| 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 <limits.h> | 5 #include <limits.h> |
| 6 #include <stddef.h> | 6 #include <stddef.h> |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| 11 #include "base/macros.h" | 11 #include "base/macros.h" |
| 12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
| 13 #include "base/pickle.h" | 13 #include "base/pickle.h" |
| 14 #include "base/strings/string16.h" | 14 #include "base/strings/string16.h" |
| 15 #include "base/strings/utf_string_conversions.h" | 15 #include "base/strings/utf_string_conversions.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 | 17 |
| 18 namespace base { | 18 namespace base { |
| 19 | 19 |
| 20 namespace { | 20 namespace { |
| 21 | 21 |
| 22 const bool testbool1 = false; | 22 const bool testbool1 = false; |
| 23 const bool testbool2 = true; | 23 const bool testbool2 = true; |
| 24 const int testint = 2093847192; | 24 const int testint = 2093847192; |
| 25 const long testlong = 1093847192; | 25 const long testlong = 1093847192; |
| 26 const uint16_t testuint16 = 32123; | 26 const uint16_t testuint16 = 32123; |
| 27 const uint32_t testuint32 = 1593847192; | 27 const uint32_t testuint32 = 1593847192; |
| 28 const int64_t testint64 = -0x7E8CA9253104BDFCLL; | 28 const int64_t testint64 = -0x7E8CA9253104BDFCLL; |
| 29 const uint64_t testuint64 = 0xCE8CA9253104BDF7ULL; | 29 const uint64_t testuint64 = 0xCE8CA9253104BDF7ULL; |
| 30 const size_t testsizet = 0xFEDC7654; | |
| 31 const float testfloat = 3.1415926935f; | 30 const float testfloat = 3.1415926935f; |
| 32 const double testdouble = 2.71828182845904523; | 31 const double testdouble = 2.71828182845904523; |
| 33 const std::string teststring("Hello world"); // note non-aligned string length | 32 const std::string teststring("Hello world"); // note non-aligned string length |
| 34 const std::wstring testwstring(L"Hello, world"); | 33 const std::wstring testwstring(L"Hello, world"); |
| 35 const string16 teststring16(ASCIIToUTF16("Hello, world")); | 34 const string16 teststring16(ASCIIToUTF16("Hello, world")); |
| 36 const char testrawstring[] = "Hello new world"; // Test raw string writing | 35 const char testrawstring[] = "Hello new world"; // Test raw string writing |
| 37 // Test raw char16 writing, assumes UTF16 encoding is ANSI for alpha chars. | 36 // Test raw char16 writing, assumes UTF16 encoding is ANSI for alpha chars. |
| 38 const char16 testrawstring16[] = {'A', 'l', 'o', 'h', 'a', 0}; | 37 const char16 testrawstring16[] = {'A', 'l', 'o', 'h', 'a', 0}; |
| 39 const char testdata[] = "AAA\0BBB\0"; | 38 const char testdata[] = "AAA\0BBB\0"; |
| 40 const int testdatalen = arraysize(testdata) - 1; | 39 const int testdatalen = arraysize(testdata) - 1; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 66 EXPECT_EQ(testuint32, outuint32); | 65 EXPECT_EQ(testuint32, outuint32); |
| 67 | 66 |
| 68 int64_t outint64; | 67 int64_t outint64; |
| 69 EXPECT_TRUE(iter.ReadInt64(&outint64)); | 68 EXPECT_TRUE(iter.ReadInt64(&outint64)); |
| 70 EXPECT_EQ(testint64, outint64); | 69 EXPECT_EQ(testint64, outint64); |
| 71 | 70 |
| 72 uint64_t outuint64; | 71 uint64_t outuint64; |
| 73 EXPECT_TRUE(iter.ReadUInt64(&outuint64)); | 72 EXPECT_TRUE(iter.ReadUInt64(&outuint64)); |
| 74 EXPECT_EQ(testuint64, outuint64); | 73 EXPECT_EQ(testuint64, outuint64); |
| 75 | 74 |
| 76 size_t outsizet; | |
| 77 EXPECT_TRUE(iter.ReadSizeT(&outsizet)); | |
| 78 EXPECT_EQ(testsizet, outsizet); | |
| 79 | |
| 80 float outfloat; | 75 float outfloat; |
| 81 EXPECT_TRUE(iter.ReadFloat(&outfloat)); | 76 EXPECT_TRUE(iter.ReadFloat(&outfloat)); |
| 82 EXPECT_EQ(testfloat, outfloat); | 77 EXPECT_EQ(testfloat, outfloat); |
| 83 | 78 |
| 84 double outdouble; | 79 double outdouble; |
| 85 EXPECT_TRUE(iter.ReadDouble(&outdouble)); | 80 EXPECT_TRUE(iter.ReadDouble(&outdouble)); |
| 86 EXPECT_EQ(testdouble, outdouble); | 81 EXPECT_EQ(testdouble, outdouble); |
| 87 | 82 |
| 88 std::string outstring; | 83 std::string outstring; |
| 89 EXPECT_TRUE(iter.ReadString(&outstring)); | 84 EXPECT_TRUE(iter.ReadString(&outstring)); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 112 } | 107 } |
| 113 | 108 |
| 114 } // namespace | 109 } // namespace |
| 115 | 110 |
| 116 TEST(PickleTest, EncodeDecode) { | 111 TEST(PickleTest, EncodeDecode) { |
| 117 Pickle pickle; | 112 Pickle pickle; |
| 118 | 113 |
| 119 EXPECT_TRUE(pickle.WriteBool(testbool1)); | 114 EXPECT_TRUE(pickle.WriteBool(testbool1)); |
| 120 EXPECT_TRUE(pickle.WriteBool(testbool2)); | 115 EXPECT_TRUE(pickle.WriteBool(testbool2)); |
| 121 EXPECT_TRUE(pickle.WriteInt(testint)); | 116 EXPECT_TRUE(pickle.WriteInt(testint)); |
| 122 EXPECT_TRUE( | 117 EXPECT_TRUE(pickle.WriteLong(testlong)); |
| 123 pickle.WriteLongUsingDangerousNonPortableLessPersistableForm(testlong)); | |
| 124 EXPECT_TRUE(pickle.WriteUInt16(testuint16)); | 118 EXPECT_TRUE(pickle.WriteUInt16(testuint16)); |
| 125 EXPECT_TRUE(pickle.WriteUInt32(testuint32)); | 119 EXPECT_TRUE(pickle.WriteUInt32(testuint32)); |
| 126 EXPECT_TRUE(pickle.WriteInt64(testint64)); | 120 EXPECT_TRUE(pickle.WriteInt64(testint64)); |
| 127 EXPECT_TRUE(pickle.WriteUInt64(testuint64)); | 121 EXPECT_TRUE(pickle.WriteUInt64(testuint64)); |
| 128 EXPECT_TRUE(pickle.WriteSizeT(testsizet)); | |
| 129 EXPECT_TRUE(pickle.WriteFloat(testfloat)); | 122 EXPECT_TRUE(pickle.WriteFloat(testfloat)); |
| 130 EXPECT_TRUE(pickle.WriteDouble(testdouble)); | 123 EXPECT_TRUE(pickle.WriteDouble(testdouble)); |
| 131 EXPECT_TRUE(pickle.WriteString(teststring)); | 124 EXPECT_TRUE(pickle.WriteString(teststring)); |
| 132 EXPECT_TRUE(pickle.WriteString16(teststring16)); | 125 EXPECT_TRUE(pickle.WriteString16(teststring16)); |
| 133 EXPECT_TRUE(pickle.WriteString(testrawstring)); | 126 EXPECT_TRUE(pickle.WriteString(testrawstring)); |
| 134 EXPECT_TRUE(pickle.WriteString16(testrawstring16)); | 127 EXPECT_TRUE(pickle.WriteString16(testrawstring16)); |
| 135 EXPECT_TRUE(pickle.WriteData(testdata, testdatalen)); | 128 EXPECT_TRUE(pickle.WriteData(testdata, testdatalen)); |
| 136 VerifyResult(pickle); | 129 VerifyResult(pickle); |
| 137 | 130 |
| 138 // test copy constructor | 131 // test copy constructor |
| 139 Pickle pickle2(pickle); | 132 Pickle pickle2(pickle); |
| 140 VerifyResult(pickle2); | 133 VerifyResult(pickle2); |
| 141 | 134 |
| 142 // test operator= | 135 // test operator= |
| 143 Pickle pickle3; | 136 Pickle pickle3; |
| 144 pickle3 = pickle; | 137 pickle3 = pickle; |
| 145 VerifyResult(pickle3); | 138 VerifyResult(pickle3); |
| 146 } | 139 } |
| 147 | 140 |
| 148 // Tests that reading/writing a size_t works correctly when the source process | 141 // Tests that reading/writing a long works correctly when the source process |
| 149 // is 64-bit. We rely on having both 32- and 64-bit trybots to validate both | 142 // is 64-bit. We rely on having both 32- and 64-bit trybots to validate both |
| 150 // arms of the conditional in this test. | 143 // arms of the conditional in this test. |
| 151 TEST(PickleTest, SizeTFrom64Bit) { | 144 TEST(PickleTest, LongFrom64Bit) { |
| 152 Pickle pickle; | 145 Pickle pickle; |
| 153 // Under the hood size_t is always written as a 64-bit value, so simulate a | 146 // Under the hood long is always written as a 64-bit value, so simulate a |
| 154 // 64-bit size_t even on 32-bit architectures by explicitly writing a | 147 // 64-bit long even on 32-bit architectures by explicitly writing an int64_t. |
| 155 // uint64_t. | 148 EXPECT_TRUE(pickle.WriteInt64(testint64)); |
| 156 EXPECT_TRUE(pickle.WriteUInt64(testuint64)); | |
| 157 | 149 |
| 158 PickleIterator iter(pickle); | 150 PickleIterator iter(pickle); |
| 159 size_t outsizet; | 151 long outlong; |
| 160 if (sizeof(size_t) < sizeof(uint64_t)) { | 152 if (sizeof(long) < sizeof(int64_t)) { |
| 161 // ReadSizeT() should return false when the original written value can't be | 153 // ReadLong() should return false when the original written value can't be |
| 162 // represented as a size_t. | 154 // represented as a long. |
| 163 EXPECT_FALSE(iter.ReadSizeT(&outsizet)); | 155 #if GTEST_HAS_DEATH_TEST |
| 156 EXPECT_DEATH(ignore_result(iter.ReadLong(&outlong)), ""); |
| 157 #endif |
| 164 } else { | 158 } else { |
| 165 EXPECT_TRUE(iter.ReadSizeT(&outsizet)); | 159 EXPECT_TRUE(iter.ReadLong(&outlong)); |
| 166 EXPECT_EQ(testuint64, outsizet); | 160 EXPECT_EQ(testint64, outlong); |
| 167 } | 161 } |
| 168 } | 162 } |
| 169 | 163 |
| 170 // Tests that we can handle really small buffers. | 164 // Tests that we can handle really small buffers. |
| 171 TEST(PickleTest, SmallBuffer) { | 165 TEST(PickleTest, SmallBuffer) { |
| 172 scoped_ptr<char[]> buffer(new char[1]); | 166 scoped_ptr<char[]> buffer(new char[1]); |
| 173 | 167 |
| 174 // We should not touch the buffer. | 168 // We should not touch the buffer. |
| 175 Pickle pickle(buffer.get(), 1); | 169 Pickle pickle(buffer.get(), 1); |
| 176 | 170 |
| (...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 549 for (size_t i = 0; i < kChunkSize; ++i) { | 543 for (size_t i = 0; i < kChunkSize; ++i) { |
| 550 EXPECT_EQ(0, bytes[i]); | 544 EXPECT_EQ(0, bytes[i]); |
| 551 } | 545 } |
| 552 } | 546 } |
| 553 | 547 |
| 554 // Checks that ClaimBytes properly advances the write offset. | 548 // Checks that ClaimBytes properly advances the write offset. |
| 555 TEST(PickleTest, ClaimBytes) { | 549 TEST(PickleTest, ClaimBytes) { |
| 556 std::string data("Hello, world!"); | 550 std::string data("Hello, world!"); |
| 557 | 551 |
| 558 TestingPickle pickle; | 552 TestingPickle pickle; |
| 559 pickle.WriteSizeT(data.size()); | 553 pickle.WriteUInt32(data.size()); |
| 560 void* bytes = pickle.ClaimBytes(data.size()); | 554 void* bytes = pickle.ClaimBytes(data.size()); |
| 561 pickle.WriteInt(42); | 555 pickle.WriteInt(42); |
| 562 memcpy(bytes, data.data(), data.size()); | 556 memcpy(bytes, data.data(), data.size()); |
| 563 | 557 |
| 564 PickleIterator iter(pickle); | 558 PickleIterator iter(pickle); |
| 565 size_t out_data_length; | 559 uint32_t out_data_length; |
| 566 EXPECT_TRUE(iter.ReadSizeT(&out_data_length)); | 560 EXPECT_TRUE(iter.ReadUInt32(&out_data_length)); |
| 567 EXPECT_EQ(data.size(), out_data_length); | 561 EXPECT_EQ(data.size(), out_data_length); |
| 568 | 562 |
| 569 const char* out_data = nullptr; | 563 const char* out_data = nullptr; |
| 570 EXPECT_TRUE(iter.ReadBytes(&out_data, out_data_length)); | 564 EXPECT_TRUE(iter.ReadBytes(&out_data, out_data_length)); |
| 571 EXPECT_EQ(data, std::string(out_data, out_data_length)); | 565 EXPECT_EQ(data, std::string(out_data, out_data_length)); |
| 572 | 566 |
| 573 int out_value; | 567 int out_value; |
| 574 EXPECT_TRUE(iter.ReadInt(&out_value)); | 568 EXPECT_TRUE(iter.ReadInt(&out_value)); |
| 575 EXPECT_EQ(42, out_value); | 569 EXPECT_EQ(42, out_value); |
| 576 } | 570 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 587 { | 581 { |
| 588 TestingPickle pickle; | 582 TestingPickle pickle; |
| 589 base::PickleSizer sizer; | 583 base::PickleSizer sizer; |
| 590 pickle.WriteInt(42); | 584 pickle.WriteInt(42); |
| 591 sizer.AddInt(); | 585 sizer.AddInt(); |
| 592 EXPECT_EQ(sizer.payload_size(), pickle.payload_size()); | 586 EXPECT_EQ(sizer.payload_size(), pickle.payload_size()); |
| 593 } | 587 } |
| 594 { | 588 { |
| 595 TestingPickle pickle; | 589 TestingPickle pickle; |
| 596 base::PickleSizer sizer; | 590 base::PickleSizer sizer; |
| 597 pickle.WriteLongUsingDangerousNonPortableLessPersistableForm(42); | 591 pickle.WriteLong(42); |
| 598 sizer.AddLongUsingDangerousNonPortableLessPersistableForm(); | 592 sizer.AddLong(); |
| 599 EXPECT_EQ(sizer.payload_size(), pickle.payload_size()); | 593 EXPECT_EQ(sizer.payload_size(), pickle.payload_size()); |
| 600 } | 594 } |
| 601 { | 595 { |
| 602 TestingPickle pickle; | 596 TestingPickle pickle; |
| 603 base::PickleSizer sizer; | 597 base::PickleSizer sizer; |
| 604 pickle.WriteUInt16(42); | 598 pickle.WriteUInt16(42); |
| 605 sizer.AddUInt16(); | 599 sizer.AddUInt16(); |
| 606 EXPECT_EQ(sizer.payload_size(), pickle.payload_size()); | 600 EXPECT_EQ(sizer.payload_size(), pickle.payload_size()); |
| 607 } | 601 } |
| 608 { | 602 { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 622 { | 616 { |
| 623 TestingPickle pickle; | 617 TestingPickle pickle; |
| 624 base::PickleSizer sizer; | 618 base::PickleSizer sizer; |
| 625 pickle.WriteUInt64(42); | 619 pickle.WriteUInt64(42); |
| 626 sizer.AddUInt64(); | 620 sizer.AddUInt64(); |
| 627 EXPECT_EQ(sizer.payload_size(), pickle.payload_size()); | 621 EXPECT_EQ(sizer.payload_size(), pickle.payload_size()); |
| 628 } | 622 } |
| 629 { | 623 { |
| 630 TestingPickle pickle; | 624 TestingPickle pickle; |
| 631 base::PickleSizer sizer; | 625 base::PickleSizer sizer; |
| 632 pickle.WriteSizeT(42); | |
| 633 sizer.AddSizeT(); | |
| 634 EXPECT_EQ(sizer.payload_size(), pickle.payload_size()); | |
| 635 } | |
| 636 { | |
| 637 TestingPickle pickle; | |
| 638 base::PickleSizer sizer; | |
| 639 pickle.WriteFloat(42.0f); | 626 pickle.WriteFloat(42.0f); |
| 640 sizer.AddFloat(); | 627 sizer.AddFloat(); |
| 641 EXPECT_EQ(sizer.payload_size(), pickle.payload_size()); | 628 EXPECT_EQ(sizer.payload_size(), pickle.payload_size()); |
| 642 } | 629 } |
| 643 { | 630 { |
| 644 TestingPickle pickle; | 631 TestingPickle pickle; |
| 645 base::PickleSizer sizer; | 632 base::PickleSizer sizer; |
| 646 pickle.WriteDouble(42.0); | 633 pickle.WriteDouble(42.0); |
| 647 sizer.AddDouble(); | 634 sizer.AddDouble(); |
| 648 EXPECT_EQ(sizer.payload_size(), pickle.payload_size()); | 635 EXPECT_EQ(sizer.payload_size(), pickle.payload_size()); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 671 { | 658 { |
| 672 TestingPickle pickle; | 659 TestingPickle pickle; |
| 673 base::PickleSizer sizer; | 660 base::PickleSizer sizer; |
| 674 pickle.WriteBytes(testdata, testdatalen); | 661 pickle.WriteBytes(testdata, testdatalen); |
| 675 sizer.AddBytes(testdatalen); | 662 sizer.AddBytes(testdatalen); |
| 676 EXPECT_EQ(sizer.payload_size(), pickle.payload_size()); | 663 EXPECT_EQ(sizer.payload_size(), pickle.payload_size()); |
| 677 } | 664 } |
| 678 } | 665 } |
| 679 | 666 |
| 680 } // namespace base | 667 } // namespace base |
| OLD | NEW |