Applied,

Thanks,
Anders

On 2014-11-17 13:33, Mike Holmes wrote:
> Signed-off-by: Mike Holmes <[email protected]>
> ---
> 
> Received some nit fixes now incorporated.
> 
> 
>  testing.dox | 316 
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 316 insertions(+)
>  create mode 100644 testing.dox
> 
> diff --git a/testing.dox b/testing.dox
> new file mode 100644
> index 0000000..8b210be
> --- /dev/null
> +++ b/testing.dox
> @@ -0,0 +1,316 @@
> +/* Copyright (c) 2014, Linaro Limited
> + * All rights reserved
> + *
> + * SPDX-License-Identifier BSD-3-Clause
> + */
> +
> +/**
> +
> +@page testing Testing, Verification & Validation
> +
> +@tableofcontents
> +
> +@sectiooverview Overview
> +The goals for ODP API testing are:
> + - Ensure that all platform implementations operate identically from the 
> perspective of the application. Optional APIs or optional features of an API 
> must operate identically between platforms but this can be to return any 
> indication specified by the API and call ODP_UNIMPLEMENTED.
> + - Ensure that a given API performs to the specification defined in the 
> published ODP Architecture & API document in source code control. The API 
> should provide specific information on how the API will respond to its 
> arguments.
> + - Catch differences in the API definition between the version of the test 
> suite and the implementation
> + - GCOV or similar tool be used to ensure complete coverage of the API, note 
> that the implementation may have less coverage than 100% but the API must be 
> covered 100%.
> +Both branch and line coverage will be reported.
> + - New APIs are considered delivered when there is a test suite to 
> compliment the API definition.
> + - Framework should be very light and configurable.
> + - Provide a mechanism to publish compliance to a released API version
> +
> +There are three elements to the overall test strategy.
> +
> +- @ref compliance
> +The simplest is the ODP Compliance test suite, this is updated with every 
> commit that adds or modifies an ODP API.
> +It is intended to be very lightweight and is implemented using CUnit for the 
> APIs, with simple scripting for the documentation.
> +
> +- @ref functional
> +Functional tests that attempt to perform some more in depth processing which 
> has its output verified, for example encrypt and then decrypt a packet, 
> checking that the result matches the input (similar to LTP).
> +These may require external equipment.
> +
> +- @ref benchmarking
> +Provides no pass fail indication but instead returns a metric on the 
> performance of some portion of the implementation of the API
> +
> +@section logical_groups Test suite API groups
> +
> +The following logical areas for the API need to be addressed for the v1.0 
> release cycle.
> +The API logical groups will be used in the test directory structure and in 
> defining the unit test suites
> +to gather the tests in to groups of related functionality.
> +
> +API logical group | Headers
> + :--------------- | :---
> +Buffer            | odp_buffer.h odp_buffer_pool.h
> +Packet            | odp_packet_flags.h odp_packet.h
> +Classification    | odp_classification.h
> +Crypt             | odp_crypto.h
> +IPC               | not defined
> +Pktio             | odp_packet_io.h
> +Queue             | odp_queue.h
> +Schedule          | odp_schedule.h odp_coremask.h
> +Shared Memory     | odp_shared_memory.h
> +Synchronizers / Barriers | odp_rwlock.h odp_sync.h odp_atomic.h 
> odp_barrier.h odp_spinlock.h odp_ticketlock.h
> +Thread            | odp_thread.h
> +Timer             | odp_timer.h
> +System            | odp_time.h odp_perf.h
> +Logging / Abort   | odp_version.h odp_debug.h odp_system_info.h
> +Initialization    | odp_init.h
> +
> +@section directory Directory structure
> +
> +Test contains all the tests that must be passed for a given revision of the 
> API to be declared compliant.
> +The tests cover:
> + - the unit tests
> + - documentation tests
> + - functional & benchmark tests
> +
> +@verbatim
> +test
> +|
> +|-- functional
> +|  |-- <test executable>
> +|  |-- <API group>/<test executable>
> +|
> +|-- documentation
> +|  |--<test case>
> +|
> +|-- cunit
> +   |-- <test executable>
> +   |-- <API group>/<test executable>
> +
> +@endverbatim
> +
> +@section compliance ODP-Compliance test suite
> +Because this suite is extended with every API extension it needs to be very 
> light weight.
> +This suite would be run by any new platform attempting to be API compliant, 
> it will try to pass in the obvious combinations of arguments that arise from 
> reading the API definition.
> +For example a unit test is of the following form.
> +
> +@code
> +/* a is in the range 0 to 10
> +returns a *2 or -1 if a is out of range */
> +int foo (unsigned int a)
> +@endcode
> +
> +Tests for foo arguments would be
> + - a=-check that  return = -1
> + - a=check that  return = 0
> + - a=check that  return = 10
> + - a=1check that  return = 20
> + - a=11 check that return = -1
> +
> +The frame work to support generating these test cases is CUnit which 
> provides batch and interactive operation.
> +Unit test cases do not use any external equipment.
> +
> +@section cunit CUnit
> +CUnit http://cunit.sourceforge.net/doc/index.html is a system for writing, 
> administering, and running unit tests in C.
> +It is built as a static library which is linked with the user's testing code.
> +CUnit uses a simple framework for building test structures, and provides a 
> rich set of assertions for testing common data types.
> +In addition, several different interfaces are provided for running tests and 
> reporting results.
> +These include automated interfaces for code-controlled testing and 
> reporting, as well as interactive interfaces allowing the user to run tests 
> and view results dynamically.
> +
> +@subsection structure Structure
> +CUnit is a combination of a platform-independent framework with various user 
> interfaces.
> +The core framework provides basic support for managing a test registry, 
> suites, and test cases.
> +The user interfaces facilitate interaction with the framework to run tests 
> and view results.
> +CUnit is organized like a conventional unit testing framework:
> +
> +@verbatim
> +                  Test Registry
> +                         |
> +          ------------------------------
> +          |                            |
> +       Suite '1'      . . . .       Suite 'N'
> +          |                            |
> +    ---------------             ---------------
> +    |             |             |             |
> + Test '11' ... Test '1M'     Test 'N1' ... Test 'NM'
> +@endverbatim
> +
> +Individual test cases are packaged into suites, which are registered with 
> the active test registry.
> +Suites can have setup and tear down functions which are automatically called 
> before and after running the suite's tests.
> +All suites/tests in the registry may be run using a single function call, or 
> selected suites or tests can be run.
> +
> +@subsection general_usage General Usage
> + - A typical sequence of steps for using the CUnit framework is:
> + - Write functions for tests (and suite init/cleanup if necessary).
> + - Initialize the test registry - CU_initialize_registry()
> + - Add suites to the test registry - CU_add_suite()
> + - Add tests to the suites - CU_add_test()
> + - Run tests using an appropriate interface, e.g. CU_console_run_tests
> + - Cleanup the test registry - CU_cleanup_registry
> +
> +@code
> +/* Copyright (c) 2014, Linaro Limited
> + * All rights reserved.
> + *
> + * SPDX-License-Identifier BSD-3-Clause
> + */
> +
> +#include "odp.h"
> +#include "CUnit/Basic.h"
> +
> +#define DEFAULT_MSG_POOL_SIZE (4*1024*1024)
> +#define DEFAULT_MSG_SIZE (8)
> +
> +static void test_odp_init_global(void)
> +{
> +
> +     int status;
> +     status = odp_init_global();
> +     CU_ASSERT (status == 0) ;
> +}
> +
> +static int init(void)
> +{
> +     printf("ODP version:%s\n",odp_version_api_str());
> +     return 0;
> +}
> +
> +
> +int main(void)
> +{
> +     CU_pSuite pSuite;
> +     CU_pTest  pTest;
> +
> +     /* initialize the CUnit test registry */
> +     if (CUE_SUCCESS != CU_initialize_registry())
> +             return CU_get_error();
> +     /* add a suite to the registry */
> +     pSuite = CU_add_suite("odp_init", init, NULL);
> +     if (!pSuite) {
> +             CU_cleanup_registry();
> +             return CU_get_error();
> +     }
> +     /* add the tests to the suite */
> +     pTest == CU_ADD_TEST(pSuite, test_odp_init_global));
> +     if (!pTest) {
> +             CU_cleanup_registry();
> +             return CU_get_error();
> +     }
> +     /* Run all tests using the CUnit Basic interface */
> +     CU_basic_set_mode(CU_BRM_VERBOSE);
> +     CU_basic_run_tests();
> +     CU_cleanup_registry();
> +     return CU_get_error();
> +}
> +@endcode
> +
> +@subsection results Normal results
> +
> +@code
> +  CUnit - A unit testing framework for C - Version 2.1-2
> +  http://cunit.sourceforge.net/
> +
> +ODP version:0.0.1
> +
> +Suite: odp_init
> +  Test: test_odp_init_global ...
> +Buffer pool init global
> +  pool_entry_s siz   192
> +  pool_entry_t siz   192
> +  odp_buffer_hdr_t size 120
> +
> +Queue init ... done
> +Queue init global
> +  struct queue_entry_s size 192
> +  queue_entry_t siz      192
> +
> +Schedule init ... done
> +Timer init ...done
> +passed
> +
> +Run Summary  Type  Total    Ran Passed Failed Inactive
> +           suites      1      1    n/a      0        0
> +            tests      1      1      1      0        0
> +          asserts      1      1      1      0      n/a
> +@endcode
> +
> +
> +@subsection compliance_xml Compliance results (XML)
> +The CUnit results may also be gathered in XML format, this format may be use 
> to submit an implementations CUnit test case completion for inclusion on the 
> ODP website as compliant to a given release.
> +
> +~~~{.xml}
> +<?xml version="1.0" ?>.
> +<?xml-stylesheet type="text/xsl" href="CUnit-Run.xsl" ?>.
> +<!DOCTYPE CUNIT_TEST_RUN_REPORT SYSTEM "CUnit-Run.dtd">.
> +<CUNIT_TEST_RUN_REPORT>.
> +  <CUNIT_HEADER/>.
> +  <CUNIT_RESULT_LISTING>.
> + <CUNIT_RUN_SUITE>.
> +   <CUNIT_RUN_SUITE_SUCCESS>.
> +     <SUITE_NAME> odp initialization </SUITE_NAME>.
> +     <CUNIT_RUN_TEST_RECORD>.
> +       <CUNIT_RUN_TEST_SUCCESS>.
> +         <TEST_NAME> test_odp_init_global </TEST_NAME>.
> +       </CUNIT_RUN_TEST_SUCCESS>.
> +     </CUNIT_RUN_TEST_RECORD>.
> +   </CUNIT_RUN_SUITE_SUCCESS>.
> + </CUNIT_RUN_SUITE>.
> +  </CUNIT_RESULT_LISTING>
> +  <CUNIT_RUN_SUMMARY>.
> + <CUNIT_RUN_SUMMARY_RECORD>.
> +   <TYPE> Suites </TYPE>.
> +   <TOTAL> 1 </TOTAL>.
> +   <RUN> 1 </RUN>.
> +   <SUCCEEDED> - NA - </SUCCEEDED>.
> +   <FAILED> 0 </FAILED>.
> +   <INACTIVE> 0 </INACTIVE>.
> + </CUNIT_RUN_SUMMARY_RECORD>.
> + <CUNIT_RUN_SUMMARY_RECORD>.
> +   <TYPE> Test Cases </TYPE>.
> +   <TOTAL> 1 </TOTAL>.
> +   <RUN> 1 </RUN>.
> +   <SUCCEEDED> 1 </SUCCEEDED>.
> +   <FAILED> 0 </FAILED>.
> +   <INACTIVE> 0 </INACTIVE>.
> + </CUNIT_RUN_SUMMARY_RECORD>.
> + <CUNIT_RUN_SUMMARY_RECORD>.
> +   <TYPE> Assertions </TYPE>.
> +   <TOTAL> 1 </TOTAL>.
> +   <RUN> 1 </RUN>.
> +   <SUCCEEDED> 1 </SUCCEEDED>.
> +   <FAILED> 0 </FAILED>.
> +   <INACTIVE> n/a </INACTIVE>.
> + </CUNIT_RUN_SUMMARY_RECORD>.
> +  </CUNIT_RUN_SUMMARY>.
> +  <CUNIT_FOOTER> File Generated By CUnit v2.1-2 - Thu Oct 23 15:02:46 2014
> + </CUNIT_FOOTER>.
> +</CUNIT_TEST_RUN_REPORT>
> +~~~
> +
> +@section functional Functional tests
> +
> +These tests are generally more elaborate with a goal of proving a complex 
> functionality.
> +@verbatim
> +test
> +.
> +|-- functional
> +  |-- <test executable>
> +  |-- <API group>/<test executable>
> +@endverbatim
> + - There is no framework for these tests and they generally take command 
> line arguments to modify their behaviour.
> + - These tests do provide a pass fail indication.
> + - These tests may require network interfaces and external equipment.
> +
> +@section benchmarking Benchmarks
> +
> +Benchmarks are currently also stored with the functional tests, this may be 
> re assessed depending on the test volume.
> +@verbatim
> +test
> +.
> +|-- functional
> +  |-- <test executable>
> +  |-- <API group>/<test executable>
> +@endverbatim
> + - These tests are generally more elaborate with a goal of quantifying the 
> capacity of a complex functionality.
> + - There is no framework for these benchmarks and they generally take 
> command line arguments to modify their behaviour.
> + - They do not provide a pass fail indication.
> +
> +@section test_versioning Test versioning relationship to ODP and versioning
> +
> +For ODP to declare for example the v1.0 tag in its git repository it must 
> have passed the corresponding test suit.
> +When ODP API v3.0 is released it will be validated against the test suite 
> version tagged ODP v3.0
> +It is possible that a version of the ODP API is released and that the test 
> suite used has a flaw, in this case the test suite will be re released as 
> v3.0-1
> +*/
> -- 
> 2.1.0
> 
> 
> _______________________________________________
> lng-odp mailing list
> [email protected]
> http://lists.linaro.org/mailman/listinfo/lng-odp

-- 
Anders Roxell
[email protected]
M: +46 709 71 42 85 | IRC: roxell

_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to