Message ID | 20201115185905.169349-1-98.arpi@gmail.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [v8,1/2] kunit: Support for Parameterized Testing | expand |
On Sun, 15 Nov 2020 at 19:59, Arpitha Raghunandan <98.arpi@gmail.com> wrote: > > Modify fs/ext4/inode-test.c to use the parameterized testing > feature of KUnit. > > Signed-off-by: Arpitha Raghunandan <98.arpi@gmail.com> > Signed-off-by: Marco Elver <elver@google.com> > --- > Changes v7->v8: > - Replace strcpy() with strncpy() in timestamp_expectation_to_desc() > Changes v6->v7: > - Introduce timestamp_expectation_to_desc() to convert param to > description. > Changes v5->v6: > - No change to this patch of the patch series > Changes v4->v5: > - No change to this patch of the patch series > Changes v3->v4: > - Modification based on latest implementation of KUnit parameterized testing > Changes v2->v3: > - Marked hardcoded test data const > - Modification based on latest implementation of KUnit parameterized testing > Changes v1->v2: > - Modification based on latest implementation of KUnit parameterized testing > > fs/ext4/inode-test.c | 323 ++++++++++++++++++++++--------------------- > 1 file changed, 167 insertions(+), 156 deletions(-) > > diff --git a/fs/ext4/inode-test.c b/fs/ext4/inode-test.c > index d62d802c9c12..2c0c00c45c6b 100644 > --- a/fs/ext4/inode-test.c > +++ b/fs/ext4/inode-test.c > @@ -80,6 +80,148 @@ struct timestamp_expectation { > bool lower_bound; > }; > > +static const struct timestamp_expectation test_data[] = { > + { > + .test_case_name = LOWER_BOUND_NEG_NO_EXTRA_BITS_CASE, > + .msb_set = true, > + .lower_bound = true, > + .extra_bits = 0, > + .expected = {.tv_sec = -0x80000000LL, .tv_nsec = 0L}, > + }, > + > + { > + .test_case_name = UPPER_BOUND_NEG_NO_EXTRA_BITS_CASE, > + .msb_set = true, > + .lower_bound = false, > + .extra_bits = 0, > + .expected = {.tv_sec = -1LL, .tv_nsec = 0L}, > + }, > + > + { > + .test_case_name = LOWER_BOUND_NONNEG_NO_EXTRA_BITS_CASE, > + .msb_set = false, > + .lower_bound = true, > + .extra_bits = 0, > + .expected = {0LL, 0L}, > + }, > + > + { > + .test_case_name = UPPER_BOUND_NONNEG_NO_EXTRA_BITS_CASE, > + .msb_set = false, > + .lower_bound = false, > + .extra_bits = 0, > + .expected = {.tv_sec = 0x7fffffffLL, .tv_nsec = 0L}, > + }, > + > + { > + .test_case_name = LOWER_BOUND_NEG_LO_1_CASE, > + .msb_set = true, > + .lower_bound = true, > + .extra_bits = 1, > + .expected = {.tv_sec = 0x80000000LL, .tv_nsec = 0L}, > + }, > + > + { > + .test_case_name = UPPER_BOUND_NEG_LO_1_CASE, > + .msb_set = true, > + .lower_bound = false, > + .extra_bits = 1, > + .expected = {.tv_sec = 0xffffffffLL, .tv_nsec = 0L}, > + }, > + > + { > + .test_case_name = LOWER_BOUND_NONNEG_LO_1_CASE, > + .msb_set = false, > + .lower_bound = true, > + .extra_bits = 1, > + .expected = {.tv_sec = 0x100000000LL, .tv_nsec = 0L}, > + }, > + > + { > + .test_case_name = UPPER_BOUND_NONNEG_LO_1_CASE, > + .msb_set = false, > + .lower_bound = false, > + .extra_bits = 1, > + .expected = {.tv_sec = 0x17fffffffLL, .tv_nsec = 0L}, > + }, > + > + { > + .test_case_name = LOWER_BOUND_NEG_HI_1_CASE, > + .msb_set = true, > + .lower_bound = true, > + .extra_bits = 2, > + .expected = {.tv_sec = 0x180000000LL, .tv_nsec = 0L}, > + }, > + > + { > + .test_case_name = UPPER_BOUND_NEG_HI_1_CASE, > + .msb_set = true, > + .lower_bound = false, > + .extra_bits = 2, > + .expected = {.tv_sec = 0x1ffffffffLL, .tv_nsec = 0L}, > + }, > + > + { > + .test_case_name = LOWER_BOUND_NONNEG_HI_1_CASE, > + .msb_set = false, > + .lower_bound = true, > + .extra_bits = 2, > + .expected = {.tv_sec = 0x200000000LL, .tv_nsec = 0L}, > + }, > + > + { > + .test_case_name = UPPER_BOUND_NONNEG_HI_1_CASE, > + .msb_set = false, > + .lower_bound = false, > + .extra_bits = 2, > + .expected = {.tv_sec = 0x27fffffffLL, .tv_nsec = 0L}, > + }, > + > + { > + .test_case_name = UPPER_BOUND_NONNEG_HI_1_NS_1_CASE, > + .msb_set = false, > + .lower_bound = false, > + .extra_bits = 6, > + .expected = {.tv_sec = 0x27fffffffLL, .tv_nsec = 1L}, > + }, > + > + { > + .test_case_name = LOWER_BOUND_NONNEG_HI_1_NS_MAX_CASE, > + .msb_set = false, > + .lower_bound = true, > + .extra_bits = 0xFFFFFFFF, > + .expected = {.tv_sec = 0x300000000LL, > + .tv_nsec = MAX_NANOSECONDS}, > + }, > + > + { > + .test_case_name = LOWER_BOUND_NONNEG_EXTRA_BITS_1_CASE, > + .msb_set = false, > + .lower_bound = true, > + .extra_bits = 3, > + .expected = {.tv_sec = 0x300000000LL, .tv_nsec = 0L}, > + }, > + > + { > + .test_case_name = UPPER_BOUND_NONNEG_EXTRA_BITS_1_CASE, > + .msb_set = false, > + .lower_bound = false, > + .extra_bits = 3, > + .expected = {.tv_sec = 0x37fffffffLL, .tv_nsec = 0L}, > + } > +}; > + > +static void timestamp_expectation_to_desc(const struct timestamp_expectation *t, > + char *desc) > +{ > + int desc_length = strlen(t->test_case_name); > + > + strncpy(desc, t->test_case_name, desc_length); > + desc[desc_length] = '\0'; > +} This unfortunately won't prevent out-of-bounds accesses if the description is longer than KUNIT_PARAM_DESC_SIZE. With strncpy() we want to avoid copying more bytes than the destination buffer can hold. This can be done by simply a strncpy(desc, t->test_case_name, KUNIT_PARAM_DESC_SIZE). But, strncpy() is unsafe in certain cases, too, so the kernel introduced strscpy() -- see the note about strncpy() in Documentation/process/deprecated.rst. Also have a look at the documentation about str{n,l,s}cpy() in lib/string.c. So, finally, what we want here is just 1 line: strscpy(desc, t->test_case_name, KUNIT_PARAM_DESC_SIZE); Patch 1/2 looks fine though, so hopefully v9 will be final. :-) Thanks, -- Marco
Hi Arpitha, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on ext4/dev] [also build test WARNING on linus/master v5.10-rc3 next-20201113] [cannot apply to tytso-fscrypt/master] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Arpitha-Raghunandan/kunit-Support-for-Parameterized-Testing/20201116-030137 base: https://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4.git dev config: microblaze-randconfig-r031-20201115 (attached as .config) compiler: microblaze-linux-gcc (GCC) 9.3.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/0day-ci/linux/commit/002a7d4700bd033cceff2f2ab10bcc4a440f1377 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Arpitha-Raghunandan/kunit-Support-for-Parameterized-Testing/20201116-030137 git checkout 002a7d4700bd033cceff2f2ab10bcc4a440f1377 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=microblaze If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): In function 'timestamp_expectation_to_desc', inlined from 'ext4_inode_gen_params' at fs/ext4/inode-test.c:223:1: >> fs/ext4/inode-test.c:219:2: warning: 'strncpy' output truncated before terminating nul copying as many bytes from a string as its length [-Wstringop-truncation] 219 | strncpy(desc, t->test_case_name, desc_length); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ fs/ext4/inode-test.c: In function 'ext4_inode_gen_params': fs/ext4/inode-test.c:217:20: note: length computed here 217 | int desc_length = strlen(t->test_case_name); | ^~~~~~~~~~~~~~~~~~~~~~~~~ vim +/strncpy +219 fs/ext4/inode-test.c 213 214 static void timestamp_expectation_to_desc(const struct timestamp_expectation *t, 215 char *desc) 216 { 217 int desc_length = strlen(t->test_case_name); 218 > 219 strncpy(desc, t->test_case_name, desc_length); 220 desc[desc_length] = '\0'; 221 } 222 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
On 16/11/20 1:14 am, Marco Elver wrote: > On Sun, 15 Nov 2020 at 19:59, Arpitha Raghunandan <98.arpi@gmail.com> wrote: >> >> Modify fs/ext4/inode-test.c to use the parameterized testing >> feature of KUnit. >> >> Signed-off-by: Arpitha Raghunandan <98.arpi@gmail.com> >> Signed-off-by: Marco Elver <elver@google.com> >> --- >> Changes v7->v8: >> - Replace strcpy() with strncpy() in timestamp_expectation_to_desc() >> Changes v6->v7: >> - Introduce timestamp_expectation_to_desc() to convert param to >> description. >> Changes v5->v6: >> - No change to this patch of the patch series >> Changes v4->v5: >> - No change to this patch of the patch series >> Changes v3->v4: >> - Modification based on latest implementation of KUnit parameterized testing >> Changes v2->v3: >> - Marked hardcoded test data const >> - Modification based on latest implementation of KUnit parameterized testing >> Changes v1->v2: >> - Modification based on latest implementation of KUnit parameterized testing >> >> fs/ext4/inode-test.c | 323 ++++++++++++++++++++++--------------------- >> 1 file changed, 167 insertions(+), 156 deletions(-) >> >> diff --git a/fs/ext4/inode-test.c b/fs/ext4/inode-test.c >> index d62d802c9c12..2c0c00c45c6b 100644 >> --- a/fs/ext4/inode-test.c >> +++ b/fs/ext4/inode-test.c >> @@ -80,6 +80,148 @@ struct timestamp_expectation { >> bool lower_bound; >> }; >> >> +static const struct timestamp_expectation test_data[] = { >> + { >> + .test_case_name = LOWER_BOUND_NEG_NO_EXTRA_BITS_CASE, >> + .msb_set = true, >> + .lower_bound = true, >> + .extra_bits = 0, >> + .expected = {.tv_sec = -0x80000000LL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = UPPER_BOUND_NEG_NO_EXTRA_BITS_CASE, >> + .msb_set = true, >> + .lower_bound = false, >> + .extra_bits = 0, >> + .expected = {.tv_sec = -1LL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = LOWER_BOUND_NONNEG_NO_EXTRA_BITS_CASE, >> + .msb_set = false, >> + .lower_bound = true, >> + .extra_bits = 0, >> + .expected = {0LL, 0L}, >> + }, >> + >> + { >> + .test_case_name = UPPER_BOUND_NONNEG_NO_EXTRA_BITS_CASE, >> + .msb_set = false, >> + .lower_bound = false, >> + .extra_bits = 0, >> + .expected = {.tv_sec = 0x7fffffffLL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = LOWER_BOUND_NEG_LO_1_CASE, >> + .msb_set = true, >> + .lower_bound = true, >> + .extra_bits = 1, >> + .expected = {.tv_sec = 0x80000000LL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = UPPER_BOUND_NEG_LO_1_CASE, >> + .msb_set = true, >> + .lower_bound = false, >> + .extra_bits = 1, >> + .expected = {.tv_sec = 0xffffffffLL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = LOWER_BOUND_NONNEG_LO_1_CASE, >> + .msb_set = false, >> + .lower_bound = true, >> + .extra_bits = 1, >> + .expected = {.tv_sec = 0x100000000LL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = UPPER_BOUND_NONNEG_LO_1_CASE, >> + .msb_set = false, >> + .lower_bound = false, >> + .extra_bits = 1, >> + .expected = {.tv_sec = 0x17fffffffLL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = LOWER_BOUND_NEG_HI_1_CASE, >> + .msb_set = true, >> + .lower_bound = true, >> + .extra_bits = 2, >> + .expected = {.tv_sec = 0x180000000LL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = UPPER_BOUND_NEG_HI_1_CASE, >> + .msb_set = true, >> + .lower_bound = false, >> + .extra_bits = 2, >> + .expected = {.tv_sec = 0x1ffffffffLL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = LOWER_BOUND_NONNEG_HI_1_CASE, >> + .msb_set = false, >> + .lower_bound = true, >> + .extra_bits = 2, >> + .expected = {.tv_sec = 0x200000000LL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = UPPER_BOUND_NONNEG_HI_1_CASE, >> + .msb_set = false, >> + .lower_bound = false, >> + .extra_bits = 2, >> + .expected = {.tv_sec = 0x27fffffffLL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = UPPER_BOUND_NONNEG_HI_1_NS_1_CASE, >> + .msb_set = false, >> + .lower_bound = false, >> + .extra_bits = 6, >> + .expected = {.tv_sec = 0x27fffffffLL, .tv_nsec = 1L}, >> + }, >> + >> + { >> + .test_case_name = LOWER_BOUND_NONNEG_HI_1_NS_MAX_CASE, >> + .msb_set = false, >> + .lower_bound = true, >> + .extra_bits = 0xFFFFFFFF, >> + .expected = {.tv_sec = 0x300000000LL, >> + .tv_nsec = MAX_NANOSECONDS}, >> + }, >> + >> + { >> + .test_case_name = LOWER_BOUND_NONNEG_EXTRA_BITS_1_CASE, >> + .msb_set = false, >> + .lower_bound = true, >> + .extra_bits = 3, >> + .expected = {.tv_sec = 0x300000000LL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = UPPER_BOUND_NONNEG_EXTRA_BITS_1_CASE, >> + .msb_set = false, >> + .lower_bound = false, >> + .extra_bits = 3, >> + .expected = {.tv_sec = 0x37fffffffLL, .tv_nsec = 0L}, >> + } >> +}; >> + >> +static void timestamp_expectation_to_desc(const struct timestamp_expectation *t, >> + char *desc) >> +{ >> + int desc_length = strlen(t->test_case_name); >> + >> + strncpy(desc, t->test_case_name, desc_length); >> + desc[desc_length] = '\0'; >> +} > > This unfortunately won't prevent out-of-bounds accesses if the > description is longer than KUNIT_PARAM_DESC_SIZE. > > With strncpy() we want to avoid copying more bytes than the > destination buffer can hold. This can be done by simply a > strncpy(desc, t->test_case_name, KUNIT_PARAM_DESC_SIZE). But, > strncpy() is unsafe in certain cases, too, so the kernel introduced > strscpy() -- see the note about strncpy() in > Documentation/process/deprecated.rst. Also have a look at the > documentation about str{n,l,s}cpy() in lib/string.c. > > So, finally, what we want here is just 1 line: > > strscpy(desc, t->test_case_name, KUNIT_PARAM_DESC_SIZE); > Okay, I'll look this up and make this change for v9. > Patch 1/2 looks fine though, so hopefully v9 will be final. :-) > > Thanks, > -- Marco > Thanks!
diff --git a/fs/ext4/inode-test.c b/fs/ext4/inode-test.c index d62d802c9c12..2c0c00c45c6b 100644 --- a/fs/ext4/inode-test.c +++ b/fs/ext4/inode-test.c @@ -80,6 +80,148 @@ struct timestamp_expectation { bool lower_bound; }; +static const struct timestamp_expectation test_data[] = { + { + .test_case_name = LOWER_BOUND_NEG_NO_EXTRA_BITS_CASE, + .msb_set = true, + .lower_bound = true, + .extra_bits = 0, + .expected = {.tv_sec = -0x80000000LL, .tv_nsec = 0L}, + }, + + { + .test_case_name = UPPER_BOUND_NEG_NO_EXTRA_BITS_CASE, + .msb_set = true, + .lower_bound = false, + .extra_bits = 0, + .expected = {.tv_sec = -1LL, .tv_nsec = 0L}, + }, + + { + .test_case_name = LOWER_BOUND_NONNEG_NO_EXTRA_BITS_CASE, + .msb_set = false, + .lower_bound = true, + .extra_bits = 0, + .expected = {0LL, 0L}, + }, + + { + .test_case_name = UPPER_BOUND_NONNEG_NO_EXTRA_BITS_CASE, + .msb_set = false, + .lower_bound = false, + .extra_bits = 0, + .expected = {.tv_sec = 0x7fffffffLL, .tv_nsec = 0L}, + }, + + { + .test_case_name = LOWER_BOUND_NEG_LO_1_CASE, + .msb_set = true, + .lower_bound = true, + .extra_bits = 1, + .expected = {.tv_sec = 0x80000000LL, .tv_nsec = 0L}, + }, + + { + .test_case_name = UPPER_BOUND_NEG_LO_1_CASE, + .msb_set = true, + .lower_bound = false, + .extra_bits = 1, + .expected = {.tv_sec = 0xffffffffLL, .tv_nsec = 0L}, + }, + + { + .test_case_name = LOWER_BOUND_NONNEG_LO_1_CASE, + .msb_set = false, + .lower_bound = true, + .extra_bits = 1, + .expected = {.tv_sec = 0x100000000LL, .tv_nsec = 0L}, + }, + + { + .test_case_name = UPPER_BOUND_NONNEG_LO_1_CASE, + .msb_set = false, + .lower_bound = false, + .extra_bits = 1, + .expected = {.tv_sec = 0x17fffffffLL, .tv_nsec = 0L}, + }, + + { + .test_case_name = LOWER_BOUND_NEG_HI_1_CASE, + .msb_set = true, + .lower_bound = true, + .extra_bits = 2, + .expected = {.tv_sec = 0x180000000LL, .tv_nsec = 0L}, + }, + + { + .test_case_name = UPPER_BOUND_NEG_HI_1_CASE, + .msb_set = true, + .lower_bound = false, + .extra_bits = 2, + .expected = {.tv_sec = 0x1ffffffffLL, .tv_nsec = 0L}, + }, + + { + .test_case_name = LOWER_BOUND_NONNEG_HI_1_CASE, + .msb_set = false, + .lower_bound = true, + .extra_bits = 2, + .expected = {.tv_sec = 0x200000000LL, .tv_nsec = 0L}, + }, + + { + .test_case_name = UPPER_BOUND_NONNEG_HI_1_CASE, + .msb_set = false, + .lower_bound = false, + .extra_bits = 2, + .expected = {.tv_sec = 0x27fffffffLL, .tv_nsec = 0L}, + }, + + { + .test_case_name = UPPER_BOUND_NONNEG_HI_1_NS_1_CASE, + .msb_set = false, + .lower_bound = false, + .extra_bits = 6, + .expected = {.tv_sec = 0x27fffffffLL, .tv_nsec = 1L}, + }, + + { + .test_case_name = LOWER_BOUND_NONNEG_HI_1_NS_MAX_CASE, + .msb_set = false, + .lower_bound = true, + .extra_bits = 0xFFFFFFFF, + .expected = {.tv_sec = 0x300000000LL, + .tv_nsec = MAX_NANOSECONDS}, + }, + + { + .test_case_name = LOWER_BOUND_NONNEG_EXTRA_BITS_1_CASE, + .msb_set = false, + .lower_bound = true, + .extra_bits = 3, + .expected = {.tv_sec = 0x300000000LL, .tv_nsec = 0L}, + }, + + { + .test_case_name = UPPER_BOUND_NONNEG_EXTRA_BITS_1_CASE, + .msb_set = false, + .lower_bound = false, + .extra_bits = 3, + .expected = {.tv_sec = 0x37fffffffLL, .tv_nsec = 0L}, + } +}; + +static void timestamp_expectation_to_desc(const struct timestamp_expectation *t, + char *desc) +{ + int desc_length = strlen(t->test_case_name); + + strncpy(desc, t->test_case_name, desc_length); + desc[desc_length] = '\0'; +} + +KUNIT_ARRAY_PARAM(ext4_inode, test_data, timestamp_expectation_to_desc); + static time64_t get_32bit_time(const struct timestamp_expectation * const test) { if (test->msb_set) { @@ -101,166 +243,35 @@ static time64_t get_32bit_time(const struct timestamp_expectation * const test) */ static void inode_test_xtimestamp_decoding(struct kunit *test) { - const struct timestamp_expectation test_data[] = { - { - .test_case_name = LOWER_BOUND_NEG_NO_EXTRA_BITS_CASE, - .msb_set = true, - .lower_bound = true, - .extra_bits = 0, - .expected = {.tv_sec = -0x80000000LL, .tv_nsec = 0L}, - }, - - { - .test_case_name = UPPER_BOUND_NEG_NO_EXTRA_BITS_CASE, - .msb_set = true, - .lower_bound = false, - .extra_bits = 0, - .expected = {.tv_sec = -1LL, .tv_nsec = 0L}, - }, - - { - .test_case_name = LOWER_BOUND_NONNEG_NO_EXTRA_BITS_CASE, - .msb_set = false, - .lower_bound = true, - .extra_bits = 0, - .expected = {0LL, 0L}, - }, - - { - .test_case_name = UPPER_BOUND_NONNEG_NO_EXTRA_BITS_CASE, - .msb_set = false, - .lower_bound = false, - .extra_bits = 0, - .expected = {.tv_sec = 0x7fffffffLL, .tv_nsec = 0L}, - }, - - { - .test_case_name = LOWER_BOUND_NEG_LO_1_CASE, - .msb_set = true, - .lower_bound = true, - .extra_bits = 1, - .expected = {.tv_sec = 0x80000000LL, .tv_nsec = 0L}, - }, - - { - .test_case_name = UPPER_BOUND_NEG_LO_1_CASE, - .msb_set = true, - .lower_bound = false, - .extra_bits = 1, - .expected = {.tv_sec = 0xffffffffLL, .tv_nsec = 0L}, - }, - - { - .test_case_name = LOWER_BOUND_NONNEG_LO_1_CASE, - .msb_set = false, - .lower_bound = true, - .extra_bits = 1, - .expected = {.tv_sec = 0x100000000LL, .tv_nsec = 0L}, - }, - - { - .test_case_name = UPPER_BOUND_NONNEG_LO_1_CASE, - .msb_set = false, - .lower_bound = false, - .extra_bits = 1, - .expected = {.tv_sec = 0x17fffffffLL, .tv_nsec = 0L}, - }, - - { - .test_case_name = LOWER_BOUND_NEG_HI_1_CASE, - .msb_set = true, - .lower_bound = true, - .extra_bits = 2, - .expected = {.tv_sec = 0x180000000LL, .tv_nsec = 0L}, - }, - - { - .test_case_name = UPPER_BOUND_NEG_HI_1_CASE, - .msb_set = true, - .lower_bound = false, - .extra_bits = 2, - .expected = {.tv_sec = 0x1ffffffffLL, .tv_nsec = 0L}, - }, - - { - .test_case_name = LOWER_BOUND_NONNEG_HI_1_CASE, - .msb_set = false, - .lower_bound = true, - .extra_bits = 2, - .expected = {.tv_sec = 0x200000000LL, .tv_nsec = 0L}, - }, - - { - .test_case_name = UPPER_BOUND_NONNEG_HI_1_CASE, - .msb_set = false, - .lower_bound = false, - .extra_bits = 2, - .expected = {.tv_sec = 0x27fffffffLL, .tv_nsec = 0L}, - }, - - { - .test_case_name = UPPER_BOUND_NONNEG_HI_1_NS_1_CASE, - .msb_set = false, - .lower_bound = false, - .extra_bits = 6, - .expected = {.tv_sec = 0x27fffffffLL, .tv_nsec = 1L}, - }, - - { - .test_case_name = LOWER_BOUND_NONNEG_HI_1_NS_MAX_CASE, - .msb_set = false, - .lower_bound = true, - .extra_bits = 0xFFFFFFFF, - .expected = {.tv_sec = 0x300000000LL, - .tv_nsec = MAX_NANOSECONDS}, - }, - - { - .test_case_name = LOWER_BOUND_NONNEG_EXTRA_BITS_1_CASE, - .msb_set = false, - .lower_bound = true, - .extra_bits = 3, - .expected = {.tv_sec = 0x300000000LL, .tv_nsec = 0L}, - }, - - { - .test_case_name = UPPER_BOUND_NONNEG_EXTRA_BITS_1_CASE, - .msb_set = false, - .lower_bound = false, - .extra_bits = 3, - .expected = {.tv_sec = 0x37fffffffLL, .tv_nsec = 0L}, - } - }; - struct timespec64 timestamp; - int i; - - for (i = 0; i < ARRAY_SIZE(test_data); ++i) { - timestamp.tv_sec = get_32bit_time(&test_data[i]); - ext4_decode_extra_time(×tamp, - cpu_to_le32(test_data[i].extra_bits)); - - KUNIT_EXPECT_EQ_MSG(test, - test_data[i].expected.tv_sec, - timestamp.tv_sec, - CASE_NAME_FORMAT, - test_data[i].test_case_name, - test_data[i].msb_set, - test_data[i].lower_bound, - test_data[i].extra_bits); - KUNIT_EXPECT_EQ_MSG(test, - test_data[i].expected.tv_nsec, - timestamp.tv_nsec, - CASE_NAME_FORMAT, - test_data[i].test_case_name, - test_data[i].msb_set, - test_data[i].lower_bound, - test_data[i].extra_bits); - } + + struct timestamp_expectation *test_param = + (struct timestamp_expectation *)(test->param_value); + + timestamp.tv_sec = get_32bit_time(test_param); + ext4_decode_extra_time(×tamp, + cpu_to_le32(test_param->extra_bits)); + + KUNIT_EXPECT_EQ_MSG(test, + test_param->expected.tv_sec, + timestamp.tv_sec, + CASE_NAME_FORMAT, + test_param->test_case_name, + test_param->msb_set, + test_param->lower_bound, + test_param->extra_bits); + KUNIT_EXPECT_EQ_MSG(test, + test_param->expected.tv_nsec, + timestamp.tv_nsec, + CASE_NAME_FORMAT, + test_param->test_case_name, + test_param->msb_set, + test_param->lower_bound, + test_param->extra_bits); } static struct kunit_case ext4_inode_test_cases[] = { - KUNIT_CASE(inode_test_xtimestamp_decoding), + KUNIT_CASE_PARAM(inode_test_xtimestamp_decoding, ext4_inode_gen_params), {} };