| // 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; |
| |
| } |