Example
Dependencies: FXAS21002 FXOS8700Q
simple-mbed-cloud-client/TESTS/host_tests/sdk_host_tests.py@0:11cc2b7889af, 2019-11-19 (annotated)
- Committer:
- maygup01
- Date:
- Tue Nov 19 09:49:38 2019 +0000
- Revision:
- 0:11cc2b7889af
Example
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
maygup01 | 0:11cc2b7889af | 1 | ## ---------------------------------------------------------------------------- |
maygup01 | 0:11cc2b7889af | 2 | ## Copyright 2016-2018 ARM Ltd. |
maygup01 | 0:11cc2b7889af | 3 | ## |
maygup01 | 0:11cc2b7889af | 4 | ## SPDX-License-Identifier: Apache-2.0 |
maygup01 | 0:11cc2b7889af | 5 | ## |
maygup01 | 0:11cc2b7889af | 6 | ## Licensed under the Apache License, Version 2.0 (the "License"); |
maygup01 | 0:11cc2b7889af | 7 | ## you may not use this file except in compliance with the License. |
maygup01 | 0:11cc2b7889af | 8 | ## You may obtain a copy of the License at |
maygup01 | 0:11cc2b7889af | 9 | ## |
maygup01 | 0:11cc2b7889af | 10 | ## http://www.apache.org/licenses/LICENSE-2.0 |
maygup01 | 0:11cc2b7889af | 11 | ## |
maygup01 | 0:11cc2b7889af | 12 | ## Unless required by applicable law or agreed to in writing, software |
maygup01 | 0:11cc2b7889af | 13 | ## distributed under the License is distributed on an "AS IS" BASIS, |
maygup01 | 0:11cc2b7889af | 14 | ## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
maygup01 | 0:11cc2b7889af | 15 | ## See the License for the specific language governing permissions and |
maygup01 | 0:11cc2b7889af | 16 | ## limitations under the License. |
maygup01 | 0:11cc2b7889af | 17 | ## ---------------------------------------------------------------------------- |
maygup01 | 0:11cc2b7889af | 18 | |
maygup01 | 0:11cc2b7889af | 19 | from mbed_host_tests import BaseHostTest |
maygup01 | 0:11cc2b7889af | 20 | from mbed_host_tests.host_tests_logger import HtrunLogger |
maygup01 | 0:11cc2b7889af | 21 | from mbed_cloud.device_directory import DeviceDirectoryAPI |
maygup01 | 0:11cc2b7889af | 22 | from mbed_cloud.connect import ConnectAPI |
maygup01 | 0:11cc2b7889af | 23 | import os |
maygup01 | 0:11cc2b7889af | 24 | import time |
maygup01 | 0:11cc2b7889af | 25 | import subprocess |
maygup01 | 0:11cc2b7889af | 26 | import re |
maygup01 | 0:11cc2b7889af | 27 | import signal |
maygup01 | 0:11cc2b7889af | 28 | |
maygup01 | 0:11cc2b7889af | 29 | DEFAULT_CYCLE_PERIOD = 1.0 |
maygup01 | 0:11cc2b7889af | 30 | |
maygup01 | 0:11cc2b7889af | 31 | class SDKTests(BaseHostTest): |
maygup01 | 0:11cc2b7889af | 32 | __result = None |
maygup01 | 0:11cc2b7889af | 33 | deviceApi = None |
maygup01 | 0:11cc2b7889af | 34 | connectApi = None |
maygup01 | 0:11cc2b7889af | 35 | deviceID = None |
maygup01 | 0:11cc2b7889af | 36 | post_timeout = None |
maygup01 | 0:11cc2b7889af | 37 | firmware_proc = None |
maygup01 | 0:11cc2b7889af | 38 | firmware_sent = False |
maygup01 | 0:11cc2b7889af | 39 | firmware_file = None |
maygup01 | 0:11cc2b7889af | 40 | iteration = 0 |
maygup01 | 0:11cc2b7889af | 41 | boot_cycles = 0 |
maygup01 | 0:11cc2b7889af | 42 | |
maygup01 | 0:11cc2b7889af | 43 | def send_safe(self, key, value): |
maygup01 | 0:11cc2b7889af | 44 | #self.send_kv('dummy_start', 0) |
maygup01 | 0:11cc2b7889af | 45 | self.send_kv(key, value) |
maygup01 | 0:11cc2b7889af | 46 | self.send_kv(key, value) |
maygup01 | 0:11cc2b7889af | 47 | self.send_kv(key, value) |
maygup01 | 0:11cc2b7889af | 48 | self.send_kv(key, value) |
maygup01 | 0:11cc2b7889af | 49 | self.send_kv(key, value) |
maygup01 | 0:11cc2b7889af | 50 | #self.send_kv('dummy_end', 1) |
maygup01 | 0:11cc2b7889af | 51 | |
maygup01 | 0:11cc2b7889af | 52 | def _callback_device_booted(self, key, value, timestamp): |
maygup01 | 0:11cc2b7889af | 53 | # This is used to let the device boot normally |
maygup01 | 0:11cc2b7889af | 54 | self.send_safe('__sync', 0) |
maygup01 | 0:11cc2b7889af | 55 | |
maygup01 | 0:11cc2b7889af | 56 | def _callback_device_ready(self, key, value, timestamp): |
maygup01 | 0:11cc2b7889af | 57 | # Send device iteration number after a reset |
maygup01 | 0:11cc2b7889af | 58 | self.boot_cycles += 1 |
maygup01 | 0:11cc2b7889af | 59 | # Prevent boot loop due to Mbed OS crash |
maygup01 | 0:11cc2b7889af | 60 | if self.boot_cycles <= 5: |
maygup01 | 0:11cc2b7889af | 61 | self.send_safe('iteration', self.iteration) |
maygup01 | 0:11cc2b7889af | 62 | |
maygup01 | 0:11cc2b7889af | 63 | def _callback_test_advance(self, key, value, timestamp): |
maygup01 | 0:11cc2b7889af | 64 | # Advance test sequence |
maygup01 | 0:11cc2b7889af | 65 | self.iteration = self.iteration + 1 |
maygup01 | 0:11cc2b7889af | 66 | self.send_safe('reset', 0) |
maygup01 | 0:11cc2b7889af | 67 | |
maygup01 | 0:11cc2b7889af | 68 | def _callback_test_failed(self, key, value, timestamp): |
maygup01 | 0:11cc2b7889af | 69 | # Test failed. End it. |
maygup01 | 0:11cc2b7889af | 70 | self.notify_complete(False) |
maygup01 | 0:11cc2b7889af | 71 | |
maygup01 | 0:11cc2b7889af | 72 | """ |
maygup01 | 0:11cc2b7889af | 73 | Device Register routines |
maygup01 | 0:11cc2b7889af | 74 | """ |
maygup01 | 0:11cc2b7889af | 75 | def _callback_verify_registration(self, key, value, timestamp): |
maygup01 | 0:11cc2b7889af | 76 | try: |
maygup01 | 0:11cc2b7889af | 77 | #set value for later use |
maygup01 | 0:11cc2b7889af | 78 | self.deviceID = value |
maygup01 | 0:11cc2b7889af | 79 | |
maygup01 | 0:11cc2b7889af | 80 | # Check if device is in Mbed Cloud Device Directory |
maygup01 | 0:11cc2b7889af | 81 | device = self.deviceApi.get_device(value) |
maygup01 | 0:11cc2b7889af | 82 | |
maygup01 | 0:11cc2b7889af | 83 | # Send registraton status to device |
maygup01 | 0:11cc2b7889af | 84 | self.send_safe("registered", 1 if device.state == "registered" else 0) |
maygup01 | 0:11cc2b7889af | 85 | except: |
maygup01 | 0:11cc2b7889af | 86 | # SDK throws an exception if the device is not found (unsuccessful registration) or times out |
maygup01 | 0:11cc2b7889af | 87 | self.send_safe("registered", 0) |
maygup01 | 0:11cc2b7889af | 88 | |
maygup01 | 0:11cc2b7889af | 89 | def _callback_verify_identity(self, key, value, timestamp): |
maygup01 | 0:11cc2b7889af | 90 | # Send true if old DeviceID is the same as current device is |
maygup01 | 0:11cc2b7889af | 91 | self.send_safe("verified", 1 if self.deviceID == value else 0) |
maygup01 | 0:11cc2b7889af | 92 | |
maygup01 | 0:11cc2b7889af | 93 | """ |
maygup01 | 0:11cc2b7889af | 94 | Device Connect routines |
maygup01 | 0:11cc2b7889af | 95 | """ |
maygup01 | 0:11cc2b7889af | 96 | def _callback_verify_lwm2m_get(self, key, value, timestamp): |
maygup01 | 0:11cc2b7889af | 97 | timeout = 0 |
maygup01 | 0:11cc2b7889af | 98 | |
maygup01 | 0:11cc2b7889af | 99 | # Get resource value from device |
maygup01 | 0:11cc2b7889af | 100 | async_response = self.connectApi.get_resource_value_async(self.deviceID, value) |
maygup01 | 0:11cc2b7889af | 101 | |
maygup01 | 0:11cc2b7889af | 102 | # Set a 30 second timeout here. |
maygup01 | 0:11cc2b7889af | 103 | while not async_response.is_done and timeout <= 50: |
maygup01 | 0:11cc2b7889af | 104 | time.sleep(0.1) |
maygup01 | 0:11cc2b7889af | 105 | timeout += 1 |
maygup01 | 0:11cc2b7889af | 106 | |
maygup01 | 0:11cc2b7889af | 107 | if not async_response.is_done: |
maygup01 | 0:11cc2b7889af | 108 | # Kick the REST API |
maygup01 | 0:11cc2b7889af | 109 | timeout = 0 |
maygup01 | 0:11cc2b7889af | 110 | async_response = self.connectApi.get_resource_value_async(self.deviceID, value) |
maygup01 | 0:11cc2b7889af | 111 | while not async_response.is_done and timeout <= 250: |
maygup01 | 0:11cc2b7889af | 112 | time.sleep(0.1) |
maygup01 | 0:11cc2b7889af | 113 | timeout += 1 |
maygup01 | 0:11cc2b7889af | 114 | |
maygup01 | 0:11cc2b7889af | 115 | if async_response.is_done: |
maygup01 | 0:11cc2b7889af | 116 | # Send resource value back to device |
maygup01 | 0:11cc2b7889af | 117 | self.send_safe("get_value", async_response.value) |
maygup01 | 0:11cc2b7889af | 118 | else: |
maygup01 | 0:11cc2b7889af | 119 | # Request timed out. |
maygup01 | 0:11cc2b7889af | 120 | self.send_safe("timeout", 0) |
maygup01 | 0:11cc2b7889af | 121 | |
maygup01 | 0:11cc2b7889af | 122 | def _callback_verify_lwm2m_set(self, key, value, timestamp): |
maygup01 | 0:11cc2b7889af | 123 | timeout = 0 |
maygup01 | 0:11cc2b7889af | 124 | |
maygup01 | 0:11cc2b7889af | 125 | # Get resource value from device |
maygup01 | 0:11cc2b7889af | 126 | async_response = self.connectApi.get_resource_value_async(self.deviceID, value) |
maygup01 | 0:11cc2b7889af | 127 | |
maygup01 | 0:11cc2b7889af | 128 | # Set a 30 second timeout here. |
maygup01 | 0:11cc2b7889af | 129 | while not async_response.is_done and timeout <= 300: |
maygup01 | 0:11cc2b7889af | 130 | time.sleep(0.1) |
maygup01 | 0:11cc2b7889af | 131 | timeout += 1 |
maygup01 | 0:11cc2b7889af | 132 | |
maygup01 | 0:11cc2b7889af | 133 | if async_response.is_done: |
maygup01 | 0:11cc2b7889af | 134 | # Send resource value back to device |
maygup01 | 0:11cc2b7889af | 135 | self.send_safe("set_value", async_response.value) |
maygup01 | 0:11cc2b7889af | 136 | else: |
maygup01 | 0:11cc2b7889af | 137 | # Request timed out. |
maygup01 | 0:11cc2b7889af | 138 | self.send_safe("timeout", 0) |
maygup01 | 0:11cc2b7889af | 139 | |
maygup01 | 0:11cc2b7889af | 140 | def _callback_verify_lwm2m_put(self, key, value, timestamp): |
maygup01 | 0:11cc2b7889af | 141 | timeout = 0 |
maygup01 | 0:11cc2b7889af | 142 | |
maygup01 | 0:11cc2b7889af | 143 | # Get resource value from device and increment it |
maygup01 | 0:11cc2b7889af | 144 | resource_value = self.connectApi.get_resource_value_async(self.deviceID, value) |
maygup01 | 0:11cc2b7889af | 145 | |
maygup01 | 0:11cc2b7889af | 146 | # Set a 30 second timeout here. |
maygup01 | 0:11cc2b7889af | 147 | while not resource_value.is_done and timeout <= 300: |
maygup01 | 0:11cc2b7889af | 148 | time.sleep(0.1) |
maygup01 | 0:11cc2b7889af | 149 | timeout += 1 |
maygup01 | 0:11cc2b7889af | 150 | |
maygup01 | 0:11cc2b7889af | 151 | if not resource_value.is_done: |
maygup01 | 0:11cc2b7889af | 152 | self.send_safe("timeout", 0) |
maygup01 | 0:11cc2b7889af | 153 | return |
maygup01 | 0:11cc2b7889af | 154 | |
maygup01 | 0:11cc2b7889af | 155 | updated_value = int(resource_value.value) + 5 |
maygup01 | 0:11cc2b7889af | 156 | |
maygup01 | 0:11cc2b7889af | 157 | # Set new resource value from cloud |
maygup01 | 0:11cc2b7889af | 158 | async_response = self.connectApi.set_resource_value_async(self.deviceID, value, updated_value) |
maygup01 | 0:11cc2b7889af | 159 | |
maygup01 | 0:11cc2b7889af | 160 | # Set a 30 second timeout here. |
maygup01 | 0:11cc2b7889af | 161 | while not async_response.is_done and timeout <= 300: |
maygup01 | 0:11cc2b7889af | 162 | time.sleep(0.1) |
maygup01 | 0:11cc2b7889af | 163 | timeout += 1 |
maygup01 | 0:11cc2b7889af | 164 | |
maygup01 | 0:11cc2b7889af | 165 | if not async_response.is_done: |
maygup01 | 0:11cc2b7889af | 166 | self.send_safe("timeout", 0) |
maygup01 | 0:11cc2b7889af | 167 | else: |
maygup01 | 0:11cc2b7889af | 168 | # Send new resource value to device for verification. |
maygup01 | 0:11cc2b7889af | 169 | self.send_safe("res_set", updated_value); |
maygup01 | 0:11cc2b7889af | 170 | |
maygup01 | 0:11cc2b7889af | 171 | def _callback_verify_lwm2m_post(self, key, value, timestamp): |
maygup01 | 0:11cc2b7889af | 172 | timeout = 0 |
maygup01 | 0:11cc2b7889af | 173 | |
maygup01 | 0:11cc2b7889af | 174 | # Execute POST function on device |
maygup01 | 0:11cc2b7889af | 175 | resource_value = self.connectApi.execute_resource_async(self.deviceID, value) |
maygup01 | 0:11cc2b7889af | 176 | |
maygup01 | 0:11cc2b7889af | 177 | # Set a 30 second timeout here. |
maygup01 | 0:11cc2b7889af | 178 | while not resource_value.is_done and timeout <= 300: |
maygup01 | 0:11cc2b7889af | 179 | time.sleep(0.1) |
maygup01 | 0:11cc2b7889af | 180 | timeout += 1 |
maygup01 | 0:11cc2b7889af | 181 | |
maygup01 | 0:11cc2b7889af | 182 | if not resource_value.is_done: |
maygup01 | 0:11cc2b7889af | 183 | self.send_safe("timeout", 0) |
maygup01 | 0:11cc2b7889af | 184 | self.post_timeout = 1 |
maygup01 | 0:11cc2b7889af | 185 | |
maygup01 | 0:11cc2b7889af | 186 | def _callback_verify_lwm2m_post_result(self, key, value, timestamp): |
maygup01 | 0:11cc2b7889af | 187 | |
maygup01 | 0:11cc2b7889af | 188 | # Called from callback function on device, POST function working as expected. |
maygup01 | 0:11cc2b7889af | 189 | # If post_timeout is not none, the request took longer than 30 seconds, which is |
maygup01 | 0:11cc2b7889af | 190 | # a failure. Don't send this value. |
maygup01 | 0:11cc2b7889af | 191 | if not self.post_timeout: |
maygup01 | 0:11cc2b7889af | 192 | self.send_safe("post_test_executed", 0) |
maygup01 | 0:11cc2b7889af | 193 | |
maygup01 | 0:11cc2b7889af | 194 | """ |
maygup01 | 0:11cc2b7889af | 195 | Device Firmware update routines |
maygup01 | 0:11cc2b7889af | 196 | """ |
maygup01 | 0:11cc2b7889af | 197 | def firmware_campaign_cleanup(self): |
maygup01 | 0:11cc2b7889af | 198 | if self.firmware_proc: |
maygup01 | 0:11cc2b7889af | 199 | if os.name == 'nt': |
maygup01 | 0:11cc2b7889af | 200 | os.kill(self.firmware_proc.pid, signal.CTRL_C_EVENT) |
maygup01 | 0:11cc2b7889af | 201 | os.kill(self.firmware_proc.pid, signal.CTRL_BREAK_EVENT) |
maygup01 | 0:11cc2b7889af | 202 | self.firmware_proc.terminate() |
maygup01 | 0:11cc2b7889af | 203 | outs, errs = self.firmware_proc.communicate() |
maygup01 | 0:11cc2b7889af | 204 | self.logger.prn_inf('Firmware campaign process killed: PID %s' % self.firmware_proc.pid) |
maygup01 | 0:11cc2b7889af | 205 | self.firmware_proc = None |
maygup01 | 0:11cc2b7889af | 206 | |
maygup01 | 0:11cc2b7889af | 207 | try: |
maygup01 | 0:11cc2b7889af | 208 | time.sleep(1) # let the manifest-tool sub-process die gracefully |
maygup01 | 0:11cc2b7889af | 209 | if self.firmware_file: |
maygup01 | 0:11cc2b7889af | 210 | os.remove(self.firmware_file) |
maygup01 | 0:11cc2b7889af | 211 | self.firmware_file = None |
maygup01 | 0:11cc2b7889af | 212 | except Exception, e: |
maygup01 | 0:11cc2b7889af | 213 | pass |
maygup01 | 0:11cc2b7889af | 214 | |
maygup01 | 0:11cc2b7889af | 215 | def _callback_firmware_ready(self, key, value, timestamp): |
maygup01 | 0:11cc2b7889af | 216 | if self.firmware_sent: |
maygup01 | 0:11cc2b7889af | 217 | # Firmware was sent, but wasn't applied if this callback is called |
maygup01 | 0:11cc2b7889af | 218 | self.firmware_campaign_cleanup() |
maygup01 | 0:11cc2b7889af | 219 | self.notify_complete(False) |
maygup01 | 0:11cc2b7889af | 220 | else: |
maygup01 | 0:11cc2b7889af | 221 | # Send device iteration number after a reset |
maygup01 | 0:11cc2b7889af | 222 | self.send_safe('iteration', self.iteration) |
maygup01 | 0:11cc2b7889af | 223 | |
maygup01 | 0:11cc2b7889af | 224 | def _callback_firmware_prepare(self, key, value, timestamp): |
maygup01 | 0:11cc2b7889af | 225 | if not self.deviceID: |
maygup01 | 0:11cc2b7889af | 226 | self.logger.prn_err("ERROR: No DeviceID") |
maygup01 | 0:11cc2b7889af | 227 | self.notify_complete(False) |
maygup01 | 0:11cc2b7889af | 228 | return -1 |
maygup01 | 0:11cc2b7889af | 229 | |
maygup01 | 0:11cc2b7889af | 230 | target = self.get_config_item('platform_name') |
maygup01 | 0:11cc2b7889af | 231 | image = self.get_config_item('image_path') |
maygup01 | 0:11cc2b7889af | 232 | update_image = re.sub(r'(.+)\.([a-z0-9]+)$', r'\1_update.bin', image if image else "") |
maygup01 | 0:11cc2b7889af | 233 | if not image or not os.path.exists(update_image): |
maygup01 | 0:11cc2b7889af | 234 | self.logger.prn_err("ERROR: No main or update image") |
maygup01 | 0:11cc2b7889af | 235 | self.notify_complete(False) |
maygup01 | 0:11cc2b7889af | 236 | return -1 |
maygup01 | 0:11cc2b7889af | 237 | self.logger.prn_inf('Found FW update image: "%s"' % update_image) |
maygup01 | 0:11cc2b7889af | 238 | |
maygup01 | 0:11cc2b7889af | 239 | try: |
maygup01 | 0:11cc2b7889af | 240 | # Open the firmware update image as provided by the build system |
maygup01 | 0:11cc2b7889af | 241 | with open(update_image, 'rb') as f: |
maygup01 | 0:11cc2b7889af | 242 | raw = f.read() |
maygup01 | 0:11cc2b7889af | 243 | # Modify the initial "spdmc_ready_chk" sequence into "firmware_update" |
maygup01 | 0:11cc2b7889af | 244 | # (matching the string length) as an indication that the firmware was changed/updated |
maygup01 | 0:11cc2b7889af | 245 | raw = re.sub(r'spdmc_ready_chk', r'firmware_update', raw) |
maygup01 | 0:11cc2b7889af | 246 | |
maygup01 | 0:11cc2b7889af | 247 | # Save the firmware into a temp place. Manifest tool has issues handling very long paths even if -n is specified |
maygup01 | 0:11cc2b7889af | 248 | update_mod_image = ".%s.%s.%s" % (target, re.sub(r'.*[\\/](.+)\.([a-z0-9]+)$', r'\1_update_mod.\2', image), time.time()) |
maygup01 | 0:11cc2b7889af | 249 | with open(update_mod_image, 'wb') as f: |
maygup01 | 0:11cc2b7889af | 250 | f.write(raw) |
maygup01 | 0:11cc2b7889af | 251 | except Exception, e: |
maygup01 | 0:11cc2b7889af | 252 | self.logger.prn_err("ERROR: While preparing modified image") |
maygup01 | 0:11cc2b7889af | 253 | self.notify_complete(False) |
maygup01 | 0:11cc2b7889af | 254 | return -1 |
maygup01 | 0:11cc2b7889af | 255 | self.logger.prn_inf('Modified FW update image: "%s"' % update_mod_image) |
maygup01 | 0:11cc2b7889af | 256 | |
maygup01 | 0:11cc2b7889af | 257 | # Use non-blocking call, but remember the process, so we can kill it later |
maygup01 | 0:11cc2b7889af | 258 | try: |
maygup01 | 0:11cc2b7889af | 259 | spargs = dict() |
maygup01 | 0:11cc2b7889af | 260 | if os.name == 'posix': |
maygup01 | 0:11cc2b7889af | 261 | spargs['preexec_fn'] = os.setpgrp |
maygup01 | 0:11cc2b7889af | 262 | elif os.name == 'nt': |
maygup01 | 0:11cc2b7889af | 263 | spargs['creationflags'] = subprocess.CREATE_NEW_PROCESS_GROUP |
maygup01 | 0:11cc2b7889af | 264 | self.firmware_proc = subprocess.Popen(["mbed", "dm", "update", "device", "-p", update_mod_image, "-D", self.deviceID], stderr=subprocess.STDOUT, **spargs) |
maygup01 | 0:11cc2b7889af | 265 | self.firmware_file = update_mod_image |
maygup01 | 0:11cc2b7889af | 266 | except Exception, e: |
maygup01 | 0:11cc2b7889af | 267 | self.logger.prn_err("ERROR: Unable to execute 'mbed dm' sub-command") |
maygup01 | 0:11cc2b7889af | 268 | self.firmware_campaign_cleanup() |
maygup01 | 0:11cc2b7889af | 269 | self.notify_complete(False) |
maygup01 | 0:11cc2b7889af | 270 | return -1 |
maygup01 | 0:11cc2b7889af | 271 | |
maygup01 | 0:11cc2b7889af | 272 | # At this point the firmware should be on it's way to the device |
maygup01 | 0:11cc2b7889af | 273 | self.firmware_sent = True |
maygup01 | 0:11cc2b7889af | 274 | self.send_safe('firmware_sent', 1) |
maygup01 | 0:11cc2b7889af | 275 | self.logger.prn_inf("Firmware sent and update campaign started. Check for download progress.") |
maygup01 | 0:11cc2b7889af | 276 | |
maygup01 | 0:11cc2b7889af | 277 | def _callback_firmware_update(self, key, value, timestamp): |
maygup01 | 0:11cc2b7889af | 278 | self.logger.prn_inf("Firmware successfully updated!") |
maygup01 | 0:11cc2b7889af | 279 | self.firmware_campaign_cleanup() |
maygup01 | 0:11cc2b7889af | 280 | self.iteration = self.iteration + 1 |
maygup01 | 0:11cc2b7889af | 281 | self.send_safe('iteration', self.iteration) |
maygup01 | 0:11cc2b7889af | 282 | |
maygup01 | 0:11cc2b7889af | 283 | |
maygup01 | 0:11cc2b7889af | 284 | """ |
maygup01 | 0:11cc2b7889af | 285 | Host setup routines |
maygup01 | 0:11cc2b7889af | 286 | """ |
maygup01 | 0:11cc2b7889af | 287 | def setup(self): |
maygup01 | 0:11cc2b7889af | 288 | # Generic test routines |
maygup01 | 0:11cc2b7889af | 289 | self.register_callback('device_booted', self._callback_device_booted) |
maygup01 | 0:11cc2b7889af | 290 | self.register_callback('device_ready', self._callback_device_ready) |
maygup01 | 0:11cc2b7889af | 291 | self.register_callback('test_advance', self._callback_test_advance) |
maygup01 | 0:11cc2b7889af | 292 | self.register_callback('test_failed', self._callback_test_failed) |
maygup01 | 0:11cc2b7889af | 293 | |
maygup01 | 0:11cc2b7889af | 294 | # Callbacks from device registration tests |
maygup01 | 0:11cc2b7889af | 295 | self.register_callback('verify_registration', self._callback_verify_registration) |
maygup01 | 0:11cc2b7889af | 296 | self.register_callback('verify_identity', self._callback_verify_identity) |
maygup01 | 0:11cc2b7889af | 297 | |
maygup01 | 0:11cc2b7889af | 298 | # Callbacks from LWM2M tests |
maygup01 | 0:11cc2b7889af | 299 | self.register_callback('verify_lwm2m_get_test', self._callback_verify_lwm2m_get) |
maygup01 | 0:11cc2b7889af | 300 | self.register_callback('verify_lwm2m_set_test', self._callback_verify_lwm2m_set) |
maygup01 | 0:11cc2b7889af | 301 | self.register_callback('verify_lwm2m_put_test', self._callback_verify_lwm2m_put) |
maygup01 | 0:11cc2b7889af | 302 | self.register_callback('verify_lwm2m_post_test', self._callback_verify_lwm2m_post) |
maygup01 | 0:11cc2b7889af | 303 | self.register_callback('verify_lwm2m_post_test_result', self._callback_verify_lwm2m_post_result) |
maygup01 | 0:11cc2b7889af | 304 | |
maygup01 | 0:11cc2b7889af | 305 | # Callbacks from FW update tests |
maygup01 | 0:11cc2b7889af | 306 | self.register_callback('spdmc_ready_chk', self._callback_firmware_ready) |
maygup01 | 0:11cc2b7889af | 307 | self.register_callback('firmware_prepare', self._callback_firmware_prepare) |
maygup01 | 0:11cc2b7889af | 308 | self.register_callback('firmware_update', self._callback_firmware_update) |
maygup01 | 0:11cc2b7889af | 309 | |
maygup01 | 0:11cc2b7889af | 310 | # Setup API config |
maygup01 | 0:11cc2b7889af | 311 | try: |
maygup01 | 0:11cc2b7889af | 312 | result = subprocess.check_output(["mbed", "config", "--list"], stderr=subprocess.STDOUT) |
maygup01 | 0:11cc2b7889af | 313 | except Exception, e: |
maygup01 | 0:11cc2b7889af | 314 | self.logger.prn_err("ERROR: CLOUD_SDK_API_KEY global config is not set: " + str(e)) |
maygup01 | 0:11cc2b7889af | 315 | return -1 |
maygup01 | 0:11cc2b7889af | 316 | |
maygup01 | 0:11cc2b7889af | 317 | match = re.search(r'CLOUD_SDK_API_KEY=(.*)\n', result) |
maygup01 | 0:11cc2b7889af | 318 | if match == None: |
maygup01 | 0:11cc2b7889af | 319 | self.logger.prn_err("ERROR: CLOUD_SDK_API_KEY global config is not set.") |
maygup01 | 0:11cc2b7889af | 320 | return -1 |
maygup01 | 0:11cc2b7889af | 321 | |
maygup01 | 0:11cc2b7889af | 322 | api_key_val = match.group(1).strip() |
maygup01 | 0:11cc2b7889af | 323 | |
maygup01 | 0:11cc2b7889af | 324 | # Get API KEY and remove LF char if included |
maygup01 | 0:11cc2b7889af | 325 | self.logger.prn_inf("CLOUD_SDK_API_KEY: " + api_key_val) |
maygup01 | 0:11cc2b7889af | 326 | |
maygup01 | 0:11cc2b7889af | 327 | api_config = {"api_key" : api_key_val, "host" : "https://api.us-east-1.mbedcloud.com"} |
maygup01 | 0:11cc2b7889af | 328 | |
maygup01 | 0:11cc2b7889af | 329 | self.iteration = 0 |
maygup01 | 0:11cc2b7889af | 330 | self.boot_cycles = 0 |
maygup01 | 0:11cc2b7889af | 331 | |
maygup01 | 0:11cc2b7889af | 332 | # Instantiate Device and Connect API |
maygup01 | 0:11cc2b7889af | 333 | self.deviceApi = DeviceDirectoryAPI(api_config) |
maygup01 | 0:11cc2b7889af | 334 | self.connectApi = ConnectAPI(api_config) |
maygup01 | 0:11cc2b7889af | 335 | |
maygup01 | 0:11cc2b7889af | 336 | def result(self): |
maygup01 | 0:11cc2b7889af | 337 | return self.__result |
maygup01 | 0:11cc2b7889af | 338 | |
maygup01 | 0:11cc2b7889af | 339 | def teardown(self): |
maygup01 | 0:11cc2b7889af | 340 | # Delete device from directory so as not to hit device allocation quota. |
maygup01 | 0:11cc2b7889af | 341 | if self.deviceID: |
maygup01 | 0:11cc2b7889af | 342 | self.deviceApi.delete_device(self.deviceID) |
maygup01 | 0:11cc2b7889af | 343 | self.firmware_campaign_cleanup() |
maygup01 | 0:11cc2b7889af | 344 | |
maygup01 | 0:11cc2b7889af | 345 | pass |
maygup01 | 0:11cc2b7889af | 346 | |
maygup01 | 0:11cc2b7889af | 347 | def __init__(self): |
maygup01 | 0:11cc2b7889af | 348 | super(SDKTests, self).__init__() |
maygup01 | 0:11cc2b7889af | 349 | self.logger = HtrunLogger('TEST') |