Skip to content

Commit 22cee10

Browse files
author
Dean Troyer
committed
Beef up network functional tests
We need to get more thorough in our functional testing, so start by adding tests for all create and set options, check return values. This also removes most of the setupClass() and teardownClass() methods as they held common state that was subject to race conditions when running tests in parallel. Change-Id: I4179f493cea971b7c576ffbf501330b5c57f52f3
1 parent f020a9f commit 22cee10

1 file changed

Lines changed: 235 additions & 24 deletions

File tree

openstackclient/tests/functional/network/v2/test_network.py

Lines changed: 235 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,41 +10,252 @@
1010
# License for the specific language governing permissions and limitations
1111
# under the License.
1212

13+
import re
1314
import uuid
1415

1516
from openstackclient.tests.functional import base
1617

1718

1819
class NetworkTests(base.TestCase):
19-
"""Functional tests for network. """
20-
NAME = uuid.uuid4().hex
21-
HEADERS = ['Name']
22-
FIELDS = ['name']
20+
"""Functional tests for network"""
2321

2422
@classmethod
2523
def setUpClass(cls):
26-
opts = cls.get_opts(cls.FIELDS)
27-
raw_output = cls.openstack('network create ' + cls.NAME + opts)
28-
expected = cls.NAME + '\n'
29-
cls.assertOutput(expected, raw_output)
24+
# Set up some regex for matching below
25+
cls.re_id = re.compile("id\s+\|\s+(\S+)")
26+
cls.re_description = re.compile("description\s+\|\s+([^|]+?)\s+\|")
27+
cls.re_enabled = re.compile("admin_state_up\s+\|\s+(\S+)")
28+
cls.re_shared = re.compile("shared\s+\|\s+(\S+)")
29+
cls.re_external = re.compile("router:external\s+\|\s+(\S+)")
30+
cls.re_default = re.compile("is_default\s+\|\s+(\S+)")
31+
cls.re_port_security = re.compile(
32+
"port_security_enabled\s+\|\s+(\S+)"
33+
)
3034

31-
@classmethod
32-
def tearDownClass(cls):
33-
raw_output = cls.openstack('network delete ' + cls.NAME)
34-
cls.assertOutput('', raw_output)
35+
def test_network_delete(self):
36+
"""Test create, delete multiple"""
37+
name1 = uuid.uuid4().hex
38+
raw_output = self.openstack(
39+
'network create ' +
40+
'--description aaaa ' +
41+
name1
42+
)
43+
self.assertEqual(
44+
'aaaa',
45+
re.search(self.re_description, raw_output).group(1),
46+
)
47+
name2 = uuid.uuid4().hex
48+
raw_output = self.openstack(
49+
'network create ' +
50+
'--description bbbb ' +
51+
name2
52+
)
53+
self.assertEqual(
54+
'bbbb',
55+
re.search(self.re_description, raw_output).group(1),
56+
)
57+
58+
del_output = self.openstack('network delete ' + name1 + ' ' + name2)
59+
self.assertOutput('', del_output)
3560

3661
def test_network_list(self):
37-
opts = self.get_opts(self.HEADERS)
38-
raw_output = self.openstack('network list' + opts)
39-
self.assertIn(self.NAME, raw_output)
62+
"""Test create defaults, list filters, delete"""
63+
name1 = uuid.uuid4().hex
64+
raw_output = self.openstack(
65+
'network create ' +
66+
'--description aaaa ' +
67+
name1
68+
)
69+
self.addCleanup(self.openstack, 'network delete ' + name1)
70+
self.assertEqual(
71+
'aaaa',
72+
re.search(self.re_description, raw_output).group(1),
73+
)
74+
# Check the default values
75+
self.assertEqual(
76+
'UP',
77+
re.search(self.re_enabled, raw_output).group(1),
78+
)
79+
self.assertEqual(
80+
'False',
81+
re.search(self.re_shared, raw_output).group(1),
82+
)
83+
self.assertEqual(
84+
'Internal',
85+
re.search(self.re_external, raw_output).group(1),
86+
)
87+
# NOTE(dtroyer): is_default is not present in the create output
88+
# so make sure it stays that way.
89+
self.assertIsNone(re.search(self.re_default, raw_output))
90+
self.assertEqual(
91+
'True',
92+
re.search(self.re_port_security, raw_output).group(1),
93+
)
94+
95+
name2 = uuid.uuid4().hex
96+
raw_output = self.openstack(
97+
'network create ' +
98+
'--description bbbb ' +
99+
'--disable ' +
100+
'--share ' +
101+
name2
102+
)
103+
self.addCleanup(self.openstack, 'network delete ' + name2)
104+
self.assertEqual(
105+
'bbbb',
106+
re.search(self.re_description, raw_output).group(1),
107+
)
108+
self.assertEqual(
109+
'DOWN',
110+
re.search(self.re_enabled, raw_output).group(1),
111+
)
112+
self.assertEqual(
113+
'True',
114+
re.search(self.re_shared, raw_output).group(1),
115+
)
116+
117+
# Test list --long
118+
raw_output = self.openstack('network list --long')
119+
self.assertIsNotNone(
120+
re.search("\|\s+" + name1 + "\s+\|\s+ACTIVE", raw_output)
121+
)
122+
self.assertIsNotNone(
123+
re.search("\|\s+" + name2 + "\s+\|\s+ACTIVE", raw_output)
124+
)
125+
126+
# Test list --long --enable
127+
raw_output = self.openstack('network list --long --enable')
128+
self.assertIsNotNone(
129+
re.search("\|\s+" + name1 + "\s+\|\s+ACTIVE", raw_output)
130+
)
131+
self.assertIsNone(
132+
re.search("\|\s+" + name2 + "\s+\|\s+ACTIVE", raw_output)
133+
)
134+
135+
# Test list --long --disable
136+
raw_output = self.openstack('network list --long --disable')
137+
self.assertIsNone(
138+
re.search("\|\s+" + name1 + "\s+\|\s+ACTIVE", raw_output)
139+
)
140+
self.assertIsNotNone(
141+
re.search("\|\s+" + name2 + "\s+\|\s+ACTIVE", raw_output)
142+
)
143+
144+
# Test list --long --share
145+
raw_output = self.openstack('network list --long --share')
146+
self.assertIsNone(
147+
re.search("\|\s+" + name1 + "\s+\|\s+ACTIVE", raw_output)
148+
)
149+
self.assertIsNotNone(
150+
re.search("\|\s+" + name2 + "\s+\|\s+ACTIVE", raw_output)
151+
)
152+
153+
# Test list --long --no-share
154+
raw_output = self.openstack('network list --long --no-share')
155+
self.assertIsNotNone(
156+
re.search("\|\s+" + name1 + "\s+\|\s+ACTIVE", raw_output)
157+
)
158+
self.assertIsNone(
159+
re.search("\|\s+" + name2 + "\s+\|\s+ACTIVE", raw_output)
160+
)
40161

