Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / network / test.py @ 5c433331

History | View | Annotate | Download (22.8 kB)

1
# Copyright 2013 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34
from mock import patch, call
35
from unittest import TestCase
36
from itertools import product
37
from json import dumps
38

    
39
from kamaki.clients import network
40

    
41

    
42
class NetworkRestClient(TestCase):
43

    
44
    """Set up a ComputesRest thorough test"""
45
    def setUp(self):
46
        self.url = 'http://network.example.com'
47
        self.token = 'n2tw0rk70k3n'
48
        self.client = network.NetworkRestClient(self.url, self.token)
49

    
50
    def tearDown(self):
51
        del self.client
52

    
53
    def _assert(self, method_call, path, set_param=None, params=(), **kwargs):
54
        """Assert the REST method call is called as expected"""
55
        x0 = - len(params)
56
        for i, (k, v, c) in enumerate(params):
57
            self.assertEqual(set_param.mock_calls[x0 + i], call(k, v, iff=c))
58

    
59
        self.assertEqual(method_call.mock_calls[-1], call(path, **kwargs))
60

    
61
    @patch('kamaki.clients.Client.get', return_value='ret val')
62
    def test_networks_get(self, get):
63
        netid = 'netid'
64
        for kwargs in (dict(), dict(k1='v1'), dict(k2='v2', k3='v3')):
65
            self.assertEqual(self.client.networks_get(**kwargs), 'ret val')
66
            self._assert(get, '/networks', **kwargs)
67
            self.assertEqual(
68
                self.client.networks_get(network_id=netid, **kwargs),
69
                'ret val')
70
            self._assert(get, '/networks/%s' % netid, **kwargs)
71

    
72
    @patch('kamaki.clients.Client.post', return_value='ret val')
73
    def test_networks_post(self, post):
74
        for kwargs in (
75
                dict(json_data=dict(k1='v1')),
76
                dict(json_data=dict(k2='v2'), k3='v3')):
77
            self.assertEqual(self.client.networks_post(**kwargs), 'ret val')
78
            json_data = kwargs.pop('json_data')
79
            self._assert(post, '/networks', json=json_data, **kwargs)
80

    
81
    @patch('kamaki.clients.Client.put', return_value='ret val')
82
    def test_networks_put(self, put):
83
        netid = 'netid'
84
        for kwargs in (
85
                dict(json_data=dict(k1='v1')),
86
                dict(json_data=dict(k2='v2'), k3='v3')):
87
            self.assertEqual(
88
                self.client.networks_put(netid, **kwargs), 'ret val')
89
            json_data = kwargs.pop('json_data')
90
            self._assert(
91
                put, '/networks/%s' % netid, json=json_data, **kwargs)
92

    
93
    @patch('kamaki.clients.Client.delete', return_value='ret val')
94
    def test_networks_delete(self, delete):
95
        netid = 'netid'
96
        for kwargs in (dict(), dict(k1='v1'), dict(k2='v2', k3='v3')):
97
            self.assertEqual(
98
                self.client.networks_delete(netid, **kwargs), 'ret val')
99
            self._assert(delete, '/networks/%s' % netid, **kwargs)
100

    
101
    @patch('kamaki.clients.Client.get', return_value='ret val')
102
    def test_subnets_get(self, get):
103
        for kwargs in (dict(), dict(k1='v1'), dict(k2='v2', k3='v3')):
104
            self.assertEqual(self.client.subnets_get(**kwargs), 'ret val')
105
            self._assert(get, '/subnets', **kwargs)
106

    
107
            subnet_id = 'subnet id'
108
            self.assertEqual(
109
                self.client.subnets_get(subnet_id=subnet_id, **kwargs),
110
                'ret val')
111
            self._assert(get, '/subnets/%s' % subnet_id, **kwargs)
112

    
113
    @patch('kamaki.clients.Client.post', return_value='ret val')
114
    def test_subnets_post(self, post):
115
        for kwargs in (dict(), dict(k1='v1'), dict(k2='v2', k3='v3')):
