# Copyright 2014 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 Environment(object):
  """An environment in which tests can be run.

  This is expected to handle all logic that is applicable to an entire specific
  environment but is independent of the test type.

  Examples include:
    - The local device environment, for running tests on devices attached to
      the local machine.
    - The local machine environment, for running tests directly on the local
      machine.
  """

  def __init__(self, output_manager):
    """Environment constructor.

    Args:
      output_manager: Instance of |output_manager.OutputManager| used to
          save test output.
    """
    self._output_manager = output_manager

    # Some subclasses have different teardown behavior on receiving SIGTERM.
    self._received_sigterm = False

  def SetUp(self):
    raise NotImplementedError

  def TearDown(self):
    raise NotImplementedError

  def __enter__(self):
    self.SetUp()
    return self

  def __exit__(self, _exc_type, _exc_val, _exc_tb):
    self.TearDown()

  @property
  def output_manager(self):
    return self._output_manager

  def ReceivedSigterm(self):
    self._received_sigterm = True
