Index: chrome/test/mini_installer/visitor_runner.py |
diff --git a/chrome/test/mini_installer/visitor_runner.py b/chrome/test/mini_installer/visitor_runner.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6720cb051a02ee5aba088112049b8517826fd646 |
--- /dev/null |
+++ b/chrome/test/mini_installer/visitor_runner.py |
@@ -0,0 +1,113 @@ |
+# Copyright 2017 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import re |
+ |
+import file_visitor |
+import process_visitor |
+import registry_visitor |
+ |
+class VisitorRunner(object): |
+ """Run all visitor based on a state's property dictionary. |
+ |
+ A property dictionary is a dictionary where each key is a verifier's name |
+ and the associated value is the input to that verifier. For details about |
+ the input format for each verifier, take a look at http://goo.gl/1P85WL |
+ |
+ All visitor's name should match the name of property. For example, visitor |
+ for property "RegistryEntries" will be "registry_entries_visitor". |
+ """ |
+ def __init__(self): |
+ self._property_name_match = {} |
+ |
+ def Run(self, state): |
+ """ Walk through all properties of the state. |
+ |
+ Args: |
+ state: A property dictionary belongs to a state. |
+ """ |
+ for property_name, property_value in state.iteritems(): |
+ visitor_name = self._Convert(property_name) + '_visitor' |
grt (UTC plus 2)
2017/03/15 09:00:08
i don't understand this part -- why is there a per
|
+ if not hasattr(self, visitor_name): |
+ self._HandleInvalidProperty(property_name) |
+ else: |
+ getattr(self, visitor_name).Traverse(property_value) |
+ |
+ |
+ |
+ def _HandleInvalidProperty(self, property_name): |
+ """ Abstract class. |
+ |
+ Handle the situation that the property in config file does not supported |
+ by the runner. |
+ |
+ Args: |
+ property_name: A string represents the unsupported property's name. |
+ """ |
+ pass |
+ |
+ def _Convert(self, input_str): |
+ """Convert CamelCase property name in config file into snake_case for |
+ reflection |
+ """ |
+ if input_str not in self._property_name_match: |
+ output_str = re.sub('([A-Z][a-z]*)', r'_\1', input_str).lower()[1:] |
+ self._property_name_match[input_str] = output_str |
+ return self._property_name_match[input_str] |
+ |
+ |
+class VerifierRunner(VisitorRunner): |
+ """Run all verifing visitor to verify that the current machine states match |
+ the property dictionary. |
+ """ |
+ |
+ def __init__(self, variable_expander): |
+ """Constructor.""" |
+ # TODO(sukolsak): Implement other verifiers |
+ super(VerifierRunner, self).__init__() |
+ self.files_visitor = file_visitor.FileVerifier(variable_expander) |
+ self.registry_entries_visitor = registry_visitor.RegistryVerifier( |
+ variable_expander) |
+ self.processes_visitor = process_visitor.ProcessVerifier(variable_expander) |
+ |
+ def _HandleInvalidProperty(self, property_name): |
+ """ Overridden VisitorRunner._HandleInvalidProperty, unsupported |
+ property raises KeyError. |
+ """ |
+ raise KeyError('Unknown verifier %s' % property_name) |
+ |
+ |
+class CleanupRunner(VisitorRunner): |
+ """ Run all cleaning visitor based on the config state to reset the machine to |
+ a clean state. |
+ |
+ Only support: |
+ 1) Delete directory, always recursively. Delete file is NOT supported. |
+ 2) Delete registry key, always recursively. |
+ """ |
+ |
+ _instance = None |
+ |
+ def __init__(self, variable_expander): |
+ """Constructor.""" |
+ # TODO(sukolsak): Implement other verifiers |
+ super(CleanupRunner, self).__init__() |
+ self.files_visitor = file_visitor.FileCleaner(variable_expander) |
+ self.registry_entries_visitor = registry_visitor.RegistryCleaner( |
+ variable_expander) |
+ |
+ |
+ @classmethod |
+ def Create(cls, variable_expander): |
+ """Singleton constructor. |
+ """ |
+ if not cls._instance: |
+ cls._instance = CleanupRunner(variable_expander) |
+ return cls._instance |
+ |
+ def _HandleInvalidProperty(self, property_name): |
+ """ Overridden VisitorRunner._HandleInvalidProperty, ignore unsupported |
+ state's property. |
+ """ |
+ return |