mbox series

[v3,00/41] test: Refactor tests to have a single test runner

Message ID 20210203124447.2458527-1-sjg@chromium.org
Headers show
Series test: Refactor tests to have a single test runner | expand

Message

Simon Glass Feb. 3, 2021, 12:44 p.m. UTC
At present U-Boot has two broad sets of tests in the C code: driver model
tests which do a lot of pre-/post-init and command tests which do not.

This separation makes it slightly harder to write a test, since there are
two different test-state structures and different rules for running the
two different test types. At present these rules are determined by where
the test is (actually its prefix).

All unit tests can be run from the command line with the 'ut' command.
Since SPL does not have commands, it currently calls the test runner
directly and offers no control of which tests are run.

This seems like a good time to refactor the tests into a unified test
runner, allowing U-Boot proper and SPL to use the same path, perhaps with
some different conditions along the way.

This series sets up a unified runner called ut_run_list(), which runs a
set of tests from a linker_list. Driver model tests are distinguished by
a new UT_TESTF_DM flag so that the necessary init and cleanup can still
be done.

The runner is modified to support running SPL tests that are not solely
for driver model. An example test for FIT loading is added as a
demonstration.

In addition, some documentation is added to explain how to write tests.

This series is available at u-boot-dm/test-working

Changes in v3:
- Add new patch to re-enable test_ofplatdata
- Reword the SPL tests section for clarity
- Use test_set_state() throughout test-main.c instead of direct assignment
- Update the pytest collector as well

Changes in v2:
- Use correct rst format for 'Ad-hoc tests' section
- Expand docs on how each type of test is marked
- Put the docs in tests_sandbox since it is more related to sandbox
- Put in a mention of tests_sandbox in the main testing docs
- Add a note that SPL tests can in fact be run individualy
- Document how to run all C tests with 'ut all'
- Fix 'get list' typo
- Fix conditions so non-DM SPL tests are actually run
- Allow for prefix to be NULL, to match function comment
- Add new patches to cover running an SPL test

Simon Glass (41):
  doc: Tidy up testing section
  doc: Document make tcheck
  sandbox: Drop the 'starting...' message unless testing
  test: Re-enable test_ofplatdata
  doc: Explain how to run tests without pytest
  doc: Document how sandbox_spl_tests are run
  test: Correct setexpr test prefix
  test: Mark all driver model tests with a flag
  test: Rename test-main.c to test-dm.c
  test: Add an overall test runner
  test: Create pre/post-run functions
  test: Call test_pre/post_run() from driver model tests
  test: Move dm_extended_scan() to test_pre_run()
  test: Move do_autoprobe() to test_pre_run()
  test: Move dm_scan_plat() to test_pre_run()
  test: Drop mallinfo() work-around
  test: Move console silencing to test_pre_run()
  test: Move delay skipping to test_pre_run()
  test: Handle driver model reinit in test_pre_run()
  test: Drop struct dm_test_state
  test: Move dm_test_init() into test-main.c
  test: Move dm_test_destroy() into test-main.c
  test: Move test running into a separate function
  test: Use ut_run_test() to run driver model tests
  test: Drop dm_do_test()
  test: Add ut_run_test_live_flat() to run tests twice
  test: Use a local variable for test state
  test: Run driver-model tests using ut_run_list()
  test: Use return values in dm_test_run()
  test: Move the devicetree check into ut_run_list()
  test: Move restoring of driver model state to ut_run_list()
  test: log: Rename log main test file to log_ut.c
  test: Add a macros for finding tests in linker_lists
  test: Rename all linker lists to have a ut_ prefix
  test: Allow SPL to run any available test
  sandbox: Update os_find_u_boot() to find the .img file
  spl: Convert spl_fit to work with sandbox
  doc: Move coccinelle into its own section
  spl: test: Add a test for spl_load_simple_fit()
  test: sandbox: Move sandbox test docs into doc/develop
  doc: Explain briefly how to write new tests

 arch/sandbox/cpu/os.c              |   8 +-
 arch/sandbox/cpu/spl.c             |   9 +-
 arch/sandbox/cpu/start.c           |  15 +-
 arch/sandbox/include/asm/state.h   |   1 +
 common/spl/spl.c                   |   3 +-
 common/spl/spl_fit.c               |  27 +-
 configs/sandbox_spl_defconfig      |   2 +-
 doc/arch/sandbox.rst               |  48 +---
 doc/develop/index.rst              |  11 +-
 doc/develop/py_testing.rst         |   3 +-
 doc/develop/testing.rst            |  46 +++-
 doc/develop/tests_sandbox.rst      | 207 ++++++++++++++
 doc/develop/tests_writing.rst      | 337 +++++++++++++++++++++++
 include/dm/test.h                  |  20 +-
 include/os.h                       |   3 +-
 include/spl.h                      |   9 +
 include/test/test.h                |  38 ++-
 include/test/ut.h                  |  45 +++
 test/Makefile                      |   3 +
 test/bloblist.c                    |   5 +-
 test/bootm.c                       |   4 +-
 test/cmd/mem.c                     |   4 +-
 test/cmd/setexpr.c                 |  28 +-
 test/cmd_ut.c                      |  38 +--
 test/compression.c                 |   5 +-
 test/dm/Makefile                   |   2 +-
 test/dm/core.c                     |  47 ++--
 test/dm/test-dm.c                  |  50 ++++
 test/dm/test-driver.c              |  12 +-
 test/dm/test-main.c                | 229 ----------------
 test/dm/test-uclass.c              |  10 +-
 test/env/cmd_ut_env.c              |   4 +-
 test/image/Makefile                |   5 +
 test/image/spl_load.c              |  91 ++++++
 test/lib/cmd_ut_lib.c              |   4 +-
 test/log/Makefile                  |   2 +-
 test/log/{test-main.c => log_ut.c} |   4 +-
 test/optee/cmd_ut_optee.c          |   5 +-
 test/overlay/cmd_ut_overlay.c      |   5 +-
 test/py/conftest.py                |   2 +-
 test/py/tests/test_log.py          |   2 +-
 test/py/tests/test_ofplatdata.py   |   2 +-
 test/str_ut.c                      |   5 +-
 test/test-main.c                   | 426 +++++++++++++++++++++++++++++
 test/unicode_ut.c                  |   4 +-
 test/ut.c                          |   7 +
 46 files changed, 1400 insertions(+), 437 deletions(-)
 create mode 100644 doc/develop/tests_sandbox.rst
 create mode 100644 doc/develop/tests_writing.rst
 create mode 100644 test/dm/test-dm.c
 delete mode 100644 test/dm/test-main.c
 create mode 100644 test/image/Makefile
 create mode 100644 test/image/spl_load.c
 rename test/log/{test-main.c => log_ut.c} (75%)
 create mode 100644 test/test-main.c

