LCOV - code coverage report
Current view: top level - lib/kunit - assert.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 23 77 29.9 %
Date: 2022-12-09 01:23:36 Functions: 3 9 33.3 %

          Line data    Source code
       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 <brendanhiggins@google.com>
       7             :  */
       8             : #include <kunit/assert.h>
       9             : #include <kunit/test.h>
      10             : 
      11             : #include "string-stream.h"
      12             : 
      13          10 : void kunit_assert_prologue(const struct kunit_loc *loc,
      14             :                            enum kunit_assert_type type,
      15             :                               struct string_stream *stream)
      16             : {
      17          10 :         const char *expect_or_assert = NULL;
      18             : 
      19          10 :         switch (type) {
      20             :         case KUNIT_EXPECTATION:
      21          10 :                 expect_or_assert = "EXPECTATION";
      22          10 :                 break;
      23             :         case KUNIT_ASSERTION:
      24           0 :                 expect_or_assert = "ASSERTION";
      25           0 :                 break;
      26             :         }
      27             : 
      28          10 :         string_stream_add(stream, "%s FAILED at %s:%d\n",
      29             :                           expect_or_assert, loc->file, loc->line);
      30          10 : }
      31             : EXPORT_SYMBOL_GPL(kunit_assert_prologue);
      32             : 
      33             : static void kunit_assert_print_msg(const struct va_format *message,
      34             :                                    struct string_stream *stream)
      35             : {
      36          10 :         if (message->fmt)
      37           0 :                 string_stream_add(stream, "\n%pV", message);
      38             : }
      39             : 
      40           0 : void kunit_fail_assert_format(const struct kunit_assert *assert,
      41             :                               const struct va_format *message,
      42             :                               struct string_stream *stream)
      43             : {
      44           0 :         string_stream_add(stream, "%pV", message);
      45           0 : }
      46             : EXPORT_SYMBOL_GPL(kunit_fail_assert_format);
      47             : 
      48           0 : void kunit_unary_assert_format(const struct kunit_assert *assert,
      49             :                                const struct va_format *message,
      50             :                                struct string_stream *stream)
      51             : {
      52             :         struct kunit_unary_assert *unary_assert;
      53             : 
      54           0 :         unary_assert = container_of(assert, struct kunit_unary_assert, assert);
      55             : 
      56           0 :         if (unary_assert->expected_true)
      57           0 :                 string_stream_add(stream,
      58             :                                   KUNIT_SUBTEST_INDENT "Expected %s to be true, but is false\n",
      59             :                                   unary_assert->condition);
      60             :         else
      61           0 :                 string_stream_add(stream,
      62             :                                   KUNIT_SUBTEST_INDENT "Expected %s to be false, but is true\n",
      63             :                                   unary_assert->condition);
      64           0 :         kunit_assert_print_msg(message, stream);
      65           0 : }
      66             : EXPORT_SYMBOL_GPL(kunit_unary_assert_format);
      67             : 
      68           0 : void kunit_ptr_not_err_assert_format(const struct kunit_assert *assert,
      69             :                                      const struct va_format *message,
      70             :                                      struct string_stream *stream)
      71             : {
      72             :         struct kunit_ptr_not_err_assert *ptr_assert;
      73             : 
      74           0 :         ptr_assert = container_of(assert, struct kunit_ptr_not_err_assert,
      75             :                                   assert);
      76             : 
      77           0 :         if (!ptr_assert->value) {
      78           0 :                 string_stream_add(stream,
      79             :                                   KUNIT_SUBTEST_INDENT "Expected %s is not null, but is\n",
      80             :                                   ptr_assert->text);
      81           0 :         } else if (IS_ERR(ptr_assert->value)) {
      82           0 :                 string_stream_add(stream,
      83             :                                   KUNIT_SUBTEST_INDENT "Expected %s is not error, but is: %ld\n",
      84             :                                   ptr_assert->text,
      85             :                                   PTR_ERR(ptr_assert->value));
      86             :         }
      87           0 :         kunit_assert_print_msg(message, stream);
      88           0 : }
      89             : EXPORT_SYMBOL_GPL(kunit_ptr_not_err_assert_format);
      90             : 
      91             : /* Checks if `text` is a literal representing `value`, e.g. "5" and 5 */
      92          20 : static bool is_literal(struct kunit *test, const char *text, long long value,
      93             :                        gfp_t gfp)
      94             : {
      95             :         char *buffer;
      96             :         int len;
      97             :         bool ret;
      98             : 
      99          20 :         len = snprintf(NULL, 0, "%lld", value);
     100          20 :         if (strlen(text) != len)
     101             :                 return false;
     102             : 
     103           0 :         buffer = kunit_kmalloc(test, len+1, gfp);
     104           0 :         if (!buffer)
     105             :                 return false;
     106             : 
     107           0 :         snprintf(buffer, len+1, "%lld", value);
     108           0 :         ret = strncmp(buffer, text, len) == 0;
     109             : 
     110           0 :         kunit_kfree(test, buffer);
     111           0 :         return ret;
     112             : }
     113             : 
     114          10 : void kunit_binary_assert_format(const struct kunit_assert *assert,
     115             :                                 const struct va_format *message,
     116             :                                 struct string_stream *stream)
     117             : {
     118             :         struct kunit_binary_assert *binary_assert;
     119             : 
     120          10 :         binary_assert = container_of(assert, struct kunit_binary_assert,
     121             :                                      assert);
     122             : 
     123          10 :         string_stream_add(stream,
     124             :                           KUNIT_SUBTEST_INDENT "Expected %s %s %s, but\n",
     125             :                           binary_assert->text->left_text,
     126             :                           binary_assert->text->operation,
     127          10 :                           binary_assert->text->right_text);
     128          10 :         if (!is_literal(stream->test, binary_assert->text->left_text,
     129             :                         binary_assert->left_value, stream->gfp))
     130          20 :                 string_stream_add(stream, KUNIT_SUBSUBTEST_INDENT "%s == %lld\n",
     131          10 :                                   binary_assert->text->left_text,
     132             :                                   binary_assert->left_value);
     133          10 :         if (!is_literal(stream->test, binary_assert->text->right_text,
     134             :                         binary_assert->right_value, stream->gfp))
     135          20 :                 string_stream_add(stream, KUNIT_SUBSUBTEST_INDENT "%s == %lld",
     136          10 :                                   binary_assert->text->right_text,
     137             :                                   binary_assert->right_value);
     138          10 :         kunit_assert_print_msg(message, stream);
     139          10 : }
     140             : EXPORT_SYMBOL_GPL(kunit_binary_assert_format);
     141             : 
     142           0 : void kunit_binary_ptr_assert_format(const struct kunit_assert *assert,
     143             :                                     const struct va_format *message,
     144             :                                     struct string_stream *stream)
     145             : {
     146             :         struct kunit_binary_ptr_assert *binary_assert;
     147             : 
     148           0 :         binary_assert = container_of(assert, struct kunit_binary_ptr_assert,
     149             :                                      assert);
     150             : 
     151           0 :         string_stream_add(stream,
     152             :                           KUNIT_SUBTEST_INDENT "Expected %s %s %s, but\n",
     153             :                           binary_assert->text->left_text,
     154             :                           binary_assert->text->operation,
     155           0 :                           binary_assert->text->right_text);
     156           0 :         string_stream_add(stream, KUNIT_SUBSUBTEST_INDENT "%s == %px\n",
     157           0 :                           binary_assert->text->left_text,
     158             :                           binary_assert->left_value);
     159           0 :         string_stream_add(stream, KUNIT_SUBSUBTEST_INDENT "%s == %px",
     160           0 :                           binary_assert->text->right_text,
     161             :                           binary_assert->right_value);
     162           0 :         kunit_assert_print_msg(message, stream);
     163           0 : }
     164             : EXPORT_SYMBOL_GPL(kunit_binary_ptr_assert_format);
     165             : 
     166             : /* Checks if KUNIT_EXPECT_STREQ() args were string literals.
     167             :  * Note: `text` will have ""s where as `value` will not.
     168             :  */
     169           0 : static bool is_str_literal(const char *text, const char *value)
     170             : {
     171             :         int len;
     172             : 
     173           0 :         len = strlen(text);
     174           0 :         if (len < 2)
     175             :                 return false;
     176           0 :         if (text[0] != '\"' || text[len - 1] != '\"')
     177             :                 return false;
     178             : 
     179           0 :         return strncmp(text + 1, value, len - 2) == 0;
     180             : }
     181             : 
     182           0 : void kunit_binary_str_assert_format(const struct kunit_assert *assert,
     183             :                                     const struct va_format *message,
     184             :                                     struct string_stream *stream)
     185             : {
     186             :         struct kunit_binary_str_assert *binary_assert;
     187             : 
     188           0 :         binary_assert = container_of(assert, struct kunit_binary_str_assert,
     189             :                                      assert);
     190             : 
     191           0 :         string_stream_add(stream,
     192             :                           KUNIT_SUBTEST_INDENT "Expected %s %s %s, but\n",
     193             :                           binary_assert->text->left_text,
     194             :                           binary_assert->text->operation,
     195           0 :                           binary_assert->text->right_text);
     196           0 :         if (!is_str_literal(binary_assert->text->left_text, binary_assert->left_value))
     197           0 :                 string_stream_add(stream, KUNIT_SUBSUBTEST_INDENT "%s == \"%s\"\n",
     198           0 :                                   binary_assert->text->left_text,
     199             :                                   binary_assert->left_value);
     200           0 :         if (!is_str_literal(binary_assert->text->right_text, binary_assert->right_value))
     201           0 :                 string_stream_add(stream, KUNIT_SUBSUBTEST_INDENT "%s == \"%s\"",
     202           0 :                                   binary_assert->text->right_text,
     203             :                                   binary_assert->right_value);
     204           0 :         kunit_assert_print_msg(message, stream);
     205           0 : }
     206             : EXPORT_SYMBOL_GPL(kunit_binary_str_assert_format);

Generated by: LCOV version 1.14