xref: /aosp_15_r20/external/google-breakpad/src/common/windows/omap_unittest.cc (revision 9712c20fc9bbfbac4935993a2ca0b3958c5adad2)
1*9712c20fSFrederick Mayle // Copyright 2013 Google LLC
2*9712c20fSFrederick Mayle //
3*9712c20fSFrederick Mayle // Redistribution and use in source and binary forms, with or without
4*9712c20fSFrederick Mayle // modification, are permitted provided that the following conditions are
5*9712c20fSFrederick Mayle // met:
6*9712c20fSFrederick Mayle //
7*9712c20fSFrederick Mayle //     * Redistributions of source code must retain the above copyright
8*9712c20fSFrederick Mayle // notice, this list of conditions and the following disclaimer.
9*9712c20fSFrederick Mayle //     * Redistributions in binary form must reproduce the above
10*9712c20fSFrederick Mayle // copyright notice, this list of conditions and the following disclaimer
11*9712c20fSFrederick Mayle // in the documentation and/or other materials provided with the
12*9712c20fSFrederick Mayle // distribution.
13*9712c20fSFrederick Mayle //     * Neither the name of Google LLC nor the names of its
14*9712c20fSFrederick Mayle // contributors may be used to endorse or promote products derived from
15*9712c20fSFrederick Mayle // this software without specific prior written permission.
16*9712c20fSFrederick Mayle //
17*9712c20fSFrederick Mayle // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*9712c20fSFrederick Mayle // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*9712c20fSFrederick Mayle // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*9712c20fSFrederick Mayle // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*9712c20fSFrederick Mayle // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*9712c20fSFrederick Mayle // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*9712c20fSFrederick Mayle // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*9712c20fSFrederick Mayle // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*9712c20fSFrederick Mayle // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*9712c20fSFrederick Mayle // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*9712c20fSFrederick Mayle // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*9712c20fSFrederick Mayle 
29*9712c20fSFrederick Mayle // Unittests for OMAP related functions.
30*9712c20fSFrederick Mayle 
31*9712c20fSFrederick Mayle #ifdef HAVE_CONFIG_H
32*9712c20fSFrederick Mayle #include <config.h>  // Must come first
33*9712c20fSFrederick Mayle #endif
34*9712c20fSFrederick Mayle 
35*9712c20fSFrederick Mayle #include "common/windows/omap.h"
36*9712c20fSFrederick Mayle 
37*9712c20fSFrederick Mayle #include "breakpad_googletest_includes.h"
38*9712c20fSFrederick Mayle 
39*9712c20fSFrederick Mayle namespace google_breakpad {
40*9712c20fSFrederick Mayle 
41*9712c20fSFrederick Mayle // Equality operators for ContainerEq. These must be outside of the anonymous
42*9712c20fSFrederick Mayle // namespace in order for them to be found.
operator ==(const MappedRange & mr1,const MappedRange & mr2)43*9712c20fSFrederick Mayle bool operator==(const MappedRange& mr1, const MappedRange& mr2) {
44*9712c20fSFrederick Mayle   return mr1.rva_original == mr2.rva_original &&
45*9712c20fSFrederick Mayle       mr1.rva_transformed == mr2.rva_transformed &&
46*9712c20fSFrederick Mayle       mr1.length == mr2.length &&
47*9712c20fSFrederick Mayle       mr1.injected == mr2.injected &&
48*9712c20fSFrederick Mayle       mr1.removed == mr2.removed;
49*9712c20fSFrederick Mayle }
operator ==(const EndpointIndex & ei1,const EndpointIndex & ei2)50*9712c20fSFrederick Mayle bool operator==(const EndpointIndex& ei1, const EndpointIndex& ei2) {
51*9712c20fSFrederick Mayle   return ei1.endpoint == ei2.endpoint && ei1.index == ei2.index;
52*9712c20fSFrederick Mayle }
53*9712c20fSFrederick Mayle 
54*9712c20fSFrederick Mayle // Pretty printers for more meaningful error messages. Also need to be outside
55*9712c20fSFrederick Mayle // the anonymous namespace.
operator <<(std::ostream & os,const MappedRange & mr)56*9712c20fSFrederick Mayle std::ostream& operator<<(std::ostream& os, const MappedRange& mr) {
57*9712c20fSFrederick Mayle   os << "MappedRange(rva_original=" << mr.rva_original
58*9712c20fSFrederick Mayle      << ", rva_transformed=" << mr.rva_transformed
59*9712c20fSFrederick Mayle      << ", length=" << mr.length
60*9712c20fSFrederick Mayle      << ", injected=" << mr.injected
61*9712c20fSFrederick Mayle      << ", removed=" << mr.removed << ")";
62*9712c20fSFrederick Mayle   return os;
63*9712c20fSFrederick Mayle }
operator <<(std::ostream & os,const EndpointIndex & ei)64*9712c20fSFrederick Mayle std::ostream& operator<<(std::ostream& os, const EndpointIndex& ei) {
65*9712c20fSFrederick Mayle   os << "EndpointIndex(endpoint=" << ei.endpoint
66*9712c20fSFrederick Mayle      << ", index=" << ei.index << ")";
67*9712c20fSFrederick Mayle   return os;
68*9712c20fSFrederick Mayle }
operator <<(std::ostream & os,const AddressRange & ar)69*9712c20fSFrederick Mayle std::ostream& operator<<(std::ostream& os, const AddressRange& ar) {
70*9712c20fSFrederick Mayle   os << "AddressRange(rva=" << ar.rva << ", length=" << ar.length << ")";
71*9712c20fSFrederick Mayle   return os;
72*9712c20fSFrederick Mayle }
73*9712c20fSFrederick Mayle 
74*9712c20fSFrederick Mayle namespace {
75*9712c20fSFrederick Mayle 
CreateOmap(DWORD rva,DWORD rvaTo)76*9712c20fSFrederick Mayle OMAP CreateOmap(DWORD rva, DWORD rvaTo) {
77*9712c20fSFrederick Mayle   OMAP o = { rva, rvaTo };
78*9712c20fSFrederick Mayle   return o;
79*9712c20fSFrederick Mayle }
80*9712c20fSFrederick Mayle 
CreateMappedRange(DWORD rva_original,DWORD rva_transformed,DWORD length,DWORD injected,DWORD removed)81*9712c20fSFrederick Mayle MappedRange CreateMappedRange(DWORD rva_original,
82*9712c20fSFrederick Mayle                               DWORD rva_transformed,
83*9712c20fSFrederick Mayle                               DWORD length,
84*9712c20fSFrederick Mayle                               DWORD injected,
85*9712c20fSFrederick Mayle                               DWORD removed) {
86*9712c20fSFrederick Mayle   MappedRange mr = { rva_original, rva_transformed, length, injected, removed };
87*9712c20fSFrederick Mayle   return mr;
88*9712c20fSFrederick Mayle }
89*9712c20fSFrederick Mayle 
CreateEndpointIndex(DWORD endpoint,size_t index)90*9712c20fSFrederick Mayle EndpointIndex CreateEndpointIndex(DWORD endpoint, size_t index) {
91*9712c20fSFrederick Mayle   EndpointIndex ei = { endpoint, index };
92*9712c20fSFrederick Mayle   return ei;
93*9712c20fSFrederick Mayle }
94*9712c20fSFrederick Mayle 
95*9712c20fSFrederick Mayle //              (C is removed)
96*9712c20fSFrederick Mayle // Original   :  A B C D E F G H
97*9712c20fSFrederick Mayle // Transformed:  A B D F E * H1 G1 G2 H2
98*9712c20fSFrederick Mayle //              (* is injected, G is copied, H is split)
99*9712c20fSFrederick Mayle // A is implied.
100*9712c20fSFrederick Mayle 
101*9712c20fSFrederick Mayle // Layout of the original image.
102*9712c20fSFrederick Mayle const AddressRange B(100, 15);
103*9712c20fSFrederick Mayle const AddressRange C(B.end(), 10);
104*9712c20fSFrederick Mayle const AddressRange D(C.end(), 25);
105*9712c20fSFrederick Mayle const AddressRange E(D.end(), 10);
106*9712c20fSFrederick Mayle const AddressRange F(E.end(), 40);
107*9712c20fSFrederick Mayle const AddressRange G(F.end(), 3);
108*9712c20fSFrederick Mayle const AddressRange H(G.end(), 7);
109*9712c20fSFrederick Mayle 
110*9712c20fSFrederick Mayle // Layout of the transformed image.
111*9712c20fSFrederick Mayle const AddressRange Bt(100, 15);
112*9712c20fSFrederick Mayle const AddressRange Dt(Bt.end(), 20);  // D is shortened.
113*9712c20fSFrederick Mayle const AddressRange Ft(Dt.end(), F.length);
114*9712c20fSFrederick Mayle const AddressRange Et(Ft.end(), E.length);
115*9712c20fSFrederick Mayle const AddressRange injected(Et.end(), 5);
116*9712c20fSFrederick Mayle const AddressRange H1t(injected.end(), 4);  // H is split.
117*9712c20fSFrederick Mayle const AddressRange G1t(H1t.end(), G.length);  // G is copied.
118*9712c20fSFrederick Mayle const AddressRange G2t(G1t.end(), G.length);  // G is copied.
119*9712c20fSFrederick Mayle const AddressRange H2t(G2t.end(), 3);  // H is split.
120*9712c20fSFrederick Mayle 
121*9712c20fSFrederick Mayle class BuildImageMapTest : public testing::Test {
122*9712c20fSFrederick Mayle  public:
123*9712c20fSFrederick Mayle   static const DWORD kInvalidAddress = 0xFFFFFFFF;
124*9712c20fSFrederick Mayle 
InitOmapData()125*9712c20fSFrederick Mayle   void InitOmapData() {
126*9712c20fSFrederick Mayle     omap_data.length_original = H.end();
127*9712c20fSFrederick Mayle 
128*9712c20fSFrederick Mayle     // Build the OMAPTO vector (from transformed to original).
129*9712c20fSFrederick Mayle     omap_data.omap_to.push_back(CreateOmap(Bt.rva, B.rva));
130*9712c20fSFrederick Mayle     omap_data.omap_to.push_back(CreateOmap(Dt.rva, D.rva));
131*9712c20fSFrederick Mayle     omap_data.omap_to.push_back(CreateOmap(Ft.rva, F.rva));
132*9712c20fSFrederick Mayle     omap_data.omap_to.push_back(CreateOmap(Et.rva, E.rva));
133*9712c20fSFrederick Mayle     omap_data.omap_to.push_back(CreateOmap(injected.rva, kInvalidAddress));
134*9712c20fSFrederick Mayle     omap_data.omap_to.push_back(CreateOmap(H1t.rva, H.rva));
135*9712c20fSFrederick Mayle     omap_data.omap_to.push_back(CreateOmap(G1t.rva, G.rva));
136*9712c20fSFrederick Mayle     omap_data.omap_to.push_back(CreateOmap(G2t.rva, G.rva));
137*9712c20fSFrederick Mayle     omap_data.omap_to.push_back(CreateOmap(H2t.rva, H.rva + H1t.length));
138*9712c20fSFrederick Mayle     omap_data.omap_to.push_back(CreateOmap(H2t.end(), kInvalidAddress));
139*9712c20fSFrederick Mayle 
140*9712c20fSFrederick Mayle     // Build the OMAPFROM vector (from original to transformed).
141*9712c20fSFrederick Mayle     omap_data.omap_from.push_back(CreateOmap(B.rva, Bt.rva));
142*9712c20fSFrederick Mayle     omap_data.omap_from.push_back(CreateOmap(C.rva, kInvalidAddress));
143*9712c20fSFrederick Mayle     omap_data.omap_from.push_back(CreateOmap(D.rva, Dt.rva));
144*9712c20fSFrederick Mayle     omap_data.omap_from.push_back(CreateOmap(E.rva, Et.rva));
145*9712c20fSFrederick Mayle     omap_data.omap_from.push_back(CreateOmap(F.rva, Ft.rva));
146*9712c20fSFrederick Mayle     omap_data.omap_from.push_back(CreateOmap(G.rva, G1t.rva));
147*9712c20fSFrederick Mayle     omap_data.omap_from.push_back(CreateOmap(H.rva, H1t.rva));
148*9712c20fSFrederick Mayle     omap_data.omap_from.push_back(CreateOmap(H.rva + H1t.length, H2t.rva));
149*9712c20fSFrederick Mayle     omap_data.omap_from.push_back(CreateOmap(H.end(), kInvalidAddress));
150*9712c20fSFrederick Mayle   }
151*9712c20fSFrederick Mayle 
152*9712c20fSFrederick Mayle   OmapData omap_data;
153*9712c20fSFrederick Mayle };
154*9712c20fSFrederick Mayle 
155*9712c20fSFrederick Mayle }  // namespace
156*9712c20fSFrederick Mayle 
TEST_F(BuildImageMapTest,EmptyImageMapOnEmptyOmapData)157*9712c20fSFrederick Mayle TEST_F(BuildImageMapTest, EmptyImageMapOnEmptyOmapData) {
158*9712c20fSFrederick Mayle   ASSERT_EQ(0u, omap_data.omap_from.size());
159*9712c20fSFrederick Mayle   ASSERT_EQ(0u, omap_data.omap_to.size());
160*9712c20fSFrederick Mayle   ASSERT_EQ(0u, omap_data.length_original);
161*9712c20fSFrederick Mayle 
162*9712c20fSFrederick Mayle   ImageMap image_map;
163*9712c20fSFrederick Mayle   BuildImageMap(omap_data, &image_map);
164*9712c20fSFrederick Mayle   EXPECT_EQ(0u, image_map.mapping.size());
165*9712c20fSFrederick Mayle   EXPECT_EQ(0u, image_map.endpoint_index_map.size());
166*9712c20fSFrederick Mayle }
167*9712c20fSFrederick Mayle 
TEST_F(BuildImageMapTest,ImageMapIsCorrect)168*9712c20fSFrederick Mayle TEST_F(BuildImageMapTest, ImageMapIsCorrect) {
169*9712c20fSFrederick Mayle   InitOmapData();
170*9712c20fSFrederick Mayle   ASSERT_LE(0u, omap_data.omap_from.size());
171*9712c20fSFrederick Mayle   ASSERT_LE(0u, omap_data.omap_to.size());
172*9712c20fSFrederick Mayle   ASSERT_LE(0u, omap_data.length_original);
173*9712c20fSFrederick Mayle 
174*9712c20fSFrederick Mayle   ImageMap image_map;
175*9712c20fSFrederick Mayle   BuildImageMap(omap_data, &image_map);
176*9712c20fSFrederick Mayle   EXPECT_LE(9u, image_map.mapping.size());
177*9712c20fSFrederick Mayle   EXPECT_LE(9u, image_map.endpoint_index_map.size());
178*9712c20fSFrederick Mayle 
179*9712c20fSFrederick Mayle   Mapping mapping;
180*9712c20fSFrederick Mayle   mapping.push_back(CreateMappedRange(0, 0, B.rva, 0, 0));
181*9712c20fSFrederick Mayle   // C is removed, and it originally comes immediately after B.
182*9712c20fSFrederick Mayle   mapping.push_back(CreateMappedRange(B.rva, Bt.rva, B.length, 0, C.length));
183*9712c20fSFrederick Mayle   // D is shortened by a length of 5.
184*9712c20fSFrederick Mayle   mapping.push_back(CreateMappedRange(D.rva, Dt.rva, Dt.length, 0, 5));
185*9712c20fSFrederick Mayle   // The injected content comes immediately after E in the transformed image.
186*9712c20fSFrederick Mayle   mapping.push_back(CreateMappedRange(E.rva, Et.rva, E.length, injected.length,
187*9712c20fSFrederick Mayle                                       0));
188*9712c20fSFrederick Mayle   mapping.push_back(CreateMappedRange(F.rva, Ft.rva, F.length, 0, 0));
189*9712c20fSFrederick Mayle   // G is copied so creates two entries.
190*9712c20fSFrederick Mayle   mapping.push_back(CreateMappedRange(G.rva, G1t.rva, G.length, 0, 0));
191*9712c20fSFrederick Mayle   mapping.push_back(CreateMappedRange(G.rva, G2t.rva, G.length, 0, 0));
192*9712c20fSFrederick Mayle   // H is split, so create two entries.
193*9712c20fSFrederick Mayle   mapping.push_back(CreateMappedRange(H.rva, H1t.rva, H1t.length, 0, 0));
194*9712c20fSFrederick Mayle   mapping.push_back(CreateMappedRange(H.rva + H1t.length, H2t.rva, H2t.length,
195*9712c20fSFrederick Mayle                                       0, 0));
196*9712c20fSFrederick Mayle   EXPECT_THAT(mapping,
197*9712c20fSFrederick Mayle               testing::ContainerEq(image_map.mapping));
198*9712c20fSFrederick Mayle 
199*9712c20fSFrederick Mayle   EndpointIndexMap endpoint_index_map;
200*9712c20fSFrederick Mayle   endpoint_index_map.push_back(CreateEndpointIndex(0, 0));
201*9712c20fSFrederick Mayle   endpoint_index_map.push_back(CreateEndpointIndex(B.rva, 1));
202*9712c20fSFrederick Mayle   endpoint_index_map.push_back(CreateEndpointIndex(D.rva, 2));
203*9712c20fSFrederick Mayle   endpoint_index_map.push_back(CreateEndpointIndex(E.rva, 3));
204*9712c20fSFrederick Mayle   endpoint_index_map.push_back(CreateEndpointIndex(F.rva, 4));
205*9712c20fSFrederick Mayle   // G is duplicated so 2 ranges map back to it, hence the skip from 5 to 7.
206*9712c20fSFrederick Mayle   endpoint_index_map.push_back(CreateEndpointIndex(G.rva, 5));
207*9712c20fSFrederick Mayle   // H is split so we expect 2 endpoints to show up attributed to it.
208*9712c20fSFrederick Mayle   endpoint_index_map.push_back(CreateEndpointIndex(H.rva, 7));
209*9712c20fSFrederick Mayle   endpoint_index_map.push_back(CreateEndpointIndex(H.rva + H1t.length, 8));
210*9712c20fSFrederick Mayle   endpoint_index_map.push_back(CreateEndpointIndex(H.end(), 9));
211*9712c20fSFrederick Mayle   EXPECT_THAT(endpoint_index_map,
212*9712c20fSFrederick Mayle               testing::ContainerEq(image_map.endpoint_index_map));
213*9712c20fSFrederick Mayle }
214*9712c20fSFrederick Mayle 
215*9712c20fSFrederick Mayle namespace {
216*9712c20fSFrederick Mayle 
217*9712c20fSFrederick Mayle class MapAddressRangeTest : public BuildImageMapTest {
218*9712c20fSFrederick Mayle  public:
219*9712c20fSFrederick Mayle   typedef BuildImageMapTest Super;
SetUp()220*9712c20fSFrederick Mayle   virtual void SetUp() {
221*9712c20fSFrederick Mayle     Super::SetUp();
222*9712c20fSFrederick Mayle     InitOmapData();
223*9712c20fSFrederick Mayle     BuildImageMap(omap_data, &image_map);
224*9712c20fSFrederick Mayle   }
225*9712c20fSFrederick Mayle 
226*9712c20fSFrederick Mayle   ImageMap image_map;
227*9712c20fSFrederick Mayle 
228*9712c20fSFrederick Mayle  private:
229*9712c20fSFrederick Mayle   using BuildImageMapTest::InitOmapData;
230*9712c20fSFrederick Mayle   using BuildImageMapTest::omap_data;
231*9712c20fSFrederick Mayle };
232*9712c20fSFrederick Mayle 
233*9712c20fSFrederick Mayle }  // namespace
234*9712c20fSFrederick Mayle 
TEST_F(MapAddressRangeTest,EmptyImageMapReturnsIdentity)235*9712c20fSFrederick Mayle TEST_F(MapAddressRangeTest, EmptyImageMapReturnsIdentity) {
236*9712c20fSFrederick Mayle   ImageMap im;
237*9712c20fSFrederick Mayle   AddressRangeVector mapped_ranges;
238*9712c20fSFrederick Mayle   AddressRange ar(0, 1024);
239*9712c20fSFrederick Mayle   MapAddressRange(im, ar, &mapped_ranges);
240*9712c20fSFrederick Mayle   EXPECT_EQ(1u, mapped_ranges.size());
241*9712c20fSFrederick Mayle   EXPECT_EQ(ar, mapped_ranges[0]);
242*9712c20fSFrederick Mayle }
243*9712c20fSFrederick Mayle 
TEST_F(MapAddressRangeTest,MapOutOfImage)244*9712c20fSFrederick Mayle TEST_F(MapAddressRangeTest, MapOutOfImage) {
245*9712c20fSFrederick Mayle   AddressRangeVector mapped_ranges;
246*9712c20fSFrederick Mayle   MapAddressRange(image_map, AddressRange(H.end() + 10, 10), &mapped_ranges);
247*9712c20fSFrederick Mayle   EXPECT_EQ(0u, mapped_ranges.size());
248*9712c20fSFrederick Mayle }
249*9712c20fSFrederick Mayle 
TEST_F(MapAddressRangeTest,MapIdentity)250*9712c20fSFrederick Mayle TEST_F(MapAddressRangeTest, MapIdentity) {
251*9712c20fSFrederick Mayle   AddressRangeVector mapped_ranges;
252*9712c20fSFrederick Mayle   MapAddressRange(image_map, B, &mapped_ranges);
253*9712c20fSFrederick Mayle   EXPECT_EQ(1u, mapped_ranges.size());
254*9712c20fSFrederick Mayle   EXPECT_THAT(mapped_ranges, testing::ElementsAre(B));
255*9712c20fSFrederick Mayle }
256*9712c20fSFrederick Mayle 
TEST_F(MapAddressRangeTest,MapReorderedContiguous)257*9712c20fSFrederick Mayle TEST_F(MapAddressRangeTest, MapReorderedContiguous) {
258*9712c20fSFrederick Mayle   AddressRangeVector mapped_ranges;
259*9712c20fSFrederick Mayle 
260*9712c20fSFrederick Mayle   AddressRange DEF(D.rva, F.end() - D.rva);
261*9712c20fSFrederick Mayle   MapAddressRange(image_map, DEF, &mapped_ranges);
262*9712c20fSFrederick Mayle   EXPECT_EQ(1u, mapped_ranges.size());
263*9712c20fSFrederick Mayle 
264*9712c20fSFrederick Mayle   AddressRange DFEt(Dt.rva, Et.end() - Dt.rva);
265*9712c20fSFrederick Mayle   EXPECT_THAT(mapped_ranges, testing::ElementsAre(DFEt));
266*9712c20fSFrederick Mayle }
267*9712c20fSFrederick Mayle 
TEST_F(MapAddressRangeTest,MapEmptySingle)268*9712c20fSFrederick Mayle TEST_F(MapAddressRangeTest, MapEmptySingle) {
269*9712c20fSFrederick Mayle   AddressRangeVector mapped_ranges;
270*9712c20fSFrederick Mayle   MapAddressRange(image_map, AddressRange(D.rva, 0), &mapped_ranges);
271*9712c20fSFrederick Mayle   EXPECT_EQ(1u, mapped_ranges.size());
272*9712c20fSFrederick Mayle   EXPECT_THAT(mapped_ranges, testing::ElementsAre(AddressRange(Dt.rva, 0)));
273*9712c20fSFrederick Mayle }
274*9712c20fSFrederick Mayle 
TEST_F(MapAddressRangeTest,MapEmptyCopied)275*9712c20fSFrederick Mayle TEST_F(MapAddressRangeTest, MapEmptyCopied) {
276*9712c20fSFrederick Mayle   AddressRangeVector mapped_ranges;
277*9712c20fSFrederick Mayle   MapAddressRange(image_map, AddressRange(G.rva, 0), &mapped_ranges);
278*9712c20fSFrederick Mayle   EXPECT_EQ(2u, mapped_ranges.size());
279*9712c20fSFrederick Mayle   EXPECT_THAT(mapped_ranges, testing::ElementsAre(AddressRange(G1t.rva, 0),
280*9712c20fSFrederick Mayle                                                   AddressRange(G2t.rva, 0)));
281*9712c20fSFrederick Mayle }
282*9712c20fSFrederick Mayle 
TEST_F(MapAddressRangeTest,MapCopiedContiguous)283*9712c20fSFrederick Mayle TEST_F(MapAddressRangeTest, MapCopiedContiguous) {
284*9712c20fSFrederick Mayle   AddressRangeVector mapped_ranges;
285*9712c20fSFrederick Mayle   MapAddressRange(image_map, G, &mapped_ranges);
286*9712c20fSFrederick Mayle   EXPECT_EQ(1u, mapped_ranges.size());
287*9712c20fSFrederick Mayle   EXPECT_THAT(mapped_ranges, testing::ElementsAre(
288*9712c20fSFrederick Mayle       AddressRange(G1t.rva, G2t.end() - G1t.rva)));
289*9712c20fSFrederick Mayle }
290*9712c20fSFrederick Mayle 
TEST_F(MapAddressRangeTest,MapSplitDiscontiguous)291*9712c20fSFrederick Mayle TEST_F(MapAddressRangeTest, MapSplitDiscontiguous) {
292*9712c20fSFrederick Mayle   AddressRangeVector mapped_ranges;
293*9712c20fSFrederick Mayle   MapAddressRange(image_map, H, &mapped_ranges);
294*9712c20fSFrederick Mayle   EXPECT_EQ(2u, mapped_ranges.size());
295*9712c20fSFrederick Mayle   EXPECT_THAT(mapped_ranges, testing::ElementsAre(H1t, H2t));
296*9712c20fSFrederick Mayle }
297*9712c20fSFrederick Mayle 
TEST_F(MapAddressRangeTest,MapInjected)298*9712c20fSFrederick Mayle TEST_F(MapAddressRangeTest, MapInjected) {
299*9712c20fSFrederick Mayle   AddressRangeVector mapped_ranges;
300*9712c20fSFrederick Mayle 
301*9712c20fSFrederick Mayle   AddressRange EFGH(E.rva, H.end() - E.rva);
302*9712c20fSFrederick Mayle   MapAddressRange(image_map, EFGH, &mapped_ranges);
303*9712c20fSFrederick Mayle   EXPECT_EQ(1u, mapped_ranges.size());
304*9712c20fSFrederick Mayle 
305*9712c20fSFrederick Mayle   AddressRange FEHGGHt(Ft.rva, H2t.end() - Ft.rva);
306*9712c20fSFrederick Mayle   EXPECT_THAT(mapped_ranges, testing::ElementsAre(FEHGGHt));
307*9712c20fSFrederick Mayle }
308*9712c20fSFrederick Mayle 
TEST_F(MapAddressRangeTest,MapRemovedEntirely)309*9712c20fSFrederick Mayle TEST_F(MapAddressRangeTest, MapRemovedEntirely) {
310*9712c20fSFrederick Mayle   AddressRangeVector mapped_ranges;
311*9712c20fSFrederick Mayle   MapAddressRange(image_map, C, &mapped_ranges);
312*9712c20fSFrederick Mayle   EXPECT_EQ(0u, mapped_ranges.size());
313*9712c20fSFrederick Mayle }
314*9712c20fSFrederick Mayle 
TEST_F(MapAddressRangeTest,MapRemovedPartly)315*9712c20fSFrederick Mayle TEST_F(MapAddressRangeTest, MapRemovedPartly) {
316*9712c20fSFrederick Mayle   AddressRangeVector mapped_ranges;
317*9712c20fSFrederick Mayle   MapAddressRange(image_map, D, &mapped_ranges);
318*9712c20fSFrederick Mayle   EXPECT_EQ(1u, mapped_ranges.size());
319*9712c20fSFrederick Mayle   EXPECT_THAT(mapped_ranges, testing::ElementsAre(Dt));
320*9712c20fSFrederick Mayle }
321*9712c20fSFrederick Mayle 
TEST_F(MapAddressRangeTest,MapFull)322*9712c20fSFrederick Mayle TEST_F(MapAddressRangeTest, MapFull) {
323*9712c20fSFrederick Mayle   AddressRangeVector mapped_ranges;
324*9712c20fSFrederick Mayle 
325*9712c20fSFrederick Mayle   AddressRange AH(0, H.end());
326*9712c20fSFrederick Mayle   MapAddressRange(image_map, AH, &mapped_ranges);
327*9712c20fSFrederick Mayle   EXPECT_EQ(1u, mapped_ranges.size());
328*9712c20fSFrederick Mayle 
329*9712c20fSFrederick Mayle   AddressRange AHt(0, H2t.end());
330*9712c20fSFrederick Mayle   EXPECT_THAT(mapped_ranges, testing::ElementsAre(AHt));
331*9712c20fSFrederick Mayle }
332*9712c20fSFrederick Mayle 
333*9712c20fSFrederick Mayle }  // namespace google_breakpad
334