Comments

Tom Rini March 3, 2021, 7:37 p.m. UTC | #1
On Wed, Feb 03, 2021 at 05:44:06AM -0700, Simon Glass wrote:

> At present U-Boot has two broad sets of tests in the C code: driver model
> tests which do a lot of pre-/post-init and command tests which do not.
> 
> This separation makes it slightly harder to write a test, since there are
> two different test-state structures and different rules for running the
> two different test types. At present these rules are determined by where
> the test is (actually its prefix).
> 
> All unit tests can be run from the command line with the 'ut' command.
> Since SPL does not have commands, it currently calls the test runner
> directly and offers no control of which tests are run.
> 
> This seems like a good time to refactor the tests into a unified test
> runner, allowing U-Boot proper and SPL to use the same path, perhaps with
> some different conditions along the way.
> 
> This series sets up a unified runner called ut_run_list(), which runs a
> set of tests from a linker_list. Driver model tests are distinguished by
> a new UT_TESTF_DM flag so that the necessary init and cleanup can still
> be done.
> 
> The runner is modified to support running SPL tests that are not solely
> for driver model. An example test for FIT loading is added as a
> demonstration.
> 
> In addition, some documentation is added to explain how to write tests.
> 
> This series is available at u-boot-dm/test-working
> 
> Changes in v3:
> - Add new patch to re-enable test_ofplatdata
> - Reword the SPL tests section for clarity
> - Use test_set_state() throughout test-main.c instead of direct assignment
> - Update the pytest collector as well
> 
> Changes in v2:
> - Use correct rst format for 'Ad-hoc tests' section
> - Expand docs on how each type of test is marked
> - Put the docs in tests_sandbox since it is more related to sandbox
> - Put in a mention of tests_sandbox in the main testing docs
> - Add a note that SPL tests can in fact be run individualy
> - Document how to run all C tests with 'ut all'
> - Fix 'get list' typo
> - Fix conditions so non-DM SPL tests are actually run
> - Allow for prefix to be NULL, to match function comment
> - Add new patches to cover running an SPL test

