Hmmm...I must have gotten the wrong patch as this now applies to master for
me.  Spelling issues noted.

On Wed, Nov 18, 2015 at 12:09 PM, Mike Holmes <mike.hol...@linaro.org>
wrote:

> Signed-off-by: Mike Holmes <mike.hol...@linaro.org>
> ---
>  doc/implementers-guide/implementers-guide.adoc | 265
> +++++++++++++++++--------
>  1 file changed, 185 insertions(+), 80 deletions(-)
>
> diff --git a/doc/implementers-guide/implementers-guide.adoc
> b/doc/implementers-guide/implementers-guide.adoc
> index 0033ba3..8b9c729 100644
> --- a/doc/implementers-guide/implementers-guide.adoc
> +++ b/doc/implementers-guide/implementers-guide.adoc
> @@ -11,9 +11,11 @@ Further details about ODP may be found at
> http://opendataplane.org[ODP homepage]
>
>
>  :numbered:
> -The include structure
> ----------------------
> -The implementers view of the include source tree allows the common API
> definitions and documentation to be reused by all the platforms defined in
> the tree, but leave the actual definitions to be defined by the specific
> platform.
> +== The include structure ==
> +
> +The implementers view of the include source tree allows the common API
> +definitions and documentation to be reused by all the platforms defined
> in the
> +tree, but leave the actual definitions to be defined by the specific
> platform.
>
>  .Implementers include structure
>  ----
> @@ -29,94 +31,145 @@ The implementers view of the include source tree
> allows the common API definitio
>  │   ├── <implementation name>/
>  │   │   ├── include/
>  │   │   │   ├── odp/
> -│   │   │   │   ├── In-line function definitions of the public API for
> this platform
> -│   │   │   │   │   seen by the applicationx.
> +│   │   │   │   ├── In-line function definitions of the public API for
> this
> +│   │   │   │   │   platform seen by the application.
>  │   │   │   │   │
>  │   │   │   │   └── plat/
> -│   │   │   │       └── Platform specific types, enums etc as seen by the
> application
> -│   │   │   │           but require overriding by the implementation.
> +│   │   │   │       └── Platform specific types, enums etc as seen by the
> +│   │   │   │           application but require overriding by the
> +│   │   │   │           implementation.
>  │   │   │   │
>  │   │   │   └── Internal header files seen only by the implementation.
>  ----
>
> -The doxygen description of the API definition is held in the public api
> file 'include/odp/api'.
> -This file is included by a counterpart in 'platform/<implementation
> name>/include/odp'.
> -The include of the public API is AFTER the platform specific definitions
> to allow the platform to provide definitions that match the underlying
> hardware.
> -The implementation code includes 'platform/<implementation
> name>/include/plat' and this then provides the source files with a complete
> definition the ODP API to be implemented.
> -Applications in turn include the include/odp.h file which includes the
> 'platform/<implementation name>/include/plat' files to provide a complete
> definition of the API.
> +The doxygen description of the API definition is held in the public api
> file
> +'include/odp/api'.
> +This file is included by a counterpart in
> +'platform/<implementation name>/include/odp'.
> +The include of the public API is AFTER the platform specific definitions
> to
> +allow the platform to provide definitions that match the underlying
> hardware.
> +The implementation code includes 'platform/<implementation
> name>/include/plat'
> +and this then provides the source files with a complete definition the
> ODP API
> +to be implemented.
> +Applications in turn include the include/odp.h file which includes the
> +'platform/<implementation name>/include/plat' files to provide a complete
> +definition of the API.
>
> -The validation Suite
> ---------------------
> -ODP provides a comprehensive set of API validation tests that are
> intended to be used by implementers during development and by application
> developers to verify that a particular implementation meets their
> requirements.
> +== The validation Suite ==
> +
> +ODP provides a comprehensive set of API validation tests that are
> intended to be
> +used by implementers during development and by application developers to
> verify
> +that a particular implementation meets their requirements.
>
>  The list of these tests is expected to grow as ODP grows.
>
> -The list of test executables is run by the automake test harness, when
> running "make check".
> -Therefore, as required by this harness, each executable should return 0
> on success (tests passed), 77 on inconclusive, or any other values on
> failure.
> -The automake functionality shows a status line (PASSED/FAIL...) for each
> of the ran test executables.
> +The list of test executables is run by the automake test harness, when
> running
> +"make check".
> +Therefore, as required by this harness, each executable should return 0 on
> +success (tests passed), 77 on inconclusive, or any other values on
> failure.
> +The automake functionality shows a status line (PASSED/FAIL...) for each
> of the
> +ran test executables.
>
> -It is expected that ODP developers will need to run tests as early as
> possible in the development cycle, before all APIs have been implemented.
> -Besides, although there are no APIs that are formally listed as optional,
> it is also expected that there may be cases where a subset of APIs remain
> unimplemented on a particular platform.
> -Moreover, some platforms may require specific initialization/termination
> code prior/after running the standard tests.
> +It is expected that ODP developers will need to run tests as early as
> possible
> +in the development cycle, before all APIs have been implemented.
> +Besides, although there are no APIs that are formally listed as optional,
> it is
> +also expected that there may be cases where a subset of APIs remain
> +unimplemented on a particular platform.
> +Moreover, some platforms may require specific initialization/termination
> code
> +prior/after running the standard tests.
>
> -To accommodate with these platform disparities, the ODP validation has
> been divided in two distinct areas:
> +To accommodate with these platform disparities, the ODP validation has
> been
> +divided in two distinct areas:
>
>  * The platform agnostic area,
>  * A platform dependent area (one per platform).
>
> -Platform agnostic
> -~~~~~~~~~~~~~~~~~
> -This grouping defines tests that are expected to be executable and
> succeed on any platform, though possibly with very different performances,
> depending on the underlying platform.
> -They are written in plain C code, and may only use functions defined in
> the standard libC library (besides the ODP functions being tested, of
> course).
> -No other languages (like scripting) are allowed as their usage would make
> assumptions on the platform capability.
> +=== Platform agnostic ===
> +
> +This grouping defines tests that are expected to be executable and
> succeed on
> +any platform, though possibly with very different performances, depending
> on the
> +underlying platform.
> +They are written in plain C code, and may only use functions defined in
> the
> +standard libC library (besides the ODP functions being tested, of course).
> +No other languages (like scripting) are allowed as their usage would make
> +assumptions on the platform capability.
>
>  This area is located at: 'test/validation/'
>
> -The ODP API itself is ordered by module, where each module groups the set
> of ODP API functions related to the same "topic".
> -Examples of modules includes "classification" (API functions dealing with
> ingres packets classification), time (functions dealing with time,
> excluding timers which have their own module), timer,...
> -The complete module list can be seen at:
> http://docs.opendataplane.org/linux-generic-doxygen-html/modules.html[ODP
> Modules] +
> -Within the platform agnostic area, the tests are also grouped by modules,
> matching the ODP API modules: 'test/validation/' mainly contains a list of
> directories matching each module name (as defined by the doxygen
> "@defgroup" or "@ingroup" statement present in each API ".h" file).
> +The ODP API itself is ordered by module, where each module groups the set
> of ODP
> +API functions related to the same "topic".
> +Examples of modules includes "classification" (API functions dealing with
> ingres
>
                ingress

> +packets classification), time (functions dealing with time, excluding
> timers
> +which have their own module), timer,...
> +The complete module list can be seen at:
> +http://docs.opendataplane.org/linux-generic-doxygen-html/modules.html[ODP
> Modules] +
> +Within the platform agnostic area, the tests are also grouped by modules,
> +matching the ODP API modules: 'test/validation/' mainly contains a list of
> +directories matching each module name (as defined by the doxygen
> "@defgroup" or
> +"@ingroup" statement present in each API ".h" file).
>
> -Within each of these directories, a library (called "libtest<module>.la")
> and its associated ".h" file (called "<module>.h") defines all the test
> functions for this module as well as few other functions to initialize,
> terminate, and group the tests.
> -An executable called "<module>_main*", is also built. It is permissible
> to generate more than one executable to cover the functionality in the test
> library for the module.
> +Within each of these directories, a library (called "libtest<module>.la")
> and
> +its associated ".h" file (called "<module>.h") defines all the test
> functions
> +for this module as well as few other functions to initialize, terminate,
> and
> +group the tests.
> +An executable called "<module>_main*", is also built. It is permissible to
> +generate more than one executable to cover the functionality in the test
> library
> +for the module.
>  These executable(s) shall call all the tests for this module. +
>  See <<anchor-1, Module test and naming convention>> for more details.
>
> -It is important to be aware that the tests defined for a given module
> (defined in 'test/validation/<module>') are focused to test the ODP
> functions belonging to this module, but are not limited to use this
> module's ODP functions only: many modules needs some interaction with some
> other module to be tested.
> -The obvious illustration of this is for module "init" whose functions are
> required by all tests of all other modules (as ODP needs to be initialized
> to test anything else). +
> +It is important to be aware that the tests defined for a given module
> +(defined in 'test/validation/<module>') are focused to test the ODP
> functions
> +belonging to this module, but are not limited to use this module's ODP
> functions
> +only: many modules needs some interaction with some other module to be
> tested.
> +The obvious illustration of this is for module "init" whose functions are
> +required by all tests of all other modules (as ODP needs to be
> initialized to
> +test anything else). +
>
> -There is a "Makefile.am" located at the top of the platform agnostic
> area. Its role is limited to the construction of the different test
> libraries and the "<module>_main*" executables. No tests are run from this
> area when "make check" is performed.
> +There is a "Makefile.am" located at the top of the platform agnostic
> area. Its
> +role is limited to the construction of the different test libraries and
> the
> +"<module>_main*" executables. No tests are run from this area when "make
> check"
> +is performed.
>
> -CUnit
> -^^^^^^
> -Within a given test executable CUnit is used to run the different tests.
> The usage of CUnit implies the following structure:
> +==== CUnit ====
> +
> +Within a given test executable CUnit is used to run the different tests.
> The
> +usage of CUnit implies the following structure:
>
>  * Tests are simple C functions.
> -* Tests are grouped in arrays called test suites. Each test suite can be
> associated with a suite initialization/termination function(s), called by
> CUnit before and after the whole suite is run.
> -* An array of test suites (and associated init/term functions) defines
> the test registry run by the test executable.
> +* Tests are grouped in arrays called test suites. Each test suite can be
> +associated with a suite initialization/termination function(s), called by
> CUnit
> +before and after the whole suite is run.
> +* An array of test suites (and associated init/term functions) defines
> the test
> +registry run by the test executable.
>
> -Moreover, two extra functions can be used to initialize/terminate the
> test executable (these are not part of CUnit). +
> +Moreover, two extra functions can be used to initialize/terminate the test
> +executable (these are not part of CUnit). +
>  A test executable return success (0) if every test of each suite succeed.
>
> -More details about http://cunit.sourceforge.net/doc/index.html[CUnit
> users guide]
> +More details about
> +http://cunit.sourceforge.net/doc/index.html[CUnit users guide]
>
>  [[anchor-1]]
> -Module test and naming convention
> -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +==== Module test and naming convention ====
> +
>
>  * Tests, i.e. C functions which are used in CUnit test suites are named:
>     *<Module>_test_+++*+++* +
>     where the suffix idendify the test.
>
       identifies

