10 Jan, 2020

5 commits

  • Making kunit itself buildable as a module allows for "always-on"
    kunit configuration; specifying CONFIG_KUNIT=m means the module
    is built but only used when loaded. Kunit test modules will load
    kunit.ko as an implicit dependency, so simply running
    "modprobe my-kunit-tests" will load the tests along with the kunit
    module and run them.

    Co-developed-by: Knut Omang
    Signed-off-by: Knut Omang
    Signed-off-by: Alan Maguire
    Reviewed-by: Brendan Higgins
    Signed-off-by: Shuah Khan

    Alan Maguire
     
  • In discussion of how to handle timeouts, it was noted that if
    sysctl_hung_task_timeout_seconds is exceeded for a kunit test,
    the test task will be killed and an oops generated. This should
    suffice as a means of debugging such timeout issues for now.

    Hence remove use of sysctl_hung_task_timeout_secs, which has the
    added benefit of avoiding the need to export that symbol from
    the core kernel.

    Co-developed-by: Knut Omang
    Signed-off-by: Knut Omang
    Signed-off-by: Alan Maguire
    Reviewed-by: Stephen Boyd
    Acked-by: Brendan Higgins
    Signed-off-by: Shuah Khan

    Alan Maguire
     
  • As tests are added to kunit, it will become less feasible to execute
    all built tests together. By supporting modular tests we provide
    a simple way to do selective execution on a running system; specifying

    CONFIG_KUNIT=y
    CONFIG_KUNIT_EXAMPLE_TEST=m

    ...means we can simply "insmod example-test.ko" to run the tests.

    To achieve this we need to do the following:

    o export the required symbols in kunit
    o string-stream tests utilize non-exported symbols so for now we skip
    building them when CONFIG_KUNIT_TEST=m.
    o drivers/base/power/qos-test.c contains a few unexported interface
    references, namely freq_qos_read_value() and freq_constraints_init().
    Both of these could be potentially defined as static inline functions
    in include/linux/pm_qos.h, but for now we simply avoid supporting
    module build for that test suite.
    o support a new way of declaring test suites. Because a module cannot
    do multiple late_initcall()s, we provide a kunit_test_suites() macro
    to declare multiple suites within the same module at once.
    o some test module names would have been too general ("test-test"
    and "example-test" for kunit tests, "inode-test" for ext4 tests);
    rename these as appropriate ("kunit-test", "kunit-example-test"
    and "ext4-inode-test" respectively).

    Also define kunit_test_suite() via kunit_test_suites()
    as callers in other trees may need the old definition.

    Co-developed-by: Knut Omang
    Signed-off-by: Knut Omang
    Signed-off-by: Alan Maguire
    Reviewed-by: Brendan Higgins
    Acked-by: Theodore Ts'o # for ext4 bits
    Acked-by: David Gow # For list-test
    Reported-by: kbuild test robot
    Signed-off-by: Shuah Khan

    Alan Maguire
     
  • Define function as static inline in try-catch-impl.h to allow it to
    be used in kunit itself and tests. Also remove unused
    kunit_generic_try_catch

    Co-developed-by: Knut Omang
    Signed-off-by: Knut Omang
    Signed-off-by: Alan Maguire
    Reviewed-by: Brendan Higgins
    Tested-by: Brendan Higgins
    Signed-off-by: Shuah Khan

    Alan Maguire
     
  • string-stream interfaces are not intended for external use;
    move them from include/kunit to lib/kunit accordingly.

    Co-developed-by: Knut Omang
    Signed-off-by: Knut Omang
    Signed-off-by: Alan Maguire
    Reviewed-by: Brendan Higgins
    Tested-by: Brendan Higgins
    Signed-off-by: Shuah Khan

    Alan Maguire
     

01 Oct, 2019

