mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			Adding timing drift host test
							parent
							
								
									6e223e311c
								
							
						
					
					
						commit
						f6c60d07ac
					
				| 
						 | 
				
			
			@ -0,0 +1,106 @@
 | 
			
		|||
"""
 | 
			
		||||
mbed SDK
 | 
			
		||||
Copyright (c) 2011-2013 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 mbed_host_tests import BaseHostTest
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TimingDriftTest(BaseHostTest):
 | 
			
		||||
    """ This test is reading single characters from stdio
 | 
			
		||||
        and measures time between their occurrences.
 | 
			
		||||
    """
 | 
			
		||||
    __result = None
 | 
			
		||||
    
 | 
			
		||||
    # This is calculated later: average_drift_max * number of tick events
 | 
			
		||||
    total_drift_max = None
 | 
			
		||||
    
 | 
			
		||||
    average_drift_max = 0.05
 | 
			
		||||
    ticks = []
 | 
			
		||||
    start_time = None
 | 
			
		||||
    finish_time = None
 | 
			
		||||
    dut_seconds_passed = None
 | 
			
		||||
    total_time = None
 | 
			
		||||
    total_drift = None
 | 
			
		||||
    average_drift = None
 | 
			
		||||
    
 | 
			
		||||
    def _callback_result(self, key, value, timestamp):
 | 
			
		||||
        # We should not see result data in this test
 | 
			
		||||
        self.__result = False
 | 
			
		||||
 | 
			
		||||
    def _callback_end(self, key, value, timestamp):
 | 
			
		||||
        """ {{end;%s}}} """
 | 
			
		||||
        self.log("Received end event, timestamp: %f" % timestamp)
 | 
			
		||||
        self.notify_complete(result=self.result(print_stats=True))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def _callback_tick(self, key, value, timestamp):
 | 
			
		||||
        """ {{tick;%d}}} """
 | 
			
		||||
        self.log("tick! %f" % timestamp)
 | 
			
		||||
        self.ticks.append((key, value, timestamp))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def setup(self):
 | 
			
		||||
        self.register_callback("end", self._callback_end)
 | 
			
		||||
        self.register_callback('tick', self._callback_tick)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def result(self, print_stats=True):        
 | 
			
		||||
        self.dut_seconds_passed = len(self.ticks) - 1
 | 
			
		||||
        
 | 
			
		||||
        if self.dut_seconds_passed < 1:
 | 
			
		||||
            if print_stats:
 | 
			
		||||
                self.log("FAIL: failed to receive at least two tick events")
 | 
			
		||||
            self.__result = False
 | 
			
		||||
            return self.__result
 | 
			
		||||
 | 
			
		||||
        self.total_drift_max = self.dut_seconds_passed * self.average_drift_max
 | 
			
		||||
 | 
			
		||||
        self.start_time = self.ticks[0][2]
 | 
			
		||||
        self.finish_time = self.ticks[-1][2]
 | 
			
		||||
        self.total_time = self.finish_time - self.start_time
 | 
			
		||||
        self.total_drift = self.total_time - self.dut_seconds_passed
 | 
			
		||||
        self.average_drift = self.total_drift / self.dut_seconds_passed
 | 
			
		||||
        
 | 
			
		||||
        if print_stats:
 | 
			
		||||
            self.log("Start: %f" % self.start_time)
 | 
			
		||||
            self.log("Finish: %f" % self.finish_time)
 | 
			
		||||
            self.log("Total time taken: %f" % self.total_time)
 | 
			
		||||
        
 | 
			
		||||
            total_drift_ratio_string = "Total drift/Max total drift: %f/%f"
 | 
			
		||||
            self.log(total_drift_ratio_string % (self.total_drift,
 | 
			
		||||
                                                 self.total_drift_max))
 | 
			
		||||
                                                 
 | 
			
		||||
            average_drift_ratio_string = "Average drift/Max average drift: %f/%f"
 | 
			
		||||
            self.log(average_drift_ratio_string % (self.average_drift,
 | 
			
		||||
                                                   self.average_drift_max))
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        if self.total_drift > self.total_drift_max:
 | 
			
		||||
            if print_stats:
 | 
			
		||||
                self.log("FAIL: Total drift exceeded max total drift")
 | 
			
		||||
            self.__result = False
 | 
			
		||||
        elif self.average_drift > self.average_drift_max:
 | 
			
		||||
            if print_stats:
 | 
			
		||||
                self.log("FAIL: Average drift exceeded max average drift")
 | 
			
		||||
            self.__result = False
 | 
			
		||||
        else:
 | 
			
		||||
            self.__result = True
 | 
			
		||||
        
 | 
			
		||||
        return self.__result
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def teardown(self):
 | 
			
		||||
        pass
 | 
			
		||||
		Loading…
	
		Reference in New Issue