1 /*
2  * Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <cstring>
8 #include <config/interface/config_store.h>
9 #include <config/ramstore/config_ramstore.h>
10 #include <config/interface/config_blob.h>
11 #include <platform/interface/device_region.h>
12 #include <CppUTest/TestHarness.h>
13 
TEST_GROUP(ConfigRamstoreTests)14 TEST_GROUP(ConfigRamstoreTests)
15 {
16 	void setup()
17 	{
18 		config_ramstore_init();
19 	}
20 
21 	void teardown()
22 	{
23 		config_ramstore_deinit();
24 	}
25 };
26 
TEST(ConfigRamstoreTests,checkEmptyConfig)27 TEST(ConfigRamstoreTests, checkEmptyConfig)
28 {
29 	struct config_blob blob;
30 
31 	/* Expect queries to an empty store to return gracefully */
32 	bool query_result = config_store_query(CONFIG_CLASSIFIER_BLOB, "flash", 0,
33 		&blob, sizeof(blob));
34 
35 	CHECK_FALSE(query_result);
36 	UNSIGNED_LONGS_EQUAL(0, config_store_count(CONFIG_CLASSIFIER_DEVICE_REGION));
37 	UNSIGNED_LONGS_EQUAL(0, config_store_count(CONFIG_CLASSIFIER_MEMORY_REGION));
38 	UNSIGNED_LONGS_EQUAL(0, config_store_count(CONFIG_CLASSIFIER_BLOB));
39 }
40 
TEST(ConfigRamstoreTests,checkSingleConfig)41 TEST(ConfigRamstoreTests, checkSingleConfig)
42 {
43 	struct device_region config;
44 
45 	/* This would be external configuration, obtained say from device tree */
46 	strcpy(config.dev_class, "fs");
47 	config.dev_instance = 2;
48 	config.base_addr = (uintptr_t)0x0f000010;
49 	config.io_region_size = 0x100;
50 
51 	/* Add the configuration object */
52 	bool success = config_store_add(CONFIG_CLASSIFIER_DEVICE_REGION,
53 		config.dev_class, config.dev_instance,
54 		&config, sizeof(config));
55 
56 	CHECK_TRUE(success);
57 
58 	/* Expect query find the config object */
59 	struct device_region query_result;
60 	 success = config_store_query(CONFIG_CLASSIFIER_DEVICE_REGION,
61 		config.dev_class, config.dev_instance,
62 		&query_result, sizeof(query_result));
63 
64 	CHECK_TRUE(success);
65 	STRCMP_EQUAL(config.dev_class, query_result.dev_class);
66 	UNSIGNED_LONGS_EQUAL(config.dev_instance, query_result.dev_instance);
67 	UNSIGNED_LONGS_EQUAL(config.base_addr, query_result.base_addr);
68 	UNSIGNED_LONGS_EQUAL(config.io_region_size, query_result.io_region_size);
69 }
70 
TEST(ConfigRamstoreTests,checkMultipleConfig)71 TEST(ConfigRamstoreTests, checkMultipleConfig)
72 {
73 	/* Add first config object */
74 	struct device_region config1;
75 
76 	strcpy(config1.dev_class, "flash");
77 	config1.dev_instance = 0;
78 	config1.base_addr = (uintptr_t)0x0f000010;
79 	config1.io_region_size = 0x100;
80 
81 	bool success = config_store_add(CONFIG_CLASSIFIER_DEVICE_REGION,
82 		config1.dev_class, config1.dev_instance,
83 		&config1, sizeof(config1));
84 
85 	CHECK_TRUE(success);
86 
87 	/* Add second config object */
88 	struct config_blob config2;
89 
90 	uint8_t config2_data[100];
91 	config2.data = config2_data;
92 	config2.data_len = sizeof(config2_data);
93 
94 	success = config_store_add(CONFIG_CLASSIFIER_BLOB,
95 		"a_config_blob", 0,
96 		&config2, sizeof(config2));
97 
98 	CHECK_TRUE(success);
99 	UNSIGNED_LONGS_EQUAL(1, config_store_count(CONFIG_CLASSIFIER_DEVICE_REGION));
100 	UNSIGNED_LONGS_EQUAL(1, config_store_count(CONFIG_CLASSIFIER_BLOB));
101 
102 	/* Expect queries for both objects to work */
103 	struct device_region query1_result;
104 	CHECK_TRUE(config_store_query(CONFIG_CLASSIFIER_DEVICE_REGION,
105 		config1.dev_class, config1.dev_instance,
106 		&query1_result, sizeof(query1_result)));
107 
108 	struct config_blob query2_result;
109 	CHECK_TRUE(config_store_query(CONFIG_CLASSIFIER_BLOB,
110 		"a_config_blob", 0,
111 		&query2_result, sizeof(query2_result)));
112 }
113