~abentley/juju-ci-tools/client-from-config-4

« back to all changes in this revision

Viewing changes to tests/test_assess_multi_series_charms.py

  • Committer: Curtis Hovey
  • Date: 2015-12-20 15:14:05 UTC
  • Revision ID: curtis@canonical.com-20151220151405-pm3dauunjr2978gz
skip any client-server that starts with 1.26.

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 os
10
 
import StringIO
11
 
import subprocess
12
 
 
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 (
25
 
    JujuAssertionError,
26
 
    temp_dir,
27
 
)
28
 
 
29
 
 
30
 
class TestParseArgs(TestCase):
31
 
    def test_common_args(self):
32
 
        args = parse_args(["an-env", "/bin/juju", "/tmp/logs", "an-env-mod"])
33
 
        self.assertEqual("an-env", args.env)
34
 
        self.assertEqual("/bin/juju", args.juju_bin)
35
 
        self.assertEqual("/tmp/logs", args.logs)
36
 
        self.assertEqual("an-env-mod", args.temp_env_name)
37
 
        self.assertEqual(False, args.debug)
38
 
 
39
 
    def test_help(self):
40
 
        fake_stdout = StringIO.StringIO()
41
 
        with parse_error(self) as fake_stderr:
42
 
            with patch("sys.stdout", fake_stdout):
43
 
                parse_args(["--help"])
44
 
        self.assertEqual("", fake_stderr.getvalue())
45
 
        self.assertNotIn("TODO", fake_stdout.getvalue())
46
 
 
47
 
 
48
 
class TestMain(TestCase):
49
 
    def test_main(self):
50
 
        argv = ["an-env", "/bin/juju", "/tmp/logs", "an-env-mod", "--verbose"]
51
 
        client = Mock(spec=["is_jes_enabled"])
52
 
        with patch("assess_multi_series_charms.configure_logging",
53
 
                   autospec=True) as mock_cl:
54
 
            with patch("assess_multi_series_charms.BootstrapManager."
55
 
                       "booted_context",
56
 
                       autospec=True) as mock_bc:
