mbox series

[v4,0/4] SBIUnit: cover OpenSBI with tests

Message ID 20240304214551.365057-1-ivan.orlov0322@gmail.com
Headers show
Series SBIUnit: cover OpenSBI with tests | expand

Message

Ivan Orlov March 4, 2024, 9:45 p.m. UTC
It is good when the code is covered with tests. Tests help us to keep
the code clean and avoid regressions. Also, a good test is always a nice
documentation for the code it covers.

This patch series introduces SBIUnit - the set of macros and functions
which simplify the unit test development for OpenSBI and automate tests
execution and evaluation.

This thing is mainly inspired by the KUnit framework from the Linux
Kernel, where the similar unit-test development tooling have been used
successfully for a pretty long time now. SBIUnit uses the same test
structure: multiple test cases are grouped together into the test
suites. SBIUnit also tries to reproduce the KUnit tests API while
allowing for some simplifications.

Another difference between the KUnit and SBIUnit is the location where
the tests are "stored". KUnit creates the ELF section in the kernel and
stores the pointers to all of the test suites there. SBIUnit takes
advantage of the 'carray' functionality of OpenSBI, keeping the pointers
to test suites in the auto-generated ".c" file. ELF section approach
could not be applied to SBIUnit, because OpenSBI could be used as a
static library when linking firmware. Use of a dedicated ELF section
would mean that all firmware linked with OpenSBI would need to have
this ELF section as well.

V1 -> V2:
- Add a cover letter
- Elaborate more on the differences between SBIUnit and KUnit
- Add a new patch adding a new entry to the 'clear' makefile target in
order to clear carray-generated files as well.

V2 -> V3:
- Drop the patch which modifies carray behavior (it will be included
into a separate patch series)

V3 -> V4:
- (Patch-specific changes are described in the following patches)

Ivan Orlov (4):
  docs: Add documentation about tests and SBIUnit
  lib: Add SBIUnit testing macros and functions
  lib: tests: Add a test for sbi_bitmap
  lib: tests: Add sbi_console test

 docs/writing_tests.md         | 133 ++++++++++++++++++++++++++++++++++
 include/sbi/sbi_unit_test.h   |  71 ++++++++++++++++++
 lib/sbi/Kconfig               |   4 +
 lib/sbi/objects.mk            |   6 ++
 lib/sbi/sbi_bitmap_test.c     | 102 ++++++++++++++++++++++++++
 lib/sbi/sbi_console.c         |   4 +
 lib/sbi/sbi_console_test.c    | 105 +++++++++++++++++++++++++++
 lib/sbi/sbi_init.c            |   3 +
 lib/sbi/sbi_unit_test.c       |  43 +++++++++++
 lib/sbi/sbi_unit_tests.carray |   3 +
 10 files changed, 474 insertions(+)
 create mode 100644 docs/writing_tests.md
 create mode 100644 include/sbi/sbi_unit_test.h
 create mode 100644 lib/sbi/sbi_bitmap_test.c
 create mode 100644 lib/sbi/sbi_console_test.c
 create mode 100644 lib/sbi/sbi_unit_test.c
 create mode 100644 lib/sbi/sbi_unit_tests.carray

Comments

Anup Patel March 10, 2024, 4:54 a.m. UTC | #1
On Tue, Mar 5, 2024 at 3:15 AM Ivan Orlov <ivan.orlov0322@gmail.com> wrote:
>
> It is good when the code is covered with tests. Tests help us to keep
> the code clean and avoid regressions. Also, a good test is always a nice
> documentation for the code it covers.
>
> This patch series introduces SBIUnit - the set of macros and functions
> which simplify the unit test development for OpenSBI and automate tests
> execution and evaluation.
>
> This thing is mainly inspired by the KUnit framework from the Linux
> Kernel, where the similar unit-test development tooling have been used
> successfully for a pretty long time now. SBIUnit uses the same test
> structure: multiple test cases are grouped together into the test
> suites. SBIUnit also tries to reproduce the KUnit tests API while
> allowing for some simplifications.
>
> Another difference between the KUnit and SBIUnit is the location where
> the tests are "stored". KUnit creates the ELF section in the kernel and
> stores the pointers to all of the test suites there. SBIUnit takes
> advantage of the 'carray' functionality of OpenSBI, keeping the pointers
> to test suites in the auto-generated ".c" file. ELF section approach
> could not be applied to SBIUnit, because OpenSBI could be used as a
> static library when linking firmware. Use of a dedicated ELF section
> would mean that all firmware linked with OpenSBI would need to have
> this ELF section as well.
>
> V1 -> V2:
> - Add a cover letter
> - Elaborate more on the differences between SBIUnit and KUnit
> - Add a new patch adding a new entry to the 'clear' makefile target in
> order to clear carray-generated files as well.
>
> V2 -> V3:
> - Drop the patch which modifies carray behavior (it will be included
> into a separate patch series)
>
> V3 -> V4:
> - (Patch-specific changes are described in the following patches)
>
> Ivan Orlov (4):
>   docs: Add documentation about tests and SBIUnit
>   lib: Add SBIUnit testing macros and functions
>   lib: tests: Add a test for sbi_bitmap
>   lib: tests: Add sbi_console test

