# Copyright 2014 IBM Corp.
#
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
#    not use this file except in compliance with the License. You may obtain
#    a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#    License for the specific language governing permissions and limitations
#    under the License.

import mock
import testtools

from tempest import cli
from tempest import exceptions
from tempest.tests import base


class TestMinClientVersion(base.TestCase):
    """Tests for the min_client_version decorator.
    """

    def _test_min_version(self, required, installed, expect_skip):

        @cli.min_client_version(client='nova', version=required)
        def fake(self, expect_skip):
            if expect_skip:
                # If we got here, the decorator didn't raise a skipException as
                # expected so we need to fail.
                self.fail('Should not have gotten past the decorator.')

        with mock.patch.object(cli, 'execute',
                               return_value=installed) as mock_cmd:
            if expect_skip:
                self.assertRaises(testtools.TestCase.skipException, fake,
                                  self, expect_skip)
            else:
                fake(self, expect_skip)
            mock_cmd.assert_called_once_with('nova', '', params='--version',
                                             merge_stderr=True)

    def test_min_client_version(self):
        # required, installed, expect_skip
        cases = (('2.17.0', '2.17.0', False),
                 ('2.17.0', '2.18.0', False),
                 ('2.18.0', '2.17.0', True))

        for case in cases:
            self._test_min_version(*case)

    @mock.patch.object(cli, 'execute', return_value=' ')
    def test_check_client_version_empty_output(self, mock_execute):
        # Tests that an exception is raised if the command output is empty.
        self.assertRaises(exceptions.TempestException,
                          cli.check_client_version, 'nova', '2.18.0')
