1 : // Copyright 2015 Google Inc. All Rights Reserved.
2 : //
3 : // Licensed under the Apache License, Version 2.0 (the "License");
4 : // you may not use this file except in compliance with the License.
5 : // You may obtain a copy of the License at
6 : //
7 : // http://www.apache.org/licenses/LICENSE-2.0
8 : //
9 : // Unless required by applicable law or agreed to in writing, software
10 : // distributed under the License is distributed on an "AS IS" BASIS,
11 : // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 : // See the License for the specific language governing permissions and
13 : // limitations under the License.
14 :
15 : #include "syzygy/bard/backdrops/heap_backdrop.h"
16 :
17 : #include "gtest/gtest.h"
18 :
19 : namespace bard {
20 : namespace backdrops {
21 :
22 E : TEST(HeapBackdropTest, StatsTest) {
23 : using EventType = EventInterface::EventType;
24 E : const EventType kFuncType1 = static_cast<EventType>(0);
25 E : const EventType kFuncType2 = static_cast<EventType>(1);
26 :
27 E : HeapBackdrop backdrop;
28 :
29 E : backdrop.UpdateStats(kFuncType1, 0);
30 E : backdrop.UpdateStats(kFuncType2, 0);
31 :
32 E : auto func1 = backdrop.total_stats().find(kFuncType1);
33 E : auto func2 = backdrop.total_stats().find(kFuncType2);
34 :
35 E : backdrop.UpdateStats(kFuncType1, 100);
36 E : EXPECT_EQ(2, func1->second.calls);
37 E : EXPECT_EQ(100, func1->second.time);
38 :
39 E : backdrop.UpdateStats(kFuncType1, 9);
40 E : EXPECT_EQ(3, func1->second.calls);
41 E : EXPECT_EQ(100 + 9, func1->second.time);
42 :
43 E : backdrop.UpdateStats(kFuncType2, 166);
44 E : EXPECT_EQ(2, func2->second.calls);
45 E : EXPECT_EQ(166, func2->second.time);
46 :
47 E : backdrop.UpdateStats(kFuncType1, 34);
48 E : EXPECT_EQ(4, func1->second.calls);
49 E : EXPECT_EQ(100 + 9 + 34, func1->second.time);
50 :
51 E : backdrop.UpdateStats(kFuncType2, 72);
52 E : EXPECT_EQ(3, func2->second.calls);
53 E : EXPECT_EQ(166 + 72, func2->second.time);
54 E : }
55 :
56 E : TEST(HeapBackdropTest, SetProcessHeap) {
57 E : HeapBackdrop backdrop;
58 E : EXPECT_TRUE(backdrop.alloc_map().Empty());
59 E : EXPECT_TRUE(backdrop.heap_map().Empty());
60 :
61 E : void* trace_ph = reinterpret_cast<void*>(0xDEADBEEF);
62 E : backdrop.SetProcessHeap(trace_ph);
63 E : EXPECT_TRUE(backdrop.alloc_map().Empty());
64 E : EXPECT_FALSE(backdrop.heap_map().Empty());
65 E : void* live_ph = ::GetProcessHeap();
66 E : void* ret = nullptr;
67 E : EXPECT_TRUE(backdrop.heap_map().GetTraceFromLive(live_ph, &ret));
68 E : EXPECT_EQ(ret, trace_ph);
69 E : EXPECT_TRUE(backdrop.heap_map().GetLiveFromTrace(trace_ph, &ret));
70 E : EXPECT_EQ(ret, live_ph);
71 :
72 E : EXPECT_TRUE(backdrop.TearDown());
73 E : }
74 :
75 E : TEST(HeapBackdropTest, AddExistingHeap) {
76 E : HeapBackdrop backdrop;
77 E : EXPECT_TRUE(backdrop.alloc_map().Empty());
78 E : EXPECT_TRUE(backdrop.heap_map().Empty());
79 :
80 E : void* eh = reinterpret_cast<void*>(0xDEADBEEF);
81 E : backdrop.AddExistingHeap(eh);
82 E : EXPECT_TRUE(backdrop.alloc_map().Empty());
83 E : EXPECT_FALSE(backdrop.heap_map().Empty());
84 E : void* ret = nullptr;
85 E : EXPECT_TRUE(backdrop.heap_map().GetLiveFromTrace(eh, &ret));
86 E : EXPECT_TRUE(ret != nullptr);
87 :
88 E : EXPECT_TRUE(backdrop.TearDown());
89 E : }
90 :
91 : } // namespace backdrops
92 : } // namespace bard
|