xref: /llvm-project/compiler-rt/lib/sanitizer_common/tests/sanitizer_addrhashmap_test.cpp (revision d19470540a0769313d219295f245975af5589edb)
1*d1947054SSnehasish Kumar //===-- sanitizer_addrhashmap_test.cpp ------------------------------------===//
2*d1947054SSnehasish Kumar //
3*d1947054SSnehasish Kumar // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*d1947054SSnehasish Kumar // See https://llvm.org/LICENSE.txt for license information.
5*d1947054SSnehasish Kumar // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*d1947054SSnehasish Kumar //
7*d1947054SSnehasish Kumar //===----------------------------------------------------------------------===//
8*d1947054SSnehasish Kumar #include "sanitizer_common/sanitizer_addrhashmap.h"
9*d1947054SSnehasish Kumar 
10*d1947054SSnehasish Kumar #include <unordered_map>
11*d1947054SSnehasish Kumar 
12*d1947054SSnehasish Kumar #include "gtest/gtest.h"
13*d1947054SSnehasish Kumar 
14*d1947054SSnehasish Kumar namespace __sanitizer {
15*d1947054SSnehasish Kumar 
16*d1947054SSnehasish Kumar struct Value {
17*d1947054SSnehasish Kumar   int payload;
operator ==__sanitizer::Value18*d1947054SSnehasish Kumar   inline bool operator==(const Value& rhs) const {
19*d1947054SSnehasish Kumar     return payload == rhs.payload;
20*d1947054SSnehasish Kumar   }
21*d1947054SSnehasish Kumar };
22*d1947054SSnehasish Kumar 
23*d1947054SSnehasish Kumar using MapTy = AddrHashMap<Value, 11>;
24*d1947054SSnehasish Kumar using HandleTy = MapTy::Handle;
25*d1947054SSnehasish Kumar using RefMapTy = std::unordered_map<uptr, Value>;
26*d1947054SSnehasish Kumar 
ExistsInReferenceMap(const uptr key,const Value & val,void * arg)27*d1947054SSnehasish Kumar static void ExistsInReferenceMap(const uptr key, const Value& val, void* arg) {
28*d1947054SSnehasish Kumar   RefMapTy* ref = reinterpret_cast<RefMapTy*>(arg);
29*d1947054SSnehasish Kumar   const RefMapTy::iterator iter = ref->find(key);
30*d1947054SSnehasish Kumar   ASSERT_NE(iter, ref->end());
31*d1947054SSnehasish Kumar   EXPECT_EQ(iter->second, val);
32*d1947054SSnehasish Kumar   ref->erase(iter);
33*d1947054SSnehasish Kumar }
34*d1947054SSnehasish Kumar 
TEST(AddrHashMap,Basic)35*d1947054SSnehasish Kumar TEST(AddrHashMap, Basic) {
36*d1947054SSnehasish Kumar   // Use a reference implementation to compare with.
37*d1947054SSnehasish Kumar   RefMapTy reference_map{
38*d1947054SSnehasish Kumar       {0x1000, {1}},
39*d1947054SSnehasish Kumar       {0x2000, {2}},
40*d1947054SSnehasish Kumar       {0x3000, {3}},
41*d1947054SSnehasish Kumar   };
42*d1947054SSnehasish Kumar 
43*d1947054SSnehasish Kumar   MapTy m;
44*d1947054SSnehasish Kumar 
45*d1947054SSnehasish Kumar   for (const auto& key_val : reference_map) {
46*d1947054SSnehasish Kumar     const uptr key = key_val.first;
47*d1947054SSnehasish Kumar     const Value val = key_val.second;
48*d1947054SSnehasish Kumar 
49*d1947054SSnehasish Kumar     // Insert all the elements.
50*d1947054SSnehasish Kumar     {
51*d1947054SSnehasish Kumar       HandleTy h(&m, key);
52*d1947054SSnehasish Kumar       ASSERT_TRUE(h.created());
53*d1947054SSnehasish Kumar       h->payload = val.payload;
54*d1947054SSnehasish Kumar     }
55*d1947054SSnehasish Kumar   }
56*d1947054SSnehasish Kumar 
57*d1947054SSnehasish Kumar   // Now check that all the elements are present.
58*d1947054SSnehasish Kumar   m.ForEach(ExistsInReferenceMap, &reference_map);
59*d1947054SSnehasish Kumar   EXPECT_TRUE(reference_map.empty());
60*d1947054SSnehasish Kumar }
61*d1947054SSnehasish Kumar 
62*d1947054SSnehasish Kumar }  // namespace __sanitizer
63