# Copyright 2017 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.
from autotest_lib.server.cros.cfm.configurable_test.dsl import *
from autotest_lib.server import utils

AUTHOR = "kerl@google.com, chromeos-meetings@google.com"
NAME = "enterprise_CFM_ConfigurableCfmTestSanity.verifications"
PURPOSE = "Verifies the configurable CfM test infra with a simple scenario"
CRITERIA = "No errors occur"
ATTRIBUTES = "suite:bluestreak-perbuild, suite:bluestreak-pre-cq"
TIME = "SHORT"
TEST_CATEGORY = "Functional"
TEST_TYPE = "server"
DEPENDENCIES="meet_app"

DOC = """
Verifies that we can specify and run verification and assertion steps in a
configurable CFM test.
"""

cfm_test = CfmTest(
    scenario=Scenario(
        AssertUsbDevices(ATRUS, lambda devices: True),
        RetryAssertAction(
            AssertFileDoesNotContain('/var/log/messages', ['FOOERRORBAR']),
            5,
            0.1),
        Sleep(0.1),
        AssertFileDoesNotContain('/var/log/eventlog.txt', ['FOOERRORBAR']),
        # Create some silly scenarios to be selected at random. The purpose
        # of this is only to test the SelectScenarioAtRandom action.
        SelectScenarioAtRandom(scenarios=[
                Scenario(AssertUsbDevices(ATRUS, lambda devices: True),
                    AssertFileDoesNotContain('/var/log/messages',
                                             ['FOOERRORBAR'])),
                Scenario(AssertUsbDevices(HUDDLY_GO, lambda devices: True)),
                Scenario(AssertUsbDevices(ATRUS, lambda devices: True))],
            run_times=3)
    ),

    configuration=Configuration(
        run_test_only = True
    )
)

args_dict = utils.args_to_dict(args)
servo_args = hosts.CrosHost.get_servo_arguments(args_dict)
def run_test(machine):
    job.run_test("enterprise_CFM_ConfigurableCfmTestSanity",
                 cfm_test = cfm_test,
                 tag = 'verifications',
                 host = hosts.create_host(machine, servo_args=servo_args))


parallel_simple(run_test, machines)
