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