Overall, this is a good addition to OpenSBI. This unit testing framework
not only allows testing OpenSBI code but it will also enable people to
write M-mode baremetal tests.

As a separate patch, I suggest moving all unit test related code
under sub-directory lib/sbi/tests. This way testing related code is
easy to locate under lib/sbi directory.

Thanks,
Anup

>
>  docs/writing_tests.md         | 133 ++++++++++++++++++++++++++++++++++
>  include/sbi/sbi_unit_test.h   |  71 ++++++++++++++++++
>  lib/sbi/Kconfig               |   4 +
>  lib/sbi/objects.mk            |   6 ++
>  lib/sbi/sbi_bitmap_test.c     | 102 ++++++++++++++++++++++++++
>  lib/sbi/sbi_console.c         |   4 +
>  lib/sbi/sbi_console_test.c    | 105 +++++++++++++++++++++++++++
>  lib/sbi/sbi_init.c            |   3 +
>  lib/sbi/sbi_unit_test.c       |  43 +++++++++++
>  lib/sbi/sbi_unit_tests.carray |   3 +
>  10 files changed, 474 insertions(+)
>  create mode 100644 docs/writing_tests.md
>  create mode 100644 include/sbi/sbi_unit_test.h
>  create mode 100644 lib/sbi/sbi_bitmap_test.c
>  create mode 100644 lib/sbi/sbi_console_test.c
>  create mode 100644 lib/sbi/sbi_unit_test.c
>  create mode 100644 lib/sbi/sbi_unit_tests.carray
>
> --
> 2.34.1
>
Ivan Orlov March 10, 2024, 8:07 p.m. UTC | #2
On 3/10/24 04:54, Anup Patel wrote:
> On Tue, Mar 5, 2024 at 3:15 AM Ivan Orlov <ivan.orlov0322@gmail.com> wrote:
>>
>> It is good when the code is covered with tests. Tests help us to keep
>> the code clean and avoid regressions. Also, a good test is always a nice
>> documentation for the code it covers.
>>
>> This patch series introduces SBIUnit - the set of macros and functions
>> which simplify the unit test development for OpenSBI and automate tests
>> execution and evaluation.
>>
>> This thing is mainly inspired by the KUnit framework from the Linux
>> Kernel, where the similar unit-test development tooling have been used
>> successfully for a pretty long time now. SBIUnit uses the same test
>> structure: multiple test cases are grouped together into the test
>> suites. SBIUnit also tries to reproduce the KUnit tests API while
>> allowing for some simplifications.
>>
>> Another difference between the KUnit and SBIUnit is the location where
>> the tests are "stored". KUnit creates the ELF section in the kernel and
>> stores the pointers to all of the test suites there. SBIUnit takes
>> advantage of the 'carray' functionality of OpenSBI, keeping the pointers
>> to test suites in the auto-generated ".c" file. ELF section approach
>> could not be applied to SBIUnit, because OpenSBI could be used as a
>> static library when linking firmware. Use of a dedicated ELF section
>> would mean that all firmware linked with OpenSBI would need to have
>> this ELF section as well.
>>
>> V1 -> V2:
>> - Add a cover letter
>> - Elaborate more on the differences between SBIUnit and KUnit
>> - Add a new patch adding a new entry to the 'clear' makefile target in
>> order to clear carray-generated files as well.
>>
>> V2 -> V3:
>> - Drop the patch which modifies carray behavior (it will be included
>> into a separate patch series)
>>
>> V3 -> V4:
>> - (Patch-specific changes are described in the following patches)
>>
>> Ivan Orlov (4):
>>    docs: Add documentation about tests and SBIUnit
>>    lib: Add SBIUnit testing macros and functions
>>    lib: tests: Add a test for sbi_bitmap
>>    lib: tests: Add sbi_console test
> 
> Overall, this is a good addition to OpenSBI. This unit testing framework
> not only allows testing OpenSBI code but it will also enable people to
> write M-mode baremetal tests.
> 
> As a separate patch, I suggest moving all unit test related code
> under sub-directory lib/sbi/tests. This way testing related code is
> easy to locate under lib/sbi directory.
> 

Hi Anup,

Thank you so much for considering this patch series, and I'm glad to 
hear that it could be useful. I agree that the tests should be moved to 
the separate directory, and I will do it in the near future :)

--
Kind regards,
Ivan Orlov