41162
def test_network_set(self):
42-
raw_output = self.openstack('network set --disable ' + self.NAME)
43-
opts = self.get_opts(['name', 'admin_state_up'])
44-
raw_output = self.openstack('network show ' + self.NAME + opts)
45-
self.assertEqual("DOWN\n" + self.NAME + "\n", raw_output)
46-
47-
def test_network_show(self):
48-
opts = self.get_opts(self.FIELDS)
49-
raw_output = self.openstack('network show ' + self.NAME + opts)
50-
self.assertEqual(self.NAME + "\n", raw_output)
163+
"""Tests create options, set, show, delete"""
164+
name = uuid.uuid4().hex
165+
raw_output = self.openstack(
166+
'network create ' +
167+
'--description aaaa ' +
168+
'--enable ' +
169+
'--no-share ' +
170+
'--internal ' +
171+
'--no-default ' +
172+
'--enable-port-security ' +
173+
name
174+
)
175+
self.addCleanup(self.openstack, 'network delete ' + name)
176+
self.assertEqual(
177+
'aaaa',
178+
re.search(self.re_description, raw_output).group(1),
179+
)
180+
self.assertEqual(
181+
'UP',
182+
re.search(self.re_enabled, raw_output).group(1),
183+
)
184+
self.assertEqual(
185+
'False',
186+
re.search(self.re_shared, raw_output).group(1),
187+
)
188+
self.assertEqual(
189+
'Internal',
190+
re.search(self.re_external, raw_output).group(1),
191+
)
192+
# NOTE(dtroyer): is_default is not present in the create output
193+
# so make sure it stays that way.
194+
self.assertIsNone(re.search(self.re_default, raw_output))
195+
self.assertEqual(
196+
'True',
197+
re.search(self.re_port_security, raw_output).group(1),
198+
)
199+
200+
raw_output = self.openstack(
201+
'network set ' +
202+
'--description cccc ' +
203+
'--disable ' +
204+
'--share ' +
205+
'--external ' +
206+
'--disable-port-security ' +
207+
name
208+
)
209+
self.assertOutput('', raw_output)
210+
211+
raw_output = self.openstack('network show ' + name)
212+
213+
self.assertEqual(
214+
'cccc',
215+
re.search(self.re_description, raw_output).group(1),
216+
)
217+
self.assertEqual(
218+
'DOWN',
219+
re.search(self.re_enabled, raw_output).group(1),
220+
)
221+
self.assertEqual(
222+
'True',
223+
re.search(self.re_shared, raw_output).group(1),
224+
)
225+
self.assertEqual(
226+
'External',
227+
re.search(self.re_external, raw_output).group(1),
228+
)
229+
# why not 'None' like above??
230+
self.assertEqual(
231+
'False',
232+
re.search(self.re_default, raw_output).group(1),
233+
)
234+
self.assertEqual(
235+
'False',
236+
re.search(self.re_port_security, raw_output).group(1),
237+
)
238+
239+
# NOTE(dtroyer): There is ambiguity around is_default in that
240+
# it is not in the API docs and apparently can
241+
# not be set when the network is --external,
242+
# although the option handling code only looks at
243+
# the value of is_default when external is True.
244+
raw_output = self.openstack(
245+
'network set ' +
246+
'--default ' +
247+
name
248+
)
249+
self.assertOutput('', raw_output)
250+
251+
raw_output = self.openstack('network show ' + name)
252+
253+
self.assertEqual(
254+
'cccc',
255+
re.search(self.re_description, raw_output).group(1),
256+
)
257+
# NOTE(dtroyer): This should be 'True'
258+
self.assertEqual(
259+
'False',
260+
re.search(self.re_default, raw_output).group(1),
261+
)

0 commit comments

Comments
 (0)