~abentley/juju-ci-tools/more-logs

« back to all changes in this revision

Viewing changes to tests/test_assess_multi_series_charms.py

Added multi series charm CI tests.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
"""Tests for assess_multi_series_charms module."""
 
2
 
 
3
import logging
 
4
from mock import (
 
5
    call,
 
6
    Mock,
 
7
    patch,
 
8
)
 
9
import StringIO
 
10
import subprocess
 
11
 
 
12
from assess_min_version import JujuAssertionError
 
13
from assess_multi_series_charms import (
 
14
    assert_deploy,
 
15
    assess_multi_series_charms,
 
16
    parse_args,
 
17
    main,
 
18
    Test,
 
19
)
 
20
from tests import (
 
21
    parse_error,
 
22
    TestCase,
 
23
)
 
24
from utility import temp_dir
 
25
 
 
26
 
 
27
class TestParseArgs(TestCase):
 
28
    def test_common_args(self):
 
29
        args = parse_args(["an-env", "/bin/juju", "/tmp/logs", "an-env-mod"])
 
30
        self.assertEqual("an-env", args.env)
 
31
        self.assertEqual("/bin/juju", args.juju_bin)
 
32
        self.assertEqual("/tmp/logs", args.logs)
 
33
        self.assertEqual("an-env-mod", args.temp_env_name)
 
34
        self.assertEqual(False, args.debug)
 
35
 
 
36
    def test_help(self):
 
37
        fake_stdout = StringIO.StringIO()
 
38
        with parse_error(self) as fake_stderr:
 
39
            with patch("sys.stdout", fake_stdout):
 
40
                parse_args(["--help"])
 
41
        self.assertEqual("", fake_stderr.getvalue())
 
42
        self.assertNotIn("TODO", fake_stdout.getvalue())
 
43
 
 
44
 
 
45
class TestMain(TestCase):
 
46
    def test_main(self):
 
47
        argv = ["an-env", "/bin/juju", "/tmp/logs", "an-env-mod", "--verbose"]
 
48
        env = object()
 
49
        client = Mock(spec=["is_jes_enabled"])
 
50
        with patch("assess_multi_series_charms.configure_logging",
 
51
                   autospec=True) as mock_cl:
 
52
            with patch("assess_multi_series_charms.BootstrapManager."
 
53
                       "booted_context",
 
54
                       autospec=True) as mock_bc:
 
55
                with patch("jujupy.SimpleEnvironment.from_config",
 
56
                           return_value=env) as mock_e:
 
57
                    with patch("jujupy.EnvJujuClient.by_version",
 
58
                               return_value=client) as mock_c:
 
59
                        with patch("assess_multi_series_charms."
 
60
                                   "assess_multi_series_charms",
 
61
                                   autospec=True) as mock_assess:
 
62
                            main(argv)
 
63
        mock_cl.assert_called_once_with(logging.DEBUG)
 
64
        mock_e.assert_called_once_with("an-env")
 
65
        mock_c.assert_called_once_with(env, "/bin/juju", debug=False)
 
66
        self.assertEqual(mock_bc.call_count, 1)
 
67
        mock_assess.assert_called_once_with(client)
 
68
 
 
69
 
 
70
class TestAssess(TestCase):
 
71
 
 
72
    def test_assess_multi_series_charms(self):
 
73
        mock_client = Mock(
 
74
            spec=["deploy", "get_juju_output", "wait_for_started"])
 
75
        mock_client.get_juju_output.return_value = "Codename:   trusty"
 
76
        mock_client.deploy.side_effect = [
 
77
            subprocess.CalledProcessError(None, None),
 
78
            None,
 
79
            None,
 
80
            None,
 
81
            None
 
82
        ]
 
83
        with temp_dir() as charm_dir:
 
84
            with patch('assess_multi_series_charms.temp_dir',
 
85
                       autospec=True) as td_mock:
 
86
                td_mock.return_value.__enter__.return_value = charm_dir
 
87
                with patch('assess_multi_series_charms.check_series',
 
88
                           autospec=True) as cs_mock:
 
89
                    assess_multi_series_charms(mock_client)
 
90
        self.assertEqual(mock_client.wait_for_started.call_count, 4)
 
91
        calls = [
 
92
            call(charm=charm_dir, force=False, series='precise',
 
93
                 service='test0'),
 
94
            call(charm=charm_dir, force=False, series=None, service='test1'),
 
95
            call(charm=charm_dir, force=False, series='trusty',
 
96
                 service='test2'),
 
97
            call(charm=charm_dir, force=False, series='xenial',
 
98
                 service='test3'),
 
99
            call(charm=charm_dir, force=True, series='precise',
 
100
                 service='test4')
 
101
        ]
 
102
        self.assertEqual(mock_client.deploy.mock_calls, calls)
 
103
        td_mock.assert_called_once_with()
 
104
        cs_calls = [
 
105
            call(mock_client, machine='0', series=None),
 
106
            call(mock_client, machine='1', series='trusty'),
 
107
            call(mock_client, machine='2', series='xenial'),
 
108
            call(mock_client, machine='3', series='precise')]
 
109
        self.assertEqual(cs_mock.mock_calls, cs_calls)
 
110
 
 
111
    def test_assert_deploy(self):
 
112
        test = Test(series='trusty', service='test1', force=False,
 
113
                    success=True, machine='0')
 
114
        mock_client = Mock(
 
115
            spec=["deploy", "get_juju_output", "wait_for_started"])
 
116
        assert_deploy(mock_client, test, '/tmp/foo')
 
117
        mock_client.deploy.assert_called_once_with(
 
118
            charm='/tmp/foo', force=False, series='trusty', service='test1')
 
119
 
 
120
    def test_assert_deploy_success_false(self):
 
121
        test = Test(series='trusty', service='test1', force=False,
 
122
                    success=False, machine='0')
 
123
        mock_client = Mock(
 
124
            spec=["deploy", "get_juju_output", "wait_for_started"])
 
125
        mock_client.deploy.side_effect = subprocess.CalledProcessError(
 
126
            None, None)
 
127
        assert_deploy(mock_client, test, '/tmp/foo')
 
128
        mock_client.deploy.assert_called_once_with(
 
129
            charm='/tmp/foo', force=False, series='trusty', service='test1')
 
130
 
 
131
    def test_assert_deploy_success_false_raises_exception(self):
 
132
        test = Test(series='trusty', service='test1', force=False,
 
133
                    success=False, machine='0')
 
134
        mock_client = Mock(
 
135
            spec=["deploy", "get_juju_output", "wait_for_started"])
 
136
        with self.assertRaisesRegexp(
 
137
                JujuAssertionError, 'Assert deploy failed for'):
 
138
            assert_deploy(mock_client, test, '/tmp/foo')
 
139
        mock_client.deploy.assert_called_once_with(
 
140
            charm='/tmp/foo', force=False, series='trusty', service='test1')