Chromium Code Reviews| Index: chrome/installer/automation_test/test_installer.py |
| diff --git a/chrome/installer/automation_test/test_installer.py b/chrome/installer/automation_test/test_installer.py |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..26e7f869f2afdc18844d73a69649223631ed2418 |
| --- /dev/null |
| +++ b/chrome/installer/automation_test/test_installer.py |
| @@ -0,0 +1,111 @@ |
| +# Copyright (c) 2012 The Chromium Authors. All rights reserved. |
|
grt (UTC plus 2)
2013/07/30 03:31:38
the new-style notice is (note: no "(c)" and use th
sukolsak
2013/07/30 15:40:32
Should we put the notice in the data files? The da
gab
2013/07/30 20:44:14
Ya, I don't think we can, but it's pure data, not
|
| +# Use of this source code is governed by a BSD-style license that can be |
| +# found in the LICENSE file. |
| + |
| +import argparse |
| +import json |
| +import os |
| +import subprocess |
| +import verifier |
| + |
| + |
| +class Config: |
| + def __init__(self): |
| + self.states = {} |
| + self.actions = {} |
| + self.tests = [] |
| + |
| + |
| +# Merge the new Property object into the current Property object |
|
grt (UTC plus 2)
2013/07/30 03:31:38
i don't have python readability, so take this with
|
| +def MergeProperties(current_property, new_property): |
| + for key, value in new_property.iteritems(): |
| + if key not in current_property: |
| + current_property[key] = value |
| + else: |
| + assert(isinstance(current_property[key], dict) and |
| + isinstance(value, dict)) |
| + current_property[key] = dict( |
| + current_property[key].items() + value.items()) |
| + |
| + |
| +# Parse a .prop file |
| +def ParseProperty(property_filename, dir): |
|
grt (UTC plus 2)
2013/07/30 03:31:38
"dir" is the name of a built-in function. please u
|
| + property_file = open(os.path.join(dir, property_filename), "r") |
|
grt (UTC plus 2)
2013/07/30 03:31:38
use the "with" statement when opening files here a
|
| + property = json.load(property_file) |
| + property_file.close() |
| + return property |
| + |
| + |
| +# Parse an array of .prop files |
| +def ParseProperties(property_filenames, dir): |
| + current_property = {} |
| + for property_filename in property_filenames: |
| + new_property = ParseProperty(property_filename, dir) |
| + MergeProperties(current_property, new_property) |
| + return current_property |
| + |
| + |
| +# Parse a .config file |
| +def ParseConfig(config_filename): |
| + config = Config() |
| + |
| + config_file = open(config_filename, "r") |
| + config_data = json.load(config_file) |
| + config_file.close() |
| + dir = os.path.dirname(os.path.abspath(config_filename)) |
| + |
| + for state_name, state_property_filenames in config_data["states"]: |
| + config.states[state_name] = ParseProperties(state_property_filenames, dir) |
| + for action_name, action_command in config_data["actions"]: |
| + config.actions[action_name] = action_command |
| + config.tests = config_data["tests"] |
| + return config |
| + |
| + |
| +# Verify that the current machine states match the given machine states |
| +def VerifyState(config, state): |
| + print " * Current state: " + state |
| + verifier.Verify(config.states[state]) |
| + |
| + |
| +def RunCommand(command): |
| + print " * Run command: " + command + "\n" |
| + subprocess.call(command, shell=True) |
| + |
| + |
| +def RunResetCommand(): |
| + print " * Reset\n" |
| + # TODO(sukolsak): This might leave artifacts on the machine |
| + subprocess.call("mini_installer.exe --chrome --uninstall" |
|
grt (UTC plus 2)
2013/07/30 03:31:38
this isn't a true chrome uninstall command line, a
gab
2013/07/30 13:27:57
As I suggested on a previous patch set, I think we
|
| + + " & mini_installer.exe --chrome-frame --uninstall", shell=True) |
| + |
| + |
| +# Test the installer |
| +def Test(config): |
| + for test in config.tests: |
| + print "Testing [ " + " -> ".join(test) + " ]" |
| + |
| + RunResetCommand() |
| + |
| + current_state = test[0] |
| + VerifyState(config, current_state) |
| + |
| + for i in range(1, len(test), 2): |
| + action = test[i] |
| + RunCommand(config.actions[action]) |
| + |
| + current_state = test[i + 1] |
| + VerifyState(config, current_state) |
| + |
| + |
| +def main(): |
| + parser = argparse.ArgumentParser(description="Test the installer.") |
| + parser.add_argument("config_filename", help="the config file") |
| + args = parser.parse_args() |
| + |
| + config = ParseConfig(args.config_filename) |
| + Test(config) |
| + |
| + |
| +if __name__ == "__main__": |
| + main() |