There was a small problem applying one or two of these patches that I
fixed up.  But then when testing locally (Ubuntu 18.04, but virtualenv
setup and populated with test/py/requirements.txt) like 200 tests failed
to run for Sandbox.  Please check this and that CI runs.
Tom Rini March 3, 2021, 8:18 p.m. UTC | #2
On Wed, Mar 03, 2021 at 02:37:51PM -0500, Tom Rini wrote:
> On Wed, Feb 03, 2021 at 05:44:06AM -0700, Simon Glass wrote:
> 
> > At present U-Boot has two broad sets of tests in the C code: driver model
> > tests which do a lot of pre-/post-init and command tests which do not.
> > 
> > This separation makes it slightly harder to write a test, since there are
> > two different test-state structures and different rules for running the
> > two different test types. At present these rules are determined by where
> > the test is (actually its prefix).
> > 
> > All unit tests can be run from the command line with the 'ut' command.
> > Since SPL does not have commands, it currently calls the test runner
> > directly and offers no control of which tests are run.
> > 
> > This seems like a good time to refactor the tests into a unified test
> > runner, allowing U-Boot proper and SPL to use the same path, perhaps with
> > some different conditions along the way.
> > 
> > This series sets up a unified runner called ut_run_list(), which runs a
> > set of tests from a linker_list. Driver model tests are distinguished by
> > a new UT_TESTF_DM flag so that the necessary init and cleanup can still
> > be done.
> > 
> > The runner is modified to support running SPL tests that are not solely
> > for driver model. An example test for FIT loading is added as a
> > demonstration.
> > 
> > In addition, some documentation is added to explain how to write tests.
> > 
> > This series is available at u-boot-dm/test-working
> > 
> > Changes in v3:
> > - Add new patch to re-enable test_ofplatdata
> > - Reword the SPL tests section for clarity
> > - Use test_set_state() throughout test-main.c instead of direct assignment
> > - Update the pytest collector as well
> > 
> > Changes in v2:
> > - Use correct rst format for 'Ad-hoc tests' section
> > - Expand docs on how each type of test is marked
> > - Put the docs in tests_sandbox since it is more related to sandbox
> > - Put in a mention of tests_sandbox in the main testing docs
> > - Add a note that SPL tests can in fact be run individualy
> > - Document how to run all C tests with 'ut all'
> > - Fix 'get list' typo
> > - Fix conditions so non-DM SPL tests are actually run
> > - Allow for prefix to be NULL, to match function comment
> > - Add new patches to cover running an SPL test
> 
> There was a small problem applying one or two of these patches that I
> fixed up.  But then when testing locally (Ubuntu 18.04, but virtualenv
> setup and populated with test/py/requirements.txt) like 200 tests failed
> to run for Sandbox.  Please check this and that CI runs.

Er, something has gone odd for me locally, please disregard.
Tom Rini March 3, 2021, 8:37 p.m. UTC | #3
On Wed, Mar 03, 2021 at 03:18:15PM -0500, Tom Rini wrote:
> On Wed, Mar 03, 2021 at 02:37:51PM -0500, Tom Rini wrote:
> > On Wed, Feb 03, 2021 at 05:44:06AM -0700, Simon Glass wrote:
> > 
> > > At present U-Boot has two broad sets of tests in the C code: driver model
> > > tests which do a lot of pre-/post-init and command tests which do not.
> > > 
> > > This separation makes it slightly harder to write a test, since there are
> > > two different test-state structures and different rules for running the
> > > two different test types. At present these rules are determined by where
> > > the test is (actually its prefix).
> > > 
> > > All unit tests can be run from the command line with the 'ut' command.
> > > Since SPL does not have commands, it currently calls the test runner
> > > directly and offers no control of which tests are run.
> > > 
> > > This seems like a good time to refactor the tests into a unified test
> > > runner, allowing U-Boot proper and SPL to use the same path, perhaps with
> > > some different conditions along the way.
> > > 
> > > This series sets up a unified runner called ut_run_list(), which runs a
> > > set of tests from a linker_list. Driver model tests are distinguished by
> > > a new UT_TESTF_DM flag so that the necessary init and cleanup can still
> > > be done.
> > > 
> > > The runner is modified to support running SPL tests that are not solely
> > > for driver model. An example test for FIT loading is added as a
> > > demonstration.
> > > 
> > > In addition, some documentation is added to explain how to write tests.
> > > 
> > > This series is available at u-boot-dm/test-working
> > > 
> > > Changes in v3:
> > > - Add new patch to re-enable test_ofplatdata
> > > - Reword the SPL tests section for clarity
> > > - Use test_set_state() throughout test-main.c instead of direct assignment
> > > - Update the pytest collector as well
> > > 
> > > Changes in v2:
> > > - Use correct rst format for 'Ad-hoc tests' section
> > > - Expand docs on how each type of test is marked
> > > - Put the docs in tests_sandbox since it is more related to sandbox
> > > - Put in a mention of tests_sandbox in the main testing docs
> > > - Add a note that SPL tests can in fact be run individualy
> > > - Document how to run all C tests with 'ut all'
> > > - Fix 'get list' typo
> > > - Fix conditions so non-DM SPL tests are actually run
> > > - Allow for prefix to be NULL, to match function comment
> > > - Add new patches to cover running an SPL test
> > 
> > There was a small problem applying one or two of these patches that I
> > fixed up.  But then when testing locally (Ubuntu 18.04, but virtualenv
> > setup and populated with test/py/requirements.txt) like 200 tests failed
> > to run for Sandbox.  Please check this and that CI runs.
> 
> Er, something has gone odd for me locally, please disregard.

