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