1 : // Copyright 2011 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 : // Unittests for iteration primitives.
16 :
17 : #include "syzygy/block_graph/iterate.h"
18 :
19 : #include "base/bind.h"
20 : #include "gmock/gmock.h"
21 : #include "gtest/gtest.h"
22 :
23 : namespace block_graph {
24 :
25 : using testing::_;
26 : using testing::Invoke;
27 : using testing::Return;
28 : using testing::StrictMock;
29 :
30 : namespace {
31 :
32 : class IterationTest : public testing::Test {
33 : public:
34 E : virtual void SetUp() {
35 E : header_block_ = block_graph_.AddBlock(BlockGraph::DATA_BLOCK, 10, "Header");
36 :
37 : // Create a text section with some blocks.
38 E : BlockGraph::Section* section = block_graph_.AddSection(".text", 0);
39 : BlockGraph::Block* block = block_graph_.AddBlock(
40 E : BlockGraph::CODE_BLOCK, 10, "FunctionA");
41 E : block->set_section(section->id());
42 :
43 : // Create a data section with some blocks.
44 E : section = block_graph_.AddSection(".data", 0);
45 : block = block_graph_.AddBlock(
46 E : BlockGraph::DATA_BLOCK, 10, "DatumA");
47 E : block->set_section(section->id());
48 E : }
49 :
50 : protected:
51 : BlockGraph block_graph_;
52 : BlockGraph::Block* header_block_;
53 : };
54 :
55 : class MockIterationCallback {
56 : public:
57 : MOCK_METHOD2(OnBlock, bool(BlockGraph* block_graph,
58 E : BlockGraph::Block* block));
59 :
60 E : bool DeleteBlock(BlockGraph* block_graph, BlockGraph::Block* block) {
61 E : return block_graph->RemoveBlock(block);
62 E : }
63 :
64 E : bool AddBlock(BlockGraph* block_graph, BlockGraph::Block* block) {
65 : BlockGraph::Block* new_block = block_graph->AddBlock(
66 E : block->type(), 10, "New block");
67 E : return new_block != NULL;
68 E : }
69 : };
70 :
71 : } // namespace
72 :
73 E : TEST_F(IterationTest, Iterate) {
74 E : StrictMock<MockIterationCallback> callback;
75 :
76 : EXPECT_CALL(callback, OnBlock(_, _)).Times(3).
77 E : WillRepeatedly(Return(true));
78 :
79 : EXPECT_TRUE(IterateBlockGraph(
80 : base::Bind(&MockIterationCallback::OnBlock,
81 : base::Unretained(&callback)),
82 E : &block_graph_));
83 E : EXPECT_EQ(3u, block_graph_.blocks().size());
84 E : }
85 :
86 E : TEST_F(IterationTest, IterateDelete) {
87 E : StrictMock<MockIterationCallback> callback;
88 :
89 : EXPECT_CALL(callback, OnBlock(_, _)).Times(3).
90 : WillOnce(Return(true)).
91 : WillOnce(Invoke(&callback, &MockIterationCallback::DeleteBlock)).
92 E : WillOnce(Return(true));
93 :
94 : EXPECT_TRUE(IterateBlockGraph(
95 : base::Bind(&MockIterationCallback::OnBlock,
96 : base::Unretained(&callback)),
97 E : &block_graph_));
98 E : EXPECT_EQ(2u, block_graph_.blocks().size());
99 E : }
100 :
101 E : TEST_F(IterationTest, IterateAdd) {
102 E : StrictMock<MockIterationCallback> callback;
103 :
104 : EXPECT_CALL(callback, OnBlock(_, _)).Times(3).
105 : WillOnce(Return(true)).
106 : WillOnce(Invoke(&callback, &MockIterationCallback::AddBlock)).
107 E : WillOnce(Return(true));
108 :
109 : EXPECT_TRUE(IterateBlockGraph(
110 : base::Bind(&MockIterationCallback::OnBlock,
111 : base::Unretained(&callback)),
112 E : &block_graph_));
113 E : EXPECT_EQ(4u, block_graph_.blocks().size());
114 E : }
115 :
116 E : TEST_F(IterationTest, IterateDeleteAdd) {
117 E : StrictMock<MockIterationCallback> callback;
118 :
119 : EXPECT_CALL(callback, OnBlock(_, _)).Times(3).
120 : WillOnce(Invoke(&callback, &MockIterationCallback::DeleteBlock)).
121 : WillOnce(Invoke(&callback, &MockIterationCallback::AddBlock)).
122 E : WillOnce(Return(true));
123 :
124 : EXPECT_TRUE(IterateBlockGraph(
125 : base::Bind(&MockIterationCallback::OnBlock,
126 : base::Unretained(&callback)),
127 E : &block_graph_));
128 E : EXPECT_EQ(3u, block_graph_.blocks().size());
129 E : }
130 :
131 : } // namespace block_graph
|