Merge lp:~nskaggs/juju-ci-tools/add-assess-terms into lp:juju-ci-tools

Proposed by Nicholas Skaggs
Status: Work in progress
Proposed branch: lp:~nskaggs/juju-ci-tools/add-assess-terms
Merge into: lp:juju-ci-tools
Prerequisite: lp:~nskaggs/juju-ci-tools/add-term-charms
Diff against target: 182 lines (+173/-0)
2 files modified
assess_terms.py (+94/-0)
tests/test_assess_terms.py (+79/-0)
To merge this branch: bzr merge lp:~nskaggs/juju-ci-tools/add-assess-terms
Reviewer Review Type Date Requested Status
Juju Release Engineering Pending
Review via email: mp+321313@code.launchpad.net

Description of the change

This implements a basic test for various charm types that contain metrics, terms and plans

To post a comment you must log in.

Unmerged revisions

1934. By Nicholas Skaggs

working PoC

1933. By Nicholas Skaggs

update deploy

1932. By Nicholas Skaggs

fix repo

1931. By Nicholas Skaggs

fix location

1930. By Nicholas Skaggs

Create assess terms

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added file 'assess_terms.py'
--- assess_terms.py 1970-01-01 00:00:00 +0000
+++ assess_terms.py 2017-03-29 15:30:53 +0000
@@ -0,0 +1,94 @@
1#!/usr/bin/env python
2"""
3This test will test a suite of charms that require combinations of terms,
4metrics, and commerical features.
5
6"""
7from __future__ import print_function
8
9import argparse
10from collections import namedtuple
11import logging
12import subprocess
13import sys
14
15from deploy_stack import BootstrapManager
16from jujucharm import (
17 local_charm_path,
18)
19from utility import (
20 add_basic_testing_arguments,
21 configure_logging,
22 JujuAssertionError,
23)
24
25__metaclass__ = type
26
27log = logging.getLogger("assess_terms")
28
29
30Test = namedtuple("Test", ["charm_name", "series", "success"])
31
32
33def assess_terms(client):
34 """Assess charm combinations
35
36 :param client: Juju client.
37 :type client: jujupy.ModelClient
38 :return: None
39 """
40 tests = [
41 Test(charm_name="canonical-terms-example",
42 series="xenial", success=False),
43 ]
44 for test in tests:
45 test_charm = local_charm_path(
46 charm=test.charm_name, juju_ver=client.version, series=test.series)
47 log.info(
48 "Assessing charm: test: {} charm_dir:{}".format(
49 test, charm_path))
50 assert_deploy(client, test, test_charm)
51
52
53def assert_deploy(client, test, test_charm):
54 """Deploy a charm and assert a success or fail.
55
56 :param client: Juju client
57 :type client: jujupy.ModelClient
58 :param test: Deploy test data.
59 :type test: Test
60 :param charm_dir:
61 :type charm_dir: str
62 :return: None
63 """
64 if test.success:
65 client.deploy(charm=test_charm, series=test.series)
66 client.wait_for_started()
67 else:
68 try:
69 client.deploy(charm=test_charm, series=test.series)
70 except subprocess.CalledProcessError:
71 return
72 raise JujuAssertionError('Assert deploy failed for {}'.format(test))
73
74
75def parse_args(argv):
76 """Parse all arguments."""
77 parser = argparse.ArgumentParser(
78 description=("Test charms with combinations of terms, "
79 "plans and commercial support"))
80 add_basic_testing_arguments(parser)
81 return parser.parse_args(argv)
82
83
84def main(argv=None):
85 args = parse_args(argv)
86 configure_logging(args.verbose)
87 bs_manager = BootstrapManager.from_args(args)
88 with bs_manager.booted_context(args.upload_tools):
89 assess_terms(bs_manager.client)
90 return 0
91
92
93if __name__ == '__main__':
94 sys.exit(main())
095
=== added file 'tests/test_assess_terms.py'
--- tests/test_assess_terms.py 1970-01-01 00:00:00 +0000
+++ tests/test_assess_terms.py 2017-03-29 15:30:53 +0000
@@ -0,0 +1,79 @@
1"""Tests for assess_terms module."""
2
3import logging
4import StringIO
5
6from mock import (
7 Mock,
8 patch,
9 )
10
11from assess_terms import (
12 assess_terms,
13 parse_args,
14 main,
15 )
16from fakejuju import fake_juju_client
17from tests import (
18 parse_error,
19 TestCase,
20 )
21
22
23class TestParseArgs(TestCase):
24
25 def test_common_args(self):
26 args = parse_args(["an-env", "/bin/juju", "/tmp/logs", "an-env-mod"])
27 self.assertEqual("an-env", args.env)
28 self.assertEqual("/bin/juju", args.juju_bin)
29 self.assertEqual("/tmp/logs", args.logs)
30 self.assertEqual("an-env-mod", args.temp_env_name)
31 self.assertEqual(False, args.debug)
32
33 def test_help(self):
34 fake_stdout = StringIO.StringIO()
35 with parse_error(self) as fake_stderr:
36 with patch("sys.stdout", fake_stdout):
37 parse_args(["--help"])
38 self.assertEqual("", fake_stderr.getvalue())
39 self.assertNotIn("TODO", fake_stdout.getvalue())
40
41
42class TestMain(TestCase):
43
44 def test_main(self):
45 argv = ["an-env", "/bin/juju", "/tmp/logs", "an-env-mod", "--verbose"]
46 env = object()
47 client = Mock(spec=["is_jes_enabled"])
48 with patch("assess_terms.configure_logging",
49 autospec=True) as mock_cl:
50 with patch("assess_terms.BootstrapManager.booted_context",
51 autospec=True) as mock_bc:
52 with patch('deploy_stack.client_from_config',
53 return_value=client) as mock_cfc:
54 with patch("assess_terms.assess_terms",
55 autospec=True) as mock_assess:
56 main(argv)
57 mock_cl.assert_called_once_with(logging.DEBUG)
58 mock_cfc.assert_called_once_with('an-env', "/bin/juju", debug=False,
59 soft_deadline=None)
60 self.assertEqual(mock_bc.call_count, 1)
61 mock_assess.assert_called_once_with(client)
62
63
64class TestAssess(TestCase):
65
66 def test_terms(self):
67 # Using fake_client means that deploy and get_status have plausible
68 # results. Wrapping it in a Mock causes every call to be recorded, and
69 # allows assertions to be made about calls. Mocks and the fake client
70 # can also be used separately.
71 fake_client = Mock(wraps=fake_juju_client())
72 fake_client.bootstrap()
73 assess_terms(fake_client)
74 fake_client.deploy.assert_called_once_with(
75 'local:trusty/my-charm')
76 fake_client.wait_for_started.assert_called_once_with()
77 self.assertEqual(
78 1, fake_client.get_status().get_service_unit_count('my-charm'))
79 self.assertNotIn("TODO", self.log_stream.getvalue())

Subscribers

People subscribed via source and target branches