1 /* SPDX-License-Identifier: GPL-2.0 */ 1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 2 /* 3 * Assertion and expectation serialization API 3 * Assertion and expectation serialization API. 4 * 4 * 5 * Copyright (C) 2019, Google LLC. 5 * Copyright (C) 2019, Google LLC. 6 * Author: Brendan Higgins <brendanhiggins@goo 6 * Author: Brendan Higgins <brendanhiggins@google.com> 7 */ 7 */ 8 8 9 #ifndef _KUNIT_ASSERT_H 9 #ifndef _KUNIT_ASSERT_H 10 #define _KUNIT_ASSERT_H 10 #define _KUNIT_ASSERT_H 11 11 12 #include <linux/err.h> 12 #include <linux/err.h> 13 #include <linux/printk.h> !! 13 #include <linux/kernel.h> 14 14 15 struct kunit; 15 struct kunit; 16 struct string_stream; 16 struct string_stream; 17 17 18 /** 18 /** 19 * enum kunit_assert_type - Type of expectatio 19 * enum kunit_assert_type - Type of expectation/assertion. 20 * @KUNIT_ASSERTION: Used to denote that a kun 20 * @KUNIT_ASSERTION: Used to denote that a kunit_assert represents an assertion. 21 * @KUNIT_EXPECTATION: Denotes that a kunit_as 21 * @KUNIT_EXPECTATION: Denotes that a kunit_assert represents an expectation. 22 * 22 * 23 * Used in conjunction with a &struct kunit_as 23 * Used in conjunction with a &struct kunit_assert to denote whether it 24 * represents an expectation or an assertion. 24 * represents an expectation or an assertion. 25 */ 25 */ 26 enum kunit_assert_type { 26 enum kunit_assert_type { 27 KUNIT_ASSERTION, 27 KUNIT_ASSERTION, 28 KUNIT_EXPECTATION, 28 KUNIT_EXPECTATION, 29 }; 29 }; 30 30 31 /** 31 /** 32 * struct kunit_loc - Identifies the source lo !! 32 * struct kunit_assert - Data for printing a failed assertion or expectation. 33 * @line: the line number in the file. !! 33 * @test: the test case this expectation/assertion is associated with. 34 * @file: the file name. !! 34 * @type: the type (either an expectation or an assertion) of this kunit_assert. >> 35 * @line: the source code line number that the expectation/assertion is at. >> 36 * @file: the file path of the source file that the expectation/assertion is in. >> 37 * @message: an optional message to provide additional context. >> 38 * @format: a function which formats the data in this kunit_assert to a string. >> 39 * >> 40 * Represents a failed expectation/assertion. Contains all the data necessary to >> 41 * format a string to a user reporting the failure. 35 */ 42 */ 36 struct kunit_loc { !! 43 struct kunit_assert { >> 44 struct kunit *test; >> 45 enum kunit_assert_type type; 37 int line; 46 int line; 38 const char *file; 47 const char *file; >> 48 struct va_format message; >> 49 void (*format)(const struct kunit_assert *assert, >> 50 struct string_stream *stream); 39 }; 51 }; 40 52 41 #define KUNIT_CURRENT_LOC { .file = __FILE__, !! 53 /** >> 54 * KUNIT_INIT_VA_FMT_NULL - Default initializer for struct va_format. >> 55 * >> 56 * Used inside a struct initialization block to initialize struct va_format to >> 57 * default values where fmt and va are null. >> 58 */ >> 59 #define KUNIT_INIT_VA_FMT_NULL { .fmt = NULL, .va = NULL } 42 60 43 /** 61 /** 44 * struct kunit_assert - Data for printing a f !! 62 * KUNIT_INIT_ASSERT_STRUCT() - Initializer for a &struct kunit_assert. >> 63 * @kunit: The test case that this expectation/assertion is associated with. >> 64 * @assert_type: The type (assertion or expectation) of this kunit_assert. >> 65 * @fmt: The formatting function which builds a string out of this kunit_assert. 45 * 66 * 46 * Represents a failed expectation/assertion. !! 67 * The base initializer for a &struct kunit_assert. 47 * format a string to a user reporting the fai << 48 */ 68 */ 49 struct kunit_assert {}; !! 69 #define KUNIT_INIT_ASSERT_STRUCT(kunit, assert_type, fmt) { \ >> 70 .test = kunit, \ >> 71 .type = assert_type, \ >> 72 .file = __FILE__, \ >> 73 .line = __LINE__, \ >> 74 .message = KUNIT_INIT_VA_FMT_NULL, \ >> 75 .format = fmt \ >> 76 } 50 77 51 typedef void (*assert_format_t)(const struct k !! 78 void kunit_base_assert_format(const struct kunit_assert *assert, 52 const struct v !! 79 struct string_stream *stream); 53 struct string_ << 54 80 55 void kunit_assert_prologue(const struct kunit_ !! 81 void kunit_assert_print_msg(const struct kunit_assert *assert, 56 enum kunit_assert_t !! 82 struct string_stream *stream); 57 struct string_strea << 58 83 59 /** 84 /** 60 * struct kunit_fail_assert - Represents a pla 85 * struct kunit_fail_assert - Represents a plain fail expectation/assertion. 61 * @assert: The parent of this type. 86 * @assert: The parent of this type. 62 * 87 * 63 * Represents a simple KUNIT_FAIL/KUNIT_FAIL_A !! 88 * Represents a simple KUNIT_FAIL/KUNIT_ASSERT_FAILURE that always fails. 64 */ 89 */ 65 struct kunit_fail_assert { 90 struct kunit_fail_assert { 66 struct kunit_assert assert; 91 struct kunit_assert assert; 67 }; 92 }; 68 93 69 void kunit_fail_assert_format(const struct kun 94 void kunit_fail_assert_format(const struct kunit_assert *assert, 70 const struct va_ << 71 struct string_st 95 struct string_stream *stream); 72 96 73 /** 97 /** >> 98 * KUNIT_INIT_FAIL_ASSERT_STRUCT() - Initializer for &struct kunit_fail_assert. >> 99 * @test: The test case that this expectation/assertion is associated with. >> 100 * @type: The type (assertion or expectation) of this kunit_assert. >> 101 * >> 102 * Initializes a &struct kunit_fail_assert. Intended to be used in >> 103 * KUNIT_EXPECT_* and KUNIT_ASSERT_* macros. >> 104 */ >> 105 #define KUNIT_INIT_FAIL_ASSERT_STRUCT(test, type) { \ >> 106 .assert = KUNIT_INIT_ASSERT_STRUCT(test, \ >> 107 type, \ >> 108 kunit_fail_assert_format) \ >> 109 } >> 110 >> 111 /** 74 * struct kunit_unary_assert - Represents a KU 112 * struct kunit_unary_assert - Represents a KUNIT_{EXPECT|ASSERT}_{TRUE|FALSE} 75 * @assert: The parent of this type. 113 * @assert: The parent of this type. 76 * @condition: A string representation of a co 114 * @condition: A string representation of a conditional expression. 77 * @expected_true: True if of type KUNIT_{EXPE 115 * @expected_true: True if of type KUNIT_{EXPECT|ASSERT}_TRUE, false otherwise. 78 * 116 * 79 * Represents a simple expectation or assertio 117 * Represents a simple expectation or assertion that simply asserts something is 80 * true or false. In other words, represents t 118 * true or false. In other words, represents the expectations: 81 * KUNIT_{EXPECT|ASSERT}_{TRUE|FALSE} 119 * KUNIT_{EXPECT|ASSERT}_{TRUE|FALSE} 82 */ 120 */ 83 struct kunit_unary_assert { 121 struct kunit_unary_assert { 84 struct kunit_assert assert; 122 struct kunit_assert assert; 85 const char *condition; 123 const char *condition; 86 bool expected_true; 124 bool expected_true; 87 }; 125 }; 88 126 89 void kunit_unary_assert_format(const struct ku 127 void kunit_unary_assert_format(const struct kunit_assert *assert, 90 const struct va << 91 struct string_s 128 struct string_stream *stream); 92 129 93 /** 130 /** >> 131 * KUNIT_INIT_UNARY_ASSERT_STRUCT() - Initializes &struct kunit_unary_assert. >> 132 * @test: The test case that this expectation/assertion is associated with. >> 133 * @type: The type (assertion or expectation) of this kunit_assert. >> 134 * @cond: A string representation of the expression asserted true or false. >> 135 * @expect_true: True if of type KUNIT_{EXPECT|ASSERT}_TRUE, false otherwise. >> 136 * >> 137 * Initializes a &struct kunit_unary_assert. Intended to be used in >> 138 * KUNIT_EXPECT_* and KUNIT_ASSERT_* macros. >> 139 */ >> 140 #define KUNIT_INIT_UNARY_ASSERT_STRUCT(test, type, cond, expect_true) { \ >> 141 .assert = KUNIT_INIT_ASSERT_STRUCT(test, \ >> 142 type, \ >> 143 kunit_unary_assert_format), \ >> 144 .condition = cond, \ >> 145 .expected_true = expect_true \ >> 146 } >> 147 >> 148 /** 94 * struct kunit_ptr_not_err_assert - An expect 149 * struct kunit_ptr_not_err_assert - An expectation/assertion that a pointer is 95 * not NULL and not a -errno. 150 * not NULL and not a -errno. 96 * @assert: The parent of this type. 151 * @assert: The parent of this type. 97 * @text: A string representation of the expre 152 * @text: A string representation of the expression passed to the expectation. 98 * @value: The actual evaluated pointer value 153 * @value: The actual evaluated pointer value of the expression. 99 * 154 * 100 * Represents an expectation/assertion that a 155 * Represents an expectation/assertion that a pointer is not null and is does 101 * not contain a -errno. (See IS_ERR_OR_NULL() 156 * not contain a -errno. (See IS_ERR_OR_NULL().) 102 */ 157 */ 103 struct kunit_ptr_not_err_assert { 158 struct kunit_ptr_not_err_assert { 104 struct kunit_assert assert; 159 struct kunit_assert assert; 105 const char *text; 160 const char *text; 106 const void *value; 161 const void *value; 107 }; 162 }; 108 163 109 void kunit_ptr_not_err_assert_format(const str 164 void kunit_ptr_not_err_assert_format(const struct kunit_assert *assert, 110 const str << 111 struct st 165 struct string_stream *stream); 112 166 113 /** 167 /** 114 * struct kunit_binary_assert_text - holds str !! 168 * KUNIT_INIT_PTR_NOT_ERR_ASSERT_STRUCT() - Initializes a 115 * kunit_binary_assert and friends to try !! 169 * &struct kunit_ptr_not_err_assert. 116 * @operation: A string representation of the !! 170 * @test: The test case that this expectation/assertion is associated with. 117 * @left_text: A string representation of the !! 171 * @type: The type (assertion or expectation) of this kunit_assert. 118 * @right_text: A string representation of the !! 172 * @txt: A string representation of the expression passed to the expectation. >> 173 * @val: The actual evaluated pointer value of the expression. >> 174 * >> 175 * Initializes a &struct kunit_ptr_not_err_assert. Intended to be used in >> 176 * KUNIT_EXPECT_* and KUNIT_ASSERT_* macros. 119 */ 177 */ 120 struct kunit_binary_assert_text { !! 178 #define KUNIT_INIT_PTR_NOT_ERR_STRUCT(test, type, txt, val) { \ 121 const char *operation; !! 179 .assert = KUNIT_INIT_ASSERT_STRUCT(test, \ 122 const char *left_text; !! 180 type, \ 123 const char *right_text; !! 181 kunit_ptr_not_err_assert_format), \ 124 }; !! 182 .text = txt, \ >> 183 .value = val \ >> 184 } 125 185 126 /** 186 /** 127 * struct kunit_binary_assert - An expectation 187 * struct kunit_binary_assert - An expectation/assertion that compares two 128 * non-pointer values (for example, KUNIT 188 * non-pointer values (for example, KUNIT_EXPECT_EQ(test, 1 + 1, 2)). 129 * @assert: The parent of this type. 189 * @assert: The parent of this type. 130 * @text: Holds the textual representations of !! 190 * @operation: A string representation of the comparison operator (e.g. "=="). >> 191 * @left_text: A string representation of the expression in the left slot. 131 * @left_value: The actual evaluated value of 192 * @left_value: The actual evaluated value of the expression in the left slot. >> 193 * @right_text: A string representation of the expression in the right slot. 132 * @right_value: The actual evaluated value of 194 * @right_value: The actual evaluated value of the expression in the right slot. 133 * 195 * 134 * Represents an expectation/assertion that co 196 * Represents an expectation/assertion that compares two non-pointer values. For 135 * example, to expect that 1 + 1 == 2, you can 197 * example, to expect that 1 + 1 == 2, you can use the expectation 136 * KUNIT_EXPECT_EQ(test, 1 + 1, 2); 198 * KUNIT_EXPECT_EQ(test, 1 + 1, 2); 137 */ 199 */ 138 struct kunit_binary_assert { 200 struct kunit_binary_assert { 139 struct kunit_assert assert; 201 struct kunit_assert assert; 140 const struct kunit_binary_assert_text !! 202 const char *operation; >> 203 const char *left_text; 141 long long left_value; 204 long long left_value; >> 205 const char *right_text; 142 long long right_value; 206 long long right_value; 143 }; 207 }; 144 208 145 void kunit_binary_assert_format(const struct k 209 void kunit_binary_assert_format(const struct kunit_assert *assert, 146 const struct v << 147 struct string_ 210 struct string_stream *stream); 148 211 149 /** 212 /** >> 213 * KUNIT_INIT_BINARY_ASSERT_STRUCT() - Initializes a >> 214 * &struct kunit_binary_assert. >> 215 * @test: The test case that this expectation/assertion is associated with. >> 216 * @type: The type (assertion or expectation) of this kunit_assert. >> 217 * @op_str: A string representation of the comparison operator (e.g. "=="). >> 218 * @left_str: A string representation of the expression in the left slot. >> 219 * @left_val: The actual evaluated value of the expression in the left slot. >> 220 * @right_str: A string representation of the expression in the right slot. >> 221 * @right_val: The actual evaluated value of the expression in the right slot. >> 222 * >> 223 * Initializes a &struct kunit_binary_assert. Intended to be used in >> 224 * KUNIT_EXPECT_* and KUNIT_ASSERT_* macros. >> 225 */ >> 226 #define KUNIT_INIT_BINARY_ASSERT_STRUCT(test, \ >> 227 type, \ >> 228 op_str, \ >> 229 left_str, \ >> 230 left_val, \ >> 231 right_str, \ >> 232 right_val) { \ >> 233 .assert = KUNIT_INIT_ASSERT_STRUCT(test, \ >> 234 type, \ >> 235 kunit_binary_assert_format), \ >> 236 .operation = op_str, \ >> 237 .left_text = left_str, \ >> 238 .left_value = left_val, \ >> 239 .right_text = right_str, \ >> 240 .right_value = right_val \ >> 241 } >> 242 >> 243 /** 150 * struct kunit_binary_ptr_assert - An expecta 244 * struct kunit_binary_ptr_assert - An expectation/assertion that compares two 151 * pointer values (for example, KUNIT_EXP 245 * pointer values (for example, KUNIT_EXPECT_PTR_EQ(test, foo, bar)). 152 * @assert: The parent of this type. 246 * @assert: The parent of this type. 153 * @text: Holds the textual representations of !! 247 * @operation: A string representation of the comparison operator (e.g. "=="). >> 248 * @left_text: A string representation of the expression in the left slot. 154 * @left_value: The actual evaluated value of 249 * @left_value: The actual evaluated value of the expression in the left slot. >> 250 * @right_text: A string representation of the expression in the right slot. 155 * @right_value: The actual evaluated value of 251 * @right_value: The actual evaluated value of the expression in the right slot. 156 * 252 * 157 * Represents an expectation/assertion that co 253 * Represents an expectation/assertion that compares two pointer values. For 158 * example, to expect that foo and bar point t 254 * example, to expect that foo and bar point to the same thing, you can use the 159 * expectation KUNIT_EXPECT_PTR_EQ(test, foo, 255 * expectation KUNIT_EXPECT_PTR_EQ(test, foo, bar); 160 */ 256 */ 161 struct kunit_binary_ptr_assert { 257 struct kunit_binary_ptr_assert { 162 struct kunit_assert assert; 258 struct kunit_assert assert; 163 const struct kunit_binary_assert_text !! 259 const char *operation; >> 260 const char *left_text; 164 const void *left_value; 261 const void *left_value; >> 262 const char *right_text; 165 const void *right_value; 263 const void *right_value; 166 }; 264 }; 167 265 168 void kunit_binary_ptr_assert_format(const stru 266 void kunit_binary_ptr_assert_format(const struct kunit_assert *assert, 169 const stru << 170 struct str 267 struct string_stream *stream); 171 268 172 /** 269 /** >> 270 * KUNIT_INIT_BINARY_PTR_ASSERT_STRUCT() - Initializes a >> 271 * &struct kunit_binary_ptr_assert. >> 272 * @test: The test case that this expectation/assertion is associated with. >> 273 * @type: The type (assertion or expectation) of this kunit_assert. >> 274 * @op_str: A string representation of the comparison operator (e.g. "=="). >> 275 * @left_str: A string representation of the expression in the left slot. >> 276 * @left_val: The actual evaluated value of the expression in the left slot. >> 277 * @right_str: A string representation of the expression in the right slot. >> 278 * @right_val: The actual evaluated value of the expression in the right slot. >> 279 * >> 280 * Initializes a &struct kunit_binary_ptr_assert. Intended to be used in >> 281 * KUNIT_EXPECT_* and KUNIT_ASSERT_* macros. >> 282 */ >> 283 #define KUNIT_INIT_BINARY_PTR_ASSERT_STRUCT(test, \ >> 284 type, \ >> 285 op_str, \ >> 286 left_str, \ >> 287 left_val, \ >> 288 right_str, \ >> 289 right_val) { \ >> 290 .assert = KUNIT_INIT_ASSERT_STRUCT(test, \ >> 291 type, \ >> 292 kunit_binary_ptr_assert_format), \ >> 293 .operation = op_str, \ >> 294 .left_text = left_str, \ >> 295 .left_value = left_val, \ >> 296 .right_text = right_str, \ >> 297 .right_value = right_val \ >> 298 } >> 299 >> 300 /** 173 * struct kunit_binary_str_assert - An expecta 301 * struct kunit_binary_str_assert - An expectation/assertion that compares two 174 * string values (for example, KUNIT_EXPE 302 * string values (for example, KUNIT_EXPECT_STREQ(test, foo, "bar")). 175 * @assert: The parent of this type. 303 * @assert: The parent of this type. 176 * @text: Holds the textual representations of !! 304 * @operation: A string representation of the comparison operator (e.g. "=="). >> 305 * @left_text: A string representation of the expression in the left slot. 177 * @left_value: The actual evaluated value of 306 * @left_value: The actual evaluated value of the expression in the left slot. >> 307 * @right_text: A string representation of the expression in the right slot. 178 * @right_value: The actual evaluated value of 308 * @right_value: The actual evaluated value of the expression in the right slot. 179 * 309 * 180 * Represents an expectation/assertion that co 310 * Represents an expectation/assertion that compares two string values. For 181 * example, to expect that the string in foo i 311 * example, to expect that the string in foo is equal to "bar", you can use the 182 * expectation KUNIT_EXPECT_STREQ(test, foo, " 312 * expectation KUNIT_EXPECT_STREQ(test, foo, "bar"); 183 */ 313 */ 184 struct kunit_binary_str_assert { 314 struct kunit_binary_str_assert { 185 struct kunit_assert assert; 315 struct kunit_assert assert; 186 const struct kunit_binary_assert_text !! 316 const char *operation; >> 317 const char *left_text; 187 const char *left_value; 318 const char *left_value; >> 319 const char *right_text; 188 const char *right_value; 320 const char *right_value; 189 }; 321 }; 190 322 191 void kunit_binary_str_assert_format(const stru 323 void kunit_binary_str_assert_format(const struct kunit_assert *assert, 192 const stru << 193 struct str 324 struct string_stream *stream); 194 325 195 /** 326 /** 196 * struct kunit_mem_assert - An expectation/as !! 327 * KUNIT_INIT_BINARY_STR_ASSERT_STRUCT() - Initializes a 197 * memory blocks. !! 328 * &struct kunit_binary_str_assert. 198 * @assert: The parent of this type. !! 329 * @test: The test case that this expectation/assertion is associated with. 199 * @text: Holds the textual representations of !! 330 * @type: The type (assertion or expectation) of this kunit_assert. 200 * @left_value: The actual evaluated value of !! 331 * @op_str: A string representation of the comparison operator (e.g. "=="). 201 * @right_value: The actual evaluated value of !! 332 * @left_str: A string representation of the expression in the left slot. 202 * @size: Size of the memory block analysed in !! 333 * @left_val: The actual evaluated value of the expression in the left slot. >> 334 * @right_str: A string representation of the expression in the right slot. >> 335 * @right_val: The actual evaluated value of the expression in the right slot. 203 * 336 * 204 * Represents an expectation/assertion that co !! 337 * Initializes a &struct kunit_binary_str_assert. Intended to be used in 205 * example, to expect that the first three byt !! 338 * KUNIT_EXPECT_* and KUNIT_ASSERT_* macros. 206 * first three bytes of bar, you can use the e << 207 * KUNIT_EXPECT_MEMEQ(test, foo, bar, 3); << 208 */ 339 */ 209 struct kunit_mem_assert { !! 340 #define KUNIT_INIT_BINARY_STR_ASSERT_STRUCT(test, \ 210 struct kunit_assert assert; !! 341 type, \ 211 const struct kunit_binary_assert_text !! 342 op_str, \ 212 const void *left_value; !! 343 left_str, \ 213 const void *right_value; !! 344 left_val, \ 214 const size_t size; !! 345 right_str, \ 215 }; !! 346 right_val) { \ 216 !! 347 .assert = KUNIT_INIT_ASSERT_STRUCT(test, \ 217 void kunit_mem_assert_format(const struct kuni !! 348 type, \ 218 const struct va_f !! 349 kunit_binary_str_assert_format), \ 219 struct string_str !! 350 .operation = op_str, \ 220 !! 351 .left_text = left_str, \ 221 #if IS_ENABLED(CONFIG_KUNIT) !! 352 .left_value = left_val, \ 222 void kunit_assert_print_msg(const struct va_fo !! 353 .right_text = right_str, \ 223 struct string_stre !! 354 .right_value = right_val \ 224 bool is_literal(const char *text, long long va !! 355 } 225 bool is_str_literal(const char *text, const ch << 226 void kunit_assert_hexdump(struct string_stream << 227 const void *buf, << 228 const void *compared << 229 const size_t len); << 230 #endif << 231 356 232 #endif /* _KUNIT_ASSERT_H */ 357 #endif /* _KUNIT_ASSERT_H */ 233 358
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.