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

load("//metadata/test_common.star", "test_common")

load("@proto//chromiumos/config/api/test/harness/tnull/v1/tnull.proto",
    tnull_pb = "chromiumos.config.api.test.tnull.v1"
)

DOC = """
{name}: Helper test verifying reporting {artifact_desc} works correctly.
Used to verify that the RTD's interface with the RTS is working.
"""

def _tests():
  return [
      _define_artifact_test("no-artifact", "absent artifacts", []),
      _define_artifact_test("simple-artifact", "a simple artifact", [
          _make_mock_artifact("simple-sink", single_obj)
      ]),
      _define_artifact_test("multiline-artifact", "a multi-line artifact", [
          _make_mock_artifact("simple-sink", second_obj)
      ]),
      _define_artifact_test("two-artifacts", "two artifacts to one request", [
          _make_mock_artifact("simple-sink", single_obj),
          _make_mock_artifact("simple-sink", second_obj)
      ]),
      _define_artifact_test("duped-artifacts", "duplicate artifacts", [
          _make_mock_artifact("simple-sink", single_obj),
          _make_mock_artifact("simple-sink", single_obj)
      ]),
      _define_artifact_test("two-requests", "artifacts to two requests", [
          _make_mock_artifact("simple-sink", single_obj),
          _make_mock_artifact("second-sink", second_obj)
      ])
  ]


def _define_artifact_test(test_name, artifact_desc, artifacts):
  """
  Helper function to dedupe boilerplate for specifying simple ArchiveArtifact
    tests. Not usable for testing artifacts for multiple requests in one test.
    Args:
      test_name: Unique name for this particular test. Must be unique across all
        tests for this RTD, but will be prefixed with the RTD name so can
        overlap with test names for other RTDs. Also used to name the request
        for the purposes of the ArchiveArtifact RPC. Tests which report
        artifacts for multiple requests should not use this helper function.
      artifact_desc: simple text description of the type of artifact archived.
        Used in docstring and purpose string.
      artifacts: List of MockArtifact objects which will be archived in this
        test.
    Returns:
      metadata.Test object
  """
  return test_common.define_test(
      test_name = test_name,
      purpose = "report a {} to the RTS.".format(artifact_desc),
      doc = DOC.format(name = test_name, artifact_desc = artifact_desc),
      owner_emails = ["email_addr@chromium.org"],
      owner_groups = ["team-mdb-group"],
      setup = test_common.define_setup(setup_config = {"artifacts": artifacts}),
      attrs = ["suite:dummy"],
      steps = [_archive_step("{}-request".format(test_name))]
  )

single_obj = """Hamlet: Methinks it is like a weasel.
Polonius: It is backed like a weasel."""

second_obj = "To be, or not to be, that is the question"

def _make_mock_artifact(sink, obj):
  return tnull_pb.MockArtifact(
      name = sink,
      file_bytes = obj
  )


def _archive_step(request_name):
  return {
      "method": "archive",
      "common_args": {
          "request": request_name,
      },
  }

TESTS= _tests()
