Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(336)

Side by Side Diff: content/common/origin_trials/trial_token_unittest.cc

Issue 2411803002: Support subdomain matching in trial tokens (Closed)
Patch Set: Add fuzzer data for subdomain tokens Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698