Merge lp:~fwereade/pyjuju/fix-mocking into lp:pyjuju

Proposed by William Reade
Status: Merged
Approved by: Gustavo Niemeyer
Approved revision: 281
Merged at revision: 285
Proposed branch: lp:~fwereade/pyjuju/fix-mocking
Merge into: lp:pyjuju
Diff against target: 173 lines (+64/-16)
4 files modified
ensemble/providers/ec2/tests/common.py (+12/-7)
ensemble/providers/ec2/tests/test_bootstrap.py (+4/-4)
ensemble/providers/ec2/tests/test_launch.py (+48/-4)
ensemble/providers/ec2/utils.py (+0/-1)
To merge this branch: bzr merge lp:~fwereade/pyjuju/fix-mocking
Reviewer Review Type Date Requested Status
Gustavo Niemeyer Approve
Kapil Thangavelu (community) Approve
Jim Baker Pending
Review via email: mp+68925@code.launchpad.net

Description of the change

Tests now run with no network.

Not sure how to reliably induce a flaky network to see whether it affects possibly-related timeouts.

Coverage of the code we were failing to mock correctly is now improved.

To post a comment you must log in.
Revision history for this message
Kapil Thangavelu (hazmat) wrote :

looks good, and works nicely disconnected.

review: Approve
Revision history for this message
Gustavo Niemeyer (niemeyer) wrote :

Looks good. Just a minor suggestion:

[1]

24 + if not get_ami_kwargs:
25 + return
26 + get_ami = self.mocker.replace(
27 + "ensemble.providers.ec2.utils.get_current_ami")
28 + get_ami(**get_ami_kwargs)
29 + self.mocker.result(succeed("ami-714ba518"))

I suggest using something like this (untested):

get_ami(KWARGS)
def check_kwargs(**kwargs):
    self.assertEquals(kwargs, get_ami_kwargs)
    return succeed("ami-...")
self.mocker.call(check_kwargs)

The distinction between the two approaches is that with the original version it will
ignore all requests that do not match the provided kwargs, and pass them through.
This version will capture all calls, and ensure they match the expectation.

review: Approve
lp:~fwereade/pyjuju/fix-mocking updated
282. By William Reade

merge from trunk

283. By William Reade