116
            json_data = dict(subnets='some data')
117
            self.assertEqual(self.client.subnets_post(
118
                json_data=json_data, **kwargs), 'ret val')
119
            self._assert(post, '/subnets', json=json_data, **kwargs)
120

    
121
    @patch('kamaki.clients.Client.put', return_value='ret val')
122
    def test_subnets_put(self, put):
123
        subnet_id = 'subid'
124
        for kwargs in (dict(), dict(k1='v1'), dict(k2='v2', k3='v3')):
125
            self.assertEqual(
126
                self.client.subnets_put(subnet_id, **kwargs), 'ret val')
127
            self._assert(put, '/subnets/%s' % subnet_id, **kwargs)
128

    
129
    @patch('kamaki.clients.Client.delete', return_value='ret val')
130
    def test_subnets_delete(self, delete):
131
        netid = 'netid'
132
        for kwargs in (dict(), dict(k1='v1'), dict(k2='v2', k3='v3')):
133
            self.assertEqual(
134
                self.client.subnets_delete(netid, **kwargs), 'ret val')
135
            self._assert(delete, '/subnets/%s' % netid, **kwargs)
136

    
137
    @patch('kamaki.clients.Client.get', return_value='ret val')
138
    def test_ports_get(self, get):
139
        for kwargs in (dict(), dict(k1='v1'), dict(k2='v2', k3='v3')):
140
            self.assertEqual(self.client.ports_get(**kwargs), 'ret val')
141
            self._assert(get, '/ports', **kwargs)
142

    
143
            port_id = 'port id'
144
            self.assertEqual(
145
                self.client.ports_get(port_id=port_id, **kwargs),
146
                'ret val')
147
            self._assert(get, '/ports/%s' % port_id, **kwargs)
148

    
149
    @patch('kamaki.clients.Client.set_param')
150
    @patch('kamaki.clients.Client.post', return_value='ret val')
151
    def test_ports_post(self, post, set_param):
152
        for params, kwargs in product(
153
                [p for p in product(
154
                    (
155
                        ('name', 'port name', 'port name'),
156
                        ('name', None, None)),
157
                    (
158
                        ('mac_address', 'max address', 'max address'),
159
                        ('mac_address', None, None)),
160
                    (
161
                        ('fixed_ips', 'fixed ip', 'fixed ip'),
162
                        ('fixed_ips', None, None)),
163
                    (
164
                        ('security_groups', 'sec groups', 'sec groups'),
165
                        ('security_groups', None, None))
166
                )],
167
                (dict(), dict(k1='v1'), dict(k2='v2', k3='v3'))):
168

    
169
            callargs = dict()
170
            for p in params:
171
                callargs[p[0]] = p[2]
172
            callargs.update(kwargs)
173

    
174
            self.assertEqual(self.client.ports_post(**callargs), 'ret val')
175
            self._assert(
176
                post, '/ports', set_param, params=params, json=None, **kwargs)
177

    
178
            json_data = dict(id='some id', other_param='other val')
179
            callargs['json_data'] = json_data
180
            self.assertEqual(self.client.ports_post(**callargs), 'ret val')
181
            self._assert(
182
                post, '/ports', set_param, params,
183
                json=json_data, **kwargs)
184

    
185
    @patch('kamaki.clients.Client.set_param')
186
    @patch('kamaki.clients.Client.put', return_value='ret val')
187
    def test_ports_put(self, put, set_param):
188
        port_id = 'portid'
189
        for params, kwargs in product(
190
                [p for p in product(
191
                    (
192
                        ('name', 'port name', 'port name'),
193
                        ('name', None, None)),
194
                    (
195
                        ('mac_address', 'max address', 'max address'),
196
                        ('mac_address', None, None)),
197
                    (
198
                        ('fixed_ips', 'fixed ip', 'fixed ip'),
199
                        ('fixed_ips', None, None)),
200
                    (
201
                        ('security_groups', 'sec groups', 'sec groups'),
202
                        ('security_groups', None, None))
203
                )],
204
                (dict(), dict(k1='v1'), dict(k2='v2', k3='v3'))):
