1 /* Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file.
4 *
5 * Tests for vboot_audio
6 */
7
8 #include <stddef.h>
9 #include <stdint.h>
10 #include <stdio.h>
11 #include <stdlib.h>
12
13 #include "crc32.h"
14 #include "gbb_header.h"
15 #include "host_common.h"
16 #include "load_kernel_fw.h"
17 #include "rollback_index.h"
18 #include "test_common.h"
19 #include "vboot_audio.h"
20 #include "vboot_audio_private.h"
21 #include "vboot_common.h"
22 #include "vboot_display.h"
23 #include "vboot_nvstorage.h"
24 #include "vboot_struct.h"
25
26
27 /* Builtin notes */
28 extern VbDevMusicNote default_notes_[], short_notes_[];
29 extern uint32_t default_count_, short_count_;
30
31 /* Mock data */
32 static VbCommonParams cparams;
33 static GoogleBinaryBlockHeader gbb;
34 static VbDevMusicNote good_notes[] = { {100, 100},
35 {100, 0},
36 {200, 200},
37 {100, 0},
38 {300, 300},
39 {100, 0},
40 {400, 400},
41 {30000, 0} };
42 static VbDevMusic good_header =
43 { .sig = { '$', 'S', 'N', 'D' },
44 .count = sizeof(good_notes) / sizeof(VbDevMusicNote),
45 };
46
47 static uint8_t notebuf[sizeof(good_header) +
48 sizeof(good_notes) - sizeof(VbDevMusicNote)];
49
50 static VbDevMusic *use_hdr;
51 static VbDevMusicNote *use_notes;
52 static uint32_t use_size;
53
54 /* Set correct checksum for custom notes */
FixChecksum(VbDevMusic * hdr)55 void FixChecksum(VbDevMusic *hdr) {
56 hdr->checksum = Crc32(&(hdr->count), sizeof(hdr->count) +
57 hdr->count * sizeof(hdr->notes[0]));
58 }
59
60 /* Reset mock data (for use before each test) */
ResetMocks(void)61 static void ResetMocks(void) {
62 VBDEBUG(("ResetMocks()\n"));
63 Memset(&cparams, 0, sizeof(cparams));
64 cparams.gbb_data = &gbb;
65 cparams.gbb = &gbb;
66 Memset(&gbb, 0, sizeof(gbb));
67 gbb.major_version = GBB_MAJOR_VER;
68 gbb.minor_version = GBB_MINOR_VER;
69 gbb.flags = 0;
70 use_hdr = (VbDevMusic *)notebuf;
71 use_notes = use_hdr->notes;
72 Memcpy(use_hdr, &good_header, sizeof(good_header));
73 Memcpy(use_notes, good_notes, sizeof(good_notes));
74 FixChecksum(use_hdr);
75 use_size = sizeof(notebuf);
76 }
77
78 /* Compare two sets of notes */
NotesMatch(VbDevMusicNote * a,VbDevMusicNote * b,uint32_t count)79 static int NotesMatch(VbDevMusicNote *a, VbDevMusicNote *b, uint32_t count) {
80 int i;
81 if (!a || !b)
82 return 0;
83
84 for ( i=0; i<count; i++) {
85 if ( a[i].msec != b[i].msec || a[i].frequency != b[i].frequency)
86 return 0;
87 }
88
89 return count;
90 }
91
92
93
94
95 /****************************************************************************/
96 /* Mocked verification functions */
97
VbExGetMusicPtr(void)98 void *VbExGetMusicPtr(void) {
99 return use_hdr;
100 }
101
VbExMaxMusicSize(void)102 uint32_t VbExMaxMusicSize(void) {
103 return use_size;
104 }
105
106
107 /****************************************************************************/
108
VbAudioTest(void)109 static void VbAudioTest(void) {
110 VbAudioContext* a = 0;
111
112 /* default is okay */
113 ResetMocks();
114 use_hdr = 0;
115 a = VbAudioOpen(&cparams);
116 TEST_TRUE(a->music_notes == default_notes_ &&
117 a->note_count == default_count_,
118 "VbAudioTest( default )");
119 VbAudioClose(a);
120
121 /* short is okay */
122 ResetMocks();
123 use_hdr = 0;
124 gbb.flags = 0x00000001;
125 a = VbAudioOpen(&cparams);
126 TEST_TRUE(a->music_notes == short_notes_ &&
127 a->note_count == short_count_,
128 "VbAudioTest( short )");
129 VbAudioClose(a);
130
131 /* good custom is okay */
132 ResetMocks();
133 a = VbAudioOpen(&cparams);
134 TEST_TRUE(NotesMatch(a->music_notes, good_notes, good_header.count) &&
135 a->note_count == good_header.count,
136 "VbAudioTest( custom good )");
137 VbAudioClose(a);
138
139 /* good custom is rejected when short flag is set */
140 ResetMocks();
141 gbb.flags = 0x00000001;
142 a = VbAudioOpen(&cparams);
143 TEST_TRUE(a->music_notes == short_notes_ &&
144 a->note_count == short_count_,
145 "VbAudioTest( short has priority )");
146 VbAudioClose(a);
147
148 /* too short gets extended */
149 ResetMocks();
150 use_hdr->count--;
151 FixChecksum(use_hdr);
152 a = VbAudioOpen(&cparams);
153 TEST_TRUE(NotesMatch(a->music_notes, use_notes, use_hdr->count) &&
154 a->note_count == use_hdr->count + 1 &&
155 a->music_notes[use_hdr->count].msec == 28700 &&
156 a->music_notes[use_hdr->count].frequency == 0,
157 "VbAudioTest( too short )");
158 VbAudioClose(a);
159
160 /* too quiet is rejected */
161 ResetMocks();
162 use_notes[6].msec = 10;
163 FixChecksum(use_hdr);
164 a = VbAudioOpen(&cparams);
165 TEST_TRUE(a->music_notes == default_notes_ &&
166 a->note_count == default_count_,
167 "VbAudioTest( too quiet )");
168 VbAudioClose(a);
169
170 /* inaudible is rejected */
171 ResetMocks();
172 use_notes[0].frequency = 99;
173 use_notes[2].frequency = 2001;
174 FixChecksum(use_hdr);
175 a = VbAudioOpen(&cparams);
176 TEST_TRUE(a->music_notes == default_notes_ &&
177 a->note_count == default_count_,
178 "VbAudioTest( inaudible )");
179 VbAudioClose(a);
180
181 /* bad signature is rejected */
182 ResetMocks();
183 use_hdr->sig[0] = 'C';
184 a = VbAudioOpen(&cparams);
185 TEST_TRUE(a->music_notes == default_notes_ &&
186 a->note_count == default_count_,
187 "VbAudioTest( bad signature )");
188 VbAudioClose(a);
189
190 /* count == 0 is rejected */
191 ResetMocks();
192 use_hdr->count = 0;
193 a = VbAudioOpen(&cparams);
194 TEST_TRUE(a->music_notes == default_notes_ &&
195 a->note_count == default_count_,
196 "VbAudioTest( count == 0 )");
197 VbAudioClose(a);
198
199 /* too big is rejected */
200 ResetMocks();
201 use_hdr->count = 999;
202 a = VbAudioOpen(&cparams);
203 TEST_TRUE(a->music_notes == default_notes_ &&
204 a->note_count == default_count_,
205 "VbAudioTest( count too big )");
206 VbAudioClose(a);
207
208 /* bad checksum is rejected */
209 ResetMocks();
210 use_hdr->checksum++;
211 a = VbAudioOpen(&cparams);
212 TEST_TRUE(a->music_notes == default_notes_ &&
213 a->note_count == default_count_,
214 "VbAudioTest( count too big )");
215 VbAudioClose(a);
216 }
217
218
main(int argc,char * argv[])219 int main(int argc, char* argv[]) {
220 int error_code = 0;
221
222 VbAudioTest();
223
224 if (!gTestSuccess)
225 error_code = 255;
226
227 if (vboot_api_stub_check_memory())
228 error_code = 255;
229
230 return error_code;
231 }
232