xref: /aosp_15_r20/external/autotest/server/cros/dynamic_suite/fakes.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li# Lint as: python2, python3
2*9c5db199SXin Li#pylint: disable-msg=C0111
3*9c5db199SXin Li# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
4*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be
5*9c5db199SXin Li# found in the LICENSE file.
6*9c5db199SXin Li
7*9c5db199SXin Li"""Fakes for dynamic_suite-related unit tests."""
8*9c5db199SXin Li
9*9c5db199SXin Lifrom __future__ import absolute_import
10*9c5db199SXin Lifrom __future__ import division
11*9c5db199SXin Lifrom __future__ import print_function
12*9c5db199SXin Liimport common
13*9c5db199SXin Lifrom autotest_lib.client.common_lib import control_data
14*9c5db199SXin Lifrom six.moves import map
15*9c5db199SXin Li
16*9c5db199SXin Li
17*9c5db199SXin Liclass FakeControlData(control_data.ControlData):
18*9c5db199SXin Li    """A fake parsed control file data structure."""
19*9c5db199SXin Li    def __init__(self, suite, attributes, data, time='LONG', expr=False,
20*9c5db199SXin Li                 dependencies=None, job_retries=0):
21*9c5db199SXin Li        self.string = 'text-' + data
22*9c5db199SXin Li        self.name = 'name-' + data
23*9c5db199SXin Li        self.path = None  # Will be set during 'parsing'.
24*9c5db199SXin Li        self.data = data
25*9c5db199SXin Li        self.suite = suite
26*9c5db199SXin Li        self.attributes = attributes
27*9c5db199SXin Li        self.test_type = 'Client'
28*9c5db199SXin Li        self.experimental = expr
29*9c5db199SXin Li        if not dependencies:
30*9c5db199SXin Li            dependencies=[]
31*9c5db199SXin Li        self.dependencies = dependencies
32*9c5db199SXin Li        self.time = time
33*9c5db199SXin Li        self.sync_count = 1
34*9c5db199SXin Li        self.job_retries = job_retries
35*9c5db199SXin Li        self.bug_template = {}
36*9c5db199SXin Li        self.require_ssp = None
37*9c5db199SXin Li        self.priority = 10
38*9c5db199SXin Li        self.fast = False
39*9c5db199SXin Li
40*9c5db199SXin Li
41*9c5db199SXin Liclass FakeJob(object):
42*9c5db199SXin Li    """Faked out RPC-client-side Job object."""
43*9c5db199SXin Li    def __init__(self, id=0, statuses=[], hostnames=[], parent_job_id=None):
44*9c5db199SXin Li        self.id = id
45*9c5db199SXin Li        self.hostnames = hostnames if hostnames else ['host%d' % id]
46*9c5db199SXin Li        self.owner = 'tester'
47*9c5db199SXin Li        self.name = 'Fake Job %d' % self.id
48*9c5db199SXin Li        self.statuses = statuses
49*9c5db199SXin Li        self.parent_job_id = parent_job_id
50*9c5db199SXin Li
51*9c5db199SXin Li
52*9c5db199SXin Liclass FakeHost(object):
53*9c5db199SXin Li    """Faked out RPC-client-side Host object."""
54*9c5db199SXin Li    def __init__(self, hostname='', status='Ready', locked=False, locked_by=''):
55*9c5db199SXin Li        self.hostname = hostname
56*9c5db199SXin Li        self.status = status
57*9c5db199SXin Li        self.locked = locked
58*9c5db199SXin Li        self.locked_by = locked_by
59*9c5db199SXin Li
60*9c5db199SXin Li
61*9c5db199SXin Li    def __str__(self):
62*9c5db199SXin Li        return '%s: %s.  %s%s' % (
63*9c5db199SXin Li            self.hostname, self.status,
64*9c5db199SXin Li            'Locked' if self.locked else 'Unlocked',
65*9c5db199SXin Li            ' by %s' % self.locked_by if self.locked else '')
66*9c5db199SXin Li
67*9c5db199SXin Li
68*9c5db199SXin Liclass FakeLabel(object):
69*9c5db199SXin Li    """Faked out RPC-client-side Label object."""
70*9c5db199SXin Li    def __init__(self, id=0):
71*9c5db199SXin Li        self.id = id
72*9c5db199SXin Li
73*9c5db199SXin Li
74*9c5db199SXin Liclass FakeStatus(object):
75*9c5db199SXin Li    """Fake replacement for server-side job status objects.
76*9c5db199SXin Li
77*9c5db199SXin Li    @var status: 'GOOD', 'FAIL', 'ERROR', etc.
78*9c5db199SXin Li    @var test_name: name of the test this is status for
79*9c5db199SXin Li    @var reason: reason for failure, if any
80*9c5db199SXin Li    @var aborted: present and True if the job was aborted.  Optional.
81*9c5db199SXin Li    """
82*9c5db199SXin Li    def __init__(self, code, name, reason, aborted=None,
83*9c5db199SXin Li                 hostname=None, subdir='fake_Test.tag.subdir_tag',
84*9c5db199SXin Li                 job_tag='id-owner/hostname'):
85*9c5db199SXin Li        self.status = code
86*9c5db199SXin Li        self.test_name = name
87*9c5db199SXin Li        self.reason = reason
88*9c5db199SXin Li        self.hostname = hostname if hostname else 'hostless'
89*9c5db199SXin Li        self.entry = {}
90*9c5db199SXin Li        self.test_started_time = '2012-11-11 11:11:11'
91*9c5db199SXin Li        self.test_finished_time = '2012-11-11 12:12:12'
92*9c5db199SXin Li        self.job_tag=job_tag
93*9c5db199SXin Li        self.subdir=subdir
94*9c5db199SXin Li        if aborted:
95*9c5db199SXin Li            self.entry['aborted'] = True
96*9c5db199SXin Li        if hostname:
97*9c5db199SXin Li            self.entry['host'] = {'hostname': hostname}
98*9c5db199SXin Li
99*9c5db199SXin Li
100*9c5db199SXin Li    def __repr__(self):
101*9c5db199SXin Li        return '%s\t%s\t%s: %s' % (self.status, self.test_name, self.reason,
102*9c5db199SXin Li                                   self.hostname)
103*9c5db199SXin Li
104*9c5db199SXin Li
105*9c5db199SXin Li    def equals_record(self, status):
106*9c5db199SXin Li        """Compares this object to a recorded status."""
107*9c5db199SXin Li        if 'aborted' in self.entry and self.entry['aborted']:
108*9c5db199SXin Li            return status._status == 'ABORT'
109*9c5db199SXin Li        return (self.status == status._status and
110*9c5db199SXin Li                status._test_name.endswith(self.test_name) and
111*9c5db199SXin Li                self.reason == status._reason)
112*9c5db199SXin Li
113*9c5db199SXin Li
114*9c5db199SXin Li    def equals_hostname_record(self, status):
115*9c5db199SXin Li        """Compares this object to a recorded status.
116*9c5db199SXin Li
117*9c5db199SXin Li        Expects the test name field of |status| to contain |self.hostname|.
118*9c5db199SXin Li        """
119*9c5db199SXin Li        return (self.status == status._status and
120*9c5db199SXin Li                self.hostname in status._test_name and
121*9c5db199SXin Li                self.reason == status._reason)
122*9c5db199SXin Li
123*9c5db199SXin Li
124*9c5db199SXin Li    def record_all(self, record):
125*9c5db199SXin Li        pass
126*9c5db199SXin Li
127*9c5db199SXin Li
128*9c5db199SXin Li    def is_good(self):
129*9c5db199SXin Li        pass
130*9c5db199SXin Li
131*9c5db199SXin Li    def name(self):
132*9c5db199SXin Li        return self.test_name
133*9c5db199SXin Li
134*9c5db199SXin Li
135*9c5db199SXin Liclass FakeMultiprocessingPool(object):
136*9c5db199SXin Li    """Fake multiprocessing pool to mock out the map method."""
137*9c5db199SXin Li
138*9c5db199SXin Li
139*9c5db199SXin Li    def __init__(self, processes=None, initializer=None, initargs=(),
140*9c5db199SXin Li                 maxtasksperchild=None):
141*9c5db199SXin Li        pass
142*9c5db199SXin Li
143*9c5db199SXin Li
144*9c5db199SXin Li    def map(self, func, iterable, chunksize=None):
145*9c5db199SXin Li        """Use the standard map() built-in instead of Pool.map()"""
146*9c5db199SXin Li        return list(map(func, iterable))
147*9c5db199SXin Li
148*9c5db199SXin Li
149*9c5db199SXin Li    def close(self):
150*9c5db199SXin Li        pass
151*9c5db199SXin Li
152*9c5db199SXin Li
153*9c5db199SXin Li    def join(self):
154*9c5db199SXin Li        pass
155