OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/common/origin_trials/trial_token.h" | 5 #include "content/common/origin_trials/trial_token.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "base/macros.h" | 9 #include "base/macros.h" |
10 #include "base/strings/string_piece.h" | 10 #include "base/strings/string_piece.h" |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 | 58 |
59 // This is a good trial token, signed with the above test private key. | 59 // This is a good trial token, signed with the above test private key. |
60 // Generate this token with the command (in tools/origin_trials): | 60 // Generate this token with the command (in tools/origin_trials): |
61 // generate_token.py valid.example.com Frobulate --expire-timestamp=1458766277 | 61 // generate_token.py valid.example.com Frobulate --expire-timestamp=1458766277 |
62 const char* kSampleToken = | 62 const char* kSampleToken = |
63 "Ap+Q/Qm0ELadZql+dlEGSwnAVsFZKgCEtUZg8idQC3uekkIeSZIY1tftoYdrwhqj" | 63 "Ap+Q/Qm0ELadZql+dlEGSwnAVsFZKgCEtUZg8idQC3uekkIeSZIY1tftoYdrwhqj" |
64 "7FO5L22sNvkZZnacLvmfNwsAAABZeyJvcmlnaW4iOiAiaHR0cHM6Ly92YWxpZC5l" | 64 "7FO5L22sNvkZZnacLvmfNwsAAABZeyJvcmlnaW4iOiAiaHR0cHM6Ly92YWxpZC5l" |
65 "eGFtcGxlLmNvbTo0NDMiLCAiZmVhdHVyZSI6ICJGcm9idWxhdGUiLCAiZXhwaXJ5" | 65 "eGFtcGxlLmNvbTo0NDMiLCAiZmVhdHVyZSI6ICJGcm9idWxhdGUiLCAiZXhwaXJ5" |
66 "IjogMTQ1ODc2NjI3N30="; | 66 "IjogMTQ1ODc2NjI3N30="; |
67 | 67 |
| 68 // This is a good subdomain trial token, signed with the above test private key. |
| 69 // Generate this token with the command (in tools/origin_trials): |
| 70 // generate_token.py example.com Frobulate --is-subdomain |
| 71 // --expire-timestamp=1458766277 |
| 72 const char* kSampleSubdomainToken = |
| 73 "Auu+j9nXAQoy5+t00MiWakZwFExcdNC8ENkRdK1gL4OMFHS0AbZCscslDTcP1fjN" |
| 74 "FjpbmQG+VCPk1NrldVXZng4AAABoeyJvcmlnaW4iOiAiaHR0cHM6Ly9leGFtcGxl" |
| 75 "LmNvbTo0NDMiLCAiaXNTdWJkb21haW4iOiB0cnVlLCAiZmVhdHVyZSI6ICJGcm9i" |
| 76 "dWxhdGUiLCAiZXhwaXJ5IjogMTQ1ODc2NjI3N30="; |
| 77 |
| 78 // This is a good trial token, explicitly not a subdomain, signed with the above |
| 79 // test private key. Generate this token with the command: |
| 80 // generate_token.py valid.example.com Frobulate --no-subdomain |
| 81 // --expire-timestamp=1458766277 |
| 82 const char* kSampleNonSubdomainToken = |
| 83 "AreD979D7tO0luSZTr1+/+J6E0SSj/GEUyLK41o1hXFzXw1R7Z1hCDHs0gXWVSu1" |
| 84 "lvH52Winvy39tHbsU2gJJQYAAABveyJvcmlnaW4iOiAiaHR0cHM6Ly92YWxpZC5l" |
| 85 "eGFtcGxlLmNvbTo0NDMiLCAiaXNTdWJkb21haW4iOiBmYWxzZSwgImZlYXR1cmUi" |
| 86 "OiAiRnJvYnVsYXRlIiwgImV4cGlyeSI6IDE0NTg3NjYyNzd9"; |
| 87 |
68 const char* kExpectedFeatureName = "Frobulate"; | 88 const char* kExpectedFeatureName = "Frobulate"; |
69 const char* kExpectedOrigin = "https://valid.example.com"; | 89 const char* kExpectedOrigin = "https://valid.example.com"; |
| 90 const char* kExpectedSubdomainOrigin = "https://example.com"; |
| 91 const char* kExpectedMultipleSubdomainOrigin = |
| 92 "https://part1.part2.part3.example.com"; |
70 const uint64_t kExpectedExpiry = 1458766277; | 93 const uint64_t kExpectedExpiry = 1458766277; |
71 | 94 |
72 // The token should not be valid for this origin, or for this feature. | 95 // The token should not be valid for this origin, or for this feature. |
73 const char* kInvalidOrigin = "https://invalid.example.com"; | 96 const char* kInvalidOrigin = "https://invalid.example.com"; |
74 const char* kInsecureOrigin = "http://valid.example.com"; | 97 const char* kInsecureOrigin = "http://valid.example.com"; |
| 98 const char* kIncorrectPortOrigin = "https://valid.example.com:444"; |
| 99 const char* kIncorrectDomainOrigin = "https://valid.example2.com"; |
| 100 const char* kInvalidTLDOrigin = "https://com"; |
75 const char* kInvalidFeatureName = "Grokalyze"; | 101 const char* kInvalidFeatureName = "Grokalyze"; |
76 | 102 |
77 // The token should be valid if the current time is kValidTimestamp or earlier. | 103 // The token should be valid if the current time is kValidTimestamp or earlier. |
78 double kValidTimestamp = 1458766276.0; | 104 double kValidTimestamp = 1458766276.0; |
79 | 105 |
80 // The token should be invalid if the current time is kInvalidTimestamp or | 106 // The token should be invalid if the current time is kInvalidTimestamp or |
81 // later. | 107 // later. |
82 double kInvalidTimestamp = 1458766278.0; | 108 double kInvalidTimestamp = 1458766278.0; |
83 | 109 |
84 // Well-formed trial token with an invalid signature. | 110 // Well-formed trial token with an invalid signature. |
(...skipping 20 matching lines...) Expand all Loading... |
105 const char kIncorrectVersionToken[] = | 131 const char kIncorrectVersionToken[] = |
106 "KlH8wVLT5o59uDvlJESorMDjzgWnvG1hmIn/GiT9Ng3f45ratVeiXCNTeaJheOaG" | 132 "KlH8wVLT5o59uDvlJESorMDjzgWnvG1hmIn/GiT9Ng3f45ratVeiXCNTeaJheOaG" |
107 "A6kX4ir4Amv8aHVC+OJHZQkAAABZeyJvcmlnaW4iOiAiaHR0cHM6Ly92YWxpZC5l" | 133 "A6kX4ir4Amv8aHVC+OJHZQkAAABZeyJvcmlnaW4iOiAiaHR0cHM6Ly92YWxpZC5l" |
108 "eGFtcGxlLmNvbTo0NDMiLCAiZmVhdHVyZSI6ICJGcm9idWxhdGUiLCAiZXhwaXJ5" | 134 "eGFtcGxlLmNvbTo0NDMiLCAiZmVhdHVyZSI6ICJGcm9idWxhdGUiLCAiZXhwaXJ5" |
109 "IjogMTQ1ODc2NjI3N30="; | 135 "IjogMTQ1ODc2NjI3N30="; |
110 | 136 |
111 const char kSampleTokenJSON[] = | 137 const char kSampleTokenJSON[] = |
112 "{\"origin\": \"https://valid.example.com:443\", \"feature\": " | 138 "{\"origin\": \"https://valid.example.com:443\", \"feature\": " |
113 "\"Frobulate\", \"expiry\": 1458766277}"; | 139 "\"Frobulate\", \"expiry\": 1458766277}"; |
114 | 140 |
| 141 const char kSampleNonSubdomainTokenJSON[] = |
| 142 "{\"origin\": \"https://valid.example.com:443\", \"isSubdomain\": false, " |
| 143 "\"feature\": \"Frobulate\", \"expiry\": 1458766277}"; |
| 144 |
| 145 const char kSampleSubdomainTokenJSON[] = |
| 146 "{\"origin\": \"https://example.com:443\", \"isSubdomain\": true, " |
| 147 "\"feature\": \"Frobulate\", \"expiry\": 1458766277}"; |
| 148 |
115 // Various ill-formed trial tokens. These should all fail to parse. | 149 // Various ill-formed trial tokens. These should all fail to parse. |
116 const char* kInvalidTokens[] = { | 150 const char* kInvalidTokens[] = { |
117 // Invalid - Not JSON at all | 151 // Invalid - Not JSON at all |
118 "abcde", | 152 "abcde", |
119 // Invalid JSON | 153 // Invalid JSON |
120 "{", | 154 "{", |
121 // Not an object | 155 // Not an object |
122 "\"abcde\"", | 156 "\"abcde\"", |
123 "123.4", | 157 "123.4", |
124 "[0, 1, 2]", | 158 "[0, 1, 2]", |
125 // Missing keys | 159 // Missing keys |
126 "{}", | 160 "{}", |
127 "{\"something\": 1}", | 161 "{\"something\": 1}", |
128 "{\"origin\": \"https://a.a\"}", | 162 "{\"origin\": \"https://a.a\"}", |
129 "{\"origin\": \"https://a.a\", \"feature\": \"a\"}" | 163 "{\"origin\": \"https://a.a\", \"feature\": \"a\"}", |
130 "{\"origin\": \"https://a.a\", \"expiry\": 1458766277}", | 164 "{\"origin\": \"https://a.a\", \"expiry\": 1458766277}", |
131 "{\"feature\": \"FeatureName\", \"expiry\": 1458766277}", | 165 "{\"feature\": \"FeatureName\", \"expiry\": 1458766277}", |
132 // Incorrect types | 166 // Incorrect types |
133 "{\"origin\": 1, \"feature\": \"a\", \"expiry\": 1458766277}", | 167 "{\"origin\": 1, \"feature\": \"a\", \"expiry\": 1458766277}", |
134 "{\"origin\": \"https://a.a\", \"feature\": 1, \"expiry\": 1458766277}", | 168 "{\"origin\": \"https://a.a\", \"feature\": 1, \"expiry\": 1458766277}", |
135 "{\"origin\": \"https://a.a\", \"feature\": \"a\", \"expiry\": \"1\"}", | 169 "{\"origin\": \"https://a.a\", \"feature\": \"a\", \"expiry\": \"1\"}", |
| 170 "{\"origin\": \"https://a.a\", \"isSubdomain\": \"true\", \"feature\": " |
| 171 "\"a\", \"expiry\": 1458766277}", |
| 172 "{\"origin\": \"https://a.a\", \"isSubdomain\": 1, \"feature\": \"a\", " |
| 173 "\"expiry\": 1458766277}", |
136 // Negative expiry timestamp | 174 // Negative expiry timestamp |
137 "{\"origin\": \"https://a.a\", \"feature\": \"a\", \"expiry\": -1}", | 175 "{\"origin\": \"https://a.a\", \"feature\": \"a\", \"expiry\": -1}", |
138 // Origin not a proper origin URL | 176 // Origin not a proper origin URL |
139 "{\"origin\": \"abcdef\", \"feature\": \"a\", \"expiry\": 1458766277}", | 177 "{\"origin\": \"abcdef\", \"feature\": \"a\", \"expiry\": 1458766277}", |
140 "{\"origin\": \"data:text/plain,abcdef\", \"feature\": \"a\", \"expiry\": " | 178 "{\"origin\": \"data:text/plain,abcdef\", \"feature\": \"a\", \"expiry\": " |
141 "1458766277}", | 179 "1458766277}", |
142 "{\"origin\": \"javascript:alert(1)\", \"feature\": \"a\", \"expiry\": " | 180 "{\"origin\": \"javascript:alert(1)\", \"feature\": \"a\", \"expiry\": " |
143 "1458766277}"}; | 181 "1458766277}", |
| 182 }; |
144 | 183 |
145 } // namespace | 184 } // namespace |
146 | 185 |
147 class TrialTokenTest : public testing::TestWithParam<const char*> { | 186 class TrialTokenTest : public testing::TestWithParam<const char*> { |
148 public: | 187 public: |
149 TrialTokenTest() | 188 TrialTokenTest() |
150 : expected_origin_(GURL(kExpectedOrigin)), | 189 : expected_origin_(GURL(kExpectedOrigin)), |
| 190 expected_subdomain_origin_(GURL(kExpectedSubdomainOrigin)), |
| 191 expected_multiple_subdomain_origin_( |
| 192 GURL(kExpectedMultipleSubdomainOrigin)), |
151 invalid_origin_(GURL(kInvalidOrigin)), | 193 invalid_origin_(GURL(kInvalidOrigin)), |
152 insecure_origin_(GURL(kInsecureOrigin)), | 194 insecure_origin_(GURL(kInsecureOrigin)), |
| 195 incorrect_port_origin_(GURL(kIncorrectPortOrigin)), |
| 196 incorrect_domain_origin_(GURL(kIncorrectDomainOrigin)), |
| 197 invalid_tld_origin_(GURL(kInvalidTLDOrigin)), |
153 expected_expiry_(base::Time::FromDoubleT(kExpectedExpiry)), | 198 expected_expiry_(base::Time::FromDoubleT(kExpectedExpiry)), |
154 valid_timestamp_(base::Time::FromDoubleT(kValidTimestamp)), | 199 valid_timestamp_(base::Time::FromDoubleT(kValidTimestamp)), |
155 invalid_timestamp_(base::Time::FromDoubleT(kInvalidTimestamp)), | 200 invalid_timestamp_(base::Time::FromDoubleT(kInvalidTimestamp)), |
156 correct_public_key_( | 201 correct_public_key_( |
157 base::StringPiece(reinterpret_cast<const char*>(kTestPublicKey), | 202 base::StringPiece(reinterpret_cast<const char*>(kTestPublicKey), |
158 arraysize(kTestPublicKey))), | 203 arraysize(kTestPublicKey))), |
159 incorrect_public_key_( | 204 incorrect_public_key_( |
160 base::StringPiece(reinterpret_cast<const char*>(kTestPublicKey2), | 205 base::StringPiece(reinterpret_cast<const char*>(kTestPublicKey2), |
161 arraysize(kTestPublicKey2))) {} | 206 arraysize(kTestPublicKey2))) {} |
162 | 207 |
(...skipping 24 matching lines...) Expand all Loading... |
187 } | 232 } |
188 | 233 |
189 bool ValidateDate(TrialToken* token, const base::Time& now) { | 234 bool ValidateDate(TrialToken* token, const base::Time& now) { |
190 return token->ValidateDate(now); | 235 return token->ValidateDate(now); |
191 } | 236 } |
192 | 237 |
193 base::StringPiece correct_public_key() { return correct_public_key_; } | 238 base::StringPiece correct_public_key() { return correct_public_key_; } |
194 base::StringPiece incorrect_public_key() { return incorrect_public_key_; } | 239 base::StringPiece incorrect_public_key() { return incorrect_public_key_; } |
195 | 240 |
196 const url::Origin expected_origin_; | 241 const url::Origin expected_origin_; |
| 242 const url::Origin expected_subdomain_origin_; |
| 243 const url::Origin expected_multiple_subdomain_origin_; |
197 const url::Origin invalid_origin_; | 244 const url::Origin invalid_origin_; |
198 const url::Origin insecure_origin_; | 245 const url::Origin insecure_origin_; |
| 246 const url::Origin incorrect_port_origin_; |
| 247 const url::Origin incorrect_domain_origin_; |
| 248 const url::Origin invalid_tld_origin_; |
199 | 249 |
200 const base::Time expected_expiry_; | 250 const base::Time expected_expiry_; |
201 const base::Time valid_timestamp_; | 251 const base::Time valid_timestamp_; |
202 const base::Time invalid_timestamp_; | 252 const base::Time invalid_timestamp_; |
203 | 253 |
204 private: | 254 private: |
205 base::StringPiece correct_public_key_; | 255 base::StringPiece correct_public_key_; |
206 base::StringPiece incorrect_public_key_; | 256 base::StringPiece incorrect_public_key_; |
207 }; | 257 }; |
208 | 258 |
209 // Test the extraction of the signed payload from token strings. This includes | 259 // Test the extraction of the signed payload from token strings. This includes |
210 // checking the included version identifier, payload length, and cryptographic | 260 // checking the included version identifier, payload length, and cryptographic |
211 // signature. | 261 // signature. |
212 | 262 |
213 // Test verification of signature and extraction of token JSON from signed | 263 // Test verification of signature and extraction of token JSON from signed |
214 // token. | 264 // token. |
215 TEST_F(TrialTokenTest, ValidateValidSignature) { | 265 TEST_F(TrialTokenTest, ValidateValidSignature) { |
216 std::string token_payload; | 266 std::string token_payload; |
217 blink::WebOriginTrialTokenStatus status = | 267 blink::WebOriginTrialTokenStatus status = |
218 Extract(kSampleToken, correct_public_key(), &token_payload); | 268 Extract(kSampleToken, correct_public_key(), &token_payload); |
219 ASSERT_EQ(blink::WebOriginTrialTokenStatus::Success, status); | 269 ASSERT_EQ(blink::WebOriginTrialTokenStatus::Success, status); |
220 EXPECT_STREQ(kSampleTokenJSON, token_payload.c_str()); | 270 EXPECT_STREQ(kSampleTokenJSON, token_payload.c_str()); |
221 } | 271 } |
222 | 272 |
| 273 TEST_F(TrialTokenTest, ValidateSubdomainValidSignature) { |
| 274 std::string token_payload; |
| 275 blink::WebOriginTrialTokenStatus status = |
| 276 Extract(kSampleSubdomainToken, correct_public_key(), &token_payload); |
| 277 ASSERT_EQ(blink::WebOriginTrialTokenStatus::Success, status); |
| 278 EXPECT_STREQ(kSampleSubdomainTokenJSON, token_payload.c_str()); |
| 279 } |
| 280 |
| 281 TEST_F(TrialTokenTest, ValidateNonSubdomainValidSignature) { |
| 282 std::string token_payload; |
| 283 blink::WebOriginTrialTokenStatus status = |
| 284 Extract(kSampleNonSubdomainToken, correct_public_key(), &token_payload); |
| 285 ASSERT_EQ(blink::WebOriginTrialTokenStatus::Success, status); |
| 286 EXPECT_STREQ(kSampleNonSubdomainTokenJSON, token_payload.c_str()); |
| 287 } |
| 288 |
223 TEST_F(TrialTokenTest, ValidateInvalidSignature) { | 289 TEST_F(TrialTokenTest, ValidateInvalidSignature) { |
224 blink::WebOriginTrialTokenStatus status = | 290 blink::WebOriginTrialTokenStatus status = |
225 ExtractIgnorePayload(kInvalidSignatureToken, correct_public_key()); | 291 ExtractIgnorePayload(kInvalidSignatureToken, correct_public_key()); |
226 EXPECT_EQ(blink::WebOriginTrialTokenStatus::InvalidSignature, status); | 292 EXPECT_EQ(blink::WebOriginTrialTokenStatus::InvalidSignature, status); |
227 } | 293 } |
228 | 294 |
229 TEST_F(TrialTokenTest, ValidateSignatureWithIncorrectKey) { | 295 TEST_F(TrialTokenTest, ValidateSignatureWithIncorrectKey) { |
230 blink::WebOriginTrialTokenStatus status = | 296 blink::WebOriginTrialTokenStatus status = |
231 ExtractIgnorePayload(kSampleToken, incorrect_public_key()); | 297 ExtractIgnorePayload(kSampleToken, incorrect_public_key()); |
232 EXPECT_EQ(blink::WebOriginTrialTokenStatus::InvalidSignature, status); | 298 EXPECT_EQ(blink::WebOriginTrialTokenStatus::InvalidSignature, status); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 std::unique_ptr<TrialToken> empty_token = Parse(GetParam()); | 333 std::unique_ptr<TrialToken> empty_token = Parse(GetParam()); |
268 EXPECT_FALSE(empty_token) << "Invalid trial token should not parse."; | 334 EXPECT_FALSE(empty_token) << "Invalid trial token should not parse."; |
269 } | 335 } |
270 | 336 |
271 INSTANTIATE_TEST_CASE_P(, TrialTokenTest, ::testing::ValuesIn(kInvalidTokens)); | 337 INSTANTIATE_TEST_CASE_P(, TrialTokenTest, ::testing::ValuesIn(kInvalidTokens)); |
272 | 338 |
273 TEST_F(TrialTokenTest, ParseValidToken) { | 339 TEST_F(TrialTokenTest, ParseValidToken) { |
274 std::unique_ptr<TrialToken> token = Parse(kSampleTokenJSON); | 340 std::unique_ptr<TrialToken> token = Parse(kSampleTokenJSON); |
275 ASSERT_TRUE(token); | 341 ASSERT_TRUE(token); |
276 EXPECT_EQ(kExpectedFeatureName, token->feature_name()); | 342 EXPECT_EQ(kExpectedFeatureName, token->feature_name()); |
| 343 EXPECT_FALSE(token->match_subdomains()); |
277 EXPECT_EQ(expected_origin_, token->origin()); | 344 EXPECT_EQ(expected_origin_, token->origin()); |
278 EXPECT_EQ(expected_expiry_, token->expiry_time()); | 345 EXPECT_EQ(expected_expiry_, token->expiry_time()); |
279 } | 346 } |
280 | 347 |
| 348 TEST_F(TrialTokenTest, ParseValidNonSubdomainToken) { |
| 349 std::unique_ptr<TrialToken> token = Parse(kSampleNonSubdomainTokenJSON); |
| 350 ASSERT_TRUE(token); |
| 351 EXPECT_EQ(kExpectedFeatureName, token->feature_name()); |
| 352 EXPECT_FALSE(token->match_subdomains()); |
| 353 EXPECT_EQ(expected_origin_, token->origin()); |
| 354 EXPECT_EQ(expected_expiry_, token->expiry_time()); |
| 355 } |
| 356 |
| 357 TEST_F(TrialTokenTest, ParseValidSubdomainToken) { |
| 358 std::unique_ptr<TrialToken> token = Parse(kSampleSubdomainTokenJSON); |
| 359 ASSERT_TRUE(token); |
| 360 EXPECT_EQ(kExpectedFeatureName, token->feature_name()); |
| 361 EXPECT_TRUE(token->match_subdomains()); |
| 362 EXPECT_EQ(kExpectedSubdomainOrigin, token->origin().Serialize()); |
| 363 EXPECT_EQ(expected_subdomain_origin_, token->origin()); |
| 364 EXPECT_EQ(expected_expiry_, token->expiry_time()); |
| 365 } |
| 366 |
281 TEST_F(TrialTokenTest, ValidateValidToken) { | 367 TEST_F(TrialTokenTest, ValidateValidToken) { |
282 std::unique_ptr<TrialToken> token = Parse(kSampleTokenJSON); | 368 std::unique_ptr<TrialToken> token = Parse(kSampleTokenJSON); |
283 ASSERT_TRUE(token); | 369 ASSERT_TRUE(token); |
284 EXPECT_TRUE(ValidateOrigin(token.get(), expected_origin_)); | 370 EXPECT_TRUE(ValidateOrigin(token.get(), expected_origin_)); |
285 EXPECT_FALSE(ValidateOrigin(token.get(), invalid_origin_)); | 371 EXPECT_FALSE(ValidateOrigin(token.get(), invalid_origin_)); |
286 EXPECT_FALSE(ValidateOrigin(token.get(), insecure_origin_)); | 372 EXPECT_FALSE(ValidateOrigin(token.get(), insecure_origin_)); |
| 373 EXPECT_FALSE(ValidateOrigin(token.get(), incorrect_port_origin_)); |
| 374 EXPECT_FALSE(ValidateOrigin(token.get(), incorrect_domain_origin_)); |
| 375 EXPECT_FALSE(ValidateOrigin(token.get(), invalid_tld_origin_)); |
287 EXPECT_TRUE(ValidateFeatureName(token.get(), kExpectedFeatureName)); | 376 EXPECT_TRUE(ValidateFeatureName(token.get(), kExpectedFeatureName)); |
288 EXPECT_FALSE(ValidateFeatureName(token.get(), kInvalidFeatureName)); | 377 EXPECT_FALSE(ValidateFeatureName(token.get(), kInvalidFeatureName)); |
289 EXPECT_FALSE(ValidateFeatureName( | 378 EXPECT_FALSE(ValidateFeatureName( |
290 token.get(), base::ToUpperASCII(kExpectedFeatureName).c_str())); | 379 token.get(), base::ToUpperASCII(kExpectedFeatureName).c_str())); |
291 EXPECT_FALSE(ValidateFeatureName( | 380 EXPECT_FALSE(ValidateFeatureName( |
292 token.get(), base::ToLowerASCII(kExpectedFeatureName).c_str())); | 381 token.get(), base::ToLowerASCII(kExpectedFeatureName).c_str())); |
293 EXPECT_TRUE(ValidateDate(token.get(), valid_timestamp_)); | 382 EXPECT_TRUE(ValidateDate(token.get(), valid_timestamp_)); |
294 EXPECT_FALSE(ValidateDate(token.get(), invalid_timestamp_)); | 383 EXPECT_FALSE(ValidateDate(token.get(), invalid_timestamp_)); |
295 } | 384 } |
296 | 385 |
| 386 TEST_F(TrialTokenTest, ValidateValidSubdomainToken) { |
| 387 std::unique_ptr<TrialToken> token = Parse(kSampleSubdomainTokenJSON); |
| 388 ASSERT_TRUE(token); |
| 389 EXPECT_TRUE(ValidateOrigin(token.get(), expected_origin_)); |
| 390 EXPECT_TRUE(ValidateOrigin(token.get(), expected_subdomain_origin_)); |
| 391 EXPECT_TRUE(ValidateOrigin(token.get(), expected_multiple_subdomain_origin_)); |
| 392 EXPECT_FALSE(ValidateOrigin(token.get(), insecure_origin_)); |
| 393 EXPECT_FALSE(ValidateOrigin(token.get(), incorrect_port_origin_)); |
| 394 EXPECT_FALSE(ValidateOrigin(token.get(), incorrect_domain_origin_)); |
| 395 EXPECT_FALSE(ValidateOrigin(token.get(), invalid_tld_origin_)); |
| 396 } |
| 397 |
297 TEST_F(TrialTokenTest, TokenIsValid) { | 398 TEST_F(TrialTokenTest, TokenIsValid) { |
298 std::unique_ptr<TrialToken> token = Parse(kSampleTokenJSON); | 399 std::unique_ptr<TrialToken> token = Parse(kSampleTokenJSON); |
299 ASSERT_TRUE(token); | 400 ASSERT_TRUE(token); |
300 EXPECT_EQ(blink::WebOriginTrialTokenStatus::Success, | 401 EXPECT_EQ(blink::WebOriginTrialTokenStatus::Success, |
301 token->IsValid(expected_origin_, valid_timestamp_)); | 402 token->IsValid(expected_origin_, valid_timestamp_)); |
302 EXPECT_EQ(blink::WebOriginTrialTokenStatus::WrongOrigin, | 403 EXPECT_EQ(blink::WebOriginTrialTokenStatus::WrongOrigin, |
303 token->IsValid(invalid_origin_, valid_timestamp_)); | 404 token->IsValid(invalid_origin_, valid_timestamp_)); |
304 EXPECT_EQ(blink::WebOriginTrialTokenStatus::WrongOrigin, | 405 EXPECT_EQ(blink::WebOriginTrialTokenStatus::WrongOrigin, |
305 token->IsValid(insecure_origin_, valid_timestamp_)); | 406 token->IsValid(insecure_origin_, valid_timestamp_)); |
| 407 EXPECT_EQ(blink::WebOriginTrialTokenStatus::WrongOrigin, |
| 408 token->IsValid(incorrect_port_origin_, valid_timestamp_)); |
306 EXPECT_EQ(blink::WebOriginTrialTokenStatus::Expired, | 409 EXPECT_EQ(blink::WebOriginTrialTokenStatus::Expired, |
307 token->IsValid(expected_origin_, invalid_timestamp_)); | 410 token->IsValid(expected_origin_, invalid_timestamp_)); |
308 } | 411 } |
| 412 |
| 413 TEST_F(TrialTokenTest, SubdomainTokenIsValid) { |
| 414 std::unique_ptr<TrialToken> token = Parse(kSampleSubdomainTokenJSON); |
| 415 ASSERT_TRUE(token); |
| 416 EXPECT_EQ(blink::WebOriginTrialTokenStatus::Success, |
| 417 token->IsValid(expected_origin_, valid_timestamp_)); |
| 418 EXPECT_EQ(blink::WebOriginTrialTokenStatus::Success, |
| 419 token->IsValid(expected_subdomain_origin_, valid_timestamp_)); |
| 420 EXPECT_EQ( |
| 421 blink::WebOriginTrialTokenStatus::Success, |
| 422 token->IsValid(expected_multiple_subdomain_origin_, valid_timestamp_)); |
| 423 EXPECT_EQ(blink::WebOriginTrialTokenStatus::WrongOrigin, |
| 424 token->IsValid(incorrect_domain_origin_, valid_timestamp_)); |
| 425 EXPECT_EQ(blink::WebOriginTrialTokenStatus::WrongOrigin, |
| 426 token->IsValid(insecure_origin_, valid_timestamp_)); |
| 427 EXPECT_EQ(blink::WebOriginTrialTokenStatus::WrongOrigin, |
| 428 token->IsValid(incorrect_port_origin_, valid_timestamp_)); |
| 429 EXPECT_EQ(blink::WebOriginTrialTokenStatus::Expired, |
| 430 token->IsValid(expected_origin_, invalid_timestamp_)); |
| 431 } |
309 | 432 |
310 // Test overall extraction, to ensure output status matches returned token | 433 // Test overall extraction, to ensure output status matches returned token |
311 TEST_F(TrialTokenTest, ExtractValidToken) { | 434 TEST_F(TrialTokenTest, ExtractValidToken) { |
312 blink::WebOriginTrialTokenStatus status; | 435 blink::WebOriginTrialTokenStatus status; |
313 std::unique_ptr<TrialToken> token = | 436 std::unique_ptr<TrialToken> token = |
314 TrialToken::From(kSampleToken, correct_public_key(), &status); | 437 TrialToken::From(kSampleToken, correct_public_key(), &status); |
315 EXPECT_TRUE(token); | 438 EXPECT_TRUE(token); |
316 EXPECT_EQ(blink::WebOriginTrialTokenStatus::Success, status); | 439 EXPECT_EQ(blink::WebOriginTrialTokenStatus::Success, status); |
317 } | 440 } |
318 | 441 |
319 TEST_F(TrialTokenTest, ExtractInvalidSignature) { | 442 TEST_F(TrialTokenTest, ExtractInvalidSignature) { |
320 blink::WebOriginTrialTokenStatus status; | 443 blink::WebOriginTrialTokenStatus status; |
321 std::unique_ptr<TrialToken> token = | 444 std::unique_ptr<TrialToken> token = |
322 TrialToken::From(kSampleToken, incorrect_public_key(), &status); | 445 TrialToken::From(kSampleToken, incorrect_public_key(), &status); |
323 EXPECT_FALSE(token); | 446 EXPECT_FALSE(token); |
324 EXPECT_EQ(blink::WebOriginTrialTokenStatus::InvalidSignature, status); | 447 EXPECT_EQ(blink::WebOriginTrialTokenStatus::InvalidSignature, status); |
325 } | 448 } |
326 | 449 |
327 TEST_F(TrialTokenTest, ExtractMalformedToken) { | 450 TEST_F(TrialTokenTest, ExtractMalformedToken) { |
328 blink::WebOriginTrialTokenStatus status; | 451 blink::WebOriginTrialTokenStatus status; |
329 std::unique_ptr<TrialToken> token = | 452 std::unique_ptr<TrialToken> token = |
330 TrialToken::From(kIncorrectLengthToken, correct_public_key(), &status); | 453 TrialToken::From(kIncorrectLengthToken, correct_public_key(), &status); |
331 EXPECT_FALSE(token); | 454 EXPECT_FALSE(token); |
332 EXPECT_EQ(blink::WebOriginTrialTokenStatus::Malformed, status); | 455 EXPECT_EQ(blink::WebOriginTrialTokenStatus::Malformed, status); |
333 } | 456 } |
334 | 457 |
335 } // namespace content | 458 } // namespace content |
OLD | NEW |