11 commits

  • Previously KUnit assumed that printk would always be present, which is
    not a valid assumption to make. Fix that by removing call to
    vprintk_emit, and calling printk directly.

    This fixes a build error[1] reported by Randy.

    For context this change comes after much discussion. My first stab[2] at
    this was just to make the KUnit logging code compile out; however, it
    was agreed that if we were going to use vprintk_emit, then vprintk_emit
    should provide a no-op stub, which lead to my second attempt[3]. In
    response to me trying to stub out vprintk_emit, Sergey Senozhatsky
    suggested a way for me to remove our usage of vprintk_emit, which led to
    my third attempt at solving this[4].

    In my third version of this patch[4], I completely removed vprintk_emit,
    as suggested by Sergey; however, there was a bit of debate over whether
    Sergey's solution was the best. The debate arose due to Sergey's version
    resulting in a checkpatch warning, which resulted in a debate over
    correct printk usage. Joe Perches offered an alternative fix which was
    somewhat less far reaching than what Sergey had suggested and
    importantly relied on continuing to use %pV. Much of the debated
    centered around whether %pV should be widely used, and whether Sergey's
    version would result in object size bloat. Ultimately, we decided to go
    with Sergey's version.

    Reported-by: Randy Dunlap
    Link[1]: https://lore.kernel.org/linux-kselftest/c7229254-0d90-d90e-f3df-5b6d6fc0b51f@infradead.org/
    Link[2]: https://lore.kernel.org/linux-kselftest/20190827174932.44177-1-brendanhiggins@google.com/
    Link[3]: https://lore.kernel.org/linux-kselftest/20190827234835.234473-1-brendanhiggins@google.com/
    Link[4]: https://lore.kernel.org/linux-kselftest/20190828093143.163302-1-brendanhiggins@google.com/
    Cc: Stephen Rothwell
    Cc: Sergey Senozhatsky
    Cc: Joe Perches
    Cc: Tim.Bird@sony.com
    Signed-off-by: Brendan Higgins
    Acked-by: Randy Dunlap # build-tested
    Reviewed-by: Petr Mladek
    Signed-off-by: Shuah Khan

    Brendan Higgins
     
  • Add unit tests for KUnit managed resources. KUnit managed resources
    (struct kunit_resource) are resources that are automatically cleaned up
    at the end of a KUnit test, similar to the concept of devm_* managed
    resources.

    Signed-off-by: Avinash Kondareddy
    Signed-off-by: Brendan Higgins
    Reviewed-by: Greg Kroah-Hartman
    Reviewed-by: Logan Gunthorpe
    Reviewed-by: Stephen Boyd
    Signed-off-by: Shuah Khan

    Avinash Kondareddy
     
  • Add support for assertions which are like expectations except the test
    terminates if the assertion is not satisfied.

    The idea with assertions is that you use them to state all the
    preconditions for your test. Logically speaking, these are the premises
    of the test case, so if a premise isn't true, there is no point in
    continuing the test case because there are no conclusions that can be
    drawn without the premises. Whereas, the expectation is the thing you
    are trying to prove. It is not used universally in x-unit style test
    frameworks, but I really like it as a convention. You could still
    express the idea of a premise using the above idiom, but I think
    KUNIT_ASSERT_* states the intended idea perfectly.

    Signed-off-by: Brendan Higgins
    Reviewed-by: Greg Kroah-Hartman
    Reviewed-by: Logan Gunthorpe
    Reviewed-by: Stephen Boyd
    Signed-off-by: Shuah Khan

    Brendan Higgins
     
  • Add KUnit tests for the KUnit test abort mechanism (see preceding
    commit). Add tests both for general try catch mechanism as well as
    non-architecture specific mechanism.

    Signed-off-by: Brendan Higgins
    Reviewed-by: Greg Kroah-Hartman
    Reviewed-by: Logan Gunthorpe
    Reviewed-by: Stephen Boyd
    Signed-off-by: Shuah Khan

    Brendan Higgins
     
  • Add support for aborting/bailing out of test cases, which is needed for
    implementing assertions.

    An assertion is like an expectation, but bails out of the test case
    early if the assertion is not met. The idea with assertions is that you
    use them to state all the preconditions for your test. Logically
    speaking, these are the premises of the test case, so if a premise isn't
    true, there is no point in continuing the test case because there are no
    conclusions that can be drawn without the premises. Whereas, the
    expectation is the thing you are trying to prove.

    Signed-off-by: Brendan Higgins
    Reviewed-by: Greg Kroah-Hartman
    Reviewed-by: Logan Gunthorpe
    Reviewed-by: Stephen Boyd
    Signed-off-by: Shuah Khan

    Brendan Higgins
     
  • Add a test for string stream along with a simpler example.

    Signed-off-by: Brendan Higgins
    Reviewed-by: Greg Kroah-Hartman
    Reviewed-by: Logan Gunthorpe
    Reviewed-by: Stephen Boyd
    Signed-off-by: Shuah Khan

    Brendan Higgins
     
  • Add support for expectations, which allow properties to be specified and
    then verified in tests.

    Signed-off-by: Brendan Higgins
    Reviewed-by: Greg Kroah-Hartman
    Reviewed-by: Logan Gunthorpe
    Reviewed-by: Stephen Boyd
    Signed-off-by: Shuah Khan

    Brendan Higgins
     
  • Add `struct kunit_assert` and friends which provide a structured way to
    capture data from an expectation or an assertion (introduced later in
    the series) so that it may be printed out in the event of a failure.

    Signed-off-by: Brendan Higgins
    Reviewed-by: Stephen Boyd
    Signed-off-by: Shuah Khan

    Brendan Higgins
     
  • A number of test features need to do pretty complicated string printing
    where it may not be possible to rely on a single preallocated string
    with parameters.

    So provide a library for constructing the string as you go similar to
    C++'s std::string. string_stream is really just a string builder,
    nothing more.

    Signed-off-by: Brendan Higgins
    Reviewed-by: Greg Kroah-Hartman
    Reviewed-by: Logan Gunthorpe
    Reviewed-by: Stephen Boyd
    Signed-off-by: Shuah Khan

    Brendan Higgins
     
  • Create a common API for test managed resources like memory and test
    objects. A lot of times a test will want to set up infrastructure to be
    used in test cases; this could be anything from just wanting to allocate
    some memory to setting up a driver stack; this defines facilities for
    creating "test resources" which are managed by the test infrastructure
    and are automatically cleaned up at the conclusion of the test.

    Signed-off-by: Brendan Higgins
    Reviewed-by: Greg Kroah-Hartman
    Reviewed-by: Logan Gunthorpe
    Reviewed-by: Stephen Boyd
    Signed-off-by: Shuah Khan

    Brendan Higgins
     
  • Add core facilities for defining unit tests; this provides a common way
    to define test cases, functions that execute code which is under test
    and determine whether the code under test behaves as expected; this also
    provides a way to group together related test cases in test suites (here
    we call them test_modules).

    Just define test cases and how to execute them for now; setting
    expectations on code will be defined later.

    Signed-off-by: Brendan Higgins
    Reviewed-by: Greg Kroah-Hartman
    Reviewed-by: Logan Gunthorpe
    Reviewed-by: Luis Chamberlain
    Reviewed-by: Stephen Boyd
    Signed-off-by: Shuah Khan

    Brendan Higgins