| //===-- 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 <unordered_map> |
| |
| #include "gtest/gtest.h" |
| |
| namespace __sanitizer { |
| |
| struct Value { |
| int payload; |
| inline bool operator==(const Value& rhs) const { |
| return payload == rhs.payload; |
| } |
| }; |
| |
| using MapTy = AddrHashMap<Value, 11>; |
| using HandleTy = MapTy::Handle; |
| using RefMapTy = std::unordered_map<uptr, Value>; |
| |
| static void ExistsInReferenceMap(const uptr key, const Value& val, void* arg) { |
| RefMapTy* ref = reinterpret_cast<RefMapTy*>(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 |