205

    
206
            callargs = dict()
207
            for p in params:
208
                callargs[p[0]] = p[2]
209
            callargs.update(kwargs)
210

    
211
            self.assertEqual(
212
                self.client.ports_put(port_id, **callargs), 'ret val')
213
            self._assert(
214
                put, '/ports/%s' % port_id, set_param,
215
                params=params, json=None, **kwargs)
216

    
217
            json_data = dict(id='some id', other_param='other val')
218
            callargs['json_data'] = json_data
219
            self.assertEqual(
220
                self.client.ports_put(port_id, **callargs), 'ret val')
221
            self._assert(
222
                put, '/ports/%s' % port_id, set_param, params,
223
                json=json_data, **kwargs)
224

    
225

    
226
class FakeObject(object):
227

    
228
    json = None
229
    headers = None
230

    
231

    
232
class NetworkClient(TestCase):
233

    
234
    """Set up a ComputesRest thorough test"""
235
    def setUp(self):
236
        self.url = 'http://network.example.com'
237
        self.token = 'n2tw0rk70k3n'
238
        self.client = network.NetworkClient(self.url, self.token)
239

    
240
    def tearDown(self):
241
        FakeObject.json, FakeObject.headers = None, None
242
        del self.client
243

    
244
    @patch(
245
        'kamaki.clients.network.NetworkClient.networks_get',
246
        return_value=FakeObject())
247
    def test_list_networks(self, networks_get):
248
        FakeObject.json = dict(networks='ret val')
249
        self.assertEqual(self.client.list_networks(), 'ret val')
250
        networks_get.assert_called_once_with(success=200)
251

    
252
    @patch(
253
        'kamaki.clients.network.NetworkClient.networks_post',
254
        return_value=FakeObject())
255
    def test_create_network(self, networks_post):
256
        for admin_state_up, shared in product((None, True), (None, True)):
257
            FakeObject.json = dict(network='ret val')
258
            name = 'net name'
259
            self.assertEqual(
260
                self.client.create_network(
261
                    name, admin_state_up=admin_state_up, shared=shared),
262
                'ret val')
263
            req = dict(name=name, admin_state_up=bool(admin_state_up))
264
            if shared:
265
                req['shared'] = shared
266
            expargs = dict(json_data=dict(network=req), success=201)
267
            self.assertEqual(networks_post.mock_calls[-1], call(**expargs))
268

    
269
    @patch(
270
        'kamaki.clients.network.NetworkClient.networks_post',
271
        return_value=FakeObject())
272
    def test_create_networks(self, networks_post):
273
        for networks in (
274
                None, dict(name='name'), 'nets', [1, 2, 3], [{'k': 'v'}, ],
275
                [dict(admin_state_up=True, shared=True)],
276
                [dict(name='n1', invalid='mistake'), ],
277
                [dict(name='valid', shared=True), {'err': 'nop'}]):
278
            self.assertRaises(
279
                ValueError, self.client.create_networks, networks)
280

    
281
        FakeObject.json = dict(networks='ret val')
282
        for networks in (
283
                [
284
                    dict(name='net1'),
285
                    dict(name='net 2', admin_state_up=False, shared=True)],
286
                [
287
                    dict(name='net1', admin_state_up=True),
288
                    dict(name='net 2', shared=False),
289
                    dict(name='net-3')],
290
                (dict(name='n.e.t'), dict(name='net 2'))):
291
            self.assertEqual(self.client.create_networks(networks), 'ret val')
292

    
293
            networks = list(networks)
294
            expargs = dict(json_data=dict(networks=networks), success=201)
295
            self.assertEqual(networks_post.mock_calls[-1], call(**expargs))
296

    
297
    @patch(
298
        'kamaki.clients.network.NetworkClient.networks_get',
299
        return_value=FakeObject())
300
    def test_get_network_details(self, networks_get):
