+static const char kSha256Integrity[] = "ni:///sha256;GAF48QOoxRvu0gZAmQivUdJPyBacqznBAXwnkfpmQX4=";
+static const char kSha384Integrity[] = "ni:///sha384;nep3XpvhUxpCMOVXIFPecThAqdY/uVeiD4kXSqXpx0YJUWU4fTTaFgciTuZk7fmE";
+static const char kSha512Integrity[] = "ni:///sha512;TXkJw18PqlVlEUXXjeXbGetop1TKB3wYQIp1/ihxCOFGUfG9TYOaA1MlkpTAqSV6yaevLO8Tj5pgH1JmZ++ItA==";
+static const char kSha384IntegrityLabeledAs256[] = "ni:///sha256;nep3XpvhUxpCMOVXIFPecThAqdY/uVeiD4kXSqXpx0YJUWU4fTTaFgciTuZk7fmE";
+static const char kUnsupportedHashFunctionIntegrity[] = "ni:///sha1;JfLW308qMPKfb4DaHpUBEESwuPc=";
+
+class SubresourceIntegrityTest : public ::testing::Test {
+public:
+ SubresourceIntegrityTest()
+ : secureURL(ParsedURLString, "https://example.test:443")
+ , insecureURL(ParsedURLString, "http://example.test:80")
+ , secureOrigin(SecurityOrigin::create(secureURL))
+ , insecureOrigin(SecurityOrigin::create(insecureURL))
+ {
+ }
+
+protected:
+ virtual void SetUp()
+ {
+ document = Document::create();
+ scriptElement = HTMLScriptElement::create(*document, true);
+ }
+
+ void expectAlgorithm(const String& text, HashAlgorithm expectedAlgorithm)
+ {
+ Vector<UChar> characters;
+ text.appendTo(characters);
+ const UChar* position = characters.data();
+ const UChar* end = characters.end();
+ HashAlgorithm algorithm;
+
+ EXPECT_TRUE(SubresourceIntegrity::parseAlgorithm(position, end, algorithm));
+ EXPECT_EQ(expectedAlgorithm, algorithm);
+ EXPECT_EQ(';', *position);
+ }
+
+ void expectAlgorithmFailure(const String& text)
+ {
+ Vector<UChar> characters;
+ text.appendTo(characters);
+ const UChar* position = characters.data();
+ const UChar* begin = characters.data();
+ const UChar* end = characters.end();
+ HashAlgorithm algorithm;
+
+ EXPECT_FALSE(SubresourceIntegrity::parseAlgorithm(position, end, algorithm));
+ EXPECT_EQ(begin, position);
+ }
+
+ void expectDigest(const String& text, const char* expectedDigest)
+ {
+ Vector<UChar> characters;
+ text.appendTo(characters);
+ const UChar* position = characters.data();
+ const UChar* end = characters.end();
+ String digest;
+
+ EXPECT_TRUE(SubresourceIntegrity::parseDigest(position, end, digest));
+ EXPECT_EQ(expectedDigest, digest);
+ }
+
+ void expectDigestFailure(const String& text)
+ {
+ Vector<UChar> characters;
+ text.appendTo(characters);
+ const UChar* position = characters.data();
+ const UChar* end = characters.end();
+ String digest;
+
+ EXPECT_FALSE(SubresourceIntegrity::parseDigest(position, end, digest));
+ EXPECT_TRUE(digest.isEmpty());
+ }
+
+ void expectParse(const char* integrityAttribute, const char* expectedDigest, HashAlgorithm expectedAlgorithm)
+ {
+ String digest;
+ HashAlgorithm algorithm;
+
+ EXPECT_TRUE(SubresourceIntegrity::parseIntegrityAttribute(integrityAttribute, digest, algorithm, *document));
+ EXPECT_EQ(expectedDigest, digest);
+ EXPECT_EQ(expectedAlgorithm, algorithm);
+ }
+
+ void expectParseFailure(const char* integrityAttribute)
+ {
+ String digest;
+ HashAlgorithm algorithm;
+
+ EXPECT_FALSE(SubresourceIntegrity::parseIntegrityAttribute(integrityAttribute, digest, algorithm, *document));
+ }
+
+ void expectIntegrity(const char* integrity, const char* script, const KURL& url)
+ {
+ scriptElement->setAttribute(HTMLNames::integrityAttr, integrity);
+ EXPECT_TRUE(SubresourceIntegrity::CheckSubresourceIntegrity(*scriptElement, script, url));
+ }
+
+ void expectIntegrityFailure(const char* integrity, const char* script, const KURL& url)
+ {
+ scriptElement->setAttribute(HTMLNames::integrityAttr, integrity);
+ EXPECT_FALSE(SubresourceIntegrity::CheckSubresourceIntegrity(*scriptElement, script, url));
+ }
+
+ KURL secureURL;
+ KURL insecureURL;
+ RefPtr<SecurityOrigin> secureOrigin;
+ RefPtr<SecurityOrigin> insecureOrigin;
+
+ RefPtrWillBePersistent<Document> document;
+ RefPtrWillBePersistent<HTMLScriptElement> scriptElement;
+};
+
+TEST_F(SubresourceIntegrityTest, ParseAlgorithm)
+{
+ expectAlgorithm("sha256;", HashAlgorithmSha256);
+ expectAlgorithm("sha384;", HashAlgorithmSha384);
+ expectAlgorithm("sha512;", HashAlgorithmSha512);
+
+ expectAlgorithmFailure("sha1;");
+ expectAlgorithmFailure("sha-1;");
+ expectAlgorithmFailure("sha-256;");
+ expectAlgorithmFailure("sha-384;");
+ expectAlgorithmFailure("sha-512;");
+}