mirror of
				https://github.com/ARM-software/workload-automation.git
				synced 2025-10-30 22:54:18 +00:00 
			
		
		
		
	Exec Control: Copied to WA3 and now uses default environment.
Moved execution decorators from wlauto to wa. Modified to use a default environment if none is explicitly specified.
This commit is contained in:
		
							
								
								
									
										269
									
								
								wa/tests/test_exec_control.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										269
									
								
								wa/tests/test_exec_control.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,269 @@ | |||||||
|  | #    Copyright 2013-2015 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. | ||||||
|  | # | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # pylint: disable=W0231,W0613,E0611,W0603,R0201 | ||||||
|  | from unittest import TestCase | ||||||
|  |  | ||||||
|  | from nose.tools import assert_equal, assert_raises | ||||||
|  |  | ||||||
|  | from wlauto.utils.exec_control import (init_environment, reset_environment, | ||||||
|  |                                               activate_environment, once, | ||||||
|  |                                               once_per_class, once_per_instance) | ||||||
|  |  | ||||||
|  | class TestClass(object): | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         self.count = 0 | ||||||
|  |  | ||||||
|  |     @once | ||||||
|  |     def initilize_once(self): | ||||||
|  |         self.count += 1 | ||||||
|  |  | ||||||
|  |     @once_per_class | ||||||
|  |     def initilize_once_per_class(self): | ||||||
|  |         self.count += 1 | ||||||
|  |  | ||||||
|  |     @once_per_instance | ||||||
|  |     def initilize_once_per_instance(self): | ||||||
|  |         self.count += 1 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class SubClass(TestClass): | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         super(SubClass, self).__init__() | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class SubSubClass(SubClass): | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         super(SubSubClass, self).__init__() | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class AnotherClass(object): | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         self.count = 0 | ||||||
|  |  | ||||||
|  |     @once | ||||||
|  |     def initilize_once(self): | ||||||
|  |         self.count += 1 | ||||||
|  |  | ||||||
|  |     @once_per_class | ||||||
|  |     def initilize_once_per_class(self): | ||||||
|  |         self.count += 1 | ||||||
|  |  | ||||||
|  |     @once_per_instance | ||||||
|  |     def initilize_once_per_instance(self): | ||||||
|  |         self.count += 1 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class EnvironmentManagementTest(TestCase): | ||||||
|  |  | ||||||
|  |     def test_duplicate_environment(self): | ||||||
|  |         init_environment('ENVIRONMENT') | ||||||
|  |         assert_raises(ValueError, init_environment, 'ENVIRONMENT') | ||||||
|  |  | ||||||
|  |     def test_reset_missing_environment(self): | ||||||
|  |         assert_raises(ValueError, reset_environment, 'MISSING') | ||||||
|  |  | ||||||
|  |     def test_reset_current_environment(self): | ||||||
|  |         activate_environment('CURRENT_ENVIRONMENT') | ||||||
|  |         t1 = TestClass() | ||||||
|  |         t1.initilize_once() | ||||||
|  |         assert_equal(t1.count, 1) | ||||||
|  |  | ||||||
|  |         reset_environment() | ||||||
|  |         t1.initilize_once() | ||||||
|  |         assert_equal(t1.count, 2) | ||||||
|  |  | ||||||
|  |     def test_switch_environment(self): | ||||||
|  |         activate_environment('ENVIRONMENT1') | ||||||
|  |         t1 = TestClass() | ||||||
|  |         t1.initilize_once() | ||||||
|  |         assert_equal(t1.count, 1) | ||||||
|  |  | ||||||
|  |         activate_environment('ENVIRONMENT2') | ||||||
|  |         t1.initilize_once() | ||||||
|  |         assert_equal(t1.count, 2) | ||||||
|  |  | ||||||
|  |         activate_environment('ENVIRONMENT1') | ||||||
|  |         t1.initilize_once() | ||||||
|  |         assert_equal(t1.count, 2) | ||||||
|  |  | ||||||
|  |     def test_reset_environment_name(self): | ||||||
|  |         activate_environment('ENVIRONMENT') | ||||||
|  |         t1 = TestClass() | ||||||
|  |         t1.initilize_once() | ||||||
|  |         assert_equal(t1.count, 1) | ||||||
|  |  | ||||||
|  |         reset_environment('ENVIRONMENT') | ||||||
|  |         t1.initilize_once() | ||||||
|  |         assert_equal(t1.count, 2) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class OnlyOnceEnvironmentTest(TestCase): | ||||||
|  |  | ||||||
|  |     def setUp(self): | ||||||
|  |         activate_environment('TEST_ENVIRONMENT') | ||||||
|  |  | ||||||
|  |     def tearDown(self): | ||||||
|  |         reset_environment('TEST_ENVIRONMENT') | ||||||
|  |  | ||||||
|  |     def test_single_instance(self): | ||||||
|  |         t1 = TestClass() | ||||||
|  |         ac = AnotherClass() | ||||||
|  |  | ||||||
|  |         t1.initilize_once() | ||||||
|  |         assert_equal(t1.count, 1) | ||||||
|  |  | ||||||
|  |         t1.initilize_once() | ||||||
|  |         assert_equal(t1.count, 1) | ||||||
|  |  | ||||||
|  |         ac.initilize_once() | ||||||
|  |         assert_equal(ac.count, 1) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     def test_mulitple_instances(self): | ||||||
|  |         t1 = TestClass() | ||||||
|  |         t2 = TestClass() | ||||||
|  |  | ||||||
|  |         t1.initilize_once() | ||||||
|  |         assert_equal(t1.count, 1) | ||||||
|  |  | ||||||
|  |         t2.initilize_once() | ||||||
|  |         assert_equal(t2.count, 0) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     def test_sub_classes(self): | ||||||
|  |         t1 = TestClass() | ||||||
|  |         sc = SubClass() | ||||||
|  |         ss = SubSubClass() | ||||||
|  |  | ||||||
|  |         t1.initilize_once() | ||||||
|  |         assert_equal(t1.count, 1) | ||||||
|  |  | ||||||
|  |         sc.initilize_once() | ||||||
|  |         sc.initilize_once() | ||||||
|  |         assert_equal(sc.count, 0) | ||||||
|  |  | ||||||
|  |         ss.initilize_once() | ||||||
|  |         ss.initilize_once() | ||||||
|  |         assert_equal(ss.count, 0) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class OncePerClassEnvironmentTest(TestCase): | ||||||
|  |  | ||||||
|  |     def setUp(self): | ||||||
|  |         activate_environment('TEST_ENVIRONMENT') | ||||||
|  |  | ||||||
|  |     def tearDown(self): | ||||||
|  |         reset_environment('TEST_ENVIRONMENT') | ||||||
|  |  | ||||||
|  |     def test_single_instance(self): | ||||||
|  |         t1 = TestClass() | ||||||
|  |         ac = AnotherClass() | ||||||
|  |  | ||||||
|  |         t1.initilize_once_per_class() | ||||||
|  |         assert_equal(t1.count, 1) | ||||||
|  |  | ||||||
|  |         t1.initilize_once_per_class() | ||||||
|  |         assert_equal(t1.count, 1) | ||||||
|  |  | ||||||
|  |         ac.initilize_once_per_class() | ||||||
|  |         assert_equal(ac.count, 1) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     def test_mulitple_instances(self): | ||||||
|  |         t1 = TestClass() | ||||||
|  |         t2 = TestClass() | ||||||
|  |  | ||||||
|  |         t1.initilize_once_per_class() | ||||||
|  |         assert_equal(t1.count, 1) | ||||||
|  |  | ||||||
|  |         t2.initilize_once_per_class() | ||||||
|  |         assert_equal(t2.count, 0) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     def test_sub_classes(self): | ||||||
|  |         t1 = TestClass() | ||||||
|  |         sc1 = SubClass() | ||||||
|  |         sc2 = SubClass() | ||||||
|  |         ss1 = SubSubClass() | ||||||
|  |         ss2 = SubSubClass() | ||||||
|  |  | ||||||
|  |         t1.initilize_once_per_class() | ||||||
|  |         assert_equal(t1.count, 1) | ||||||
|  |  | ||||||
|  |         sc1.initilize_once_per_class() | ||||||
|  |         sc2.initilize_once_per_class() | ||||||
|  |         assert_equal(sc1.count, 1) | ||||||
|  |         assert_equal(sc2.count, 0) | ||||||
|  |  | ||||||
|  |         ss1.initilize_once_per_class() | ||||||
|  |         ss2.initilize_once_per_class() | ||||||
|  |         assert_equal(ss1.count, 1) | ||||||
|  |         assert_equal(ss2.count, 0) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class OncePerInstanceEnvironmentTest(TestCase): | ||||||
|  |  | ||||||
|  |     def setUp(self): | ||||||
|  |         activate_environment('TEST_ENVIRONMENT') | ||||||
|  |  | ||||||
|  |     def tearDown(self): | ||||||
|  |         reset_environment('TEST_ENVIRONMENT') | ||||||
|  |  | ||||||
|  |     def test_single_instance(self): | ||||||
|  |         t1 = TestClass() | ||||||
|  |         ac = AnotherClass() | ||||||
|  |  | ||||||
|  |         t1.initilize_once_per_instance() | ||||||
|  |         assert_equal(t1.count, 1) | ||||||
|  |  | ||||||
|  |         t1.initilize_once_per_instance() | ||||||
|  |         assert_equal(t1.count, 1) | ||||||
|  |  | ||||||
|  |         ac.initilize_once_per_instance() | ||||||
|  |         assert_equal(ac.count, 1) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     def test_mulitple_instances(self): | ||||||
|  |         t1 = TestClass() | ||||||
|  |         t2 = TestClass() | ||||||
|  |  | ||||||
|  |         t1.initilize_once_per_instance() | ||||||
|  |         assert_equal(t1.count, 1) | ||||||
|  |  | ||||||
|  |         t2.initilize_once_per_instance() | ||||||
|  |         assert_equal(t2.count, 1) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     def test_sub_classes(self): | ||||||
|  |         t1 = TestClass() | ||||||
|  |         sc = SubClass() | ||||||
|  |         ss = SubSubClass() | ||||||
|  |  | ||||||
|  |         t1.initilize_once_per_instance() | ||||||
|  |         assert_equal(t1.count, 1) | ||||||
|  |  | ||||||
|  |         sc.initilize_once_per_instance() | ||||||
|  |         sc.initilize_once_per_instance() | ||||||
|  |         assert_equal(sc.count, 1) | ||||||
|  |  | ||||||
|  |         ss.initilize_once_per_instance() | ||||||
|  |         ss.initilize_once_per_instance() | ||||||
|  |         assert_equal(ss.count, 1) | ||||||
							
								
								
									
										110
									
								
								wa/utils/exec_control.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								wa/utils/exec_control.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,110 @@ | |||||||