301
        netid, FakeObject.json = 'netid', dict(network='ret val')
302
        self.assertEqual(self.client.get_network_details(netid), 'ret val')
303
        networks_get.assert_called_once_with(netid, success=200)
304

    
305
    @patch(
306
        'kamaki.clients.network.NetworkClient.networks_put',
307
        return_value=FakeObject())
308
    def test_update_network(self, networks_put):
309
        netid, FakeObject.json = 'netid', dict(network='ret val')
310
        for name, admin_state_up, shared in product(
311
                ('net name', None), (True, None), (True, None)):
312
            kwargs = dict(
313
                name=name, admin_state_up=admin_state_up, shared=shared)
314
            self.assertEqual(
315
                self.client.update_network(netid, **kwargs), 'ret val')
316
            if name in (None, ):
317
                kwargs.pop('name')
318
            if admin_state_up in (None, ):
319
                kwargs.pop('admin_state_up')
320
            if shared in (None, ):
321
                kwargs.pop('shared')
322
            kwargs = dict(json_data=dict(network=kwargs), success=200)
323
            self.assertEqual(
324
                networks_put.mock_calls[-1], call(netid, **kwargs))
325

    
326
    @patch(
327
        'kamaki.clients.network.NetworkClient.networks_delete',
328
        return_value=FakeObject())
329
    def test_delete_network(self, networks_delete):
330
        netid, FakeObject.headers = 'netid', 'ret headers'
331
        self.assertEqual(self.client.delete_network(netid), 'ret headers')
332
        networks_delete.assert_called_once_with(netid, success=204)
333

    
334
    @patch(
335
        'kamaki.clients.network.NetworkClient.subnets_get',
336
        return_value=FakeObject())
337
    def test_list_subnets(self, subnets_get):
338
        FakeObject.json = dict(subnets='ret val')
339
        self.assertEqual(self.client.list_subnets(), 'ret val')
340
        subnets_get.assert_called_once_with(success=200)
341

    
342
    @patch(
343
        'kamaki.clients.network.NetworkClient.subnets_post',
344
        return_value=FakeObject())
345
    def test_create_subnet(self, subnets_post):
346
        for (
347
                name, allocation_pools, gateway_ip,
348
                subnet_id, ipv6, enable_dhcp) in product(
349
                    ('name', None), ('all pools', None), ('gip', None),
350
                    ('sid', None), (True, None), (True, None)):
351
            kwargs = dict(
352
                name=name, allocation_pools=allocation_pools,
353
                gateway_ip=gateway_ip, subnet_id=subnet_id,
354
                ipv6=ipv6, enable_dhcp=enable_dhcp)
355
            FakeObject.json, network_id, cidr = dict(subnet='rv'), 'name', 'cd'
356
            self.assertEqual(
357
                self.client.create_subnet(network_id, cidr, **kwargs), 'rv')
358
            req = dict(
359
                network_id=network_id, cidr=cidr,
360
                ip_version=6 if kwargs.pop('ipv6', None) else 4)
361
            for k, v in kwargs.items():
362
                if v:
363
                    req['id' if k == 'subnet_id' else k] = v
364
            expargs = dict(json_data=dict(subnet=req), success=201)
365
            self.assertEqual(subnets_post.mock_calls[-1], call(**expargs))
366

    
367
    @patch(
368
        'kamaki.clients.network.NetworkClient.subnets_post',
369
        return_value=FakeObject())
370
    def test_create_subnets(self, subnets_post):
371
        for subnets in (
372
                None, dict(network_id='name'), 'nets', [1, 2, 3], [{'k': 'v'}],
373
                [dict(ipv6=True, enable_dhcp=True)],
374
                [dict(network_id='n1', cidr='dr', invalid='mistake'), ],
375
                [dict(network_id='valid', cidr='valid'), {'err': 'nop'}]):
376
            self.assertRaises(
377
                ValueError, self.client.create_subnets, subnets)
378

    
379
        FakeObject.json = dict(subnets='ret val')