>
> -* Test arrays, i.e. arrays of odp_testinfo_t, listing the test functions
> belonging to a suite, are called:
> +* Test arrays, i.e. arrays of odp_testinfo_t, listing the test functions
> +  belonging to a suite, are called:
>     *<Module>_suite+++[_*]+++* +
>     where the possible suffix can be used if many suites are declared.
>
>  * CUnit suite init and termination functions are called:
>     *<Module>+++_suite[_*]_init()+++* and
> *<Module>+++_suite[_*]_term()+++* respectively. +
> -   where the possible extra middle pattern can be used if many suites are
> declared.
> +   where the possible extra middle pattern can be used if many suites are
> +   declared.
>
> -* Suite arrays, i.e. arrays of odp_suiteinfo_t used in executables (CUnit
> registry) are called:
> +* Suite arrays, i.e. arrays of odp_suiteinfo_t used in executables
> +  (CUnit registry) are called:
>     *<Module>+++_suites[_*]+++* +
>     where the possible suffix identifies the executable using it, if many.
>
> @@ -128,18 +181,28 @@ Module test and naming convention
>     *<Module>_init*
>     *<Module>_term*
>
> -All the above symbols are part of the generated libtest<Module>.la
> libraries. The generated main executable(s) (named <module>_+++main[_*]+++,
> where the optional suffix is used to distinguish the executables belonging
> to the same module, if many) simply call(s) the related
> <Module>_main+++[_*]+++ from the library.
> +All the above symbols are part of the generated libtest<Module>.la
> libraries.
> +The generated main executable(s) (named <module>_+++main[_*]+++, where the
> +optional suffix is used to distinguish the executables belonging to the
> same
> +module, if many) simply call(s) the related <Module>_main+++[_*]+++ from
> the
> +library.
>
> -Platform specific
> -~~~~~~~~~~~~~~~~~
> -These tests are located under 'platform/<platform>/test'. There is one
> such area for each platform implementing ODP.
> -This location will be referred as <PLATFORM_SPECIFIC> in the rest of this
> document.
> +=== Platform specific ===
>
> -The normal case
> -^^^^^^^^^^^^^^^
> -If the considered platform needs no platform specific tests, this
> directory simply needs to contain a single Makefile.am listing each of the
> executables (named <module>_main) built from the platform agnostic area.
> The executables are listed in the automake TEST variable and will therefore
> be run on "make check".
> +These tests are located under 'platform/<platform>/test'. There is one
> such area
> +for each platform implementing ODP.
> +This location will be referred as <PLATFORM_SPECIFIC> in the rest of this
> +document.
>
> -For the linux-generic platform, most tested modules fall into this
> category: currently, the 'platform/linux-generic/test/Makefile.am' looks as
> follows:
> +==== The normal case ====
> +
> +If the considered platform needs no platform specific tests, this
> directory
> +simply needs to contain a single Makefile.am listing each of the
> executables
> +(named <module>_main) built from the platform agnostic area. The
> executables are
> +listed in the automake TEST variable and will therefore be run on "make
> check".
> +
> +For the linux-generic platform, most tested modules fall into this
> category:
> +currently, the 'platform/linux-generic/test/Makefile.am' looks as follows:
>
>  [source,am]
>  ----
> @@ -175,22 +238,39 @@ endif
>
>  ----
>
> -With the exception for module pktio, all other modules testing just
> involves calling the platform agnostic <module>_main executables (in
> test/validation).
> +With the exception for module pktio, all other modules testing just
> involves
> +calling the platform agnostic <module>_main executables (in
> test/validation).
>
> -Using other languages
> -^^^^^^^^^^^^^^^^^^^^^
> -The pktio module, above, is actually tested using a bash script. This
> script is needed to set up the interfaces used by the tests. The pktio_run
> script eventually calls the platform agnostic
> 'test/validation/pktio/pktio_main' after setting up the interfaces needed
> by the tests.
> -Notice that the path to the script, 'pktio/pktio_run', is pointing to a
> file within the <PLATFORM_SPECIFIC> tree so is private to this platform.
> Any languages supported by the tested platform can be used there, as it
> will not impact other platforms.
> -The platform "private" executables (such as this script), of course, must
> also return one of the return code expected by the automake test harness (0
> for success, 77 for skipped, other values for errors).
> +==== Using other languages ====
>
> -Defining test wrappers
> -^^^^^^^^^^^^^^^^^^^^^^
> -The pktio case above is actually using a script as wrapper around the
> "standard" (platform independent) test executable. Wrappers can also be
> defined by using the LOG_COMPILER variable of automake.
> -This is applicable in cases where the same wrapper should be used for
> more then one test, as the test name is passed has parameter to the
> wrapper. A wrapper is just a program expecting one argument: the test name.
> +The pktio module, above, is actually tested using a bash script. This
> script is
> +needed to set up the interfaces used by the tests. The pktio_run script
> +eventually calls the platform agnostic 'test/validation/pktio/pktio_main'
> after
> +setting up the interfaces needed by the tests.
> +Notice that the path to the script, 'pktio/pktio_run', is pointing to a
> file
> +within the <PLATFORM_SPECIFIC> tree so is private to this platform. Any
> +languages supported by the tested platform can be used there, as it will
> not
> +impact other platforms.
> +The platform "private" executables (such as this script), of course, must
> also
> +return one of the return code expected by the automake test harness
> +(0 for success, 77 for skipped, other values for errors).
>
> -Automake also supports the usage different wrappers based of the
> executable filename suffix. See
> https://www.gnu.org/software/automake/manual/html_node/Parallel-Test-Harness.html[Parallel-Test-Harness]
> for more information.
> +==== Defining test wrappers ====
>
> -To add a wrapper around the executed test, just add the following
> LOG_COMPILER definition line in the '<PLATFORM_SPECIFIC>/Makefile.am':
> +The pktio case above is actually using a script as wrapper around the
> "standard"
> +(platform independent) test executable. Wrappers can also be defined by
> using
> +the LOG_COMPILER variable of automake.
> +This is applicable in cases where the same wrapper should be used for
> more then
> +one test, as the test name is passed has parameter to the wrapper. A
> wrapper is
> +just a program expecting one argument: the test name.
> +
> +Automake also supports the usage different wrappers based of the
> executable
> +filename suffix. See
> +
> https://www.gnu.org/software/automake/manual/html_node/Parallel-Test-Harness.html[Parallel-Test-Harness]
> +for more information.
> +
> +To add a wrapper around the executed test, just add the following
> LOG_COMPILER
> +definition line in the '<PLATFORM_SPECIFIC>/Makefile.am':
>
>  [source,am]
>  ----
> @@ -221,18 +301,40 @@ echo "Do something to clean up the mess here :-)"
>  exit $res
>  ----
>
> -Note how the above script stores the return code of the test executable
> to return it properly to the automake test harness.
> +Note how the above script stores the return code of the test executable to
> +return it properly to the automake test harness.
>
> -Defining platform specific tests
> -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> -Sometimes, it may be necessary to call platform specific system calls to
> check some functionality: For instance, testing odp_cpumask_* could involve
> checking the underlying system CPU mask. On linux, such a test would
> require using the CPU_ISSET macro, which is linux specific. Such a test
> would be written in '<PLATFORM_SPECIFIC>/cpumask/...' The contents of this
> directory would be very similar to the contents of the platform agnostic
> side cpu_mask tests (including a Makefile.am...), but platform specific
> test would be written there.
> -'<PLATFORM_SPECIFIC>/Makefile.am' would then trigger the building of the
> platform specific tests (by listing their module name in SUBDIRS and
> therefore calling the appropriate Makefile.am) and then it would call both
> the platform agnostic executable(s) and the platform specific test
> executable.
> +==== Defining platform specific tests ====
>
> -Marking tests as inactive
> -^^^^^^^^^^^^^^^^^^^^^^^^^
> -The general policy is that a full run of the validation suite (a "make
> check") must pass at all times. However a particular platform may have one
> or more test cases that are known to be unimplemented either during
> development or permanently, so to avoid these test cases being reported as
> failures it's useful to be able to skip them. This can be achieved by
> creating a new test executable (still on the platform side), giving the
> platform specific initialisation code the opportunity to modify the
> registered tests in order to mark unwanted tests as inactive while leaving
> the remaining tests active. It's important that the unwanted tests are
> still registered with the test framework to allow the fact that they're not
> being tested to be recorded.
> +Sometimes, it may be necessary to call platform specific system calls to
> check
> +some functionality: For instance, testing odp_cpumask_* could involve
> checking
> +the underlying system CPU mask. On linux, such a test would require using
> the
> +CPU_ISSET macro, which is linux specific. Such a test would be written in
> +'<PLATFORM_SPECIFIC>/cpumask/...' The contents of this directory would be
> very
> +similar to the contents of the platform agnostic side cpu_mask tests
> +(including a Makefile.am...), but platform specific test would be written
> there.
> +'<PLATFORM_SPECIFIC>/Makefile.am' would then trigger the building of the
> +platform specific tests (by listing their module name in SUBDIRS and
> therefore
> +calling the appropriate Makefile.am) and then it would call both the
> platform
> +agnostic executable(s) and the platform specific test executable.
>
> -The odp_cunit_update() function is intended for this purpose, it is used
> to modify the properties of previously registered tests, for example to
> mark them as inactive. Inactive tests are registered with the test
> framework but aren't executed and will be recorded as inactive in test
> reports.
> +==== Marking tests as inactive ====
> +
> +The general policy is that a full run of the validation suite (a "make
> check")
> +must pass at all times. However a particular platform may have one or
> more test
> +cases that are known to be unimplemented either during development or
> +permanently, so to avoid these test cases being reported as failures it's
> useful
> +to be able to skip them. This can be achieved by creating a new test
> executable
> +(still on the platform side), giving the platform specific initialisation
> code
>
initialization

> +the opportunity to modify the registered tests in order to mark unwanted
> tests
> +as inactive while leaving the remaining tests active. It's important that
> the
> +unwanted tests are still registered with the test framework to allow the
> fact
> +that they're not being tested to be recorded.
> +
> +The odp_cunit_update() function is intended for this purpose, it is used
> to
> +modify the properties of previously registered tests, for example to mark
> them
> +as inactive. Inactive tests are registered with the test framework but
> aren't
> +executed and will be recorded as inactive in test reports.
>
>  In 'test/validation/foo/foo.c', define all tests for the 'foo' module:
>
> @@ -250,7 +352,8 @@ odp_suiteinfo_t foo_suites[] = {
>  };
>  ------------------
>
> -In 'platform/<platform>/test/foo/foo_main.c', register all the tests
> defined in the 'foo' module, then mark a single specific test case as
> inactive:
> +In 'platform/<platform>/test/foo/foo_main.c', register all the tests
> defined in
> +the 'foo' module, then mark a single specific test case as inactive:
>
>  [source,c]
>  ------------------
> @@ -280,4 +383,6 @@ int foo_main(void)
>
>  So 'foo_test_a' will be executed and 'foo_test_b' is inactive.
>
> -It's expected that early in the development cycle of a new implementation
> the inactive list will be quite long, but it should shrink over time as
> more parts of the API are implemented.
> +It's expected that early in the development cycle of a new implementation
> the
> +inactive list will be quite long, but it should shrink over time as more
> parts
> +of the API are implemented.
> --
> 2.5.0
>
> _______________________________________________
> lng-odp mailing list
> lng-odp@lists.linaro.org
> https://lists.linaro.org/mailman/listinfo/lng-odp
>
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to