Two problems!  One, this series IS breaking tests for me.  Fresh venv,
~260 tests fail to run.  Two, I didn't notice a fail-to-build in my
build+pytest script, so the binary from this really really failed with
the current pytest scripts :)
Simon Glass March 4, 2021, 3:06 a.m. UTC | #4
Hi Tom,

On Wed, 3 Mar 2021 at 15:37, Tom Rini <trini@konsulko.com> wrote:
>
> On Wed, Mar 03, 2021 at 03:18:15PM -0500, Tom Rini wrote:
> > On Wed, Mar 03, 2021 at 02:37:51PM -0500, Tom Rini wrote:
> > > On Wed, Feb 03, 2021 at 05:44:06AM -0700, Simon Glass wrote:
> > >
> > > > At present U-Boot has two broad sets of tests in the C code: driver model
> > > > tests which do a lot of pre-/post-init and command tests which do not.
> > > >
> > > > This separation makes it slightly harder to write a test, since there are
> > > > two different test-state structures and different rules for running the
> > > > two different test types. At present these rules are determined by where
> > > > the test is (actually its prefix).
> > > >
> > > > All unit tests can be run from the command line with the 'ut' command.
> > > > Since SPL does not have commands, it currently calls the test runner
> > > > directly and offers no control of which tests are run.
> > > >
> > > > This seems like a good time to refactor the tests into a unified test
> > > > runner, allowing U-Boot proper and SPL to use the same path, perhaps with
> > > > some different conditions along the way.
> > > >
> > > > This series sets up a unified runner called ut_run_list(), which runs a
> > > > set of tests from a linker_list. Driver model tests are distinguished by
> > > > a new UT_TESTF_DM flag so that the necessary init and cleanup can still
> > > > be done.
> > > >
> > > > The runner is modified to support running SPL tests that are not solely
> > > > for driver model. An example test for FIT loading is added as a
> > > > demonstration.
> > > >
> > > > In addition, some documentation is added to explain how to write tests.
> > > >
> > > > This series is available at u-boot-dm/test-working
> > > >
> > > > Changes in v3:
> > > > - Add new patch to re-enable test_ofplatdata
> > > > - Reword the SPL tests section for clarity
> > > > - Use test_set_state() throughout test-main.c instead of direct assignment
> > > > - Update the pytest collector as well
> > > >
> > > > Changes in v2:
> > > > - Use correct rst format for 'Ad-hoc tests' section
> > > > - Expand docs on how each type of test is marked
> > > > - Put the docs in tests_sandbox since it is more related to sandbox
> > > > - Put in a mention of tests_sandbox in the main testing docs
> > > > - Add a note that SPL tests can in fact be run individualy
> > > > - Document how to run all C tests with 'ut all'
> > > > - Fix 'get list' typo
> > > > - Fix conditions so non-DM SPL tests are actually run
> > > > - Allow for prefix to be NULL, to match function comment
> > > > - Add new patches to cover running an SPL test
> > >
> > > There was a small problem applying one or two of these patches that I
> > > fixed up.  But then when testing locally (Ubuntu 18.04, but virtualenv
> > > setup and populated with test/py/requirements.txt) like 200 tests failed
> > > to run for Sandbox.  Please check this and that CI runs.
> >
> > Er, something has gone odd for me locally, please disregard.
>
> Two problems!  One, this series IS breaking tests for me.  Fresh venv,
> ~260 tests fail to run.  Two, I didn't notice a fail-to-build in my
> build+pytest script, so the binary from this really really failed with
> the current pytest scripts :)

Sorry about that...it needs a fix which I had already brought into
dm/master when I was intending for this series to go to the current
release, but have not sent a pull request for. They are in dm/master
now too and I'll send a pull request for master (that you should also
apply to -next).

http://patchwork.ozlabs.org/project/uboot/patch/20210204042944.2636812-1-sjg@chromium.org/‌
‌

Basically there is a crash in sandbox_spl in a rather obscure case
with of-platdata. Finding that was one of the fruits of adding the SPL
tests.

Regards,
Simon