380
        for subnets in (
381
                [
382
                    dict(network_id='n1', cidr='c1'),
383
                    dict(network_id='n 2', cidr='c 2', name='name')],
384
                [
385
                    dict(network_id='n1', cidr='c 6', allocation_pools='a p'),
386
                    dict(network_id='n 2', cidr='c_4', gateway_ip='g ip'),
387
                    dict(network_id='n 2', cidr='c_4', subnet_id='s id'),
388
                    dict(network_id='n-4', cidr='c3', ipv6=True, name='w. 6'),
389
                    dict(network_id='n_5', cidr='c2', enable_dhcp=True)],
390
                (
391
                    dict(network_id='n.e.t', cidr='c-5'),
392
                    dict(network_id='net 2', cidr='c 2'))):
393
            self.assertEqual(self.client.create_subnets(subnets), 'ret val')
394

    
395
            for subnet in subnets:
396
                subnet['ip_version'] = 6 if subnet.pop('ipv6', None) else 4
397
                if 'subnet_id' in subnet:
398
                    subnet['id'] = subnet.pop('subnet_id')
399
            subnets = list(subnets)
400
            expargs = dict(json_data=dict(subnets=subnets), success=201)
401
            self.assertEqual(subnets_post.mock_calls[-1], call(**expargs))
402

    
403
    @patch(
404
        'kamaki.clients.network.NetworkClient.subnets_get',
405
        return_value=FakeObject())
406
    def test_get_subnet_details(self, subnets_get):
407
        subid, FakeObject.json = 'subid', 'ret val'
408
        self.assertEqual(self.client.get_subnet_details(subid), 'ret val')
409
        subnets_get.assert_called_once_with(subid, success=201)
410

    
411
    @patch(
412
        'kamaki.clients.network.NetworkClient.subnets_put',
413
        return_value=FakeObject())
414
    def test_update_subnet(self, subnets_put):
415
        for (
416
                name, allocation_pools, gateway_ip,
417
                subnet_id, ipv6, enable_dhcp) in product(
418
                    ('name', None), ('all pools', None), ('gip', None),
419
                    ('sid', None), (True, False, None), (True, False, None)):
420
            kwargs = dict(
421
                name=name, allocation_pools=allocation_pools,
422
                gateway_ip=gateway_ip, subnet_id=subnet_id,
423
                ipv6=ipv6, enable_dhcp=enable_dhcp)
424
            FakeObject.json, network_id, cidr = dict(subnet='rv'), 'name', 'cd'
425
            self.assertEqual(
426
                self.client.update_subnet(network_id, cidr, **kwargs), 'rv')
427
            req = dict(network_id=network_id, cidr=cidr)
428
            if kwargs.get('ipv6', None) not in (None, ):
429
                req['ip_version'] = 6 if kwargs.pop('ipv6') else 4
430
            for k, v in kwargs.items():
431
                if v not in (None, ):
432
                    req['id' if k == 'subnet_id' else k] = v
433
            expargs = dict(json_data=dict(subnet=req), success=201)
434
            self.assertEqual(subnets_put.mock_calls[-1], call(**expargs))
435

    
436
    @patch(
437
        'kamaki.clients.network.NetworkClient.subnets_delete',
438
        return_value=FakeObject())
439
    def test_delete_subnet(self, subnets_delete):
440
        netid, FakeObject.headers = 'netid', 'ret headers'
441
        self.assertEqual(self.client.delete_subnet(netid), 'ret headers')
442
        subnets_delete.assert_called_once_with(netid, success=204)
443

    
444
    @patch(
445
        'kamaki.clients.network.NetworkClient.ports_get',
446
        return_value=FakeObject())
447
    def test_list_ports(self, ports_get):
448
        FakeObject.json = dict(ports='ret val')
449
        self.assertEqual(self.client.list_ports(), 'ret val')
450
        ports_get.assert_called_once_with(success=200)
451

    
452
    @patch(
453
        'kamaki.clients.network.NetworkClient.ports_post',
454
        return_value=FakeObject())
