2 * Copyright 2008, Google Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following disclaimer
13 * in the documentation and/or other materials provided with the
15 * * Neither the name of Google Inc. nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 #include "native_client/service_runtime/sel_mem.h"
34 #include "third_party/gtest/files/include/gtest/gtest.h"
38 TEST(SelMemTest
, AddTest
) {
39 struct NaClVmmap mem_map
;
40 int start_page_num
= 32;
43 ret_code
= NaClVmmapCtor(&mem_map
);
44 EXPECT_EQ(1, ret_code
);
46 for (int i
= 1; i
<= 5; ++i
) {
47 ret_code
= NaClVmmapAdd(&mem_map
,
50 PROT_READ
| PROT_EXEC
,
51 (struct NaClMemObj
*) NULL
);
52 EXPECT_EQ(1, ret_code
);
53 EXPECT_EQ(i
, static_cast<int>(mem_map
.nvalid
));
54 EXPECT_EQ(5, static_cast<int>(mem_map
.size
));
57 // no checks for start_page_num ..
58 ret_code
= NaClVmmapAdd(&mem_map
,
62 (struct NaClMemObj
*) NULL
);
63 EXPECT_EQ(6, static_cast<int>(mem_map
.nvalid
));
64 EXPECT_EQ(10, static_cast<int>(mem_map
.size
));
66 NaClVmmapDtor(&mem_map
);
69 TEST(SelMemTest
, UpdateTest
) {
70 struct NaClVmmap mem_map
;
72 NaClVmmapCtor(&mem_map
);
75 NaClVmmapUpdate(&mem_map
,
78 PROT_READ
| PROT_EXEC
,
79 (struct NaClMemObj
*) NULL
,
81 EXPECT_EQ(1, static_cast<int>(mem_map
.nvalid
));
84 NaClVmmapUpdate(&mem_map
,
88 (struct NaClMemObj
*) NULL
,
90 // vmmap is [32, 44], [64, 74]
91 EXPECT_EQ(2, static_cast<int>(mem_map
.nvalid
));
93 // new mapping overlaps end and start of existing mappings
94 NaClVmmapUpdate(&mem_map
,
98 (struct NaClMemObj
*) NULL
,
100 // vmmap is [32, 41], [42, 66], [67, 74]
101 EXPECT_EQ(3, static_cast<int>(mem_map
.nvalid
));
103 // new mapping is in the middle of existing mapping
104 NaClVmmapUpdate(&mem_map
,
107 PROT_READ
| PROT_EXEC
,
108 (struct NaClMemObj
*) NULL
,
110 // vmmap is [32, 35], [34, 36], [37, 41], [42, 66], [67, 74]
111 EXPECT_EQ(5, static_cast<int>(mem_map
.nvalid
));
113 // new mapping covers all of the existing mapping
114 NaClVmmapUpdate(&mem_map
,
117 PROT_READ
| PROT_EXEC
,
118 (struct NaClMemObj
*) NULL
,
120 // vmmap is [32, 36], [37, 41], [42, 66], [67, 74]
121 EXPECT_EQ(4, static_cast<int>(mem_map
.nvalid
));
123 // remove existing mappings
124 NaClVmmapUpdate(&mem_map
,
127 PROT_READ
| PROT_EXEC
,
128 (struct NaClMemObj
*) NULL
,
130 // vmmap is [32, 36], [37, 39], [71, 74]
131 EXPECT_EQ(3, static_cast<int>(mem_map
.nvalid
));
133 NaClVmmapDtor(&mem_map
);
136 TEST(SelMemTest
, FindPageTest
) {
137 struct NaClVmmap mem_map
;
140 ret_code
= NaClVmmapCtor(&mem_map
);
141 EXPECT_EQ(1, ret_code
);
143 struct NaClVmmapEntry
const *entry
;
144 entry
= NaClVmmapFindPage(&mem_map
, 32);
145 EXPECT_TRUE(NULL
== entry
);
147 int start_page_num
= 32;
148 for (int i
= 1; i
<= 6; ++i
) {
149 ret_code
= NaClVmmapAdd(&mem_map
,
152 PROT_READ
| PROT_EXEC
,
153 (struct NaClMemObj
*) NULL
);
154 EXPECT_EQ(1, ret_code
);
155 EXPECT_EQ(i
, static_cast<int>(mem_map
.nvalid
));
157 // vmmap is [32, 34], [64, 68], [96, 102], [128, 136],
158 // [160, 170], [192, 204]
160 entry
= NaClVmmapFindPage(&mem_map
, 16);
161 EXPECT_TRUE(NULL
== entry
);
163 entry
= NaClVmmapFindPage(&mem_map
, 32);
164 EXPECT_TRUE(NULL
!= entry
);
166 entry
= NaClVmmapFindPage(&mem_map
, 34);
167 EXPECT_TRUE(NULL
== entry
);
169 entry
= NaClVmmapFindPage(&mem_map
, 202);
170 EXPECT_TRUE(NULL
!= entry
);
172 NaClVmmapDtor(&mem_map
);
175 TEST(SelMemTest
, FindSpaceTest
) {
176 struct NaClVmmap mem_map
;
179 ret_code
= NaClVmmapCtor(&mem_map
);
180 EXPECT_EQ(1, ret_code
);
183 ret_code
= NaClVmmapFindSpace(&mem_map
, 32);
184 EXPECT_EQ(0, ret_code
);
186 NaClVmmapAdd(&mem_map
,
189 PROT_READ
| PROT_EXEC
,
190 (struct NaClMemObj
*) NULL
);
191 EXPECT_EQ(1, static_cast<int>(mem_map
.nvalid
));
193 ret_code
= NaClVmmapFindSpace(&mem_map
, 2);
194 EXPECT_EQ(0, ret_code
);
196 NaClVmmapAdd(&mem_map
,
199 PROT_READ
| PROT_EXEC
,
200 (struct NaClMemObj
*) NULL
);
201 EXPECT_EQ(2, static_cast<int>(mem_map
.nvalid
));
203 // the space is [32, 42], [64, 74]
204 ret_code
= NaClVmmapFindSpace(&mem_map
, 32);
205 EXPECT_EQ(0, ret_code
);
207 ret_code
= NaClVmmapFindSpace(&mem_map
, 2);
208 EXPECT_EQ(62, ret_code
);
210 NaClVmmapAdd(&mem_map
,
213 PROT_READ
| PROT_EXEC
,
214 (struct NaClMemObj
*) NULL
);
215 EXPECT_EQ(3, static_cast<int>(mem_map
.nvalid
));
217 // vmmap is [32, 42], [64, 74], [96, 106]
218 // the search is from high address down
219 ret_code
= NaClVmmapFindSpace(&mem_map
, 22);
220 EXPECT_EQ(74, ret_code
);
222 NaClVmmapDtor(&mem_map
);