OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <string> | 5 #include <string> |
6 | 6 |
7 #include "base/strings/stringprintf.h" | 7 #include "base/strings/stringprintf.h" |
8 #include "base/time/time.h" | 8 #include "base/time/time.h" |
9 #include "chrome/browser/safe_browsing/protocol_parser.h" | 9 #include "chrome/browser/safe_browsing/protocol_parser.h" |
10 #include "chrome/browser/safe_browsing/safe_browsing_util.h" | 10 #include "chrome/browser/safe_browsing/safe_browsing_util.h" |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 EXPECT_TRUE(safe_browsing::ParseChunk(kRawAddChunk, sizeof(kRawAddChunk), | 86 EXPECT_TRUE(safe_browsing::ParseChunk(kRawAddChunk, sizeof(kRawAddChunk), |
87 &chunks)); | 87 &chunks)); |
88 ASSERT_EQ(1U, chunks.size()); | 88 ASSERT_EQ(1U, chunks.size()); |
89 EXPECT_EQ(1, chunks[0]->ChunkNumber()); | 89 EXPECT_EQ(1, chunks[0]->ChunkNumber()); |
90 EXPECT_TRUE(chunks[0]->IsAdd()); | 90 EXPECT_TRUE(chunks[0]->IsAdd()); |
91 EXPECT_FALSE(chunks[0]->IsSub()); | 91 EXPECT_FALSE(chunks[0]->IsSub()); |
92 EXPECT_FALSE(chunks[0]->IsPrefix()); | 92 EXPECT_FALSE(chunks[0]->IsPrefix()); |
93 EXPECT_TRUE(chunks[0]->IsFullHash()); | 93 EXPECT_TRUE(chunks[0]->IsFullHash()); |
94 | 94 |
95 ASSERT_EQ(2U, chunks[0]->FullHashCount()); | 95 ASSERT_EQ(2U, chunks[0]->FullHashCount()); |
96 EXPECT_TRUE(SBFullHashEqual(chunks[0]->FullHashAt(0), full_hash1)); | 96 EXPECT_TRUE( |
97 EXPECT_TRUE(SBFullHashEqual(chunks[0]->FullHashAt(1), full_hash2)); | 97 safe_browsing::SBFullHashEqual(chunks[0]->FullHashAt(0), full_hash1)); |
| 98 EXPECT_TRUE( |
| 99 safe_browsing::SBFullHashEqual(chunks[0]->FullHashAt(1), full_hash2)); |
98 } | 100 } |
99 | 101 |
100 // Test parsing multiple add chunks. We'll use the same chunk as above, and add | 102 // Test parsing multiple add chunks. We'll use the same chunk as above, and add |
101 // one more after it. | 103 // one more after it. |
102 TEST(SafeBrowsingProtocolParsingTest, TestAddChunks) { | 104 TEST(SafeBrowsingProtocolParsingTest, TestAddChunks) { |
103 const char kRawAddChunk[] = { | 105 const char kRawAddChunk[] = { |
104 '\0', '\0', '\0', '\x1C', // 32-bit payload length in network byte order. | 106 '\0', '\0', '\0', '\x1C', // 32-bit payload length in network byte order. |
105 '\x08', // field 1, wire format varint | 107 '\x08', // field 1, wire format varint |
106 '\x01', // chunk_number varint 1 | 108 '\x01', // chunk_number varint 1 |
107 '\x22', // field 4, wire format length-delimited | 109 '\x22', // field 4, wire format length-delimited |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 EXPECT_TRUE(safe_browsing::ParseChunk(kRawSubChunk, sizeof(kRawSubChunk), | 282 EXPECT_TRUE(safe_browsing::ParseChunk(kRawSubChunk, sizeof(kRawSubChunk), |
281 &chunks)); | 283 &chunks)); |
282 ASSERT_EQ(1U, chunks.size()); | 284 ASSERT_EQ(1U, chunks.size()); |
283 EXPECT_EQ(2, chunks[0]->ChunkNumber()); | 285 EXPECT_EQ(2, chunks[0]->ChunkNumber()); |
284 EXPECT_FALSE(chunks[0]->IsAdd()); | 286 EXPECT_FALSE(chunks[0]->IsAdd()); |
285 EXPECT_TRUE(chunks[0]->IsSub()); | 287 EXPECT_TRUE(chunks[0]->IsSub()); |
286 EXPECT_FALSE(chunks[0]->IsPrefix()); | 288 EXPECT_FALSE(chunks[0]->IsPrefix()); |
287 EXPECT_TRUE(chunks[0]->IsFullHash()); | 289 EXPECT_TRUE(chunks[0]->IsFullHash()); |
288 | 290 |
289 ASSERT_EQ(2U, chunks[0]->FullHashCount()); | 291 ASSERT_EQ(2U, chunks[0]->FullHashCount()); |
290 EXPECT_TRUE(SBFullHashEqual(chunks[0]->FullHashAt(0), full_hash1)); | 292 EXPECT_TRUE( |
| 293 safe_browsing::SBFullHashEqual(chunks[0]->FullHashAt(0), full_hash1)); |
291 EXPECT_EQ(7, chunks[0]->AddChunkNumberAt(0)); | 294 EXPECT_EQ(7, chunks[0]->AddChunkNumberAt(0)); |
292 EXPECT_TRUE(SBFullHashEqual(chunks[0]->FullHashAt(1), full_hash2)); | 295 EXPECT_TRUE( |
| 296 safe_browsing::SBFullHashEqual(chunks[0]->FullHashAt(1), full_hash2)); |
293 EXPECT_EQ(9, chunks[0]->AddChunkNumberAt(1)); | 297 EXPECT_EQ(9, chunks[0]->AddChunkNumberAt(1)); |
294 } | 298 } |
295 | 299 |
296 // Test parsing the SafeBrowsing update response. | 300 // Test parsing the SafeBrowsing update response. |
297 TEST(SafeBrowsingProtocolParsingTest, TestChunkDelete) { | 301 TEST(SafeBrowsingProtocolParsingTest, TestChunkDelete) { |
298 std::string add_del("n:1700\ni:phishy\nad:1-7,43-597,44444,99999\n" | 302 std::string add_del("n:1700\ni:phishy\nad:1-7,43-597,44444,99999\n" |
299 "i:malware\nsd:21-27,42,171717\n"); | 303 "i:malware\nsd:21-27,42,171717\n"); |
300 | 304 |
301 size_t next_query_sec = 0; | 305 size_t next_query_sec = 0; |
302 bool reset = false; | 306 bool reset = false; |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
394 kDefaultPhishList)); | 398 kDefaultPhishList)); |
395 std::vector<SBFullHashResult> full_hashes; | 399 std::vector<SBFullHashResult> full_hashes; |
396 base::TimeDelta cache_lifetime; | 400 base::TimeDelta cache_lifetime; |
397 EXPECT_TRUE(safe_browsing::ParseGetHash(get_hash.data(), get_hash.length(), | 401 EXPECT_TRUE(safe_browsing::ParseGetHash(get_hash.data(), get_hash.length(), |
398 &cache_lifetime, &full_hashes)); | 402 &cache_lifetime, &full_hashes)); |
399 | 403 |
400 ASSERT_EQ(3U, full_hashes.size()); | 404 ASSERT_EQ(3U, full_hashes.size()); |
401 EXPECT_EQ(memcmp(&full_hashes[0].hash, | 405 EXPECT_EQ(memcmp(&full_hashes[0].hash, |
402 "00112233445566778899aabbccddeeff", | 406 "00112233445566778899aabbccddeeff", |
403 sizeof(SBFullHash)), 0); | 407 sizeof(SBFullHash)), 0); |
404 EXPECT_EQ(safe_browsing_util::PHISH, full_hashes[0].list_id); | 408 EXPECT_EQ(safe_browsing::PHISH, full_hashes[0].list_id); |
405 EXPECT_EQ(memcmp(&full_hashes[1].hash, | 409 EXPECT_EQ(memcmp(&full_hashes[1].hash, |
406 "00001111222233334444555566667777", | 410 "00001111222233334444555566667777", |
407 sizeof(SBFullHash)), 0); | 411 sizeof(SBFullHash)), 0); |
408 EXPECT_EQ(safe_browsing_util::PHISH, full_hashes[1].list_id); | 412 EXPECT_EQ(safe_browsing::PHISH, full_hashes[1].list_id); |
409 EXPECT_EQ(memcmp(&full_hashes[2].hash, | 413 EXPECT_EQ(memcmp(&full_hashes[2].hash, |
410 "ffffeeeeddddccccbbbbaaaa99998888", | 414 "ffffeeeeddddccccbbbbaaaa99998888", |
411 sizeof(SBFullHash)), 0); | 415 sizeof(SBFullHash)), 0); |
412 EXPECT_EQ(safe_browsing_util::PHISH, full_hashes[2].list_id); | 416 EXPECT_EQ(safe_browsing::PHISH, full_hashes[2].list_id); |
413 | 417 |
414 // Test multiple lists in the GetHash results. | 418 // Test multiple lists in the GetHash results. |
415 const std::string get_hash2(base::StringPrintf( | 419 const std::string get_hash2(base::StringPrintf( |
416 "45\n" | 420 "45\n" |
417 "%s:32:1\n" | 421 "%s:32:1\n" |
418 "00112233445566778899aabbccddeeff" | 422 "00112233445566778899aabbccddeeff" |
419 "%s:32:2\n" | 423 "%s:32:2\n" |
420 "cafebeefcafebeefdeaddeaddeaddead" | 424 "cafebeefcafebeefdeaddeaddeaddead" |
421 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss", | 425 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss", |
422 kDefaultPhishList, | 426 kDefaultPhishList, |
423 kDefaultMalwareList)); | 427 kDefaultMalwareList)); |
424 EXPECT_TRUE(safe_browsing::ParseGetHash(get_hash2.data(), get_hash2.length(), | 428 EXPECT_TRUE(safe_browsing::ParseGetHash(get_hash2.data(), get_hash2.length(), |
425 &cache_lifetime, &full_hashes)); | 429 &cache_lifetime, &full_hashes)); |
426 | 430 |
427 ASSERT_EQ(3U, full_hashes.size()); | 431 ASSERT_EQ(3U, full_hashes.size()); |
428 EXPECT_EQ(memcmp(&full_hashes[0].hash, | 432 EXPECT_EQ(memcmp(&full_hashes[0].hash, |
429 "00112233445566778899aabbccddeeff", | 433 "00112233445566778899aabbccddeeff", |
430 sizeof(SBFullHash)), 0); | 434 sizeof(SBFullHash)), 0); |
431 EXPECT_EQ(safe_browsing_util::PHISH, full_hashes[0].list_id); | 435 EXPECT_EQ(safe_browsing::PHISH, full_hashes[0].list_id); |
432 EXPECT_EQ(memcmp(&full_hashes[1].hash, | 436 EXPECT_EQ(memcmp(&full_hashes[1].hash, |
433 "cafebeefcafebeefdeaddeaddeaddead", | 437 "cafebeefcafebeefdeaddeaddeaddead", |
434 sizeof(SBFullHash)), 0); | 438 sizeof(SBFullHash)), 0); |
435 EXPECT_EQ(safe_browsing_util::MALWARE, full_hashes[1].list_id); | 439 EXPECT_EQ(safe_browsing::MALWARE, full_hashes[1].list_id); |
436 EXPECT_EQ(memcmp(&full_hashes[2].hash, | 440 EXPECT_EQ(memcmp(&full_hashes[2].hash, |
437 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss", | 441 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss", |
438 sizeof(SBFullHash)), 0); | 442 sizeof(SBFullHash)), 0); |
439 EXPECT_EQ(safe_browsing_util::MALWARE, full_hashes[2].list_id); | 443 EXPECT_EQ(safe_browsing::MALWARE, full_hashes[2].list_id); |
440 | 444 |
441 // Test metadata parsing. | 445 // Test metadata parsing. |
442 const std::string get_hash3(base::StringPrintf( | 446 const std::string get_hash3(base::StringPrintf( |
443 "45\n" | 447 "45\n" |
444 "%s:32:2:m\n" | 448 "%s:32:2:m\n" |
445 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss" | 449 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss" |
446 "00112233445566778899aabbccddeeff" | 450 "00112233445566778899aabbccddeeff" |
447 "2\nab2\nxy" | 451 "2\nab2\nxy" |
448 "%s:32:1\n" | 452 "%s:32:1\n" |
449 "cafebeefcafebeefdeaddeaddeaddead", | 453 "cafebeefcafebeefdeaddeaddeaddead", |
450 kDefaultMalwareList, | 454 kDefaultMalwareList, |
451 kDefaultPhishList)); | 455 kDefaultPhishList)); |
452 EXPECT_TRUE(safe_browsing::ParseGetHash(get_hash3.data(), get_hash3.length(), | 456 EXPECT_TRUE(safe_browsing::ParseGetHash(get_hash3.data(), get_hash3.length(), |
453 &cache_lifetime, &full_hashes)); | 457 &cache_lifetime, &full_hashes)); |
454 | 458 |
455 ASSERT_EQ(3U, full_hashes.size()); | 459 ASSERT_EQ(3U, full_hashes.size()); |
456 EXPECT_EQ(memcmp(&full_hashes[0].hash, | 460 EXPECT_EQ(memcmp(&full_hashes[0].hash, |
457 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss", | 461 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss", |
458 sizeof(SBFullHash)), 0); | 462 sizeof(SBFullHash)), 0); |
459 EXPECT_EQ(safe_browsing_util::MALWARE, full_hashes[0].list_id); | 463 EXPECT_EQ(safe_browsing::MALWARE, full_hashes[0].list_id); |
460 EXPECT_EQ(std::string("ab"), full_hashes[0].metadata); | 464 EXPECT_EQ(std::string("ab"), full_hashes[0].metadata); |
461 EXPECT_EQ(memcmp(&full_hashes[1].hash, | 465 EXPECT_EQ(memcmp(&full_hashes[1].hash, |
462 "00112233445566778899aabbccddeeff", | 466 "00112233445566778899aabbccddeeff", |
463 sizeof(SBFullHash)), 0); | 467 sizeof(SBFullHash)), 0); |
464 EXPECT_EQ(safe_browsing_util::MALWARE, full_hashes[1].list_id); | 468 EXPECT_EQ(safe_browsing::MALWARE, full_hashes[1].list_id); |
465 EXPECT_EQ(std::string("xy"), full_hashes[1].metadata); | 469 EXPECT_EQ(std::string("xy"), full_hashes[1].metadata); |
466 EXPECT_EQ(memcmp(&full_hashes[2].hash, | 470 EXPECT_EQ(memcmp(&full_hashes[2].hash, |
467 "cafebeefcafebeefdeaddeaddeaddead", | 471 "cafebeefcafebeefdeaddeaddeaddead", |
468 sizeof(SBFullHash)), 0); | 472 sizeof(SBFullHash)), 0); |
469 EXPECT_EQ(safe_browsing_util::PHISH, full_hashes[2].list_id); | 473 EXPECT_EQ(safe_browsing::PHISH, full_hashes[2].list_id); |
470 EXPECT_EQ(std::string(), full_hashes[2].metadata); | 474 EXPECT_EQ(std::string(), full_hashes[2].metadata); |
471 } | 475 } |
472 | 476 |
473 TEST(SafeBrowsingProtocolParsingTest, TestGetHashWithUnknownList) { | 477 TEST(SafeBrowsingProtocolParsingTest, TestGetHashWithUnknownList) { |
474 std::string hash_response(base::StringPrintf( | 478 std::string hash_response(base::StringPrintf( |
475 "45\n" | 479 "45\n" |
476 "%s:32:1\n" | 480 "%s:32:1\n" |
477 "12345678901234567890123456789012" | 481 "12345678901234567890123456789012" |
478 "googpub-phish-shavar:32:1\n" | 482 "googpub-phish-shavar:32:1\n" |
479 "09876543210987654321098765432109", | 483 "09876543210987654321098765432109", |
480 kDefaultPhishList)); | 484 kDefaultPhishList)); |
481 std::vector<SBFullHashResult> full_hashes; | 485 std::vector<SBFullHashResult> full_hashes; |
482 base::TimeDelta cache_lifetime; | 486 base::TimeDelta cache_lifetime; |
483 EXPECT_TRUE(safe_browsing::ParseGetHash(hash_response.data(), | 487 EXPECT_TRUE(safe_browsing::ParseGetHash(hash_response.data(), |
484 hash_response.size(), | 488 hash_response.size(), |
485 &cache_lifetime, | 489 &cache_lifetime, |
486 &full_hashes)); | 490 &full_hashes)); |
487 | 491 |
488 ASSERT_EQ(1U, full_hashes.size()); | 492 ASSERT_EQ(1U, full_hashes.size()); |
489 EXPECT_EQ(memcmp("12345678901234567890123456789012", | 493 EXPECT_EQ(memcmp("12345678901234567890123456789012", |
490 &full_hashes[0].hash, sizeof(SBFullHash)), 0); | 494 &full_hashes[0].hash, sizeof(SBFullHash)), 0); |
491 EXPECT_EQ(safe_browsing_util::PHISH, full_hashes[0].list_id); | 495 EXPECT_EQ(safe_browsing::PHISH, full_hashes[0].list_id); |
492 | 496 |
493 hash_response += base::StringPrintf( | 497 hash_response += base::StringPrintf( |
494 "%s:32:1\n" | 498 "%s:32:1\n" |
495 "abcdefghijklmnopqrstuvwxyz123457", | 499 "abcdefghijklmnopqrstuvwxyz123457", |
496 kDefaultMalwareList); | 500 kDefaultMalwareList); |
497 full_hashes.clear(); | 501 full_hashes.clear(); |
498 EXPECT_TRUE(safe_browsing::ParseGetHash(hash_response.data(), | 502 EXPECT_TRUE(safe_browsing::ParseGetHash(hash_response.data(), |
499 hash_response.size(), | 503 hash_response.size(), |
500 &cache_lifetime, | 504 &cache_lifetime, |
501 &full_hashes)); | 505 &full_hashes)); |
502 | 506 |
503 EXPECT_EQ(2U, full_hashes.size()); | 507 EXPECT_EQ(2U, full_hashes.size()); |
504 EXPECT_EQ(memcmp("12345678901234567890123456789012", | 508 EXPECT_EQ(memcmp("12345678901234567890123456789012", |
505 &full_hashes[0].hash, sizeof(SBFullHash)), 0); | 509 &full_hashes[0].hash, sizeof(SBFullHash)), 0); |
506 EXPECT_EQ(safe_browsing_util::PHISH, full_hashes[0].list_id); | 510 EXPECT_EQ(safe_browsing::PHISH, full_hashes[0].list_id); |
507 EXPECT_EQ(memcmp("abcdefghijklmnopqrstuvwxyz123457", | 511 EXPECT_EQ(memcmp("abcdefghijklmnopqrstuvwxyz123457", |
508 &full_hashes[1].hash, sizeof(SBFullHash)), 0); | 512 &full_hashes[1].hash, sizeof(SBFullHash)), 0); |
509 EXPECT_EQ(safe_browsing_util::MALWARE, full_hashes[1].list_id); | 513 EXPECT_EQ(safe_browsing::MALWARE, full_hashes[1].list_id); |
510 } | 514 } |
511 | 515 |
512 TEST(SafeBrowsingProtocolParsingTest, TestGetHashWithUnknownListAndMetadata) { | 516 TEST(SafeBrowsingProtocolParsingTest, TestGetHashWithUnknownListAndMetadata) { |
513 std::vector<SBFullHashResult> full_hashes; | 517 std::vector<SBFullHashResult> full_hashes; |
514 base::TimeDelta cache_lifetime; | 518 base::TimeDelta cache_lifetime; |
515 // Test skipping over a hashentry with an unrecognized listname that also has | 519 // Test skipping over a hashentry with an unrecognized listname that also has |
516 // metadata. | 520 // metadata. |
517 const std::string get_hash3(base::StringPrintf( | 521 const std::string get_hash3(base::StringPrintf( |
518 "600\n" | 522 "600\n" |
519 "BADLISTNAME:32:1:m\n" | 523 "BADLISTNAME:32:1:m\n" |
520 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" | 524 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" |
521 "8\nMETADATA" | 525 "8\nMETADATA" |
522 "%s:32:1\n" | 526 "%s:32:1\n" |
523 "0123456789hashhashhashhashhashha", | 527 "0123456789hashhashhashhashhashha", |
524 kDefaultMalwareList)); | 528 kDefaultMalwareList)); |
525 EXPECT_TRUE(safe_browsing::ParseGetHash(get_hash3.data(), get_hash3.length(), | 529 EXPECT_TRUE(safe_browsing::ParseGetHash(get_hash3.data(), get_hash3.length(), |
526 &cache_lifetime, &full_hashes)); | 530 &cache_lifetime, &full_hashes)); |
527 ASSERT_EQ(1U, full_hashes.size()); | 531 ASSERT_EQ(1U, full_hashes.size()); |
528 EXPECT_EQ(memcmp(&full_hashes[0].hash, | 532 EXPECT_EQ(memcmp(&full_hashes[0].hash, |
529 "0123456789hashhashhashhashhashha", | 533 "0123456789hashhashhashhashhashha", |
530 sizeof(SBFullHash)), 0); | 534 sizeof(SBFullHash)), 0); |
531 EXPECT_EQ(safe_browsing_util::MALWARE, full_hashes[0].list_id); | 535 EXPECT_EQ(safe_browsing::MALWARE, full_hashes[0].list_id); |
532 EXPECT_EQ(std::string(), full_hashes[0].metadata); | 536 EXPECT_EQ(std::string(), full_hashes[0].metadata); |
533 } | 537 } |
534 | 538 |
535 TEST(SafeBrowsingProtocolParsingTest, TestFormatHash) { | 539 TEST(SafeBrowsingProtocolParsingTest, TestFormatHash) { |
536 std::vector<SBPrefix> prefixes; | 540 std::vector<SBPrefix> prefixes; |
537 prefixes.push_back(0x34333231); | 541 prefixes.push_back(0x34333231); |
538 prefixes.push_back(0x64636261); | 542 prefixes.push_back(0x64636261); |
539 prefixes.push_back(0x73727170); | 543 prefixes.push_back(0x73727170); |
540 | 544 |
541 EXPECT_EQ("4:12\n1234abcdpqrs", safe_browsing::FormatGetHash(prefixes)); | 545 EXPECT_EQ("4:12\n1234abcdpqrs", safe_browsing::FormatGetHash(prefixes)); |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
709 EXPECT_FALSE(chunks[0]->IsAdd()); | 713 EXPECT_FALSE(chunks[0]->IsAdd()); |
710 EXPECT_TRUE(chunks[0]->IsSub()); | 714 EXPECT_TRUE(chunks[0]->IsSub()); |
711 EXPECT_TRUE(chunks[2]->IsPrefix()); | 715 EXPECT_TRUE(chunks[2]->IsPrefix()); |
712 EXPECT_FALSE(chunks[2]->IsFullHash()); | 716 EXPECT_FALSE(chunks[2]->IsFullHash()); |
713 ASSERT_EQ(1U, chunks[2]->PrefixCount()); | 717 ASSERT_EQ(1U, chunks[2]->PrefixCount()); |
714 EXPECT_EQ(0x70707070U, chunks[2]->PrefixAt(0)); // pppp | 718 EXPECT_EQ(0x70707070U, chunks[2]->PrefixAt(0)); // pppp |
715 EXPECT_EQ(11, chunks[2]->AddChunkNumberAt(0)); | 719 EXPECT_EQ(11, chunks[2]->AddChunkNumberAt(0)); |
716 } | 720 } |
717 | 721 |
718 } // namespace | 722 } // namespace |
OLD | NEW |