mbed-os for GR-LYCHEE

Dependents:   mbed-os-example-blinky-gr-lychee GR-Boads_Camera_sample GR-Boards_Audio_Recoder GR-Boads_Camera_DisplayApp ... more

Committer:
dkato
Date:
Fri Feb 02 05:42:23 2018 +0000
Revision:
0:f782d9c66c49
mbed-os for GR-LYCHEE

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 0:f782d9c66c49 1 """
dkato 0:f782d9c66c49 2 mbed SDK
dkato 0:f782d9c66c49 3 Copyright (c) 2011-2014 ARM Limited
dkato 0:f782d9c66c49 4
dkato 0:f782d9c66c49 5 Licensed under the Apache License, Version 2.0 (the "License");
dkato 0:f782d9c66c49 6 you may not use this file except in compliance with the License.
dkato 0:f782d9c66c49 7 You may obtain a copy of the License at
dkato 0:f782d9c66c49 8
dkato 0:f782d9c66c49 9 http://www.apache.org/licenses/LICENSE-2.0
dkato 0:f782d9c66c49 10
dkato 0:f782d9c66c49 11 Unless required by applicable law or agreed to in writing, software
dkato 0:f782d9c66c49 12 distributed under the License is distributed on an "AS IS" BASIS,
dkato 0:f782d9c66c49 13 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dkato 0:f782d9c66c49 14 See the License for the specific language governing permissions and
dkato 0:f782d9c66c49 15 limitations under the License.
dkato 0:f782d9c66c49 16
dkato 0:f782d9c66c49 17 Author: Przemyslaw Wirkus <Przemyslaw.wirkus@arm.com>
dkato 0:f782d9c66c49 18 """
dkato 0:f782d9c66c49 19
dkato 0:f782d9c66c49 20 import sys
dkato 0:f782d9c66c49 21 import json
dkato 0:f782d9c66c49 22 import optparse
dkato 0:f782d9c66c49 23 from flask import Flask
dkato 0:f782d9c66c49 24 from os.path import join, abspath, dirname
dkato 0:f782d9c66c49 25
dkato 0:f782d9c66c49 26 # Be sure that the tools directory is in the search path
dkato 0:f782d9c66c49 27 ROOT = abspath(join(dirname(__file__), ".."))
dkato 0:f782d9c66c49 28 sys.path.insert(0, ROOT)
dkato 0:f782d9c66c49 29
dkato 0:f782d9c66c49 30 # Imports related to mbed build api
dkato 0:f782d9c66c49 31 from tools.utils import construct_enum
dkato 0:f782d9c66c49 32 from tools.build_api import mcu_toolchain_matrix
dkato 0:f782d9c66c49 33
dkato 0:f782d9c66c49 34 # Imports from TEST API
dkato 0:f782d9c66c49 35 from test_api import SingleTestRunner
dkato 0:f782d9c66c49 36 from test_api import SingleTestExecutor
dkato 0:f782d9c66c49 37 from test_api import get_json_data_from_file
dkato 0:f782d9c66c49 38 from test_api import print_muts_configuration_from_json
dkato 0:f782d9c66c49 39 from test_api import print_test_configuration_from_json
dkato 0:f782d9c66c49 40 from test_api import get_avail_tests_summary_table
dkato 0:f782d9c66c49 41 from test_api import get_default_test_options_parser
dkato 0:f782d9c66c49 42
dkato 0:f782d9c66c49 43
dkato 0:f782d9c66c49 44 class SingleTestRunnerWebService(SingleTestRunner):
dkato 0:f782d9c66c49 45 def __init__(self):
dkato 0:f782d9c66c49 46 super(SingleTestRunnerWebService, self).__init__()
dkato 0:f782d9c66c49 47
dkato 0:f782d9c66c49 48 # With this lock we should control access to certain resources inside this class
dkato 0:f782d9c66c49 49 self.resource_lock = thread.allocate_lock()
dkato 0:f782d9c66c49 50
dkato 0:f782d9c66c49 51 self.RestRequest = construct_enum(REST_MUTS='muts',
dkato 0:f782d9c66c49 52 REST_TEST_SPEC='test_spec',
dkato 0:f782d9c66c49 53 REST_TEST_RESULTS='test_results')
dkato 0:f782d9c66c49 54
dkato 0:f782d9c66c49 55 def get_rest_result_template(self, result, command, success_code):
dkato 0:f782d9c66c49 56 """ Returns common part of every web service request
dkato 0:f782d9c66c49 57 """
dkato 0:f782d9c66c49 58 result = {"result" : result,
dkato 0:f782d9c66c49 59 "command" : command,
dkato 0:f782d9c66c49 60 "success_code": success_code} # 0 - OK, >0 - Error number
dkato 0:f782d9c66c49 61 return result
dkato 0:f782d9c66c49 62
dkato 0:f782d9c66c49 63 # REST API handlers for Flask framework
dkato 0:f782d9c66c49 64 def rest_api_status(self):
dkato 0:f782d9c66c49 65 """ Returns current test execution status. E.g. running / finished etc.
dkato 0:f782d9c66c49 66 """
dkato 0:f782d9c66c49 67 with self.resource_lock:
dkato 0:f782d9c66c49 68 pass
dkato 0:f782d9c66c49 69
dkato 0:f782d9c66c49 70 def rest_api_config(self):
dkato 0:f782d9c66c49 71 """ Returns configuration passed to SingleTest executor
dkato 0:f782d9c66c49 72 """
dkato 0:f782d9c66c49 73 with self.resource_lock:
dkato 0:f782d9c66c49 74 pass
dkato 0:f782d9c66c49 75
dkato 0:f782d9c66c49 76 def rest_api_log(self):
dkato 0:f782d9c66c49 77 """ Returns current test log """
dkato 0:f782d9c66c49 78 with self.resource_lock:
dkato 0:f782d9c66c49 79 pass
dkato 0:f782d9c66c49 80
dkato 0:f782d9c66c49 81 def rest_api_request_handler(self, request_type):
dkato 0:f782d9c66c49 82 """ Returns various data structures. Both static and mutable during test
dkato 0:f782d9c66c49 83 """
dkato 0:f782d9c66c49 84 result = {}
dkato 0:f782d9c66c49 85 success_code = 0
dkato 0:f782d9c66c49 86 with self.resource_lock:
dkato 0:f782d9c66c49 87 if request_type == self.RestRequest.REST_MUTS:
dkato 0:f782d9c66c49 88 result = self.muts # Returns MUTs
dkato 0:f782d9c66c49 89 elif request_type == self.RestRequest.REST_TEST_SPEC:
dkato 0:f782d9c66c49 90 result = self.test_spec # Returns Test Specification
dkato 0:f782d9c66c49 91 elif request_type == self.RestRequest.REST_TEST_RESULTS:
dkato 0:f782d9c66c49 92 pass # Returns test results
dkato 0:f782d9c66c49 93 else:
dkato 0:f782d9c66c49 94 success_code = -1
dkato 0:f782d9c66c49 95 return json.dumps(self.get_rest_result_template(result, 'request/' + request_type, success_code), indent=4)
dkato 0:f782d9c66c49 96
dkato 0:f782d9c66c49 97
dkato 0:f782d9c66c49 98 def singletest_in_webservice_mode():
dkato 0:f782d9c66c49 99 # TODO Implement this web service functionality
dkato 0:f782d9c66c49 100 pass
dkato 0:f782d9c66c49 101
dkato 0:f782d9c66c49 102
dkato 0:f782d9c66c49 103 def get_default_test_webservice_options_parser():
dkato 0:f782d9c66c49 104 """ Get test script web service options used by CLI, webservices etc.
dkato 0:f782d9c66c49 105 """
dkato 0:f782d9c66c49 106 parser = get_default_test_options_parser()
dkato 0:f782d9c66c49 107
dkato 0:f782d9c66c49 108 # Things related to web services offered by test suite scripts
dkato 0:f782d9c66c49 109 parser.add_argument('', '--rest-api',
dkato 0:f782d9c66c49 110 dest='rest_api_enabled',
dkato 0:f782d9c66c49 111 default=False,
dkato 0:f782d9c66c49 112 action="store_true",
dkato 0:f782d9c66c49 113 help='Enables REST API.')
dkato 0:f782d9c66c49 114
dkato 0:f782d9c66c49 115 parser.add_argument('', '--rest-api-port',
dkato 0:f782d9c66c49 116 dest='rest_api_port_no',
dkato 0:f782d9c66c49 117 type=int,
dkato 0:f782d9c66c49 118 help='Sets port for REST API interface')
dkato 0:f782d9c66c49 119
dkato 0:f782d9c66c49 120 return parser
dkato 0:f782d9c66c49 121
dkato 0:f782d9c66c49 122 '''
dkato 0:f782d9c66c49 123 if __name__ == '__main__':
dkato 0:f782d9c66c49 124 # Command line options
dkato 0:f782d9c66c49 125 parser = get_default_test_options_parser()
dkato 0:f782d9c66c49 126
dkato 0:f782d9c66c49 127 parser.description = """This script allows you to run mbed defined test cases for particular MCU(s) and corresponding toolchain(s)."""
dkato 0:f782d9c66c49 128 parser.epilog = """Example: singletest.py -i test_spec.json -M muts_all.json"""
dkato 0:f782d9c66c49 129
dkato 0:f782d9c66c49 130 (opts, args) = parser.parse_args()
dkato 0:f782d9c66c49 131
dkato 0:f782d9c66c49 132 # Print summary / information about automation test status
dkato 0:f782d9c66c49 133 if opts.test_automation_report:
dkato 0:f782d9c66c49 134 print get_avail_tests_summary_table()
dkato 0:f782d9c66c49 135 exit(0)
dkato 0:f782d9c66c49 136
dkato 0:f782d9c66c49 137 # Print summary / information about automation test status
dkato 0:f782d9c66c49 138 if opts.test_case_report:
dkato 0:f782d9c66c49 139 test_case_report_cols = ['id', 'automated', 'description', 'peripherals', 'host_test', 'duration', 'source_dir']
dkato 0:f782d9c66c49 140 print get_avail_tests_summary_table(cols=test_case_report_cols, result_summary=False, join_delim='\n')
dkato 0:f782d9c66c49 141 exit(0)
dkato 0:f782d9c66c49 142
dkato 0:f782d9c66c49 143 # Only prints matrix of supported toolchains
dkato 0:f782d9c66c49 144 if opts.supported_toolchains:
dkato 0:f782d9c66c49 145 print mcu_toolchain_matrix(platform_filter=opts.general_filter_regex)
dkato 0:f782d9c66c49 146 exit(0)
dkato 0:f782d9c66c49 147
dkato 0:f782d9c66c49 148 # Open file with test specification
dkato 0:f782d9c66c49 149 # test_spec_filename tells script which targets and their toolchain(s)
dkato 0:f782d9c66c49 150 # should be covered by the test scenario
dkato 0:f782d9c66c49 151 test_spec = get_json_data_from_file(opts.test_spec_filename) if opts.test_spec_filename else None
dkato 0:f782d9c66c49 152 if test_spec is None:
dkato 0:f782d9c66c49 153 if not opts.test_spec_filename:
dkato 0:f782d9c66c49 154 parser.print_help()
dkato 0:f782d9c66c49 155 exit(-1)
dkato 0:f782d9c66c49 156
dkato 0:f782d9c66c49 157 # Get extra MUTs if applicable
dkato 0:f782d9c66c49 158 MUTs = get_json_data_from_file(opts.muts_spec_filename) if opts.muts_spec_filename else None
dkato 0:f782d9c66c49 159
dkato 0:f782d9c66c49 160 if MUTs is None:
dkato 0:f782d9c66c49 161 if not opts.muts_spec_filename:
dkato 0:f782d9c66c49 162 parser.print_help()
dkato 0:f782d9c66c49 163 exit(-1)
dkato 0:f782d9c66c49 164
dkato 0:f782d9c66c49 165 # Only prints read MUTs configuration
dkato 0:f782d9c66c49 166 if MUTs and opts.verbose_test_configuration_only:
dkato 0:f782d9c66c49 167 print "MUTs configuration in %s:"% opts.muts_spec_filename
dkato 0:f782d9c66c49 168 print print_muts_configuration_from_json(MUTs)
dkato 0:f782d9c66c49 169 print
dkato 0:f782d9c66c49 170 print "Test specification in %s:"% opts.test_spec_filename
dkato 0:f782d9c66c49 171 print print_test_configuration_from_json(test_spec)
dkato 0:f782d9c66c49 172 exit(0)
dkato 0:f782d9c66c49 173
dkato 0:f782d9c66c49 174 # Verbose test specification and MUTs configuration
dkato 0:f782d9c66c49 175 if MUTs and opts.verbose:
dkato 0:f782d9c66c49 176 print print_muts_configuration_from_json(MUTs)
dkato 0:f782d9c66c49 177 if test_spec and opts.verbose:
dkato 0:f782d9c66c49 178 print print_test_configuration_from_json(test_spec)
dkato 0:f782d9c66c49 179
dkato 0:f782d9c66c49 180 if opts.only_build_tests:
dkato 0:f782d9c66c49 181 # We are skipping testing phase, and suppress summary
dkato 0:f782d9c66c49 182 opts.suppress_summary = True
dkato 0:f782d9c66c49 183
dkato 0:f782d9c66c49 184 single_test = SingleTestRunner(_global_loops_count=opts.test_global_loops_value,
dkato 0:f782d9c66c49 185 _test_loops_list=opts.test_loops_list,
dkato 0:f782d9c66c49 186 _muts=MUTs,
dkato 0:f782d9c66c49 187 _test_spec=test_spec,
dkato 0:f782d9c66c49 188 _opts_goanna_for_mbed_sdk=opts.goanna_for_mbed_sdk,
dkato 0:f782d9c66c49 189 _opts_goanna_for_tests=opts.goanna_for_tests,
dkato 0:f782d9c66c49 190 _opts_shuffle_test_order=opts.shuffle_test_order,
dkato 0:f782d9c66c49 191 _opts_shuffle_test_seed=opts.shuffle_test_seed,
dkato 0:f782d9c66c49 192 _opts_test_by_names=opts.test_by_names,
dkato 0:f782d9c66c49 193 _opts_test_only_peripheral=opts.test_only_peripheral,
dkato 0:f782d9c66c49 194 _opts_test_only_common=opts.test_only_common,
dkato 0:f782d9c66c49 195 _opts_verbose_skipped_tests=opts.verbose_skipped_tests,
dkato 0:f782d9c66c49 196 _opts_verbose_test_result_only=opts.verbose_test_result_only,
dkato 0:f782d9c66c49 197 _opts_verbose=opts.verbose,
dkato 0:f782d9c66c49 198 _opts_firmware_global_name=opts.firmware_global_name,
dkato 0:f782d9c66c49 199 _opts_only_build_tests=opts.only_build_tests,
dkato 0:f782d9c66c49 200 _opts_suppress_summary=opts.suppress_summary,
dkato 0:f782d9c66c49 201 _opts_test_x_toolchain_summary=opts.test_x_toolchain_summary,
dkato 0:f782d9c66c49 202 _opts_copy_method=opts.copy_method
dkato 0:f782d9c66c49 203 )
dkato 0:f782d9c66c49 204
dkato 0:f782d9c66c49 205 try:
dkato 0:f782d9c66c49 206 st_exec_thread = SingleTestExecutor(single_test)
dkato 0:f782d9c66c49 207 except KeyboardInterrupt, e:
dkato 0:f782d9c66c49 208 print "\n[CTRL+c] exit"
dkato 0:f782d9c66c49 209 st_exec_thread.start()
dkato 0:f782d9c66c49 210
dkato 0:f782d9c66c49 211 if opts.rest_api_enabled:
dkato 0:f782d9c66c49 212 # Enable REST API
dkato 0:f782d9c66c49 213
dkato 0:f782d9c66c49 214 app = Flask(__name__)
dkato 0:f782d9c66c49 215
dkato 0:f782d9c66c49 216 @app.route('/')
dkato 0:f782d9c66c49 217 def hello_world():
dkato 0:f782d9c66c49 218 return 'Hello World!'
dkato 0:f782d9c66c49 219
dkato 0:f782d9c66c49 220 @app.route('/status')
dkato 0:f782d9c66c49 221 def rest_api_status():
dkato 0:f782d9c66c49 222 return single_test.rest_api_status() # TODO
dkato 0:f782d9c66c49 223
dkato 0:f782d9c66c49 224 @app.route('/config')
dkato 0:f782d9c66c49 225 def rest_api_config():
dkato 0:f782d9c66c49 226 return single_test.rest_api_config() # TODO
dkato 0:f782d9c66c49 227
dkato 0:f782d9c66c49 228 @app.route('/log')
dkato 0:f782d9c66c49 229 def rest_api_log():
dkato 0:f782d9c66c49 230 return single_test.rest_api_log() # TODO
dkato 0:f782d9c66c49 231
dkato 0:f782d9c66c49 232 @app.route('/request/<request_type>') # 'muts', 'test_spec', 'test_results'
dkato 0:f782d9c66c49 233 def rest_api_request_handler(request_type):
dkato 0:f782d9c66c49 234 result = single_test.rest_api_request_handler(request_type) # TODO
dkato 0:f782d9c66c49 235 return result
dkato 0:f782d9c66c49 236
dkato 0:f782d9c66c49 237 rest_api_port = int(opts.rest_api_port_no) if opts.rest_api_port_no else 5555
dkato 0:f782d9c66c49 238 app.debug = False
dkato 0:f782d9c66c49 239 app.run(port=rest_api_port) # Blocking Flask REST API web service
dkato 0:f782d9c66c49 240 else:
dkato 0:f782d9c66c49 241 st_exec_thread.join()
dkato 0:f782d9c66c49 242
dkato 0:f782d9c66c49 243 '''