Files
OpenCellular/tests/vboot_audio_tests.c
Simon Glass 2500185a83 Add memory leak checking
Add checks that the vboot library does not leak memory. This works by
tracking VbExMalloc() calls and making sure that they have an associated
VbExFree().

Adjust host_signature to use VbExFree() instead of free(), so that this
scheme works correctly for existing code.

BUG=chrome-os-partner:21115
BRANCH=pit
TEST=FEATURES=test emerge-peach_pit vboot_reference

Change-Id: I6ccccfbcc162fc43fb75862cd0eddad78ce8b18a
Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/66175
2013-09-17 23:17:17 +00:00

232 lines
6.1 KiB
C

/* Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
* Tests for vboot_audio
*/
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include "crc32.h"
#include "gbb_header.h"
#include "host_common.h"
#include "load_kernel_fw.h"
#include "rollback_index.h"
#include "test_common.h"
#include "vboot_audio.h"
#include "vboot_audio_private.h"
#include "vboot_common.h"
#include "vboot_display.h"
#include "vboot_nvstorage.h"
#include "vboot_struct.h"
/* Builtin notes */
extern VbDevMusicNote default_notes_[], short_notes_[];
extern uint32_t default_count_, short_count_;
/* Mock data */
static VbCommonParams cparams;
static GoogleBinaryBlockHeader gbb;
static VbDevMusicNote good_notes[] = { {100, 100},
{100, 0},
{200, 200},
{100, 0},
{300, 300},
{100, 0},
{400, 400},
{30000, 0} };
static VbDevMusic good_header =
{ .sig = { '$', 'S', 'N', 'D' },
.count = sizeof(good_notes) / sizeof(VbDevMusicNote),
};
static uint8_t notebuf[sizeof(good_header) +
sizeof(good_notes) - sizeof(VbDevMusicNote)];
static VbDevMusic *use_hdr;
static VbDevMusicNote *use_notes;
static uint32_t use_size;
/* Set correct checksum for custom notes */
void FixChecksum(VbDevMusic *hdr) {
hdr->checksum = Crc32(&(hdr->count), sizeof(hdr->count) +
hdr->count * sizeof(hdr->notes[0]));
}
/* Reset mock data (for use before each test) */
static void ResetMocks(void) {
VBDEBUG(("ResetMocks()\n"));
Memset(&cparams, 0, sizeof(cparams));
cparams.gbb_data = &gbb;
cparams.gbb = &gbb;
Memset(&gbb, 0, sizeof(gbb));
gbb.major_version = GBB_MAJOR_VER;
gbb.minor_version = GBB_MINOR_VER;
gbb.flags = 0;
use_hdr = (VbDevMusic *)notebuf;
use_notes = use_hdr->notes;
Memcpy(use_hdr, &good_header, sizeof(good_header));
Memcpy(use_notes, good_notes, sizeof(good_notes));
FixChecksum(use_hdr);
use_size = sizeof(notebuf);
}
/* Compare two sets of notes */
static int NotesMatch(VbDevMusicNote *a, VbDevMusicNote *b, uint32_t count) {
int i;
if (!a || !b)
return 0;
for ( i=0; i<count; i++) {
if ( a[i].msec != b[i].msec || a[i].frequency != b[i].frequency)
return 0;
}
return count;
}
/****************************************************************************/
/* Mocked verification functions */
void *VbExGetMusicPtr(void) {
return use_hdr;
}
uint32_t VbExMaxMusicSize(void) {
return use_size;
}
/****************************************************************************/
static void VbAudioTest(void) {
VbAudioContext* a = 0;
/* default is okay */
ResetMocks();
use_hdr = 0;
a = VbAudioOpen(&cparams);
TEST_TRUE(a->music_notes == default_notes_ &&
a->note_count == default_count_,
"VbAudioTest( default )");
VbAudioClose(a);
/* short is okay */
ResetMocks();
use_hdr = 0;
gbb.flags = 0x00000001;
a = VbAudioOpen(&cparams);
TEST_TRUE(a->music_notes == short_notes_ &&
a->note_count == short_count_,
"VbAudioTest( short )");
VbAudioClose(a);
/* good custom is okay */
ResetMocks();
a = VbAudioOpen(&cparams);
TEST_TRUE(NotesMatch(a->music_notes, good_notes, good_header.count) &&
a->note_count == good_header.count,
"VbAudioTest( custom good )");
VbAudioClose(a);
/* good custom is rejected when short flag is set */
ResetMocks();
gbb.flags = 0x00000001;
a = VbAudioOpen(&cparams);
TEST_TRUE(a->music_notes == short_notes_ &&
a->note_count == short_count_,
"VbAudioTest( short has priority )");
VbAudioClose(a);
/* too short gets extended */
ResetMocks();
use_hdr->count--;
FixChecksum(use_hdr);
a = VbAudioOpen(&cparams);
TEST_TRUE(NotesMatch(a->music_notes, use_notes, use_hdr->count) &&
a->note_count == use_hdr->count + 1 &&
a->music_notes[use_hdr->count].msec == 28700 &&
a->music_notes[use_hdr->count].frequency == 0,
"VbAudioTest( too short )");
VbAudioClose(a);
/* too quiet is rejected */
ResetMocks();
use_notes[6].msec = 10;
FixChecksum(use_hdr);
a = VbAudioOpen(&cparams);
TEST_TRUE(a->music_notes == default_notes_ &&
a->note_count == default_count_,
"VbAudioTest( too quiet )");
VbAudioClose(a);
/* inaudible is rejected */
ResetMocks();
use_notes[0].frequency = 99;
use_notes[2].frequency = 2001;
FixChecksum(use_hdr);
a = VbAudioOpen(&cparams);
TEST_TRUE(a->music_notes == default_notes_ &&
a->note_count == default_count_,
"VbAudioTest( inaudible )");
VbAudioClose(a);
/* bad signature is rejected */
ResetMocks();
use_hdr->sig[0] = 'C';
a = VbAudioOpen(&cparams);
TEST_TRUE(a->music_notes == default_notes_ &&
a->note_count == default_count_,
"VbAudioTest( bad signature )");
VbAudioClose(a);
/* count == 0 is rejected */
ResetMocks();
use_hdr->count = 0;
a = VbAudioOpen(&cparams);
TEST_TRUE(a->music_notes == default_notes_ &&
a->note_count == default_count_,
"VbAudioTest( count == 0 )");
VbAudioClose(a);
/* too big is rejected */
ResetMocks();
use_hdr->count = 999;
a = VbAudioOpen(&cparams);
TEST_TRUE(a->music_notes == default_notes_ &&
a->note_count == default_count_,
"VbAudioTest( count too big )");
VbAudioClose(a);
/* bad checksum is rejected */
ResetMocks();
use_hdr->checksum++;
a = VbAudioOpen(&cparams);
TEST_TRUE(a->music_notes == default_notes_ &&
a->note_count == default_count_,
"VbAudioTest( count too big )");
VbAudioClose(a);
}
int main(int argc, char* argv[]) {
int error_code = 0;
VbAudioTest();
if (!gTestSuccess)
error_code = 255;
if (vboot_api_stub_check_memory())
error_code = 255;
return error_code;
}