# Copyright 2018 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.

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

from skylab_staging import test_push


EXAMPLE_TEST_RESULTS = [
    ('dummy_PassServer', 'GOOD'),
    ('dummy_PassServer', 'GOOD'),
    ('dummy_Fail.Fail', 'FAIL'),
    ('dummy_Pass.actionable', 'GOOD'),
    ('dummy_Pass.bluetooth', 'GOOD'),
    ('dummy_Pass', 'GOOD'),
    ('dummy_Fail.Error', 'ERROR'),
    ('dummy_Fail.Warn', 'WARN'),
    ('dummy_Fail.NAError', 'TEST_NA'),
    ('dummy_Fail.Crash', 'GOOD'),
    ('login_LoginSuccess', 'GOOD'),
    ('provision_AutoUpdate.double', 'GOOD'),
    ('tast', 'GOOD'),
    ('tast.example.Pass', 'GOOD'),
    ('tast.example.Perf', 'GOOD'),
    ('tast.example.ReconnectDUT', 'GOOD'),
]


def _construct_test_views_list():
  return [{'test_name':r[0], 'status':r[1]} for r in EXAMPLE_TEST_RESULTS]


def test_successful_test_push():
  """Test a successfully passed test push."""
  available_views = _construct_test_views_list()
  summary = test_push._verify_and_summarize(available_views,
                                            test_push._EXPECTED_TEST_RESULTS)
  assert len(summary) == 0


def test_failing_test():
  """Test a test push with a failed test."""
  available_views = _construct_test_views_list()
  for v in available_views:
    if v['test_name'] == 'dummy_Pass':
      v['status'] = 'Fail'

  summary = test_push._verify_and_summarize(available_views,
                                            test_push._EXPECTED_TEST_RESULTS)
  assert len(summary) != 0
  assert 'dummy_Pass' in summary[1]


def test_missing_test():
  """Test a test push with a missing test."""
  available_views = _construct_test_views_list()
  for v in available_views:
    if v['test_name'] == 'login_LoginSuccess':
      available_views.remove(v)

  summary = test_push._verify_and_summarize(available_views,
                                            test_push._EXPECTED_TEST_RESULTS)
  assert len(summary) != 0
  assert 'login_LoginSuccess' in summary[1]


def test_incorrect_test_count():
  """Test a test push with a failed test."""
  available_views = _construct_test_views_list()
  available_views.append({'test_name': 'dummy_Fail.Fail', 'status': 'FAIL'})

  summary = test_push._verify_and_summarize(available_views,
                                            test_push._EXPECTED_TEST_RESULTS)
  assert len(summary) != 0
  assert 'dummy_Fail.Fail' in summary[1]