57
 
                with patch("deploy_stack.client_from_config",
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_c.assert_called_once_with('an-env', "/bin/juju", debug=False)
65
 
        self.assertEqual(mock_bc.call_count, 1)
66
 
        mock_assess.assert_called_once_with(client)
67
 
 
68
 
 
69
 
class TestAssess(TestCase):
70
 
 
71
 
    def test_assess_multi_series_charms(self):
72
 
        mock_client = Mock(
73
 
            spec=["deploy", "get_juju_output", "wait_for_started",
74
 
                  "is_juju1x"])
75
 
        mock_client.version = '2.0.0'
76
 
        mock_client.is_juju1x.return_value = False
77
 
        mock_client.get_juju_output.return_value = "Codename:   trusty"
78
 
        mock_client.deploy.side_effect = [
79
 
            subprocess.CalledProcessError(None, None),
80
 
            None,
81
 
            None,
82
 
            None,
83
 
            None
84
 
        ]
85
 
        with temp_dir() as charm_dir:
86
 
            with patch('assess_multi_series_charms.temp_dir',
87
 
                       autospec=True) as td_mock:
88
 
                td_mock.return_value.__enter__.return_value = charm_dir
89
 
                with patch('assess_multi_series_charms.check_series',
90
 
                           autospec=True) as cs_mock:
91
 
                    assess_multi_series_charms(mock_client)
92
 
        self.assertEqual(mock_client.wait_for_started.call_count, 4)
93
 
        charm = os.path.join(charm_dir, 'trusty', 'dummy')
94
 
        calls = [
95
 
            call(charm=charm, force=False, repository=charm_dir,
96
 
                 series='precise', service='test0'),
97
 
            call(charm=charm, force=False, repository=charm_dir,
98
 
                 series=None, service='test1'),
99
 
            call(charm=charm, force=False, repository=charm_dir,
100
 
                 series='trusty', service='test2'),
101
 
            call(charm=charm, force=False, repository=charm_dir,
102
 
                 series='xenial', service='test3'),
103
 
            call(charm=charm, force=True, repository=charm_dir,
104
 
                 series='precise', service='test4')
105
 
        ]
106
 
        self.assertEqual(mock_client.deploy.mock_calls, calls)
107
 
        td_mock.assert_called_once_with()
108
 
        cs_calls = [
109
 
            call(mock_client, machine='0', series=None),
110
 
            call(mock_client, machine='1', series='trusty'),
111
 
            call(mock_client, machine='2', series='xenial'),
112
 
            call(mock_client, machine='3', series='precise')]
113
 
        self.assertEqual(cs_mock.mock_calls, cs_calls)
114
 
 
115
 
    def test_assess_multi_series_charms_juju1x(self):
116
 
        mock_client = Mock(
117
 
            spec=[
118
 
                "deploy", "get_juju_output", "wait_for_started", "is_juju1x"])
119
 
        mock_client.version = '1.25.5'
120
 
        mock_client.is_juju1x.return_value = True
121
 
        mock_client.get_juju_output.return_value = "Codename:   trusty"
122
 
        mock_client.deploy.return_value = None
123
 
        with temp_dir() as charm_dir:
124
 
            with patch('assess_multi_series_charms.temp_dir',
125
 
                       autospec=True) as td_mock:
126
 
                td_mock.return_value.__enter__.return_value = charm_dir
127
 
                with patch('assess_multi_series_charms.check_series',
128
 
                           autospec=True) as cs_mock:
129
 
                    assess_multi_series_charms(mock_client)
130
 
        self.assertEqual(mock_client.wait_for_started.call_count, 2)
131
 
        charm = os.path.join('local:trusty', 'dummy')
132
 
        calls = [
133
 
            call(charm=charm, force=False, repository=charm_dir,
134
 
                 series=None, service='test1'),
135
 
            call(charm=charm, force=False, repository=charm_dir,
136
 
                 series='trusty', service='test2')
137
 
        ]
138
 
        self.assertEqual(mock_client.deploy.mock_calls, calls)
139
 
        td_mock.assert_called_once_with()
140
 
        cs_calls = [
141
 
            call(mock_client, machine='0', series=None),
142
 
            call(mock_client, machine='1', series='trusty')]
143
 
        self.assertEqual(cs_mock.mock_calls, cs_calls)
144
 
 
145
 
    def test_assert_deploy(self):
146
 
        test = Test(series='trusty', service='test1', force=False,
147
 
                    success=True, machine='0', juju1x_supported=False)
148
 
        mock_client = Mock(
149
 
            spec=["deploy", "get_juju_output", "wait_for_started"])
150
 
        assert_deploy(mock_client, test, '/tmp/foo')
151
 
        mock_client.deploy.assert_called_once_with(
152
 
            charm='/tmp/foo', force=False, repository=None, series='trusty',
153
 
            service='test1')
154
 
 
155
 
    def test_assert_deploy_success_false(self):
156
 
        test = Test(series='trusty', service='test1', force=False,
157
 
                    success=False, machine='0',  juju1x_supported=False)
158
 
        mock_client = Mock(
159
 
            spec=["deploy", "get_juju_output", "wait_for_started"])
160
 
        mock_client.deploy.side_effect = subprocess.CalledProcessError(
161
 
            None, None)
162
 
        assert_deploy(mock_client, test, '/tmp/foo')
163
 
        mock_client.deploy.assert_called_once_with(
164
 
            charm='/tmp/foo', force=False, repository=None, series='trusty',
165
 
            service='test1')
166
 
 
167
 
    def test_assert_deploy_success_false_raises_exception(self):
168
 
        test = Test(series='trusty', service='test1', force=False,
169
 
                    success=False, machine='0',  juju1x_supported=False)
170
 
        mock_client = Mock(
171
 
            spec=["deploy", "get_juju_output", "wait_for_started"])
172
 
        with self.assertRaisesRegexp(
173
 
                JujuAssertionError, 'Assert deploy failed for'):
174
 
            assert_deploy(mock_client, test, '/tmp/foo')
175
 
        mock_client.deploy.assert_called_once_with(
176
 
            charm='/tmp/foo', force=False, repository=None, series='trusty',
177
 
            service='test1')