1#!/usr/bin/env vpython
2# Copyright 2016 The Chromium Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6# pylint: disable=protected-access
7
8import unittest
9
10from pylib.base import base_test_result
11from pylib.local.device import local_device_test_run
12
13import mock  # pylint: disable=import-error
14
15
16class SubstituteDeviceRootTest(unittest.TestCase):
17
18  def testNoneDevicePath(self):
19    self.assertEquals(
20        '/fake/device/root',
21        local_device_test_run.SubstituteDeviceRoot(
22            None, '/fake/device/root'))
23
24  def testStringDevicePath(self):
25    self.assertEquals(
26        '/another/fake/device/path',
27        local_device_test_run.SubstituteDeviceRoot(
28            '/another/fake/device/path', '/fake/device/root'))
29
30  def testListWithNoneDevicePath(self):
31    self.assertEquals(
32        '/fake/device/root/subpath',
33        local_device_test_run.SubstituteDeviceRoot(
34            [None, 'subpath'], '/fake/device/root'))
35
36  def testListWithoutNoneDevicePath(self):
37    self.assertEquals(
38        '/another/fake/device/path',
39        local_device_test_run.SubstituteDeviceRoot(
40            ['/', 'another', 'fake', 'device', 'path'],
41            '/fake/device/root'))
42
43
44class TestLocalDeviceTestRun(local_device_test_run.LocalDeviceTestRun):
45
46  # pylint: disable=abstract-method
47
48  def __init__(self):
49    super(TestLocalDeviceTestRun, self).__init__(
50        mock.MagicMock(), mock.MagicMock())
51
52
53class TestLocalDeviceNonStringTestRun(
54    local_device_test_run.LocalDeviceTestRun):
55
56  # pylint: disable=abstract-method
57
58  def __init__(self):
59    super(TestLocalDeviceNonStringTestRun, self).__init__(
60        mock.MagicMock(), mock.MagicMock())
61
62  def _GetUniqueTestName(self, test):
63    return test['name']
64
65
66class LocalDeviceTestRunTest(unittest.TestCase):
67
68  def testGetTestsToRetry_allTestsPassed(self):
69    results = [
70        base_test_result.BaseTestResult(
71            'Test1', base_test_result.ResultType.PASS),
72        base_test_result.BaseTestResult(
73            'Test2', base_test_result.ResultType.PASS),
74    ]
75
76    tests = [r.GetName() for r in results]
77    try_results = base_test_result.TestRunResults()
78    try_results.AddResults(results)
79
80    test_run = TestLocalDeviceTestRun()
81    tests_to_retry = test_run._GetTestsToRetry(tests, try_results)
82    self.assertEquals(0, len(tests_to_retry))
83
84  def testGetTestsToRetry_testFailed(self):
85    results = [
86        base_test_result.BaseTestResult(
87            'Test1', base_test_result.ResultType.FAIL),
88        base_test_result.BaseTestResult(
89            'Test2', base_test_result.ResultType.PASS),
90    ]
91
92    tests = [r.GetName() for r in results]
93    try_results = base_test_result.TestRunResults()
94    try_results.AddResults(results)
95
96    test_run = TestLocalDeviceTestRun()
97    tests_to_retry = test_run._GetTestsToRetry(tests, try_results)
98    self.assertEquals(1, len(tests_to_retry))
99    self.assertIn('Test1', tests_to_retry)
100
101  def testGetTestsToRetry_testUnknown(self):
102    results = [
103        base_test_result.BaseTestResult(
104            'Test2', base_test_result.ResultType.PASS),
105    ]
106
107    tests = ['Test1'] + [r.GetName() for r in results]
108    try_results = base_test_result.TestRunResults()
109    try_results.AddResults(results)
110
111    test_run = TestLocalDeviceTestRun()
112    tests_to_retry = test_run._GetTestsToRetry(tests, try_results)
113    self.assertEquals(1, len(tests_to_retry))
114    self.assertIn('Test1', tests_to_retry)
115
116  def testGetTestsToRetry_wildcardFilter_allPass(self):
117    results = [
118        base_test_result.BaseTestResult(
119            'TestCase.Test1', base_test_result.ResultType.PASS),
120        base_test_result.BaseTestResult(
121            'TestCase.Test2', base_test_result.ResultType.PASS),
122    ]
123
124    tests = ['TestCase.*']
125    try_results = base_test_result.TestRunResults()
126    try_results.AddResults(results)
127
128    test_run = TestLocalDeviceTestRun()
129    tests_to_retry = test_run._GetTestsToRetry(tests, try_results)
130    self.assertEquals(0, len(tests_to_retry))
131
132  def testGetTestsToRetry_wildcardFilter_oneFails(self):
133    results = [
134        base_test_result.BaseTestResult(
135            'TestCase.Test1', base_test_result.ResultType.PASS),
136        base_test_result.BaseTestResult(
137            'TestCase.Test2', base_test_result.ResultType.FAIL),
138    ]
139
140    tests = ['TestCase.*']
141    try_results = base_test_result.TestRunResults()
142    try_results.AddResults(results)
143
144    test_run = TestLocalDeviceTestRun()
145    tests_to_retry = test_run._GetTestsToRetry(tests, try_results)
146    self.assertEquals(1, len(tests_to_retry))
147    self.assertIn('TestCase.*', tests_to_retry)
148
149  def testGetTestsToRetry_nonStringTests(self):
150    results = [
151        base_test_result.BaseTestResult(
152            'TestCase.Test1', base_test_result.ResultType.PASS),
153        base_test_result.BaseTestResult(
154            'TestCase.Test2', base_test_result.ResultType.FAIL),
155    ]
156
157    tests = [
158        {'name': 'TestCase.Test1'},
159        {'name': 'TestCase.Test2'},
160    ]
161    try_results = base_test_result.TestRunResults()
162    try_results.AddResults(results)
163
164    test_run = TestLocalDeviceNonStringTestRun()
165    tests_to_retry = test_run._GetTestsToRetry(tests, try_results)
166    self.assertEquals(1, len(tests_to_retry))
167    self.assertIsInstance(tests_to_retry[0], dict)
168    self.assertEquals(tests[1], tests_to_retry[0])
169
170
171if __name__ == '__main__':
172  unittest.main(verbosity=2)
173