summaryrefslogtreecommitdiffstats
path: root/toasteruitest/run_toastertests.py
blob: dffb3d995fa63058ca7164e21f790a1d3a0a17d0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#!/usr/bin/python
#
# DESCRIPTION
# This is main script for running all selected toaster cases
# on selected web browser manifested in toaster_test.cfg
#

import argparse
import ConfigParser
import os
import platform
import sys
from toaster_automation_test import toaster_cases
import unittest

def get_args_parser():
    description = "Script that runs toaster auto tests."
    parser = argparse.ArgumentParser(description=description)
    parser.add_argument('--run-all-tests', required=False, action="store_true", dest="run_all_tests", default=False,
                       help='Run all tests.')
    parser.add_argument('--run-suite', required=False, dest='run_suite', default=False,
                       help='run suite (defined in cfg file)')
    return parser

def get_tests():
    testslist = []
    prefix = 'toaster_automation_test.toaster_cases'
    for t in dir(toaster_cases):
        if t.startswith('test_'):
            testslist.append('.'.join((prefix, t)))
    return testslist

def get_tests_from_cfg(suite=None):

    testslist = []
    config = ConfigParser.SafeConfigParser()
    config.read('toaster_test.cfg')

    if suite is not None:
        target_suite = suite.lower()
    else:
        target_suite = platform.system().lower()
    try:
        tests_from_cfg = eval(config.get('toaster_test_' + target_suite, 'test_cases'))
    except:
        print('Failed to get test cases from cfg file. Make sure the format is correct.')
        return None

    prefix = 'toaster_automation_test.toaster_cases.test_'
    for t in tests_from_cfg:
        testslist.append(prefix + str(t))
    return testslist

def buildResultClass(args):
    """Build a Result Class to use in the testcase execution"""
    class StampedResult(unittest.TextTestResult):
        """
        Custom TestResult that prints the time when a test starts.  As toaster-auto
        can take a long time (ie a few hours) to run, timestamps help us understand
        what tests are taking a long time to execute.
        """
        def startTest(self, test):
            import time
            self.stream.write(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + " - ")
            super(StampedResult, self).startTest(test)
    return StampedResult

def main():

    os.chdir(os.path.abspath(sys.path[0]))
    parser = get_args_parser()
    args = parser.parse_args()

    if args.run_all_tests:
        testslist = get_tests()
    elif args.run_suite:
        testslist = get_tests_from_cfg(args.run_suite)
        os.environ['TOASTER_SUITE'] = args.run_suite
    else:
        testslist = get_tests_from_cfg()

    if not testslist:
        print('Failed to get test cases.')
        exit(1)

    suite = unittest.TestSuite()
    loader = unittest.TestLoader()
    loader.sortTestMethodsUsing = None
    runner = unittest.TextTestRunner(verbosity=2, resultclass=buildResultClass(args))
    for test in testslist:
        try:
            suite.addTests(loader.loadTestsFromName(test))
        except:
            return 1

    result = runner.run(suite)

    if result.wasSuccessful():
        return 0
    else:
        return 1

if __name__ == "__main__":

    try:
        ret = main()
    except:
        ret = 1
        import traceback
        traceback.print_exc()
    finally:
        if os.getenv('TOASTER_SUITE'):
            del os.environ['TOASTER_SUITE']
    sys.exit(ret)