13ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// Copyright (c) 2008, Google Inc. 23ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// All rights reserved. 33ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// 43ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// Redistribution and use in source and binary forms, with or without 53ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// modification, are permitted provided that the following conditions are 63ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// met: 73ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// 83ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// * Redistributions of source code must retain the above copyright 93ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// notice, this list of conditions and the following disclaimer. 103ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// * Redistributions in binary form must reproduce the above 113ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// copyright notice, this list of conditions and the following disclaimer 123ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// in the documentation and/or other materials provided with the 133ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// distribution. 143ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// * Neither the name of Google Inc. nor the names of its 153ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// contributors may be used to endorse or promote products derived from 163ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// this software without specific prior written permission. 173ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// 183ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 193ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 203ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 213ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 223ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 233ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 243ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 253ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 263ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 273ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 283ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 293ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 30303311b8370b307ea38201fc3ad241a5610f8cfcrsesek@chromium.org#include "breakpad_googletest_includes.h" 31303311b8370b307ea38201fc3ad241a5610f8cfcrsesek@chromium.org#include "common/simple_string_dictionary.h" 323ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 33303311b8370b307ea38201fc3ad241a5610f8cfcrsesek@chromium.orgnamespace google_breakpad { 343ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 35c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.orgTEST(NonAllocatingMapTest, Entry) { 36c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org typedef NonAllocatingMap<5, 9, 15> TestMap; 37c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org TestMap map; 38c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 39c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org const TestMap::Entry* entry = TestMap::Iterator(map).Next(); 40c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_FALSE(entry); 41c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 42c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org // Try setting a key/value and then verify. 43c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map.SetKeyValue("key1", "value1"); 44c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org entry = TestMap::Iterator(map).Next(); 45c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org ASSERT_TRUE(entry); 46c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ(entry->key, "key1"); 47c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ(entry->value, "value1"); 48c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 49c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org // Try setting a new value. 50c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map.SetKeyValue("key1", "value3"); 51c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ(entry->value, "value3"); 52c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 53c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org // Make sure the key didn't change. 54c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ(entry->key, "key1"); 55c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 56c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org // Clear the entry and verify the key and value are empty strings. 57c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map.RemoveKey("key1"); 58c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_FALSE(entry->is_active()); 59c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_EQ(strlen(entry->key), 0u); 60c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_EQ(strlen(entry->value), 0u); 613ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid} 623ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 63c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.orgTEST(NonAllocatingMapTest, SimpleStringDictionary) { 643ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // Make a new dictionary 65c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org SimpleStringDictionary dict; 663ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 673ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // Set three distinct values on three keys 68c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org dict.SetKeyValue("key1", "value1"); 69c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org dict.SetKeyValue("key2", "value2"); 70c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org dict.SetKeyValue("key3", "value3"); 71c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 72c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_NE(dict.GetValueForKey("key1"), "value1"); 73c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_NE(dict.GetValueForKey("key2"), "value2"); 74c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_NE(dict.GetValueForKey("key3"), "value3"); 75c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_EQ(dict.GetCount(), 3u); 763ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // try an unknown key 77c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_FALSE(dict.GetValueForKey("key4")); 783ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 793ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // Remove a key 80c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org dict.RemoveKey("key3"); 813ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 823ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // Now make sure it's not there anymore 83c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_FALSE(dict.GetValueForKey("key3")); 843ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 853ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // Remove by setting value to NULL 86c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org dict.SetKeyValue("key2", NULL); 873ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 883ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // Now make sure it's not there anymore 89c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_FALSE(dict.GetValueForKey("key2")); 903ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid} 913ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 92c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.orgTEST(NonAllocatingMapTest, CopyAndAssign) { 93c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org NonAllocatingMap<10, 10, 10> map; 94c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map.SetKeyValue("one", "a"); 95c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map.SetKeyValue("two", "b"); 96c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map.SetKeyValue("three", "c"); 97c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map.RemoveKey("two"); 98c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_EQ(2u, map.GetCount()); 99c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 100c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org // Test copy. 101c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org NonAllocatingMap<10, 10, 10> map_copy(map); 102c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_EQ(2u, map_copy.GetCount()); 103c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ("a", map_copy.GetValueForKey("one")); 104c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ("c", map_copy.GetValueForKey("three")); 105c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map_copy.SetKeyValue("four", "d"); 106c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ("d", map_copy.GetValueForKey("four")); 107c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_FALSE(map.GetValueForKey("four")); 108c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 109c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org // Test assign. 110c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org NonAllocatingMap<10, 10, 10> map_assign; 111c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map_assign = map; 112c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_EQ(2u, map_assign.GetCount()); 113c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ("a", map_assign.GetValueForKey("one")); 114c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ("c", map_assign.GetValueForKey("three")); 115c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map_assign.SetKeyValue("four", "d"); 116c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ("d", map_assign.GetValueForKey("four")); 117c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_FALSE(map.GetValueForKey("four")); 118c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 119c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map.RemoveKey("one"); 120c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_FALSE(map.GetValueForKey("one")); 121c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ("a", map_copy.GetValueForKey("one")); 122c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ("a", map_assign.GetValueForKey("one")); 123c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org} 124c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 125c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org// Add a bunch of values to the dictionary, remove some entries in the middle, 126c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org// and then add more. 127c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.orgTEST(NonAllocatingMapTest, Iterator) { 128c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org SimpleStringDictionary* dict = new SimpleStringDictionary(); 129303311b8370b307ea38201fc3ad241a5610f8cfcrsesek@chromium.org ASSERT_TRUE(dict); 1303ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 131c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org char key[SimpleStringDictionary::key_size]; 132c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org char value[SimpleStringDictionary::value_size]; 1333ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 134c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org const int kDictionaryCapacity = SimpleStringDictionary::num_entries; 1353ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid const int kPartitionIndex = kDictionaryCapacity - 5; 1363ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 1373ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // We assume at least this size in the tests below 138303311b8370b307ea38201fc3ad241a5610f8cfcrsesek@chromium.org ASSERT_GE(kDictionaryCapacity, 64); 1393ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 1403ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // We'll keep track of the number of key/value pairs we think should 1413ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // be in the dictionary 1423ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid int expectedDictionarySize = 0; 1433ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 1443ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // Set a bunch of key/value pairs like key0/value0, key1/value1, ... 1453ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid for (int i = 0; i < kPartitionIndex; ++i) { 1463ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid sprintf(key, "key%d", i); 1473ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid sprintf(value, "value%d", i); 1483ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid dict->SetKeyValue(key, value); 1493ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid } 1503ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid expectedDictionarySize = kPartitionIndex; 1513ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 1523ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // set a couple of the keys twice (with the same value) - should be nop 1533ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid dict->SetKeyValue("key2", "value2"); 1543ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid dict->SetKeyValue("key4", "value4"); 1553ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid dict->SetKeyValue("key15", "value15"); 1563ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 1573ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // Remove some random elements in the middle 1583ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid dict->RemoveKey("key7"); 1593ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid dict->RemoveKey("key18"); 1603ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid dict->RemoveKey("key23"); 1613ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid dict->RemoveKey("key31"); 1623ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid expectedDictionarySize -= 4; // we just removed four key/value pairs 1633ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 1643ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // Set some more key/value pairs like key59/value59, key60/value60, ... 1653ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid for (int i = kPartitionIndex; i < kDictionaryCapacity; ++i) { 1663ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid sprintf(key, "key%d", i); 1673ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid sprintf(value, "value%d", i); 1683ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid dict->SetKeyValue(key, value); 1693ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid } 1703ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid expectedDictionarySize += kDictionaryCapacity - kPartitionIndex; 1713ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 1723ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // Now create an iterator on the dictionary 173c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org SimpleStringDictionary::Iterator iter(*dict); 1743ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 1753ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // We then verify that it iterates through exactly the number of 1763ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // key/value pairs we expect, and that they match one-for-one with what we 1773ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // would expect. The ordering of the iteration does not matter... 1783ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 1793ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // used to keep track of number of occurrences found for key/value pairs 1803ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid int count[kDictionaryCapacity]; 1813ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid memset(count, 0, sizeof(count)); 1823ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 1833ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid int totalCount = 0; 1843ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 185c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org const SimpleStringDictionary::Entry* entry; 1863ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid while ((entry = iter.Next())) { 1873ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid totalCount++; 1883ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 1893ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // Extract keyNumber from a string of the form key<keyNumber> 1903ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid int keyNumber; 191c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org sscanf(entry->key, "key%d", &keyNumber); 1923ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 1933ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // Extract valueNumber from a string of the form value<valueNumber> 1943ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid int valueNumber; 195c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org sscanf(entry->value, "value%d", &valueNumber); 1963ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 1973ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // The value number should equal the key number since that's how we set them 198303311b8370b307ea38201fc3ad241a5610f8cfcrsesek@chromium.org EXPECT_EQ(keyNumber, valueNumber); 1993ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 2003ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // Key and value numbers should be in proper range: 2013ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // 0 <= keyNumber < kDictionaryCapacity 2023ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid bool isKeyInGoodRange = 2033ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid (keyNumber >= 0 && keyNumber < kDictionaryCapacity); 2043ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid bool isValueInGoodRange = 2053ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid (valueNumber >= 0 && valueNumber < kDictionaryCapacity); 206303311b8370b307ea38201fc3ad241a5610f8cfcrsesek@chromium.org EXPECT_TRUE(isKeyInGoodRange); 207303311b8370b307ea38201fc3ad241a5610f8cfcrsesek@chromium.org EXPECT_TRUE(isValueInGoodRange); 2083ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 2093ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid if (isKeyInGoodRange && isValueInGoodRange) { 2103ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid ++count[keyNumber]; 2113ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid } 2123ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid } 2133ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 2143ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // Make sure each of the key/value pairs showed up exactly one time, except 2153ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // for the ones which we removed. 216c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org for (size_t i = 0; i < kDictionaryCapacity; ++i) { 2173ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // Skip over key7, key18, key23, and key31, since we removed them 2183ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid if (!(i == 7 || i == 18 || i == 23 || i == 31)) { 219303311b8370b307ea38201fc3ad241a5610f8cfcrsesek@chromium.org EXPECT_EQ(count[i], 1); 2203ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid } 2213ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid } 2223ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 2233ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // Make sure the number of iterations matches the expected dictionary size. 224303311b8370b307ea38201fc3ad241a5610f8cfcrsesek@chromium.org EXPECT_EQ(totalCount, expectedDictionarySize); 2253ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid} 2263ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid 227c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 228c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.orgTEST(NonAllocatingMapTest, AddRemove) { 229c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org NonAllocatingMap<5, 7, 6> map; 230c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map.SetKeyValue("rob", "ert"); 231c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map.SetKeyValue("mike", "pink"); 232c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map.SetKeyValue("mark", "allays"); 233c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 234c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_EQ(3u, map.GetCount()); 235c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ("ert", map.GetValueForKey("rob")); 236c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ("pink", map.GetValueForKey("mike")); 237c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ("allays", map.GetValueForKey("mark")); 238c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 239c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map.RemoveKey("mike"); 240c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 241c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_EQ(2u, map.GetCount()); 242c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_FALSE(map.GetValueForKey("mike")); 243c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 244c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map.SetKeyValue("mark", "mal"); 245c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_EQ(2u, map.GetCount()); 246c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ("mal", map.GetValueForKey("mark")); 247c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 248c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map.RemoveKey("mark"); 249c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_EQ(1u, map.GetCount()); 250c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_FALSE(map.GetValueForKey("mark")); 251c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org} 252c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 253c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.orgTEST(NonAllocatingMapTest, Serialize) { 254c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org typedef NonAllocatingMap<4, 5, 7> TestMap; 255c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org TestMap map; 256c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map.SetKeyValue("one", "abc"); 257c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map.SetKeyValue("two", "def"); 258c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map.SetKeyValue("tre", "hig"); 259c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 260c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ("abc", map.GetValueForKey("one")); 261c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ("def", map.GetValueForKey("two")); 262c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ("hig", map.GetValueForKey("tre")); 263c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 264c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org const SerializedNonAllocatingMap* serialized; 265c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org size_t size = map.Serialize(&serialized); 266c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 267c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org SerializedNonAllocatingMap* serialized_copy = 268c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org reinterpret_cast<SerializedNonAllocatingMap*>(malloc(size)); 269c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org ASSERT_TRUE(serialized_copy); 270c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org memcpy(serialized_copy, serialized, size); 271c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 272c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org TestMap deserialized(serialized_copy, size); 273c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org free(serialized_copy); 274c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 275c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_EQ(3u, deserialized.GetCount()); 276c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ("abc", deserialized.GetValueForKey("one")); 277c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ("def", deserialized.GetValueForKey("two")); 278c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ("hig", deserialized.GetValueForKey("tre")); 279c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org} 280c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 2818160f86c54596ed816378bbd07fb83acbe8154farsesek@chromium.org// Running out of space shouldn't crash. 282c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.orgTEST(NonAllocatingMapTest, OutOfSpace) { 283c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org NonAllocatingMap<3, 2, 2> map; 284c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map.SetKeyValue("a", "1"); 285c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map.SetKeyValue("b", "2"); 2868160f86c54596ed816378bbd07fb83acbe8154farsesek@chromium.org map.SetKeyValue("c", "3"); 2878160f86c54596ed816378bbd07fb83acbe8154farsesek@chromium.org EXPECT_EQ(2u, map.GetCount()); 2888160f86c54596ed816378bbd07fb83acbe8154farsesek@chromium.org EXPECT_FALSE(map.GetValueForKey("c")); 289c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org} 290c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 2918160f86c54596ed816378bbd07fb83acbe8154farsesek@chromium.org#ifndef NDEBUG 2928160f86c54596ed816378bbd07fb83acbe8154farsesek@chromium.org 293c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.orgTEST(NonAllocatingMapTest, NullKey) { 294c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org NonAllocatingMap<4, 6, 6> map; 295c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org ASSERT_DEATH(map.SetKeyValue(NULL, "hello"), ""); 296c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 297c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map.SetKeyValue("hi", "there"); 298c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org ASSERT_DEATH(map.GetValueForKey(NULL), ""); 299c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_STREQ("there", map.GetValueForKey("hi")); 300c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 301c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org ASSERT_DEATH(map.GetValueForKey(NULL), ""); 302c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org map.RemoveKey("hi"); 303c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org EXPECT_EQ(0u, map.GetCount()); 304c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org} 305c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 306c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org#endif // !NDEBUG 307c36fcd7f534887b5f8e83dca2ef445cb05e09463rsesek@chromium.org 308303311b8370b307ea38201fc3ad241a5610f8cfcrsesek@chromium.org} // namespace google_breakpad 309