148 lines
3.9 KiB
C
148 lines
3.9 KiB
C
// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
|
|
/* Copyright 2019 IBM Corp. */
|
|
|
|
#include "secvar_api_test.c"
|
|
|
|
const char *secvar_test_name = "enqueue";
|
|
|
|
// Stub storage function, enqueue only cares that this succeeds
|
|
static int temp_write_bank(struct list_head *bank, int section)
|
|
{
|
|
(void) bank, (void) section;
|
|
return OPAL_SUCCESS;
|
|
}
|
|
|
|
int run_test(void)
|
|
{
|
|
int64_t rc;
|
|
|
|
struct secvar *var;
|
|
char key[1024] = {0};
|
|
|
|
uint64_t data_size = 128;
|
|
char *data = zalloc(data_size);
|
|
|
|
secvar_storage.max_var_size = 1024;
|
|
|
|
/*** Bad cases first this time ***/
|
|
// No write bank hook set
|
|
secvar_storage.write_bank = NULL;
|
|
memcpy(key, "meow", 4); // ascii
|
|
rc = secvar_enqueue(key, 4, data, data_size);
|
|
ASSERT(rc == OPAL_HARDWARE);
|
|
|
|
// Set a stub bank writer, so the rest runs ok
|
|
secvar_storage.write_bank = temp_write_bank;
|
|
|
|
// Parameter checks
|
|
// null key
|
|
rc = secvar_enqueue(NULL, 5, data, data_size);
|
|
ASSERT(rc == OPAL_PARAMETER);
|
|
ASSERT(list_empty(&update_bank));
|
|
|
|
// key is empty
|
|
memset(key, 0, sizeof(key));
|
|
rc = secvar_enqueue(key, 5, data, data_size);
|
|
ASSERT(rc == OPAL_PARAMETER);
|
|
ASSERT(list_empty(&update_bank));
|
|
|
|
// keylen is zero
|
|
rc = secvar_enqueue(key, 0, data, data_size);
|
|
ASSERT(rc == OPAL_PARAMETER);
|
|
ASSERT(list_empty(&update_bank));
|
|
|
|
// keylen is excessive
|
|
rc = secvar_enqueue(key, 5000, data, data_size);
|
|
ASSERT(rc == OPAL_PARAMETER);
|
|
ASSERT(list_empty(&update_bank));
|
|
|
|
// null data
|
|
rc = secvar_enqueue(key, 5, NULL, data_size);
|
|
ASSERT(rc == OPAL_PARAMETER);
|
|
ASSERT(list_empty(&update_bank));
|
|
|
|
// data_size is excessive
|
|
rc = secvar_enqueue(key, 5, data, 50000);
|
|
ASSERT(rc == OPAL_PARAMETER);
|
|
ASSERT(list_empty(&update_bank));
|
|
|
|
// data_size is zero
|
|
rc = secvar_enqueue(key, 5, data, 0);
|
|
ASSERT(rc == OPAL_PARAMETER);
|
|
ASSERT(list_empty(&update_bank));
|
|
|
|
// secvar is disabled
|
|
secvar_enabled = 0;
|
|
rc = secvar_enqueue(key, 5, data, data_size);
|
|
ASSERT(rc == OPAL_UNSUPPORTED);
|
|
secvar_enabled = 1;
|
|
|
|
// secvar is not ready
|
|
secvar_ready = 0;
|
|
rc = secvar_enqueue(key, 5, data, data_size);
|
|
ASSERT(rc == OPAL_RESOURCE);
|
|
secvar_ready = 1;
|
|
|
|
|
|
/*** Good cases ***/
|
|
// TODO: add data?
|
|
memcpy(key, "test", 4); // ascii
|
|
rc = secvar_enqueue(key, 4, data, data_size);
|
|
ASSERT(rc == OPAL_SUCCESS);
|
|
ASSERT(list_length(&update_bank) == 1);
|
|
|
|
memcpy(key, "f\0o\0o\0b\0a\0r\0", 6*2); // "unicode"
|
|
rc = secvar_enqueue(key, 6*2, data, data_size);
|
|
ASSERT(rc == OPAL_SUCCESS);
|
|
ASSERT(list_length(&update_bank) == 2);
|
|
|
|
memcpy(key, "meep", 4);
|
|
rc = secvar_enqueue(key, 4, data, data_size);
|
|
ASSERT(rc == OPAL_SUCCESS);
|
|
ASSERT(list_length(&update_bank) == 3); // should not increase
|
|
|
|
// Re-add the same variable
|
|
memcpy(key, "meep", 4);
|
|
rc = secvar_enqueue(key, 4, data, data_size);
|
|
ASSERT(rc == OPAL_SUCCESS);
|
|
ASSERT(list_length(&update_bank) == 3); // should not increase
|
|
var = list_tail(&update_bank, struct secvar, link);
|
|
ASSERT(!memcmp(var->key, key, 4)) // should be at end
|
|
|
|
// Unstage the variable update
|
|
rc = secvar_enqueue(key, 4, NULL, 0);
|
|
ASSERT(rc == OPAL_SUCCESS);
|
|
ASSERT(list_length(&update_bank) == 2);
|
|
|
|
// Unstage a bogus variable update
|
|
rc = secvar_enqueue("nada", 4, NULL, 0);
|
|
ASSERT(rc == OPAL_EMPTY);
|
|
ASSERT(list_length(&update_bank) == 2);
|
|
|
|
|
|
// Empty the in-memory cache, and reload from "pnor"
|
|
// Removed to drop dependency on a storage backend
|
|
// Probably not actually necessary to test, that's the
|
|
// job of the storage backend tests
|
|
/*
|
|
clear_bank_list(&update_bank);
|
|
ASSERT(list_empty(&update_bank));
|
|
secvar_storage.load_bank(&update_bank, SECVAR_UPDATE_BANK);
|
|
printf("list_length = %d\n", list_length(&update_bank));
|
|
ASSERT(list_length(&update_bank) == 2);
|
|
|
|
node = list_top(&update_bank, struct secvar_node, link);
|
|
ASSERT(node);
|
|
ASSERT(!memcmp(node->var->key, "test", 4));
|
|
node = list_next(&update_bank, node, link);
|
|
ASSERT(node);
|
|
ASSERT(!memcmp(node->var->key, "f\0o\0o\0b\0a\0r\0", 6*2));
|
|
*/
|
|
|
|
/*** ONE more bad case... ***/
|
|
|
|
free(data);
|
|
|
|
return 0;
|
|
|
|
}
|