mbed-os/features/filesystem/littlefs/TESTS/host_tests/unexpected_reset.py

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