toolkit/crashreporter/google-breakpad/src/processor/map_serializers_unittest.cc

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 // Copyright (c) 2010, Google Inc.
     2 // All rights reserved.
     3 //
     4 // Redistribution and use in source and binary forms, with or without
     5 // modification, are permitted provided that the following conditions are
     6 // met:
     7 //
     8 //     * Redistributions of source code must retain the above copyright
     9 // notice, this list of conditions and the following disclaimer.
    10 //     * Redistributions in binary form must reproduce the above
    11 // copyright notice, this list of conditions and the following disclaimer
    12 // in the documentation and/or other materials provided with the
    13 // distribution.
    14 //     * Neither the name of Google Inc. nor the names of its
    15 // contributors may be used to endorse or promote products derived from
    16 // this software without specific prior written permission.
    17 //
    18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    30 // map_serializers_unittest.cc: Unit tests for std::map serializer and
    31 // std::map wrapper serializers.
    32 //
    33 // Author: Siyang Xie (lambxsy@google.com)
    35 #include <climits>
    36 #include <map>
    37 #include <string>
    38 #include <utility>
    39 #include <iostream>
    40 #include <sstream>
    42 #include "breakpad_googletest_includes.h"
    43 #include "map_serializers-inl.h"
    45 #include "processor/address_map-inl.h"
    46 #include "processor/range_map-inl.h"
    47 #include "processor/contained_range_map-inl.h"
    49 typedef int32_t AddrType;
    50 typedef int32_t EntryType;
    52 const int kSizeOfInt = 4;
    54 class TestStdMapSerializer : public ::testing::Test {
    55  protected:
    56   void SetUp() {
    57     serialized_size_ = 0;
    58     serialized_data_ = NULL;
    59   }
    61   void TearDown() {
    62     delete [] serialized_data_;
    63   }
    65   std::map<AddrType, EntryType> std_map_;
    66   google_breakpad::StdMapSerializer<AddrType, EntryType> serializer_;
    67   uint32_t serialized_size_;
    68   char *serialized_data_;
    69 };
    71 TEST_F(TestStdMapSerializer, EmptyMapTestCase) {
    72   const int32_t correct_data[] = { 0 };
    73   uint32_t correct_size = sizeof(correct_data);
    75   // std_map_ is empty.
    76   serialized_data_ = serializer_.Serialize(std_map_, &serialized_size_);
    78   EXPECT_EQ(correct_size, serialized_size_);
    79   EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
    80 }
    82 TEST_F(TestStdMapSerializer, MapWithTwoElementsTestCase) {
    83   const int32_t correct_data[] = {
    84       // # of nodes
    85       2,
    86       // Offsets
    87       20, 24,
    88       // Keys
    89       1, 3,
    90       // Values
    91       2, 6
    92   };
    93   uint32_t correct_size = sizeof(correct_data);
    95   std_map_.insert(std::make_pair(1, 2));
    96   std_map_.insert(std::make_pair(3, 6));
    98   serialized_data_ = serializer_.Serialize(std_map_, &serialized_size_);
   100   EXPECT_EQ(correct_size, serialized_size_);
   101   EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
   102 }
   104 TEST_F(TestStdMapSerializer, MapWithFiveElementsTestCase) {
   105   const int32_t correct_data[] = {
   106       // # of nodes
   107       5,
   108       // Offsets
   109       44, 48, 52, 56, 60,
   110       // Keys
   111       1, 2, 3, 4, 5,
   112       // Values
   113       11, 12, 13, 14, 15
   114   };
   115   uint32_t correct_size = sizeof(correct_data);
   117   for (int i = 1; i < 6; ++i)
   118     std_map_.insert(std::make_pair(i, 10 + i));
   120   serialized_data_ = serializer_.Serialize(std_map_, &serialized_size_);
   122   EXPECT_EQ(correct_size, serialized_size_);
   123   EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
   124 }
   126 class TestAddressMapSerializer : public ::testing::Test {
   127  protected:
   128   void SetUp() {
   129     serialized_size_ = 0;
   130     serialized_data_ = 0;
   131   }
   133   void TearDown() {
   134     delete [] serialized_data_;
   135   }
   137   google_breakpad::AddressMap<AddrType, EntryType> address_map_;
   138   google_breakpad::AddressMapSerializer<AddrType, EntryType> serializer_;
   139   uint32_t serialized_size_;
   140   char *serialized_data_;
   141 };
   143 TEST_F(TestAddressMapSerializer, EmptyMapTestCase) {
   144   const int32_t correct_data[] = { 0 };
   145   uint32_t correct_size = sizeof(correct_data);
   147   // std_map_ is empty.
   148   serialized_data_ = serializer_.Serialize(address_map_, &serialized_size_);
   150   EXPECT_EQ(correct_size, serialized_size_);
   151   EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
   152 }
   154 TEST_F(TestAddressMapSerializer, MapWithTwoElementsTestCase) {
   155   const int32_t correct_data[] = {
   156       // # of nodes
   157       2,
   158       // Offsets
   159       20, 24,
   160       // Keys
   161       1, 3,
   162       // Values
   163       2, 6
   164   };
   165   uint32_t correct_size = sizeof(correct_data);
   167   address_map_.Store(1, 2);
   168   address_map_.Store(3, 6);
   170   serialized_data_ = serializer_.Serialize(address_map_, &serialized_size_);
   172   EXPECT_EQ(correct_size, serialized_size_);
   173   EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
   174 }
   176 TEST_F(TestAddressMapSerializer, MapWithFourElementsTestCase) {
   177   const int32_t correct_data[] = {
   178       // # of nodes
   179       4,
   180       // Offsets
   181       36, 40, 44, 48,
   182       // Keys
   183       -6, -4, 8, 123,
   184       // Values
   185       2, 3, 5, 8
   186   };
   187   uint32_t correct_size = sizeof(correct_data);
   189   address_map_.Store(-6, 2);
   190   address_map_.Store(-4, 3);
   191   address_map_.Store(8, 5);
   192   address_map_.Store(123, 8);
   194   serialized_data_ = serializer_.Serialize(address_map_, &serialized_size_);
   196   EXPECT_EQ(correct_size, serialized_size_);
   197   EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
   198 }
   201 class TestRangeMapSerializer : public ::testing::Test {
   202  protected:
   203   void SetUp() {
   204     serialized_size_ = 0;
   205     serialized_data_ = 0;
   206   }
   208   void TearDown() {
   209     delete [] serialized_data_;
   210   }
   212   google_breakpad::RangeMap<AddrType, EntryType> range_map_;
   213   google_breakpad::RangeMapSerializer<AddrType, EntryType> serializer_;
   214   uint32_t serialized_size_;
   215   char *serialized_data_;
   216 };
   218 TEST_F(TestRangeMapSerializer, EmptyMapTestCase) {
   219   const int32_t correct_data[] = { 0 };
   220   uint32_t correct_size = sizeof(correct_data);
   222   // range_map_ is empty.
   223   serialized_data_ = serializer_.Serialize(range_map_, &serialized_size_);
   225   EXPECT_EQ(correct_size, serialized_size_);
   226   EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
   227 }
   229 TEST_F(TestRangeMapSerializer, MapWithOneRangeTestCase) {
   230   const int32_t correct_data[] = {
   231       // # of nodes
   232       1,
   233       // Offsets
   234       12,
   235       // Keys: high address
   236       10,
   237       // Values: (low address, entry) pairs
   238       1, 6
   239   };
   240   uint32_t correct_size = sizeof(correct_data);
   242   range_map_.StoreRange(1, 10, 6);
   244   serialized_data_ = serializer_.Serialize(range_map_, &serialized_size_);
   246   EXPECT_EQ(correct_size, serialized_size_);
   247   EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
   248 }
   250 TEST_F(TestRangeMapSerializer, MapWithThreeRangesTestCase) {
   251   const int32_t correct_data[] = {
   252       // # of nodes
   253       3,
   254       // Offsets
   255       28,    36,    44,
   256       // Keys: high address
   257       5,     9,     20,
   258       // Values: (low address, entry) pairs
   259       2, 1,  6, 2,  10, 3
   260   };
   261   uint32_t correct_size = sizeof(correct_data);
   263   ASSERT_TRUE(range_map_.StoreRange(2, 4, 1));
   264   ASSERT_TRUE(range_map_.StoreRange(6, 4, 2));
   265   ASSERT_TRUE(range_map_.StoreRange(10, 11, 3));
   267   serialized_data_ = serializer_.Serialize(range_map_, &serialized_size_);
   269   EXPECT_EQ(correct_size, serialized_size_);
   270   EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
   271 }
   274 class TestContainedRangeMapSerializer : public ::testing::Test {
   275  protected:
   276   void SetUp() {
   277     serialized_size_ = 0;
   278     serialized_data_ = 0;
   279   }
   281   void TearDown() {
   282     delete [] serialized_data_;
   283   }
   285   google_breakpad::ContainedRangeMap<AddrType, EntryType> crm_map_;
   286   google_breakpad::ContainedRangeMapSerializer<AddrType, EntryType> serializer_;
   287   uint32_t serialized_size_;
   288   char *serialized_data_;
   289 };
   291 TEST_F(TestContainedRangeMapSerializer, EmptyMapTestCase) {
   292   const int32_t correct_data[] = {
   293       0,  // base address of root
   294       4,  // size of entry
   295       0,  // entry stored at root
   296       0   // empty map stored at root
   297   };
   298   uint32_t correct_size = sizeof(correct_data);
   300   // crm_map_ is empty.
   301   serialized_data_ = serializer_.Serialize(&crm_map_, &serialized_size_);
   303   EXPECT_EQ(correct_size, serialized_size_);
   304   EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
   305 }
   307 TEST_F(TestContainedRangeMapSerializer, MapWithOneRangeTestCase) {
   308   const int32_t correct_data[] = {
   309       0,  // base address of root
   310       4,  // size of entry
   311       0,  // entry stored at root
   312       // Map stored at root node:
   313       1,  // # of nodes
   314       12, // offset
   315       9,  // key
   316       // value: a child ContainedRangeMap
   317       3,  // base address of child CRM
   318       4,  // size of entry
   319       -1, // entry stored in child CRM
   320       0   // empty sub-map stored in child CRM
   321   };
   322   uint32_t correct_size = sizeof(correct_data);
   324   crm_map_.StoreRange(3, 7, -1);
   326   serialized_data_ = serializer_.Serialize(&crm_map_, &serialized_size_);
   328   EXPECT_EQ(correct_size, serialized_size_);
   329   EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
   330 }
   332 TEST_F(TestContainedRangeMapSerializer, MapWithTwoLevelsTestCase) {
   333   // Tree structure of ranges:
   334   //           root              level 0
   335   //            |
   336   //           map
   337   //         /     \             level 1: child1, child2
   338   //      2~8      10~20
   339   //       |         |
   340   //      map       map
   341   //     /   \       |
   342   //    3~4 6~7    16-20         level 2: grandchild1, grandchild2, grandchild3
   344   const int32_t correct_data[] = {
   345       // root: base, entry_size, entry
   346       0, 4, 0,
   347       // root's map: # of nodes, offset1, offset2, key1, key2
   348       2, 20, 84, 8, 20,
   349       // child1: base, entry_size, entry:
   350       2, 4, -1,
   351       // child1's map: # of nodes, offset1, offset2, key1, key2
   352       2, 20, 36, 4, 7,
   353         // grandchild1: base, entry_size, entry, empty_map
   354         3, 4, -1, 0,
   355         // grandchild2: base, entry_size, entry, empty_map
   356         6, 4, -1, 0,
   357       // child2: base, entry_size, entry:
   358       10, 4, -1,
   359       // child2's map: # of nodes, offset1, key1
   360       1, 12, 20,
   361         // grandchild3: base, entry_size, entry, empty_map
   362         16, 4, -1, 0
   363   };
   364   uint32_t correct_size = sizeof(correct_data);
   366   // Store child1.
   367   ASSERT_TRUE(crm_map_.StoreRange(2, 7, -1));
   368   // Store child2.
   369   ASSERT_TRUE(crm_map_.StoreRange(10, 11, -1));
   370   // Store grandchild1.
   371   ASSERT_TRUE(crm_map_.StoreRange(3, 2, -1));
   372   // Store grandchild2.
   373   ASSERT_TRUE(crm_map_.StoreRange(6, 2, -1));
   374   // Store grandchild3.
   375   ASSERT_TRUE(crm_map_.StoreRange(16, 5, -1));
   377   serialized_data_ = serializer_.Serialize(&crm_map_, &serialized_size_);
   379   EXPECT_EQ(correct_size, serialized_size_);
   380   EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);
   381 }
   384 int main(int argc, char *argv[]) {
   385   ::testing::InitGoogleTest(&argc, argv);
   387   return RUN_ALL_TESTS();
   388 }

mercurial