358
365
def test_no_args(self):
360
parser = add_basic_testing_arguments(ArgumentParser(), deadline=True)
361
with patch('utility.os.getenv', return_value=''):
362
args = parser.parse_args(cmd_line)
367
parser = add_basic_testing_arguments(ArgumentParser())
368
with patch('utility.os.makedirs'):
369
with patch('utility.os.getenv', return_value=''):
370
args = parser.parse_args(cmd_line)
363
371
self.assertEqual(args.env, 'lxd')
364
372
self.assertEqual(args.juju_bin, '/usr/bin/juju')
366
self.assertEqual(args.logs, None)
374
logs_arg = args.logs.split("/")
375
logs_ts = logs_arg[4]
376
self.assertEqual(logs_arg[1:4], ['tmp', 'test_utility', 'logs'])
377
self.assertTrue(logs_ts, datetime.strptime(logs_ts, "%Y%m%d%H%M%S"))
368
temp_env_name_arg = args.temp_env_name.split("-")
369
temp_env_name_ts = temp_env_name_arg[1]
370
self.assertEqual(temp_env_name_arg[0:1], ['testutility'])
379
temp_env_name_arg = args.temp_env_name.split("_")
380
temp_env_name_ts = temp_env_name_arg[2]
381
self.assertEqual(temp_env_name_arg[0:2], ['test', 'utility'])
371
382
self.assertTrue(temp_env_name_ts,
372
383
datetime.strptime(temp_env_name_ts, "%Y%m%d%H%M%S"))
373
self.assertEqual(temp_env_name_arg[2:4], ['temp', 'env'])
374
self.assertIs(None, args.deadline)
384
self.assertEqual(temp_env_name_arg[3:5], ['temp', 'env'])
386
self.assertEqual(logs_ts, temp_env_name_ts)
376
388
def test_default_binary(self):
378
with patch('utility.os.getenv', return_value='/tmp'):
379
with patch('utility.os.path.isfile', return_value=True):
380
parser = add_basic_testing_arguments(ArgumentParser())
381
args = parser.parse_args(cmd_line)
390
with patch('utility.os.makedirs'):
391
with patch('utility.os.getenv', return_value='/tmp'):
392
with patch('utility.os.path.isfile', return_value=True):
393
parser = add_basic_testing_arguments(ArgumentParser())
394
args = parser.parse_args(cmd_line)
382
395
self.assertEqual(args.juju_bin, '/tmp/bin/juju')
384
397
def test_positional_args(self):
385
398
cmd_line = ['local', '/foo/juju', '/tmp/logs', 'testtest']
386
parser = add_basic_testing_arguments(ArgumentParser(), deadline=True)
399
parser = add_basic_testing_arguments(ArgumentParser())
387
400
args = parser.parse_args(cmd_line)
388
401
expected = Namespace(
389
402
agent_url=None, debug=False, env='local', temp_env_name='testtest',
390
403
juju_bin='/foo/juju', logs='/tmp/logs', series=None,
391
404
verbose=logging.INFO, agent_stream=None, keep_env=False,
392
upload_tools=False, bootstrap_host=None, machine=[], region=None,
405
upload_tools=False, bootstrap_host=None, machine=[], region=None)
394
406
self.assertEqual(args, expected)
396
408
def test_positional_args_add_juju_bin_name(self):
397
409
cmd_line = ['local', '/juju', '/tmp/logs', 'testtest']
398
parser = add_basic_testing_arguments(ArgumentParser(), deadline=True)
410
parser = add_basic_testing_arguments(ArgumentParser())
399
411
args = parser.parse_args(cmd_line)
400
412
self.assertEqual(args.juju_bin, '/juju')
402
414
def test_positional_args_accepts_juju_exe(self):
403
415
cmd_line = ['local', 'c:\\juju.exe', '/tmp/logs', 'testtest']
404
parser = add_basic_testing_arguments(ArgumentParser(), deadline=True)
416
parser = add_basic_testing_arguments(ArgumentParser())
405
417
args = parser.parse_args(cmd_line)
406
418
self.assertEqual(args.juju_bin, 'c:\\juju.exe')
454
454
r"Not a directory " + log_dir)
455
455
self.assertEqual("", self.log_stream.getvalue())
457
def test_warn_on_directory_creation_failure(self):
458
with warnings.catch_warnings(record=True) as warned:
459
with patch('utility.os.makedirs', side_effect=OSError):
462
parser = add_basic_testing_arguments(ArgumentParser())
463
parser.parse_args(cmd_line)
465
# we catch our thrown OSError
468
self.fail('No exception thrown after' +
469
' directory creation failure')
470
self.assertEqual(len(warned), 1)
471
self.assertRegexpMatches(
472
str(warned[0].message),
473
r"Failed to create logging directory: /tmp/test_utility/" +
474
"logs/.*. Please specify empty folder or try again")
457
476
def test_debug(self):
458
477
cmd_line = ['local', '/foo/juju', '/tmp/logs', 'testtest', '--debug']
459
478
parser = add_basic_testing_arguments(ArgumentParser())
531
550
args = parser.parse_args(cmd_line)
532
551
self.assertEqual('foo-bar', args.region)
534
def test_deadline(self):
535
now = datetime(2012, 11, 10, 9, 8, 7)
536
cmd_line = ['--timeout', '300']
537
parser = add_basic_testing_arguments(ArgumentParser(), deadline=True)
538
with patch('utility.datetime') as dt_class:
539
# Can't patch the utcnow method of datetime.datetime (because it's
540
# C code?) but we can patch out the whole datetime class.
541
dt_class.utcnow.return_value = now
542
args = parser.parse_args(cmd_line)
543
self.assertEqual(now + timedelta(seconds=300), args.deadline)
546
554
class TestRunCommand(TestCase):
628
636
self.assertTrue(os.path.exists(d))
629
637
self.assertTrue(os.path.exists(os.path.join(d, "a-file")))
630
638
self.assertFalse(os.path.exists(p))
633
class TestUnqualifiedModelName(TestCase):
635
def test_returns_just_model_name_when_passed_qualifed_full_username(self):
637
unqualified_model_name('admin@local/default'),
641
def test_returns_just_model_name_when_passed_just_username(self):
643
unqualified_model_name('admin/default'),
647
def test_returns_just_model_name_when_passed_no_username(self):
649
unqualified_model_name('default'),
654
class TestQualifiedModelName(TestCase):
656
def test_raises_valueerror_when_model_name_blank(self):
657
with self.assertRaises(ValueError):
658
qualified_model_name('', 'admin@local')
660
def test_raises_valueerror_when_owner_name_blank(self):
661
with self.assertRaises(ValueError):
662
qualified_model_name('default', '')
664
def test_raises_valueerror_when_owner_and_model_blank(self):
665
with self.assertRaises(ValueError):
666
qualified_model_name('', '')
668
def test_raises_valueerror_when_owner_name_doesnt_match_model_owner(self):
669
with self.assertRaises(ValueError):
670
qualified_model_name('test/default', 'admin')
672
with self.assertRaises(ValueError):
673
qualified_model_name('test@local/default', 'admin@local')
675
def test_returns_qualified_model_name_with_plain_model_name(self):
677
qualified_model_name('default', 'admin@local'),
678
'admin@local/default'
682
qualified_model_name('default', 'admin'),
686
def test_returns_qualified_model_name_with_model_name_with_owner(self):
688
qualified_model_name('admin@local/default', 'admin@local'),
689
'admin@local/default'
693
qualified_model_name('admin/default', 'admin'),