improved test per niemeyer's suggestion

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'ensemble/providers/ec2/tests/common.py'
2--- ensemble/providers/ec2/tests/common.py 2011-07-14 05:40:06 +0000
3+++ ensemble/providers/ec2/tests/common.py 2011-07-27 09:37:19 +0000
4@@ -53,7 +53,7 @@
5 default_zookeeper_host = Instance(
6 "i-es-zoo", "running", private_dns_name="es.example.internal")
7
8- def _mock_launch_utils(self):
9+ def _mock_launch_utils(self, **get_ami_kwargs):
10 get_public_key = self.mocker.replace(
11 "ensemble.providers.common.utils.get_user_authorized_keys")
12
13@@ -62,12 +62,17 @@
14
15 get_public_key(MATCH(match_config))
16 self.mocker.result("zebra")
17- # AMI is not retrieve dynamically at the moment, default values are
18- # utilized.
19- #get_ami = self.mocker.replace(
20- # "ensemble.providers.ec2.utils.get_current_ami")
21- #get_ami()
22- #self.mocker.result(succeed("ami-714ba518"))
23+
24+ if not get_ami_kwargs:
25+ return
26+ get_ami = self.mocker.replace(
27+ "ensemble.providers.ec2.utils.get_current_ami")
28+ get_ami(KWARGS)
29+
30+ def check_kwargs(**kwargs):
31+ self.assertEquals(kwargs, get_ami_kwargs)
32+ return succeed("ami-714ba518")
33+ self.mocker.call(check_kwargs)
34
35 def _mock_create_group(self):
36 group_name = "ensemble-%s" % self.env_name
37
38=== modified file 'ensemble/providers/ec2/tests/test_bootstrap.py'
39--- ensemble/providers/ec2/tests/test_bootstrap.py 2011-07-18 07:07:03 +0000
40+++ ensemble/providers/ec2/tests/test_bootstrap.py 2011-07-27 09:37:19 +0000
41@@ -92,7 +92,7 @@
42 self.ec2.describe_security_groups()
43 self.mocker.result(succeed([]))
44 self._mock_create_group()
45- self._mock_launch_utils()
46+ self._mock_launch_utils(region="us-east-1")
47 self._mock_launch()
48 self.mocker.result(succeed([]))
49 self._mock_save()
50@@ -120,7 +120,7 @@
51 self.ec2.describe_security_groups()
52 self.mocker.result(succeed([
53 SecurityGroup("ensemble-%s" % self.env_name, "")]))
54- self._mock_launch_utils()
55+ self._mock_launch_utils(region="us-east-1")
56 self._mock_launch()
57 self.mocker.result(succeed([]))
58 self._mock_save()
59@@ -196,7 +196,7 @@
60 self.ec2.describe_security_groups()
61 self.mocker.result(succeed([
62 SecurityGroup("ensemble-%s" % self.env_name, "")]))
63- self._mock_launch_utils()
64+ self._mock_launch_utils(region="us-east-1")
65 self._mock_launch()
66 self.mocker.result(succeed(instances))
67 self._mock_save()
68@@ -223,7 +223,7 @@
69 self.ec2.describe_security_groups()
70 self.mocker.result(succeed([
71 SecurityGroup("ensemble-%s" % self.env_name, "")]))
72- self._mock_launch_utils()
73+ self._mock_launch_utils(region="us-east-1")
74 self._mock_launch()
75 self.mocker.result(succeed(instances))
76 self._mock_save()
77
78=== modified file 'ensemble/providers/ec2/tests/test_launch.py'
79--- ensemble/providers/ec2/tests/test_launch.py 2011-07-18 07:07:03 +0000
80+++ ensemble/providers/ec2/tests/test_launch.py 2011-07-27 09:37:19 +0000
81@@ -1,4 +1,4 @@
82-
83+import random
84 from yaml import load
85
86 from twisted.internet.defer import succeed
87@@ -56,7 +56,7 @@
88 self.ec2.describe_security_groups()
89 self.mocker.result(succeed([]))
90 self._mock_create_group()
91- self._mock_launch_utils()
92+ self._mock_launch_utils(region="us-east-1")
93 self._mock_get_zookeeper_hosts()
94 self._mock_launch(instance)
95 self.mocker.replay()
96@@ -77,7 +77,7 @@
97 self.ec2.describe_security_groups()
98 self.mocker.result(succeed([]))
99 self._mock_create_group()
100- self._mock_launch_utils()
101+ self._mock_launch_utils(region="us-east-1")
102 self._mock_get_zookeeper_hosts()
103
104 def verify_provider_type(data):
105@@ -129,7 +129,7 @@
106 self.ec2.describe_security_groups()
107 self.mocker.result(succeed([]))
108 self._mock_create_group()
109- self._mock_launch_utils()
110+ self._mock_launch_utils(region="us-east-1")
111 self._mock_get_zookeeper_hosts()
112
113 def verify_machine_agent(data):
114@@ -146,3 +146,47 @@
115 provider = self.get_provider()
116 d = provider.start_machine({"machine-id": "machine-1"})
117 return d
118+
119+ def _mock_launch_with_ami_params(self, get_ami_kwargs):
120+ instance = Instance("i-foobar", "running", dns_name="x1.example.com")
121+ self.ec2.describe_security_groups()
122+ self.mocker.result(succeed([]))
123+ self._mock_create_group()
124+ self._mock_launch_utils(**get_ami_kwargs)
125+ self._mock_get_zookeeper_hosts()
126+ self._mock_launch(instance)
127+
128+ def test_launch_options_known_ami(self):
129+ self._mock_launch_with_ami_params({})
130+ self.mocker.replay()
131+
132+ provider = self.get_provider()
133+ # TODO shouldn't something be testing we actually launch
134+ # an instance of the expected AMI?
135+ provider.config["default-image-id"] = "ami-XXXXXX"
136+ return provider.start_machine({"machine-id": "machine-1"})
137+
138+ def test_launch_options_region(self):
139+ self._mock_launch_with_ami_params({"region":"somewhere-else-1"})
140+ self.mocker.replay()
141+
142+ provider = self.get_provider()
143+ provider.config["region"] = "somewhere-else-1"
144+ return provider.start_machine({"machine-id": "machine-1"})
145+
146+ def test_launch_options_other(self):
147+ self._mock_launch_with_ami_params({
148+ "region": "us-east-1",
149+ "ubuntu_release_name": "choleric",
150+ "arch": "quantum86",
151+ "ebs": "maybe",
152+ "daily": "perhaps"})
153+ self.mocker.replay()
154+
155+ provider = self.get_provider()
156+ return provider.start_machine({
157+ "machine-id": "machine-1",
158+ "image_release_name": "choleric",
159+ "image_arch": "quantum86",
160+ "image_ebs": "maybe",
161+ "image_daily": "perhaps"})
162
163=== modified file 'ensemble/providers/ec2/utils.py'
164--- ensemble/providers/ec2/utils.py 2011-07-13 03:39:28 +0000
165+++ ensemble/providers/ec2/utils.py 2011-07-27 09:37:19 +0000
166@@ -32,7 +32,6 @@
167 region="us-east-1", daily=False, desktop=False,
168 url_fetch=None):
169 """Get the latest ami for the last release of ubuntu."""
170-
171 data = {}
172 data["ubuntu_release_name"] = ubuntu_release_name
173 data["version"] = daily and "daily" or "released"

Subscribers

People subscribed via source and target branches

to status/vote changes: