• D
    kunit: tool: support running each suite/test separately · ff9e09a3
    Daniel Latypov 提交于
    The new --run_isolated flag makes the tool boot the kernel once per
    suite or test, preventing leftover state from one suite to impact the
    other. This can be useful as a starting point to debugging test
    hermeticity issues.
    
    Note: it takes a lot longer, so people should not use it normally.
    
    Consider the following very simplified example:
    
      bool disable_something_for_test = false;
      void function_being_tested() {
        ...
        if (disable_something_for_test) return;
        ...
      }
    
      static void test_before(struct kunit *test)
      {
        disable_something_for_test = true;
        function_being_tested();
        /* oops, we forgot to reset it back to false */
      }
    
      static void test_after(struct kunit *test)
      {
        /* oops, now "fixing" test_before can cause test_after to fail! */
        function_being_tested();
      }
    
    Presented like this, the issues are obvious, but it gets a lot more
    complicated to track down as the amount of test setup and helper
    functions increases.
    
    Another use case is memory corruption. It might not be surfaced as a
    failure/crash in the test case or suite that caused it. I've noticed in
    kunit's own unit tests, the 3rd suite after might be the one to finally
    crash after an out-of-bounds write, for example.
    
    Example usage:
    
    Per suite:
    $ ./tools/testing/kunit/kunit.py run --kunitconfig=lib/kunit --run_isolated=suite
    ...
    Starting KUnit Kernel (1/7)...
    ============================================================
    ======== [PASSED] kunit_executor_test ========
    ....
    Testing complete. 5 tests run. 0 failed. 0 crashed. 0 skipped.
    Starting KUnit Kernel (2/7)...
    ============================================================
    ======== [PASSED] kunit-try-catch-test ========
    ...
    
    Per test:
    $ ./tools/testing/kunit/kunit.py run --kunitconfig=lib/kunit --run_isolated=test
    Starting KUnit Kernel (1/23)...
    ============================================================
    ======== [PASSED] kunit_executor_test ========
    [PASSED] parse_filter_test
    ============================================================
    Testing complete. 1 tests run. 0 failed. 0 crashed. 0 skipped.
    Starting KUnit Kernel (2/23)...
    ============================================================
    ======== [PASSED] kunit_executor_test ========
    [PASSED] filter_subsuite_test
    ...
    
    It works with filters as well:
    $ ./tools/testing/kunit/kunit.py run --kunitconfig=lib/kunit --run_isolated=suite example
    ...
    Starting KUnit Kernel (1/1)...
    ============================================================
    ======== [PASSED] example ========
    ...
    
    It also handles test filters, '*.*skip*' runs these 3 tests:
      kunit_status.kunit_status_mark_skipped_test
      example.example_skip_test
      example.example_mark_skipped_test
    
    Fixed up merge conflict between:
      d8c23ead ("kunit: tool: better handling of quasi-bool args (--json, --raw_output)") and
      6710951ee039 ("kunit: tool: support running each suite/test separately")
    Reported-by: NStephen Rothwell <sfr@canb.auug.org.au>
        Shuah Khan <skhan@linuxfoundation.org>
    Signed-off-by: NDaniel Latypov <dlatypov@google.com>
    Reviewed-by: NDavid Gow <davidgow@google.com>
    Reviewed-by: NBrendan Higgins <brendanhiggins@google.com>
    Signed-off-by: NShuah Khan <skhan@linuxfoundation.org>
    ff9e09a3
kunit_tool_test.py 20.7 KB