1 /*
2  * Copyright (c) 2019 Alexander Wachter
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 #include <drivers/hwinfo.h>
7 #include <ztest.h>
8 #include <strings.h>
9 #include <errno.h>
10 
11 /*
12  * @addtogroup t_hwinfo_get_device_id_api
13  * @{
14  * @defgroup t_hwinfo_get_device_id test_hwinfo_get_device_id
15  * @brief TestPurpose: verify device id get works
16  * @details
17  * - Test Steps
18  *   -# Read the ID
19  *   -# Check if to many bytes are written to the buffer
20  *   -# Check if UID is plausible
21  * - Expected Results
22  *   -# Device uid with correct length should be written to the buffer.
23  * @}
24  */
25 
26 #define BUFFER_LENGTH 17
27 #define BUFFER_CANARY 0xFF
28 
test_device_id_get(void)29 static void test_device_id_get(void)
30 {
31 	uint8_t buffer_1[BUFFER_LENGTH];
32 	uint8_t buffer_2[BUFFER_LENGTH];
33 	ssize_t length_read_1, length_read_2;
34 	int i;
35 
36 	length_read_1 = hwinfo_get_device_id(buffer_1, 1);
37 	if (length_read_1 == -ENOSYS) {
38 		ztest_test_skip();
39 		return;
40 	}
41 
42 	zassert_false((length_read_1 < 0),
43 		      "Unexpected negative return value: %d", length_read_1);
44 	zassert_not_equal(length_read_1, 0, "Zero bytes read");
45 	zassert_equal(length_read_1, 1, "Length not adhered");
46 
47 	memset(buffer_1, BUFFER_CANARY, sizeof(buffer_1));
48 
49 	length_read_1 = hwinfo_get_device_id(buffer_1, BUFFER_LENGTH - 1);
50 	zassert_equal(buffer_1[length_read_1], BUFFER_CANARY,
51 		      "Too many bytes are written");
52 
53 	memcpy(buffer_2, buffer_1, length_read_1);
54 
55 	for (i = 0; i < BUFFER_LENGTH; i++) {
56 		buffer_1[i] ^= 0xA5;
57 	}
58 
59 	length_read_2 = hwinfo_get_device_id(buffer_1, BUFFER_LENGTH - 1);
60 	zassert_equal(length_read_1, length_read_2, "Length varied");
61 
62 	zassert_equal(buffer_1[length_read_1], (BUFFER_CANARY ^ 0xA5),
63 		      "Too many bytes are written");
64 
65 	for (i = 0; i < length_read_1; i++) {
66 		zassert_equal(buffer_1[i], buffer_2[i],
67 			      "Two consecutively readings don't match");
68 	}
69 }
70 
71 /*
72  * @addtogroup t_hwinfo_get_reset_cause_api
73  * @{
74  * @defgroup t_hwinfo_get_reset_cause test_hwinfo_get_reset_cause
75  * @brief TestPurpose: verify get reset cause works.
76  * @details
77  * - Test Steps
78  *   -# Set target buffer to a known value
79  *   -# Read the reset cause
80  *   -# Check if target buffer has been altered
81  * - Expected Results
82  *   -# Target buffer contents should be changed after the call.
83  * @}
84  */
85 
test_get_reset_cause(void)86 static void test_get_reset_cause(void)
87 {
88 	uint32_t cause;
89 	ssize_t ret;
90 
91 	/* Set `cause` to a known value prior to call. */
92 	cause = 0xDEADBEEF;
93 
94 	ret = hwinfo_get_reset_cause(&cause);
95 	if (ret == -ENOSYS) {
96 		ztest_test_skip();
97 		return;
98 	}
99 
100 	zassert_false((ret < 0),
101 		      "Unexpected negative return value: %d", ret);
102 
103 	/* Verify that `cause` has been changed. */
104 	zassert_not_equal(cause, 0xDEADBEEF, "Reset cause not written.");
105 }
106 
107 /*
108  * @addtogroup t_hwinfo_clear_reset_cause_api
109  * @{
110  * @defgroup t_hwinfo_clear_reset_cause test_hwinfo_clear_reset_cause
111  * @brief TestPurpose: verify clear reset cause works. This may
112  *        not work on some platforms, depending on how reset cause register
113  *        works on that SoC.
114  * @details
115  * - Test Steps
116  *   -# Read the reset cause and store the result
117  *   -# Call clear reset cause
118  *   -# Read the reset cause again
119  *   -# Check if the two readings match
120  * - Expected Results
121  *   -# Reset cause value should change after calling clear reset cause.
122  * @}
123  */
test_clear_reset_cause(void)124 static void test_clear_reset_cause(void)
125 {
126 	uint32_t cause_1, cause_2;
127 	ssize_t ret;
128 
129 	ret = hwinfo_get_reset_cause(&cause_1);
130 	if (ret == -ENOSYS) {
131 		ztest_test_skip();
132 		return;
133 	}
134 
135 	zassert_false((ret < 0),
136 		      "Unexpected negative return value: %d", ret);
137 
138 	ret = hwinfo_clear_reset_cause();
139 	if (ret == -ENOSYS) {
140 		ztest_test_skip();
141 		return;
142 	}
143 
144 	zassert_false((ret < 0),
145 		      "Unexpected negative return value: %d", ret);
146 
147 	ret = hwinfo_get_reset_cause(&cause_2);
148 	if (ret == -ENOSYS) {
149 		ztest_test_skip();
150 		return;
151 	}
152 
153 	zassert_false((ret < 0),
154 		      "Unexpected negative return value: %d", ret);
155 
156 	/* Verify that `cause` has been changed. */
157 	zassert_not_equal(cause_1, cause_2,
158 		"Reset cause did not change after clearing");
159 }
160 
161 /*
162  * @addtogroup t_hwinfo_get_reset_cause_api
163  * @{
164  * @defgroup t_hwinfo_get_reset_cause test_hwinfo_get_supported_reset_cause
165  * @brief TestPurpose: verify get supported reset cause works.
166  * @details
167  * - Test Steps
168  *   -# Set target buffer to a known value
169  *   -# Read the reset cause
170  *   -# Check if target buffer has been altered
171  * - Expected Results
172  *   -# Target buffer contents should be changed after the call.
173  * @}
174  */
test_get_supported_reset_cause(void)175 static void test_get_supported_reset_cause(void)
176 {
177 	uint32_t supported;
178 	ssize_t ret;
179 
180 	/* Set `supported` to a known value prior to call. */
181 	supported = 0xDEADBEEF;
182 
183 	ret = hwinfo_get_supported_reset_cause(&supported);
184 	if (ret == -ENOSYS) {
185 		ztest_test_skip();
186 		return;
187 	}
188 
189 	zassert_false((ret < 0),
190 		      "Unexpected negative return value: %d", ret);
191 
192 	/* Verify that `supported` has been changed. */
193 	zassert_not_equal(supported, 0xDEADBEEF,
194 					"Supported reset cause not written.");
195 }
196 
test_main(void)197 void test_main(void)
198 {
199 	ztest_test_suite(hwinfo_device_id_api,
200 			 ztest_unit_test(test_device_id_get),
201 			 ztest_unit_test(test_get_reset_cause),
202 			 ztest_unit_test(test_clear_reset_cause),
203 			 ztest_unit_test(test_get_supported_reset_cause)
204 			);
205 
206 	ztest_run_test_suite(hwinfo_device_id_api);
207 }
208