blob: b1d9c62af18cd78d455ae45efa7d244267fee107 [file] [log] [blame]
Evgeniy Stepanovbec2f0e2011-03-05 12:50:33 +03001/* Copyright (c) 2008-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 * * Neither the name of Google Inc. nor the names of its
11 * contributors may be used to endorse or promote products derived from
12 * this software without specific prior written permission.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
18 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
20 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27// This file is part of ThreadSanitizer, a dynamic data race detector.
28// Author: Konstantin Serebryany.
29
30// This file contains tests for various parts of ThreadSanitizer.
31
32#include <gtest/gtest.h>
33
34#include "ts_heap_info.h"
35#include "ts_simple_cache.h"
36
37// Testing the HeapMap.
38struct TestHeapInfo {
39 uintptr_t ptr;
40 uintptr_t size;
41 int val;
42 TestHeapInfo() : ptr(0), size(0), val(0) { }
43 TestHeapInfo(uintptr_t p, uintptr_t s, uintptr_t v) :
44 ptr(p), size(s), val(v) { }
45};
46
47TEST(ThreadSanitizer, HeapInfoTest) {
48 HeapMap<TestHeapInfo> map;
49 TestHeapInfo *info;
50 EXPECT_EQ(0U, map.size());
51 EXPECT_EQ(NULL, map.GetInfo(12345));
52
53 // Insert range [1000, 1000+100) with value 1.
54 map.InsertInfo(1000, TestHeapInfo(1000, 100, 1));
55 EXPECT_EQ(1U, map.size());
56 info = map.GetInfo(1000);
57 EXPECT_TRUE(info);
58 EXPECT_EQ(1000U, info->ptr);
59 EXPECT_EQ(100U, info->size);
60 EXPECT_EQ(1, info->val);
61
62 EXPECT_TRUE(map.GetInfo(1000));
63 EXPECT_EQ(1, info->val);
64 EXPECT_TRUE(map.GetInfo(1050));
65 EXPECT_EQ(1, info->val);
66 EXPECT_TRUE(map.GetInfo(1099));
67 EXPECT_EQ(1, info->val);
68 EXPECT_FALSE(map.GetInfo(1100));
69 EXPECT_FALSE(map.GetInfo(2000));
70
71 EXPECT_EQ(NULL, map.GetInfo(2000));
72 EXPECT_EQ(NULL, map.GetInfo(3000));
73
74 // Insert range [2000, 2000+200) with value 2.
75 map.InsertInfo(2000, TestHeapInfo(2000, 200, 2));
76 EXPECT_EQ(2U, map.size());
77
78 info = map.GetInfo(1000);
79 EXPECT_TRUE(info);
80 EXPECT_EQ(1, info->val);
81
82 info = map.GetInfo(2000);
83 EXPECT_TRUE(info);
84 EXPECT_EQ(2, info->val);
85
86 info = map.GetInfo(1000);
87 EXPECT_TRUE(info);
88 EXPECT_EQ(1, info->val);
89 EXPECT_TRUE((info = map.GetInfo(1050)));
90 EXPECT_EQ(1, info->val);
91 EXPECT_TRUE((info = map.GetInfo(1099)));
92 EXPECT_EQ(1, info->val);
93 EXPECT_FALSE(map.GetInfo(1100));
94
95 EXPECT_TRUE((info = map.GetInfo(2000)));
96 EXPECT_EQ(2, info->val);
97 EXPECT_TRUE((info = map.GetInfo(2199)));
98 EXPECT_EQ(2, info->val);
99
100 EXPECT_FALSE(map.GetInfo(2200));
101 EXPECT_FALSE(map.GetInfo(3000));
102
103 // Insert range [3000, 3000+300) with value 3.
104 map.InsertInfo(3000, TestHeapInfo(3000, 300, 3));
105 EXPECT_EQ(3U, map.size());
106
107 EXPECT_TRUE((info = map.GetInfo(1000)));
108 EXPECT_EQ(1, info->val);
109
110 EXPECT_TRUE((info = map.GetInfo(2000)));
111 EXPECT_EQ(2, info->val);
112
113 EXPECT_TRUE((info = map.GetInfo(3000)));
114 EXPECT_EQ(3, info->val);
115
116 EXPECT_TRUE((info = map.GetInfo(1050)));
117 EXPECT_EQ(1, info->val);
118
119 EXPECT_TRUE((info = map.GetInfo(2100)));
120 EXPECT_EQ(2, info->val);
121
122 EXPECT_TRUE((info = map.GetInfo(3200)));
123 EXPECT_EQ(3, info->val);
124
125 // Remove range [2000,2000+200)
126 map.EraseInfo(2000);
127 EXPECT_EQ(2U, map.size());
128
129 EXPECT_TRUE((info = map.GetInfo(1050)));
130 EXPECT_EQ(1, info->val);
131
132 EXPECT_FALSE(map.GetInfo(2100));
133
134 EXPECT_TRUE((info = map.GetInfo(3200)));
135 EXPECT_EQ(3, info->val);
136
137}
138
139TEST(ThreadSanitizer, PtrToBoolCacheTest) {
140 PtrToBoolCache<256> c;
141 bool val = false;
142 EXPECT_FALSE(c.Lookup(123, &val));
143
144 c.Insert(0, false);
145 c.Insert(1, true);
146 c.Insert(2, false);
147 c.Insert(3, true);
148
149 EXPECT_TRUE(c.Lookup(0, &val));
150 EXPECT_EQ(false, val);
151 EXPECT_TRUE(c.Lookup(1, &val));
152 EXPECT_EQ(true, val);
153 EXPECT_TRUE(c.Lookup(2, &val));
154 EXPECT_EQ(false, val);
155 EXPECT_TRUE(c.Lookup(3, &val));
156 EXPECT_EQ(true, val);
157
158 EXPECT_FALSE(c.Lookup(256, &val));
159 EXPECT_FALSE(c.Lookup(257, &val));
160 EXPECT_FALSE(c.Lookup(258, &val));
161 EXPECT_FALSE(c.Lookup(259, &val));
162
163 c.Insert(0, true);
164 c.Insert(1, false);
165
166 EXPECT_TRUE(c.Lookup(0, &val));
167 EXPECT_EQ(true, val);
168 EXPECT_TRUE(c.Lookup(1, &val));
169 EXPECT_EQ(false, val);
170 EXPECT_TRUE(c.Lookup(2, &val));
171 EXPECT_EQ(false, val);
172 EXPECT_TRUE(c.Lookup(3, &val));
173 EXPECT_EQ(true, val);
174
175 c.Insert(256, false);
176 c.Insert(257, false);
177 EXPECT_FALSE(c.Lookup(0, &val));
178 EXPECT_FALSE(c.Lookup(1, &val));
179 EXPECT_TRUE(c.Lookup(2, &val));
180 EXPECT_EQ(false, val);
181 EXPECT_TRUE(c.Lookup(3, &val));
182 EXPECT_EQ(true, val);
183 EXPECT_TRUE(c.Lookup(256, &val));
184 EXPECT_EQ(false, val);
185 EXPECT_TRUE(c.Lookup(257, &val));
186 EXPECT_EQ(false, val);
187}
188
189TEST(ThreadSanitizer, IntPairToBoolCacheTest) {
190 IntPairToBoolCache<257> c;
191 bool val = false;
192 map<pair<int,int>, bool> m;
193
194 for (int i = 0; i < 1000000; i++) {
195 int a = (rand() % 1024) + 1;
196 int b = (rand() % 1024) + 1;
197
198 if (c.Lookup(a, b, &val)) {
199 EXPECT_EQ(1U, m.count(make_pair(a,b)));
200 EXPECT_EQ(val, m[make_pair(a,b)]);
201 }
202
203 val = (rand() % 2) == 1;
204 c.Insert(a, b, val);
205 m[make_pair(a,b)] = val;
206 }
207}
208
209int main(int argc, char **argv) {
210 testing::InitGoogleTest(&argc, argv);
211 return RUN_ALL_TESTS();
212}