455
    def test_create_port(self, ports_post):
456
        for (
457
                name, status, admin_state_up,
458
                mac_address, fixed_ips, security_groups
459
                ) in product(
460
                    ('name', None), ('status', None), (True, False, None),
461
                    ('maddr', None), ('some ips', None), ([1, 2, 3], None)):
462
            kwargs = dict(
463
                name=name, status=status, admin_state_up=admin_state_up,
464
                mac_address=mac_address, fixed_ips=fixed_ips,
465
                security_groups=security_groups)
466
            FakeObject.json, network_id = dict(port='ret val'), 'name'
467
            self.assertEqual(
468
                self.client.create_port(network_id, **kwargs), 'ret val')
469
            req = dict(network_id=network_id)
470
            for k, v in kwargs.items():
471
                if v not in (None, ):
472
                    req[k] = v
473
            expargs = dict(json_data=dict(port=req), success=201)
474
            self.assertEqual(ports_post.mock_calls[-1], call(**expargs))
475

    
476
    @patch(
477
        'kamaki.clients.network.NetworkClient.ports_post',
478
        return_value=FakeObject())
479
    def test_create_ports(self, ports_post):
480
        for ports in (
481
                None, dict(network_id='name'), 'nets', [1, 2, 3], [{'k': 'v'}],
482
                [dict(name=True, mac_address='mac')],
483
                [dict(network_id='n1', invalid='mistake'), ],
484
                [dict(network_id='valid', name='valid'), {'err': 'nop'}]):
485
            self.assertRaises(
486
                ValueError, self.client.create_ports, ports)
487

    
488
        FakeObject.json = dict(ports='ret val')
489
        for ports in (
490
                [dict(network_id='n1'), dict(network_id='n 2', name='name')],
491
                [
492
                    dict(network_id='n1', name='n 6', status='status'),
493
                    dict(network_id='n 2', admin_state_up=True, fixed_ips='f'),
494
                    dict(network_id='n 2', mac_address='mc', name='n.a.m.e.'),
495
                    dict(network_id='n-4', security_groups='s~G', name='w. 6'),
496
                    dict(network_id='n_5', admin_state_up=False, name='f a')],
497
                (
498
                    dict(network_id='n.e.t', name='c-5'),
499
                    dict(network_id='net 2', status='YEAH'))):
500
            self.assertEqual(self.client.create_ports(ports), 'ret val')
501
            expargs = dict(json_data=dict(ports=list(ports)), success=201)
502
            self.assertEqual(ports_post.mock_calls[-1], call(**expargs))
503

    
504
    @patch(
505
        'kamaki.clients.network.NetworkClient.ports_get',
506
        return_value=FakeObject())
507
    def test_get_port_details(self, ports_get):
508
        portid, FakeObject.json = 'portid', dict(ports='ret val')
509
        self.assertEqual(self.client.get_port_details(portid), 'ret val')
510
        ports_get.assert_called_once_with(portid, success=201)
511

    
512
    @patch(
513
        'kamaki.clients.network.NetworkClient.ports_delete',
514
        return_value=FakeObject())
515
    def test_delete_port(self, ports_delete):
516
        portid, FakeObject.headers = 'portid', 'ret headers'
517
        self.assertEqual(self.client.delete_port(portid), 'ret headers')
518
        ports_delete.assert_called_once_with(portid, success=204)
519

    
520

    
521
if __name__ == '__main__':
522
    from sys import argv
523
    from kamaki.clients.test import runTestCase
524
    not_found = True
525
    if not argv[1:] or argv[1] == 'NetworkClient':
526
        not_found = False
527
        runTestCase(NetworkClient, 'Network Client', argv[2:])
528
    if not argv[1:] or argv[1] == 'NetworkRestClient':
529
        not_found = False
530
        runTestCase(NetworkRestClient, 'NetworkRest Client', argv[2:])
531
    if not_found:
532
        print('TestCase %s not found' % argv[1])