1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Assertion and expectation serialization API. 4 * 5 * Copyright (C) 2019, Google LLC. 6 * Author: Brendan Higgins <[email protected]> 7 */ 8 #include <kunit/assert.h> 9 10 #include "string-stream.h" 11 12 void kunit_base_assert_format(const struct kunit_assert *assert, 13 struct string_stream *stream) 14 { 15 const char *expect_or_assert = NULL; 16 17 switch (assert->type) { 18 case KUNIT_EXPECTATION: 19 expect_or_assert = "EXPECTATION"; 20 break; 21 case KUNIT_ASSERTION: 22 expect_or_assert = "ASSERTION"; 23 break; 24 } 25 26 string_stream_add(stream, "%s FAILED at %s:%d\n", 27 expect_or_assert, assert->file, assert->line); 28 } 29 30 void kunit_assert_print_msg(const struct kunit_assert *assert, 31 struct string_stream *stream) 32 { 33 if (assert->message.fmt) 34 string_stream_add(stream, "\n%pV", &assert->message); 35 } 36 37 void kunit_fail_assert_format(const struct kunit_assert *assert, 38 struct string_stream *stream) 39 { 40 kunit_base_assert_format(assert, stream); 41 string_stream_add(stream, "%pV", &assert->message); 42 } 43 44 void kunit_unary_assert_format(const struct kunit_assert *assert, 45 struct string_stream *stream) 46 { 47 struct kunit_unary_assert *unary_assert = container_of( 48 assert, struct kunit_unary_assert, assert); 49 50 kunit_base_assert_format(assert, stream); 51 if (unary_assert->expected_true) 52 string_stream_add(stream, 53 "\tExpected %s to be true, but is false\n", 54 unary_assert->condition); 55 else 56 string_stream_add(stream, 57 "\tExpected %s to be false, but is true\n", 58 unary_assert->condition); 59 kunit_assert_print_msg(assert, stream); 60 } 61 62 void kunit_ptr_not_err_assert_format(const struct kunit_assert *assert, 63 struct string_stream *stream) 64 { 65 struct kunit_ptr_not_err_assert *ptr_assert = container_of( 66 assert, struct kunit_ptr_not_err_assert, assert); 67 68 kunit_base_assert_format(assert, stream); 69 if (!ptr_assert->value) { 70 string_stream_add(stream, 71 "\tExpected %s is not null, but is\n", 72 ptr_assert->text); 73 } else if (IS_ERR(ptr_assert->value)) { 74 string_stream_add(stream, 75 "\tExpected %s is not error, but is: %ld\n", 76 ptr_assert->text, 77 PTR_ERR(ptr_assert->value)); 78 } 79 kunit_assert_print_msg(assert, stream); 80 } 81 82 void kunit_binary_assert_format(const struct kunit_assert *assert, 83 struct string_stream *stream) 84 { 85 struct kunit_binary_assert *binary_assert = container_of( 86 assert, struct kunit_binary_assert, assert); 87 88 kunit_base_assert_format(assert, stream); 89 string_stream_add(stream, 90 "\tExpected %s %s %s, but\n", 91 binary_assert->left_text, 92 binary_assert->operation, 93 binary_assert->right_text); 94 string_stream_add(stream, "\t\t%s == %lld\n", 95 binary_assert->left_text, 96 binary_assert->left_value); 97 string_stream_add(stream, "\t\t%s == %lld", 98 binary_assert->right_text, 99 binary_assert->right_value); 100 kunit_assert_print_msg(assert, stream); 101 } 102 103 void kunit_binary_ptr_assert_format(const struct kunit_assert *assert, 104 struct string_stream *stream) 105 { 106 struct kunit_binary_ptr_assert *binary_assert = container_of( 107 assert, struct kunit_binary_ptr_assert, assert); 108 109 kunit_base_assert_format(assert, stream); 110 string_stream_add(stream, 111 "\tExpected %s %s %s, but\n", 112 binary_assert->left_text, 113 binary_assert->operation, 114 binary_assert->right_text); 115 string_stream_add(stream, "\t\t%s == %pK\n", 116 binary_assert->left_text, 117 binary_assert->left_value); 118 string_stream_add(stream, "\t\t%s == %pK", 119 binary_assert->right_text, 120 binary_assert->right_value); 121 kunit_assert_print_msg(assert, stream); 122 } 123 124 void kunit_binary_str_assert_format(const struct kunit_assert *assert, 125 struct string_stream *stream) 126 { 127 struct kunit_binary_str_assert *binary_assert = container_of( 128 assert, struct kunit_binary_str_assert, assert); 129 130 kunit_base_assert_format(assert, stream); 131 string_stream_add(stream, 132 "\tExpected %s %s %s, but\n", 133 binary_assert->left_text, 134 binary_assert->operation, 135 binary_assert->right_text); 136 string_stream_add(stream, "\t\t%s == %s\n", 137 binary_assert->left_text, 138 binary_assert->left_value); 139 string_stream_add(stream, "\t\t%s == %s", 140 binary_assert->right_text, 141 binary_assert->right_value); 142 kunit_assert_print_msg(assert, stream); 143 } 144