Home | History | Annotate | Download | only in specs
      1 #!/bin/bash
      2 
      3 #
      4 # Copyright (C) 2017 The Android Open Source Project
      5 #
      6 # Licensed under the Apache License, Version 2.0 (the "License");
      7 # you may not use this file except in compliance with the License.
      8 # You may obtain a copy of the License at
      9 #
     10 #      http://www.apache.org/licenses/LICENSE-2.0
     11 #
     12 # Unless required by applicable law or agreed to in writing, software
     13 # distributed under the License is distributed on an "AS IS" BASIS,
     14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15 # See the License for the specific language governing permissions and
     16 # limitations under the License.
     17 
     18 NNAPI_VERSION="
     19 V1_0
     20 V1_1
     21 "
     22 
     23 # Process one test spec, and optionally provide the log file argument
     24 # for the slicing tool. The first argument is the test spec file; the
     25 # second optional argument specifies the log file this test should dump
     26 # results into. Only used by the test slicing tool to collect reference
     27 # outputs from the CPU. Also, it outputs the right #includes in the
     28 # test harness so the test would be invoked by TestGenerated.cpp
     29 #
     30 # This function shouldn't be directly called from other scripts. Use
     31 # generate_wrapper below for generating models and examples and updating the
     32 # test framework in one shot.
     33 
     34 export NNAPI_BASE=$ANDROID_BUILD_TOP/frameworks/ml/nn
     35 : ${TEST_DIR:=frameworks/ml/nn/runtime/test}
     36 
     37 function generate_one_testcase {
     38   # Generate one testcase
     39   local LOGFILE=$2
     40   if [ -n "$2" ]; then
     41     local LOGFILE=", \"$2\""
     42   fi
     43   local BASENAME=`basename -s .mod.py $1`
     44   local EXAMPLE="-e $ANDROID_BUILD_TOP/$TEST_DIR/generated/examples/$BASENAME.example.cpp"
     45 
     46   $NNAPI_BASE/tools/test_generator/test_generator.py ./`basename $1`\
     47     -m $ANDROID_BUILD_TOP/$TEST_DIR/generated/models/$BASENAME.model.cpp $EXAMPLE
     48   ret=$?
     49   # Paste these lines into TestGenerated.cpp
     50   echo
     51   echo namespace $BASENAME {
     52   echo std::vector\<MixedTypedExample\> examples \= {
     53   echo // Generated $BASENAME test
     54   echo \#include \"generated/examples/$BASENAME.example.cpp\"
     55   echo }\;
     56   echo // Generated model constructor
     57   echo \#include \"generated/models/$BASENAME.model.cpp\"
     58   echo }  // namespace $BASENAME
     59   echo TEST_F\(GeneratedTests\, $BASENAME\) {
     60   echo '    execute'\($BASENAME\:\:CreateModel\,
     61   echo '            '$BASENAME\:\:is_ignored\,
     62   echo '            '$BASENAME\:\:examples${LOGFILE}\)\;
     63   echo }
     64   return $ret
     65 }
     66 
     67 # Driver for generate_one_testcase. Append the output of generate_one_testcase
     68 # (which are C++ snippets that invokes the test harness) to the
     69 # all_generated_tests.cpp
     70 # Optionally, the "LOG" file ($2), only used by the slicing tool, would be
     71 # passed to generate_one_testcase.
     72 #
     73 # This function should be called to process one test spec from other scripts.
     74 function generate_wrapper {
     75   local LOGFILE=""
     76   if [ $1 = "log" ]; then
     77     local LOGFILE=$2
     78     shift
     79     shift
     80   fi
     81   cd $ANDROID_BUILD_TOP/$TEST_DIR/specs
     82   OUTFILE=$ANDROID_BUILD_TOP/$TEST_DIR/generated/all_generated_tests.cpp
     83   echo "// DO NOT EDIT;" > $OUTFILE
     84   echo "// Generated by ml/nn/runtime/test/specs/generate_test.sh" >> $OUTFILE
     85   FOUND=0
     86 
     87   for ver in $NNAPI_VERSION;
     88   do
     89     VER_DIR=$ANDROID_BUILD_TOP/$TEST_DIR/specs/$ver
     90     [ ! -d $VER_DIR ] && continue
     91     pushd $VER_DIR > /dev/null
     92     for f in $@;
     93     do
     94       if [ -f $(basename $f) ]; then
     95         generate_one_testcase $f "$LOGFILE" >> $OUTFILE
     96         if [ $? -ne 0 ]; then
     97           echo "Failed processing $f"
     98           return $?
     99         fi
    100         FOUND=1
    101       fi
    102     done
    103     popd > /dev/null
    104   done
    105   if [[ $FOUND -eq 0 ]]; then
    106     echo did not find any files for $@
    107     exit 1
    108   fi
    109   return $?
    110 }
    111 
    112 # Only run the following when not sourced by another script
    113 if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    114   set -eu
    115   if [ $# -eq 0 ]; then
    116     FILES=${ANDROID_BUILD_TOP}/${TEST_DIR}/specs/V*/*.mod.py
    117   else
    118     FILES="$@"
    119   fi
    120   generate_wrapper $FILES
    121   if [ $? -ne 0 ]; then
    122     exit $?
    123   fi
    124   echo "Generated file in ml/nn/runtime/test/generated/"`basename $OUTFILE`
    125 fi # [[ "${BASH_SOURCE[0]}" == "${0}" ]]
    126 
    127