1 : // Copyright 2014 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/core/section_offset_address.h"
16 :
17 : #include "gtest/gtest.h"
18 : #include "syzygy/core/unittest_util.h"
19 :
20 : namespace core {
21 :
22 : namespace {
23 :
24 : const uint32 kSectionId = 2;
25 : const uint32 kOffset = 0xCAFEBABE;
26 :
27 : } // namespace
28 :
29 E : TEST(SectionOffsetAddressTest, DefaultInitialization) {
30 E : SectionOffsetAddress address;
31 E : EXPECT_EQ(0, address.section_id());
32 E : EXPECT_EQ(0, address.offset());
33 E : }
34 :
35 E : TEST(SectionOffsetAddressTest, CreateInitialialized) {
36 E : const uint32 kSectionId = 2;
37 E : const uint32 kOffset = 0xCAFEBABE;
38 :
39 E : SectionOffsetAddress address(kSectionId, kOffset);
40 :
41 E : EXPECT_EQ(kSectionId, address.section_id());
42 E : EXPECT_EQ(kOffset, address.offset());
43 E : }
44 :
45 E : TEST(SectionOffsetAddressTest, ValueComparison) {
46 E : const SectionOffsetAddress::SectionOffset kOne(1, 0);
47 E : const SectionOffsetAddress::SectionOffset kTwo(1, 10);
48 E : const SectionOffsetAddress::SectionOffset kThree(2, 0);
49 :
50 E : EXPECT_TRUE(kOne < kTwo);
51 E : EXPECT_FALSE(kOne < kOne);
52 E : EXPECT_FALSE(kTwo < kOne);
53 E : EXPECT_TRUE(kTwo < kThree);
54 E : EXPECT_FALSE(kThree < kOne);
55 E : EXPECT_FALSE(kThree < kTwo);
56 :
57 E : EXPECT_TRUE(kOne <= kTwo);
58 E : EXPECT_TRUE(kOne <= kOne);
59 E : EXPECT_FALSE(kTwo <= kOne);
60 E : EXPECT_TRUE(kTwo <= kThree);
61 E : EXPECT_FALSE(kThree <= kOne);
62 E : EXPECT_FALSE(kThree <= kTwo);
63 :
64 E : EXPECT_FALSE(kOne > kTwo);
65 E : EXPECT_FALSE(kOne > kOne);
66 E : EXPECT_TRUE(kTwo > kOne);
67 E : EXPECT_FALSE(kTwo > kThree);
68 E : EXPECT_TRUE(kThree > kOne);
69 E : EXPECT_TRUE(kThree > kTwo);
70 :
71 E : EXPECT_FALSE(kOne >= kTwo);
72 E : EXPECT_TRUE(kOne >= kOne);
73 E : EXPECT_TRUE(kTwo >= kOne);
74 E : EXPECT_FALSE(kTwo >= kThree);
75 E : EXPECT_TRUE(kThree >= kOne);
76 E : EXPECT_TRUE(kThree >= kTwo);
77 :
78 E : const SectionOffsetAddress::SectionOffset kOtherOne(1, 0);
79 E : EXPECT_TRUE(kOne == kOtherOne);
80 E : EXPECT_FALSE(kOne == kTwo);
81 E : EXPECT_FALSE(kOne != kOtherOne);
82 E : EXPECT_TRUE(kOne != kTwo);
83 E : }
84 :
85 E : TEST(SectionOffsetAddressTest, Operators) {
86 E : const SectionOffsetAddress kOne(1, 0);
87 E : const SectionOffsetAddress kTwo(1, 10);
88 E : const SectionOffsetAddress kThree(2, 0);
89 :
90 E : EXPECT_TRUE(kOne < kTwo);
91 E : EXPECT_FALSE(kOne < kOne);
92 E : EXPECT_FALSE(kTwo < kOne);
93 E : EXPECT_TRUE(kTwo < kThree);
94 E : EXPECT_FALSE(kThree < kOne);
95 E : EXPECT_FALSE(kThree < kTwo);
96 :
97 E : EXPECT_TRUE(kOne <= kTwo);
98 E : EXPECT_TRUE(kOne <= kOne);
99 E : EXPECT_FALSE(kTwo <= kOne);
100 E : EXPECT_TRUE(kTwo <= kThree);
101 E : EXPECT_FALSE(kThree <= kOne);
102 E : EXPECT_FALSE(kThree <= kTwo);
103 :
104 E : EXPECT_FALSE(kOne > kTwo);
105 E : EXPECT_FALSE(kOne > kOne);
106 E : EXPECT_TRUE(kTwo > kOne);
107 E : EXPECT_FALSE(kTwo > kThree);
108 E : EXPECT_TRUE(kThree > kOne);
109 E : EXPECT_TRUE(kThree > kTwo);
110 :
111 E : EXPECT_FALSE(kOne >= kTwo);
112 E : EXPECT_TRUE(kOne >= kOne);
113 E : EXPECT_TRUE(kTwo >= kOne);
114 E : EXPECT_FALSE(kTwo >= kThree);
115 E : EXPECT_TRUE(kThree >= kOne);
116 E : EXPECT_TRUE(kThree >= kTwo);
117 :
118 E : SectionOffsetAddress addr(kOne);
119 E : EXPECT_TRUE(kOne == addr);
120 E : EXPECT_FALSE(addr == kTwo);
121 E : EXPECT_FALSE(kOne != addr);
122 E : EXPECT_TRUE(addr != kTwo);
123 E : EXPECT_EQ(1, addr.section_id());
124 E : EXPECT_EQ(0, addr.offset());
125 :
126 E : EXPECT_TRUE(kOne + 10 == kTwo);
127 E : EXPECT_TRUE(kOne == kTwo - 10);
128 :
129 E : addr += 10;
130 E : EXPECT_TRUE(addr == kTwo);
131 E : addr -= 10;
132 E : EXPECT_TRUE(addr == kOne);
133 :
134 E : addr = kThree;
135 E : EXPECT_TRUE(addr == kThree);
136 E : }
137 :
138 E : TEST(SectionOffsetAddressTest, SetValue) {
139 E : SectionOffsetAddress address(0, 0);
140 E : address.set_value(SectionOffsetAddress::SectionOffset(kSectionId, kOffset));
141 :
142 E : EXPECT_EQ(kSectionId, address.value().section_id);
143 E : EXPECT_EQ(kOffset, address.value().offset);
144 E : }
145 :
146 E : TEST(SectionOffsetAddressTest, SetSectionId) {
147 E : SectionOffsetAddress address(0, 0);
148 E : address.set_section_id(kSectionId);
149 E : EXPECT_EQ(kSectionId, address.value().section_id);
150 E : }
151 :
152 E : TEST(SectionOffsetAddressTest, SetOffset) {
153 E : SectionOffsetAddress address(0, 0);
154 E : address.set_offset(kOffset);
155 E : EXPECT_EQ(kOffset, address.value().offset);
156 E : }
157 :
158 E : TEST(SectionOffsetAddressTest, AlignUp) {
159 E : const SectionOffsetAddress one(0, 1);
160 E : const SectionOffsetAddress two(0, 2);
161 E : const SectionOffsetAddress four(0, 4);
162 E : const SectionOffsetAddress eight(0, 8);
163 E : const SectionOffsetAddress sixteen(0, 16);
164 :
165 E : EXPECT_EQ(one.AlignUp(1), one);
166 E : EXPECT_EQ(one.AlignUp(2), two);
167 E : EXPECT_EQ(one.AlignUp(4), four);
168 E : EXPECT_EQ(one.AlignUp(8), eight);
169 E : EXPECT_EQ(one.AlignUp(16), sixteen);
170 :
171 E : EXPECT_TRUE(one.AlignUp(1).IsAligned(1));
172 E : EXPECT_TRUE(one.AlignUp(2).IsAligned(2));
173 E : EXPECT_TRUE(one.AlignUp(4).IsAligned(4));
174 E : EXPECT_TRUE(one.AlignUp(8).IsAligned(8));
175 E : EXPECT_TRUE(one.AlignUp(16).IsAligned(16));
176 E : }
177 :
178 E : TEST(SectionOffsetAddressTest, GetAlignment) {
179 E : const uint32 max_alignment = 512;
180 :
181 E : const SectionOffsetAddress zero(0, 0);
182 E : EXPECT_EQ(max_alignment, zero.GetAlignment());
183 E : const SectionOffsetAddress one(0, 1);
184 :
185 E : for (uint32 i = 1; i <= max_alignment; i <<= 1) {
186 E : SectionOffsetAddress address(0, i);
187 E : EXPECT_EQ(i, address.GetAlignment());
188 E : }
189 :
190 E : SectionOffsetAddress big_offset(0, 1024);
191 E : EXPECT_EQ(max_alignment, big_offset.GetAlignment());
192 E : }
193 :
194 E : TEST(SectionOffsetAddressTest, Serialization) {
195 E : const SectionOffsetAddress address(5, 42);
196 :
197 E : EXPECT_TRUE(testing::TestSerialization(address));
198 E : }
199 :
200 : } // namespace core
|