116d7a5204e347855b1c3a68c982c22f931a12866Yuheng Long# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
216d7a5204e347855b1c3a68c982c22f931a12866Yuheng Long# Use of this source code is governed by a BSD-style license that can be
316d7a5204e347855b1c3a68c982c22f931a12866Yuheng Long# found in the LICENSE file.
4a5712a2c71aa665dcca808963d152228890c8364Yuheng Long"""This module defines the common mock tasks used by various unit tests.
5a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long
6a791546e80cede30d5325bec834b35b99b7e7bfeYuheng LongPart of the Chrome build flags optimization.
7a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long"""
8a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long
9a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long__author__ = 'yuhenglong@google.com (Yuheng Long)'
10a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long
11a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long# Pick an integer at random.
12a791546e80cede30d5325bec834b35b99b7e7bfeYuheng LongPOISONPILL = 975
13a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long
14a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long
15a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Longclass MockTask(object):
16a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long  """This class emulates an actual task.
17a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long
18a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long  It does not do the actual work, but simply returns the result as given when
19a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long  this task is constructed.
20a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long  """
21a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long
22a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long  def __init__(self, stage, identifier, cost=0):
23a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long    """Set up the results for this task.
24a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long
25a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long    Args:
26a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long      stage: the stage of this test is in.
27a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long      identifier: the identifier of this task.
28a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long      cost: the mock cost of this task.
29a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long
3025cdf79e17a73858ffa28db8a5b387210fea9e25Yuheng Long      The _cost field stored the cost. Once this task is performed, i.e., by
3125cdf79e17a73858ffa28db8a5b387210fea9e25Yuheng Long      calling the work method or by setting the result from other task, the
3225cdf79e17a73858ffa28db8a5b387210fea9e25Yuheng Long      _cost field will have this cost. The stage field verifies that the module
3325cdf79e17a73858ffa28db8a5b387210fea9e25Yuheng Long      being tested and the unitest are in the same stage. If the unitest does
3425cdf79e17a73858ffa28db8a5b387210fea9e25Yuheng Long      not care about cost of this task, the cost parameter should be leaved
3525cdf79e17a73858ffa28db8a5b387210fea9e25Yuheng Long      blank.
36a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long    """
37a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long
38a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long    self._identifier = identifier
3925cdf79e17a73858ffa28db8a5b387210fea9e25Yuheng Long    self._cost = cost
40a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long    self._stage = stage
41a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long
4225cdf79e17a73858ffa28db8a5b387210fea9e25Yuheng Long    # Indicate that this method has not been performed yet.
4325cdf79e17a73858ffa28db8a5b387210fea9e25Yuheng Long    self._performed = False
4425cdf79e17a73858ffa28db8a5b387210fea9e25Yuheng Long
45a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long  def __eq__(self, other):
46a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long    if isinstance(other, MockTask):
47a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long      return (self._identifier == other.GetIdentifier(self._stage) and
48a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long              self._cost == other.GetResult(self._stage))
49a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long    return False
50a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long
51a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long  def GetIdentifier(self, stage):
52a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long    assert stage == self._stage
53a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long    return self._identifier
54a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long
55a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long  def SetResult(self, stage, cost):
56a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long    assert stage == self._stage
57a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long    self._cost = cost
5825cdf79e17a73858ffa28db8a5b387210fea9e25Yuheng Long    self._performed = True
59a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long
60a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long  def Work(self, stage):
61a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long    assert stage == self._stage
6225cdf79e17a73858ffa28db8a5b387210fea9e25Yuheng Long    self._performed = True
63a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long
64a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long  def GetResult(self, stage):
65a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long    assert stage == self._stage
66a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long    return self._cost
67a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long
68a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long  def Done(self, stage):
69a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long    """Indicates whether the task has been performed."""
70a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long
71a791546e80cede30d5325bec834b35b99b7e7bfeYuheng Long    assert stage == self._stage
7225cdf79e17a73858ffa28db8a5b387210fea9e25Yuheng Long    return self._performed
73a5712a2c71aa665dcca808963d152228890c8364Yuheng Long
74b15d41c6d6324e343fbea19abaed3717417f3cdeYuheng Long  def LogSteeringCost(self):
75a5712a2c71aa665dcca808963d152228890c8364Yuheng Long    pass
76a5712a2c71aa665dcca808963d152228890c8364Yuheng Long
77a5712a2c71aa665dcca808963d152228890c8364Yuheng Long
78a5712a2c71aa665dcca808963d152228890c8364Yuheng Longclass IdentifierMockTask(MockTask):
79a5712a2c71aa665dcca808963d152228890c8364Yuheng Long  """This class defines the mock task that does not consider the cost.
80a5712a2c71aa665dcca808963d152228890c8364Yuheng Long
81a5712a2c71aa665dcca808963d152228890c8364Yuheng Long  The task instances will be inserted into a set. Therefore the hash and the
82a5712a2c71aa665dcca808963d152228890c8364Yuheng Long  equal methods are overridden. The unittests that compares identities of the
83a5712a2c71aa665dcca808963d152228890c8364Yuheng Long  tasks for equality can use this mock task instead of the base mock tack.
84a5712a2c71aa665dcca808963d152228890c8364Yuheng Long  """
85a5712a2c71aa665dcca808963d152228890c8364Yuheng Long
86a5712a2c71aa665dcca808963d152228890c8364Yuheng Long  def __hash__(self):
87a5712a2c71aa665dcca808963d152228890c8364Yuheng Long    return self._identifier
88a5712a2c71aa665dcca808963d152228890c8364Yuheng Long
89a5712a2c71aa665dcca808963d152228890c8364Yuheng Long  def __eq__(self, other):
90a5712a2c71aa665dcca808963d152228890c8364Yuheng Long    if isinstance(other, MockTask):
91a5712a2c71aa665dcca808963d152228890c8364Yuheng Long      return self._identifier == other.GetIdentifier(self._stage)
92a5712a2c71aa665dcca808963d152228890c8364Yuheng Long    return False
93