# Copyright 2019 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 import utils
from autotest_lib.server.cros.bluetooth import bluetooth_test

AUTHOR = 'chromeos-bluetooth'
NAME = 'bluetooth_AdapterSASanity.sa_adapter_discoverable_timeout_test'
PURPOSE = 'Test DiscoverableTimout Property'
CRITERIA = 'Controller should become not discoverable after timeout'
ATTRIBUTES = ('suite:bluetooth, suite:bluetooth_sanity,'
              'suite:bluetooth_standalone')
TIME = 'MEDIUM' # 6 minutes on EVE
TEST_CATEGORY = 'Functional'
TEST_CLASS = 'bluetooth'
TEST_TYPE = 'server'
DEPENDENCIES = 'bluetooth'

DOC = """
    Verify that DiscoverableTimeout Property works as expected

    - Set and Read back DiscoverableTimeout and make sure the values match
    - Set discoverable
    - Check that adapter is discoverable till DiscoverableTimeout and then it
      is not discoverable
    - Set DiscoverableTimeout to default value at the end of the test.

    """

args_dict = utils.args_to_dict(args)
chameleon_args = hosts.CrosHost.get_chameleon_arguments(args_dict)
newblue_enable = args_dict['newblue'] == 'enable'\
  if 'newblue' in args_dict else False

def run(machine):
    host = hosts.create_host(machine,chameleon_args=chameleon_args)
    bluetooth_test.enable_newblue(host=host, enable=newblue_enable)
    job.run_test('bluetooth_AdapterSASanity', host=host,
                 num_iterations=1, test_name=NAME.split('.')[1])

parallel_simple(run, machines)
