# Copyright 2017 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import copy
import os

from mobly import utils


class RuntimeTestInfo:
  """Container class for runtime information of a test or test stage.

  One object corresponds to one test. This is meant to be a read-only class.

  This also applies to test stages like `setup_class`, which has its own
  runtime info but is not part of any single test.

  Attributes:
    name: string, name of the test.
    signature: string, an identifier of the test, a combination of test
      name and begin time.
    record: TestResultRecord, the current test result record. This changes
      as the test's execution progresses.
    output_path: string, path to the test's output directory. It's created
      upon accessing.
  """

  def __init__(self, test_name, log_path, record):
    self._name = test_name
    self._record = record
    self._signature = '%s-%s' % (test_name, record.begin_time)
    self._output_dir_path = utils.abs_path(
        os.path.join(log_path, self._signature))

  @property
  def name(self):
    return self._name

  @property
  def signature(self):
    return self._signature

  @property
  def record(self):
    return copy.deepcopy(self._record)

  @property
  def output_path(self):
    utils.create_dir(self._output_dir_path)
    return self._output_dir_path
