aboutsummaryrefslogtreecommitdiffstats
path: root/roms/skiboot/libstb/secvar/test/secvar-test-enqueue.c
diff options
context:
space:
mode:
Diffstat (limited to 'roms/skiboot/libstb/secvar/test/secvar-test-enqueue.c')
-rw-r--r--roms/skiboot/libstb/secvar/test/secvar-test-enqueue.c148
1 files changed, 148 insertions, 0 deletions
diff --git a/roms/skiboot/libstb/secvar/test/secvar-test-enqueue.c b/roms/skiboot/libstb/secvar/test/secvar-test-enqueue.c
new file mode 100644
index 000000000..b4b2c1409
--- /dev/null
+++ b/roms/skiboot/libstb/secvar/test/secvar-test-enqueue.c
@@ -0,0 +1,148 @@
+// 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;
+
+}