//===-- sanitizer_addrhashmap_test.cpp ------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "sanitizer_common/sanitizer_addrhashmap.h" #include #include "gtest/gtest.h" namespace __sanitizer { struct Value { int payload; inline bool operator==(const Value& rhs) const { return payload == rhs.payload; } }; using MapTy = AddrHashMap; using HandleTy = MapTy::Handle; using RefMapTy = std::unordered_map; static void ExistsInReferenceMap(const uptr key, const Value& val, void* arg) { RefMapTy* ref = reinterpret_cast(arg); const RefMapTy::iterator iter = ref->find(key); ASSERT_NE(iter, ref->end()); EXPECT_EQ(iter->second, val); ref->erase(iter); } TEST(AddrHashMap, Basic) { // Use a reference implementation to compare with. RefMapTy reference_map{ {0x1000, {1}}, {0x2000, {2}}, {0x3000, {3}}, }; MapTy m; for (const auto& key_val : reference_map) { const uptr key = key_val.first; const Value val = key_val.second; // Insert all the elements. { HandleTy h(&m, key); ASSERT_TRUE(h.created()); h->payload = val.payload; } } // Now check that all the elements are present. m.ForEach(ExistsInReferenceMap, &reference_map); EXPECT_TRUE(reference_map.empty()); } } // namespace __sanitizer