# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


class Verifier:
  """Verifies that the current machine states match the expectation."""

  def VerifyInput(self, verifier_input, variable_expander):
    """Verifies that the current machine states match |verifier_input|.

    Args:
      verifier_input: An input to the verifier. It is a dictionary where each
          key is an expectation name and the associated value is an expectation
          dictionary. The expectation dictionary may contain an optional
          'condition' property, a string that determines whether the expectation
          should be verified. Each subclass can specify a different expectation
          name and expectation dictionary.
      variable_expander: A VariableExpander object.
    """
    for expectation_name, expectation in verifier_input.iteritems():
      if 'condition' in expectation:
        condition = variable_expander.Expand(expectation['condition'])
        if not self._EvaluateCondition(condition):
          continue
      self._VerifyExpectation(expectation_name, expectation, variable_expander)

  def _VerifyExpectation(self, expectation_name, expectation,
                         variable_expander):
    """Verifies that the current machine states match |verifier_input|.

    This is an abstract method for subclasses to override.

    Args:
      expectation_name: An expectation name. Each subclass can specify a
          different expectation name format.
      expectation: An expectation dictionary. Each subclass can specify a
          different expectation dictionary format.
      variable_expander: A VariableExpander object.
    """
    raise NotImplementedError()

  def _EvaluateCondition(self, condition):
    """Evaluates |condition| using eval().

    Args:
      condition: A condition string.

    Returns:
      The result of the evaluated condition.
    """
    return eval(condition, {'__builtins__': None}, None)