1*0d6140beSAndroid Build Coastguard Worker /*
2*0d6140beSAndroid Build Coastguard Worker * This file is part of the flashrom project.
3*0d6140beSAndroid Build Coastguard Worker *
4*0d6140beSAndroid Build Coastguard Worker * Copyright 2021 Google LLC
5*0d6140beSAndroid Build Coastguard Worker *
6*0d6140beSAndroid Build Coastguard Worker * This program is free software; you can redistribute it and/or modify
7*0d6140beSAndroid Build Coastguard Worker * it under the terms of the GNU General Public License as published by
8*0d6140beSAndroid Build Coastguard Worker * the Free Software Foundation; version 2 of the License.
9*0d6140beSAndroid Build Coastguard Worker *
10*0d6140beSAndroid Build Coastguard Worker * This program is distributed in the hope that it will be useful,
11*0d6140beSAndroid Build Coastguard Worker * but WITHOUT ANY WARRANTY; without even the implied warranty of
12*0d6140beSAndroid Build Coastguard Worker * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13*0d6140beSAndroid Build Coastguard Worker * GNU General Public License for more details.
14*0d6140beSAndroid Build Coastguard Worker */
15*0d6140beSAndroid Build Coastguard Worker
16*0d6140beSAndroid Build Coastguard Worker #include <include/test.h>
17*0d6140beSAndroid Build Coastguard Worker #include <stdio.h>
18*0d6140beSAndroid Build Coastguard Worker
19*0d6140beSAndroid Build Coastguard Worker #include "tests.h"
20*0d6140beSAndroid Build Coastguard Worker #include "flash.h"
21*0d6140beSAndroid Build Coastguard Worker #include "layout.h"
22*0d6140beSAndroid Build Coastguard Worker #include "libflashrom.h"
23*0d6140beSAndroid Build Coastguard Worker
included_regions_dont_overlap_test_success(void ** state)24*0d6140beSAndroid Build Coastguard Worker void included_regions_dont_overlap_test_success(void **state)
25*0d6140beSAndroid Build Coastguard Worker {
26*0d6140beSAndroid Build Coastguard Worker (void) state; /* unused */
27*0d6140beSAndroid Build Coastguard Worker
28*0d6140beSAndroid Build Coastguard Worker printf("Creating layout... ");
29*0d6140beSAndroid Build Coastguard Worker struct flashrom_layout *layout;
30*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_new(&layout));
31*0d6140beSAndroid Build Coastguard Worker printf("done\n");
32*0d6140beSAndroid Build Coastguard Worker
33*0d6140beSAndroid Build Coastguard Worker printf("Adding and including first region... ");
34*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_add_region(layout, 0x00021000, 0x00031000, "first region"));
35*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_include_region(layout, "first region"));
36*0d6140beSAndroid Build Coastguard Worker printf("done");
37*0d6140beSAndroid Build Coastguard Worker
38*0d6140beSAndroid Build Coastguard Worker printf(", second (non-overlapping) region... ");
39*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_add_region(layout, 0x00031001, 0x0023efc0, "second region"));
40*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_include_region(layout, "second region"));
41*0d6140beSAndroid Build Coastguard Worker printf("done\n");
42*0d6140beSAndroid Build Coastguard Worker
43*0d6140beSAndroid Build Coastguard Worker printf("Asserting included regions do not overlap... ");
44*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, included_regions_overlap(layout));
45*0d6140beSAndroid Build Coastguard Worker printf("done\n");
46*0d6140beSAndroid Build Coastguard Worker
47*0d6140beSAndroid Build Coastguard Worker printf("Releasing layout... ");
48*0d6140beSAndroid Build Coastguard Worker flashrom_layout_release(layout);
49*0d6140beSAndroid Build Coastguard Worker printf("done\n");
50*0d6140beSAndroid Build Coastguard Worker }
51*0d6140beSAndroid Build Coastguard Worker
included_regions_overlap_test_success(void ** state)52*0d6140beSAndroid Build Coastguard Worker void included_regions_overlap_test_success(void **state)
53*0d6140beSAndroid Build Coastguard Worker {
54*0d6140beSAndroid Build Coastguard Worker (void) state; /* unused */
55*0d6140beSAndroid Build Coastguard Worker
56*0d6140beSAndroid Build Coastguard Worker printf("Creating layout... ");
57*0d6140beSAndroid Build Coastguard Worker struct flashrom_layout *layout;
58*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_new(&layout));
59*0d6140beSAndroid Build Coastguard Worker printf("done\n");
60*0d6140beSAndroid Build Coastguard Worker
61*0d6140beSAndroid Build Coastguard Worker printf("Adding and including first region... ");
62*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_add_region(layout, 0x00021000, 0x00031000, "first region"));
63*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_include_region(layout, "first region"));
64*0d6140beSAndroid Build Coastguard Worker printf("done");
65*0d6140beSAndroid Build Coastguard Worker
66*0d6140beSAndroid Build Coastguard Worker printf(", second (overlapping) region... ");
67*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_add_region(layout, 0x00027100, 0x0023efc0, "second region"));
68*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_include_region(layout, "second region"));
69*0d6140beSAndroid Build Coastguard Worker printf("done\n");
70*0d6140beSAndroid Build Coastguard Worker
71*0d6140beSAndroid Build Coastguard Worker printf("Asserting included regions overlap... ");
72*0d6140beSAndroid Build Coastguard Worker assert_int_equal(1, included_regions_overlap(layout));
73*0d6140beSAndroid Build Coastguard Worker printf("done\n");
74*0d6140beSAndroid Build Coastguard Worker
75*0d6140beSAndroid Build Coastguard Worker printf("Releasing layout... ");
76*0d6140beSAndroid Build Coastguard Worker flashrom_layout_release(layout);
77*0d6140beSAndroid Build Coastguard Worker printf("done\n");
78*0d6140beSAndroid Build Coastguard Worker }
79*0d6140beSAndroid Build Coastguard Worker
region_not_included_overlap_test_success(void ** state)80*0d6140beSAndroid Build Coastguard Worker void region_not_included_overlap_test_success(void **state)
81*0d6140beSAndroid Build Coastguard Worker {
82*0d6140beSAndroid Build Coastguard Worker (void) state; /* unused */
83*0d6140beSAndroid Build Coastguard Worker
84*0d6140beSAndroid Build Coastguard Worker printf("Creating layout... ");
85*0d6140beSAndroid Build Coastguard Worker struct flashrom_layout *layout;
86*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_new(&layout));
87*0d6140beSAndroid Build Coastguard Worker printf("done\n");
88*0d6140beSAndroid Build Coastguard Worker
89*0d6140beSAndroid Build Coastguard Worker printf("Adding and including first region... ");
90*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_add_region(layout, 0x00021000, 0x00031000, "first region"));
91*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_include_region(layout, "first region"));
92*0d6140beSAndroid Build Coastguard Worker printf("done");
93*0d6140beSAndroid Build Coastguard Worker
94*0d6140beSAndroid Build Coastguard Worker printf(", second (overlapping) region, not included... ");
95*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_add_region(layout, 0x00027100, 0x0023efc0, "second region"));
96*0d6140beSAndroid Build Coastguard Worker printf("done\n");
97*0d6140beSAndroid Build Coastguard Worker
98*0d6140beSAndroid Build Coastguard Worker printf("Asserting included regions do not overlap... ");
99*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, included_regions_overlap(layout));
100*0d6140beSAndroid Build Coastguard Worker printf("done\n");
101*0d6140beSAndroid Build Coastguard Worker
102*0d6140beSAndroid Build Coastguard Worker printf("Releasing layout... ");
103*0d6140beSAndroid Build Coastguard Worker flashrom_layout_release(layout);
104*0d6140beSAndroid Build Coastguard Worker printf("done\n");
105*0d6140beSAndroid Build Coastguard Worker }
106*0d6140beSAndroid Build Coastguard Worker
layout_pass_sanity_checks_test_success(void ** state)107*0d6140beSAndroid Build Coastguard Worker void layout_pass_sanity_checks_test_success(void **state)
108*0d6140beSAndroid Build Coastguard Worker {
109*0d6140beSAndroid Build Coastguard Worker (void) state; /* unused */
110*0d6140beSAndroid Build Coastguard Worker
111*0d6140beSAndroid Build Coastguard Worker unsigned int region_start = 0x00021000;
112*0d6140beSAndroid Build Coastguard Worker unsigned int region_end = 0x00031000;
113*0d6140beSAndroid Build Coastguard Worker unsigned int region2_start = 0x00041000;
114*0d6140beSAndroid Build Coastguard Worker unsigned int region2_end = 0x00051000;
115*0d6140beSAndroid Build Coastguard Worker unsigned int start = 0;
116*0d6140beSAndroid Build Coastguard Worker unsigned int len = 0;
117*0d6140beSAndroid Build Coastguard Worker
118*0d6140beSAndroid Build Coastguard Worker struct flashrom_layout *layout;
119*0d6140beSAndroid Build Coastguard Worker
120*0d6140beSAndroid Build Coastguard Worker printf("Creating layout with one included region... ");
121*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_new(&layout));
122*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_add_region(layout, region_start, region_end, "region"));
123*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_include_region(layout, "region"));
124*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_add_region(layout, region2_start, region2_end, "region2"));
125*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_include_region(layout, "region2"));
126*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_exclude_region(layout, "region2"));
127*0d6140beSAndroid Build Coastguard Worker printf("done\n");
128*0d6140beSAndroid Build Coastguard Worker
129*0d6140beSAndroid Build Coastguard Worker printf("Asserting region range... ");
130*0d6140beSAndroid Build Coastguard Worker flashrom_layout_get_region_range(layout, "region", &start, &len);
131*0d6140beSAndroid Build Coastguard Worker assert_int_equal(start, region_start);
132*0d6140beSAndroid Build Coastguard Worker assert_int_equal(len, region_end - region_start + 1);
133*0d6140beSAndroid Build Coastguard Worker printf("done\n");
134*0d6140beSAndroid Build Coastguard Worker
135*0d6140beSAndroid Build Coastguard Worker printf("Layout passes sanity checks... ");
136*0d6140beSAndroid Build Coastguard Worker
137*0d6140beSAndroid Build Coastguard Worker struct flashchip chip = {
138*0d6140beSAndroid Build Coastguard Worker .total_size = 1024,
139*0d6140beSAndroid Build Coastguard Worker };
140*0d6140beSAndroid Build Coastguard Worker struct flashrom_flashctx flash = {
141*0d6140beSAndroid Build Coastguard Worker .chip = &chip,
142*0d6140beSAndroid Build Coastguard Worker };
143*0d6140beSAndroid Build Coastguard Worker flashrom_layout_set(&flash, layout);
144*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, layout_sanity_checks(&flash));
145*0d6140beSAndroid Build Coastguard Worker
146*0d6140beSAndroid Build Coastguard Worker printf("done\n");
147*0d6140beSAndroid Build Coastguard Worker
148*0d6140beSAndroid Build Coastguard Worker printf("Releasing layout... ");
149*0d6140beSAndroid Build Coastguard Worker flashrom_layout_release(layout);
150*0d6140beSAndroid Build Coastguard Worker printf("done\n");
151*0d6140beSAndroid Build Coastguard Worker }
152*0d6140beSAndroid Build Coastguard Worker
layout_region_invalid_address_test_success(void ** state)153*0d6140beSAndroid Build Coastguard Worker void layout_region_invalid_address_test_success(void **state)
154*0d6140beSAndroid Build Coastguard Worker {
155*0d6140beSAndroid Build Coastguard Worker (void) state; /* unused */
156*0d6140beSAndroid Build Coastguard Worker
157*0d6140beSAndroid Build Coastguard Worker struct flashrom_layout *layout;
158*0d6140beSAndroid Build Coastguard Worker
159*0d6140beSAndroid Build Coastguard Worker printf("Creating layout with one included region... ");
160*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_new(&layout));
161*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_add_region(layout, 0x60000000, 0x70000000, "region"));
162*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_include_region(layout, "region"));
163*0d6140beSAndroid Build Coastguard Worker printf("done\n");
164*0d6140beSAndroid Build Coastguard Worker
165*0d6140beSAndroid Build Coastguard Worker printf("Layout does not pass sanity checks... ");
166*0d6140beSAndroid Build Coastguard Worker
167*0d6140beSAndroid Build Coastguard Worker struct flashchip chip = {
168*0d6140beSAndroid Build Coastguard Worker /* Make sure layout region addresses exceed total size on chip. */
169*0d6140beSAndroid Build Coastguard Worker .total_size = 1,
170*0d6140beSAndroid Build Coastguard Worker };
171*0d6140beSAndroid Build Coastguard Worker struct flashrom_flashctx flash = {
172*0d6140beSAndroid Build Coastguard Worker .chip = &chip,
173*0d6140beSAndroid Build Coastguard Worker };
174*0d6140beSAndroid Build Coastguard Worker flashrom_layout_set(&flash, layout);
175*0d6140beSAndroid Build Coastguard Worker assert_int_equal(1, layout_sanity_checks(&flash));
176*0d6140beSAndroid Build Coastguard Worker
177*0d6140beSAndroid Build Coastguard Worker printf("done\n");
178*0d6140beSAndroid Build Coastguard Worker
179*0d6140beSAndroid Build Coastguard Worker printf("Releasing layout... ");
180*0d6140beSAndroid Build Coastguard Worker flashrom_layout_release(layout);
181*0d6140beSAndroid Build Coastguard Worker printf("done\n");
182*0d6140beSAndroid Build Coastguard Worker }
183*0d6140beSAndroid Build Coastguard Worker
layout_region_invalid_range_test_success(void ** state)184*0d6140beSAndroid Build Coastguard Worker void layout_region_invalid_range_test_success(void **state)
185*0d6140beSAndroid Build Coastguard Worker {
186*0d6140beSAndroid Build Coastguard Worker (void) state; /* unused */
187*0d6140beSAndroid Build Coastguard Worker
188*0d6140beSAndroid Build Coastguard Worker struct flashrom_layout *layout;
189*0d6140beSAndroid Build Coastguard Worker
190*0d6140beSAndroid Build Coastguard Worker printf("Creating layout with one included region... ");
191*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_new(&layout));
192*0d6140beSAndroid Build Coastguard Worker /* Make sure address range of region is not positive i.e. start > end. */
193*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_add_region(layout, 0x00000020, 0x00000010, "region"));
194*0d6140beSAndroid Build Coastguard Worker assert_int_equal(0, flashrom_layout_include_region(layout, "region"));
195*0d6140beSAndroid Build Coastguard Worker printf("done\n");
196*0d6140beSAndroid Build Coastguard Worker
197*0d6140beSAndroid Build Coastguard Worker printf("Layout does not pass sanity checks... ");
198*0d6140beSAndroid Build Coastguard Worker
199*0d6140beSAndroid Build Coastguard Worker struct flashchip chip = {
200*0d6140beSAndroid Build Coastguard Worker /* Make sure layout region addresses fit into total size on chip. */
201*0d6140beSAndroid Build Coastguard Worker .total_size = 1024,
202*0d6140beSAndroid Build Coastguard Worker };
203*0d6140beSAndroid Build Coastguard Worker struct flashrom_flashctx flash = {
204*0d6140beSAndroid Build Coastguard Worker .chip = &chip,
205*0d6140beSAndroid Build Coastguard Worker };
206*0d6140beSAndroid Build Coastguard Worker flashrom_layout_set(&flash, layout);
207*0d6140beSAndroid Build Coastguard Worker assert_int_equal(1, layout_sanity_checks(&flash));
208*0d6140beSAndroid Build Coastguard Worker
209*0d6140beSAndroid Build Coastguard Worker printf("done\n");
210*0d6140beSAndroid Build Coastguard Worker
211*0d6140beSAndroid Build Coastguard Worker printf("Releasing layout... ");
212*0d6140beSAndroid Build Coastguard Worker flashrom_layout_release(layout);
213*0d6140beSAndroid Build Coastguard Worker printf("done\n");
214*0d6140beSAndroid Build Coastguard Worker }
215