#!/usr/bin/python
# Copyright (c) 2013 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.
# pylint: disable-msg=C0111

import unittest
import common
from autotest_lib.site_utils import test_that


class TestThatUnittests(unittest.TestCase):
    def test_validate_arguments(self):
        # Deferred until validate_arguments allows for lab runs.
        pass

    def test_parse_arguments(self):
        args = test_that.parse_arguments(
                ['-b', 'some_board', '-i', 'some_image', '--args', 'some_args',
                 'some_remote', 'test1', 'test2'])
        self.assertEqual('some_board', args.board)
        self.assertEqual('some_image', args.build)
        self.assertEqual('some_args', args.args)
        self.assertEqual('some_remote', args.remote)
        self.assertEqual(['test1', 'test2'], args.tests)

    def test_parse_arguments_internal(self):
        args, remote_argv = test_that._parse_arguments_internal(
                ['-b', 'some_board', '-i', 'some_image', '--args', 'some_args',
                 'some_remote', 'test1', 'test2'])
        self.assertEqual('some_board', args.board)
        self.assertEqual('some_image', args.build)
        self.assertEqual('some_args', args.args)
        self.assertEqual('some_remote', args.remote)
        self.assertEqual(['test1', 'test2'], args.tests)
        self.assertEqual(remote_argv,
                         ['-b', 'some_board', '-i', 'some_image', '--args',
                          'some_args', 'some_remote', 'test1', 'test2'])

    def test_parse_arguments_internal_with_local_argument(self):
        args, remote_argv = test_that._parse_arguments_internal(
                ['-b', 'some_board', '-i', 'some_image', '-w', 'server:port',
                 '--args', 'some_args', 'some_remote', 'test1', 'test2'])
        self.assertEqual('server:port', args.web)
        self.assertEqual('some_board', args.board)
        self.assertEqual('some_image', args.build)
        self.assertEqual('some_args', args.args)
        self.assertEqual('some_remote', args.remote)
        self.assertEqual(['test1', 'test2'], args.tests)
        self.assertEqual(remote_argv,
                         ['-b', 'some_board', '-i', 'some_image', '--args',
                          'some_args', 'some_remote', 'test1', 'test2'])

    def test_parse_arguments_with_local_argument(self):
        args = test_that.parse_arguments(
                ['-b', 'some_board', '-i', 'some_image', '-w', 'server:port',
                 '--args', 'some_args', 'some_remote', 'test1', 'test2'])
        self.assertEqual('server:port', args.web)
        self.assertEqual('some_board', args.board)
        self.assertEqual('some_image', args.build)
        self.assertEqual('some_args', args.args)
        self.assertEqual('some_remote', args.remote)
        self.assertEqual(['test1', 'test2'], args.tests)

    def test_parse_arguments_lab_run_requires_build(self):
        """Running against :lab: requires certain extra arguments."""
        args = test_that.parse_arguments(['-b', 'some_board', ':lab:', 'test1'])
        with self.assertRaises(ValueError):
            test_that.validate_arguments(args)

    def test_parse_arguments_lab_run_disallows_suite_args(self):
        """Running against :lab: requires certain extra arguments."""
        args = test_that.parse_arguments([
                '-b', 'some_board', '-i', 'some_image', '--args', 'some_args',
                ':lab:', 'test1'])
        with self.assertRaises(ValueError):
            test_that.validate_arguments(args)


if __name__ == '__main__':
    unittest.main()