|  | from inspect import getmro | ||||||
|  |  | ||||||
|  | # "environment" management: | ||||||
|  | __environments = {} | ||||||
|  | __active_environment = None | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def activate_environment(name): | ||||||
|  |     """ | ||||||
|  |     Sets the current tracking environment to ``name``. If an | ||||||
|  |     environment with that name does not already exist, it will be | ||||||
|  |     created. | ||||||
|  |     """ | ||||||
|  |     #pylint: disable=W0603 | ||||||
|  |     global __active_environment | ||||||
|  |  | ||||||
|  |     if name not in __environments.keys(): | ||||||
|  |         init_environment(name) | ||||||
|  |     __active_environment = name | ||||||
|  |  | ||||||
|  | def init_environment(name): | ||||||
|  |     """ | ||||||
|  |     Create a new environment called ``name``, but do not set it as the | ||||||
|  |     current environment. | ||||||
|  |  | ||||||
|  |     :raises: ``ValueError`` if an environment with name ``name`` | ||||||
|  |              already exists. | ||||||
|  |     """ | ||||||
|  |     if name in __environments.keys(): | ||||||
|  |         msg = "Environment {} already exists".format(name) | ||||||
|  |         raise ValueError(msg) | ||||||
|  |     __environments[name] = [] | ||||||
|  |  | ||||||
|  | def reset_environment(name=None): | ||||||
|  |     """ | ||||||
|  |     Reset method call tracking for environment ``name``. If ``name`` is | ||||||
|  |     not specified or is ``None``, reset the current active environment. | ||||||
|  |  | ||||||
|  |     :raises: ``ValueError`` if an environment with name ``name`` | ||||||
|  |           does not exist. | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     if name is not None: | ||||||
|  |         if name not in __environments.keys(): | ||||||
|  |             msg = "Environment {} does not exist".format(name) | ||||||
|  |             raise ValueError(msg) | ||||||
|  |         __environments[name] = [] | ||||||
|  |     else: | ||||||
|  |         if __active_environment is None: | ||||||
|  |             activate_environment('default') | ||||||
|  |         __environments[__active_environment] = [] | ||||||
|  |  | ||||||
|  | # The decorators: | ||||||
|  | def once_per_instance(method): | ||||||
|  |     """ | ||||||
|  |     The specified method will be invoked only once for every bound | ||||||
|  |     instance within the environment. | ||||||
|  |     """ | ||||||
|  |     def wrapper(*args, **kwargs): | ||||||
|  |         if __active_environment is None: | ||||||
|  |             activate_environment('default') | ||||||
|  |         func_id = repr(args[0]) | ||||||
|  |         if func_id in __environments[__active_environment]: | ||||||
|  |             return | ||||||
|  |         else: | ||||||
|  |             __environments[__active_environment].append(func_id) | ||||||
|  |         return method(*args, **kwargs) | ||||||
|  |  | ||||||
|  |     return wrapper | ||||||
|  |  | ||||||
|  | def once_per_class(method): | ||||||
|  |     """ | ||||||
|  |     The specified method will be invoked only once for all instances | ||||||
|  |     of a class within the environment. | ||||||
|  |     """ | ||||||
|  |     def wrapper(*args, **kwargs): | ||||||
|  |         if __active_environment is None: | ||||||
|  |             activate_environment('default') | ||||||
|  |  | ||||||
|  |         func_id = repr(method.func_name) + repr(args[0].__class__) | ||||||
|  |  | ||||||
|  |         if func_id in __environments[__active_environment]: | ||||||
|  |             return | ||||||
|  |         else: | ||||||
|  |             __environments[__active_environment].append(func_id) | ||||||
|  |         return method(*args, **kwargs) | ||||||
|  |  | ||||||
|  |     return wrapper | ||||||
|  |  | ||||||
|  | def once(method): | ||||||
|  |     """ | ||||||
|  |     The specified method will be invoked only once within the | ||||||
|  |     environment. | ||||||
|  |     """ | ||||||
|  |     def wrapper(*args, **kwargs): | ||||||
|  |         if __active_environment is None: | ||||||
|  |             activate_environment('default') | ||||||
|  |  | ||||||
|  |         func_id = repr(method.func_name) | ||||||
|  |         # Store the least derived class, which isn't object, to account | ||||||
|  |         # for subclasses. | ||||||
|  |         func_id += repr(getmro(args[0].__class__)[-2]) | ||||||
|  |  | ||||||
|  |         if func_id in __environments[__active_environment]: | ||||||
|  |             return | ||||||
|  |         else: | ||||||
|  |             __environments[__active_environment].append(func_id) | ||||||
|  |         return method(*args, **kwargs) | ||||||
|  |  | ||||||
|  |     return wrapper | ||||||
		Reference in New Issue
	
	Block a user