mirror of https://github.com/ARMmbed/mbed-os.git
104 lines
3.1 KiB
Python
104 lines
3.1 KiB
Python
"""
|
|
mbed SDK
|
|
Copyright (c) 2017-2017 ARM Limited
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
"""
|
|
from __future__ import print_function
|
|
|
|
from mbed_host_tests import BaseHostTest
|
|
from time import sleep
|
|
|
|
|
|
class UnexpectedResetTest(BaseHostTest):
|
|
"""This test checks that a device's RTC keeps count through a reset
|
|
|
|
It does this by setting the RTC's time, triggering a reset,
|
|
delaying and then reading the RTC's time again to ensure
|
|
that the RTC is still counting.
|
|
"""
|
|
|
|
"""Number of times to reset the device in this test"""
|
|
RESET_COUNT = 20
|
|
RESET_DELAY_BASE = 1.0
|
|
RESET_DELAY_INC = 0.02
|
|
VALUE_PLACEHOLDER = "0"
|
|
|
|
def setup(self):
|
|
"""Register callbacks required for the test"""
|
|
self._error = False
|
|
generator = self.unexpected_reset_test()
|
|
generator.next()
|
|
|
|
def run_gen(key, value, time):
|
|
"""Run the generator, and fail testing if the iterator stops"""
|
|
if self._error:
|
|
return
|
|
try:
|
|
generator.send((key, value, time))
|
|
except StopIteration:
|
|
self._error = True
|
|
|
|
for resp in ("start", "read", "format_done", "reset_complete"):
|
|
self.register_callback(resp, run_gen)
|
|
|
|
def teardown(self):
|
|
"""No work to do here"""
|
|
pass
|
|
|
|
def unexpected_reset_test(self):
|
|
"""Generator for running the reset test
|
|
|
|
This function calls yield to wait for the next event from
|
|
the device. If the device gives the wrong response, then the
|
|
generator terminates by returing which raises a StopIteration
|
|
exception and fails the test.
|
|
"""
|
|
|
|
# Wait for start token
|
|
key, value, time = yield
|
|
if key != "start":
|
|
return
|
|
|
|
# Format the device before starting the test
|
|
self.send_kv("format", self.VALUE_PLACEHOLDER)
|
|
key, value, time = yield
|
|
if key != "format_done":
|
|
return
|
|
|
|
for i in range(self.RESET_COUNT):
|
|
|
|
self.send_kv("run", self.VALUE_PLACEHOLDER)
|
|
sleep(self.RESET_DELAY_BASE + self.RESET_DELAY_INC * i)
|
|
|
|
self.reset()
|
|
|
|
# Wait for start token
|
|
key, value, time = yield
|
|
self.log("Key from yield: %s" % key)
|
|
if key != "reset_complete":
|
|
return
|
|
|
|
|
|
self.send_kv("__sync", "00000000-0000-000000000-000000000000")
|
|
|
|
# Wait for start token
|
|
key, value, time = yield
|
|
if key != "start":
|
|
return
|
|
|
|
self.send_kv("exit", "pass")
|
|
|
|
yield # No more events expected
|
|
|