github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/acceptancetests/jujupy/tests/test_backend.py (about) 1 import os 2 3 from datetime import ( 4 datetime, 5 timedelta, 6 ) 7 try: 8 from mock import patch 9 except ImportError: 10 from unittest.mock import patch 11 12 from jujupy.backend import ( 13 JUJU_DEV_FEATURE_FLAGS, 14 JujuBackend, 15 ) 16 from jujupy.exceptions import ( 17 NoActiveModel, 18 SoftDeadlineExceeded, 19 ) 20 from jujupy.utility import ( 21 get_timeout_prefix, 22 scoped_environ, 23 ) 24 25 from tests import ( 26 FakePopen, 27 TestCase, 28 ) 29 30 31 class TestJujuBackend(TestCase): 32 33 test_environ = {'PATH': 'foo:bar'} 34 35 def test_juju2_backend(self): 36 backend = JujuBackend('/bin/path', '2.0', set(), False) 37 self.assertEqual('/bin/path', backend.full_path) 38 self.assertEqual('2.0', backend.version) 39 40 def test_clone_retains_soft_deadline(self): 41 soft_deadline = object() 42 backend = JujuBackend( 43 '/bin/path', '2.0', feature_flags=set(), 44 debug=False, soft_deadline=soft_deadline) 45 cloned = backend.clone(full_path=None, version=None, debug=None, 46 feature_flags=None) 47 self.assertIsNot(cloned, backend) 48 self.assertIs(soft_deadline, cloned.soft_deadline) 49 50 def test_cloned_backends_share_juju_timings(self): 51 backend = JujuBackend('/bin/path', '2.0', set(), False) 52 cloned = backend.clone( 53 full_path=None, version=None, debug=None, feature_flags=None) 54 self.assertIs(cloned.juju_timings, backend.juju_timings) 55 56 def test__check_timeouts(self): 57 backend = JujuBackend( 58 '/bin/path', '2.0', set(), debug=False, 59 soft_deadline=datetime(2015, 1, 2, 3, 4, 5)) 60 with patch('jujupy.JujuBackend._now', 61 return_value=backend.soft_deadline): 62 with backend._check_timeouts(): 63 pass 64 now = backend.soft_deadline + timedelta(seconds=1) 65 with patch('jujupy.JujuBackend._now', return_value=now): 66 with self.assertRaisesRegexp( 67 SoftDeadlineExceeded, 68 'Operation exceeded deadline.'): 69 with backend._check_timeouts(): 70 pass 71 72 def test__check_timeouts_no_deadline(self): 73 backend = JujuBackend( 74 '/bin/path', '2.0', set(), debug=False, 75 soft_deadline=None) 76 now = datetime(2015, 1, 2, 3, 4, 6) 77 with patch('jujupy.JujuBackend._now', return_value=now): 78 with backend._check_timeouts(): 79 pass 80 81 def test_ignore_soft_deadline_check_timeouts(self): 82 backend = JujuBackend( 83 '/bin/path', '2.0', set(), debug=False, 84 soft_deadline=datetime(2015, 1, 2, 3, 4, 5)) 85 now = backend.soft_deadline + timedelta(seconds=1) 86 with patch('jujupy.JujuBackend._now', return_value=now): 87 with backend.ignore_soft_deadline(): 88 with backend._check_timeouts(): 89 pass 90 with self.assertRaisesRegexp(SoftDeadlineExceeded, 91 'Operation exceeded deadline.'): 92 with backend._check_timeouts(): 93 pass 94 95 def test_shell_environ_feature_flags(self): 96 backend = JujuBackend( 97 '/bin/path', '2.0', {'may', 'june'}, 98 debug=False, soft_deadline=None) 99 env = backend.shell_environ({'april', 'june'}, 'fake-home') 100 self.assertEqual('june', env[JUJU_DEV_FEATURE_FLAGS]) 101 102 def test_shell_environ_feature_flags_environmental(self): 103 backend = JujuBackend( 104 '/bin/path', '2.0', set(), debug=False, 105 soft_deadline=None) 106 with scoped_environ(): 107 os.environ[JUJU_DEV_FEATURE_FLAGS] = 'run-test' 108 env = backend.shell_environ(set(), 'fake-home') 109 self.assertEqual('run-test', env[JUJU_DEV_FEATURE_FLAGS]) 110 111 def test_shell_environ_feature_flags_environmental_union(self): 112 backend = JujuBackend( 113 '/bin/path', '2.0', {'june'}, debug=False, 114 soft_deadline=None) 115 with scoped_environ(): 116 os.environ[JUJU_DEV_FEATURE_FLAGS] = 'run-test' 117 env = backend.shell_environ({'june'}, 'fake-home') 118 # The feature_flags are combined in alphabetic order. 119 self.assertEqual('june,run-test', env[JUJU_DEV_FEATURE_FLAGS]) 120 121 def test_full_args(self): 122 backend = JujuBackend('/bin/path/juju', '2.0', set(), False, None) 123 full = backend.full_args('help', ('commands',), None, None) 124 self.assertEqual(('juju', '--show-log', 'help', 'commands'), full) 125 126 def test_full_args_debug(self): 127 backend = JujuBackend('/bin/path/juju', '2.0', set(), True, None) 128 full = backend.full_args('help', ('commands',), None, None) 129 self.assertEqual(('juju', '--debug', 'help', 'commands'), full) 130 131 def test_full_args_model(self): 132 backend = JujuBackend('/bin/path/juju', '2.0', set(), False, None) 133 full = backend.full_args('help', ('commands',), 'test', None) 134 self.assertEqual(('juju', '--show-log', 'help', '-m', 'test', 135 'commands'), full) 136 137 def test_full_args_timeout(self): 138 backend = JujuBackend('/bin/path/juju', '2.0', set(), False, None) 139 full = backend.full_args('help', ('commands',), None, 600) 140 self.assertEqual(get_timeout_prefix(600, backend._timeout_path) + 141 ('juju', '--show-log', 'help', 'commands'), full) 142 143 def test_juju_checks_timeouts(self): 144 backend = JujuBackend( 145 '/bin/path', '2.0', set(), debug=False, 146 soft_deadline=datetime(2015, 1, 2, 3, 4, 5)) 147 with patch('subprocess.check_call'): 148 with patch('jujupy.JujuBackend._now', 149 return_value=backend.soft_deadline): 150 backend.juju('cmd', ('args',), [], 'home') 151 now = backend.soft_deadline + timedelta(seconds=1) 152 with patch('jujupy.JujuBackend._now', return_value=now): 153 with self.assertRaisesRegexp(SoftDeadlineExceeded, 154 'Operation exceeded deadline.'): 155 backend.juju('cmd', ('args',), [], 'home') 156 157 def test_juju_async_checks_timeouts(self): 158 backend = JujuBackend( 159 '/bin/path', '2.0', set(), debug=False, 160 soft_deadline=datetime(2015, 1, 2, 3, 4, 5)) 161 with patch('subprocess.Popen') as mock_popen: 162 mock_popen.return_value.wait.return_value = 0 163 with patch('jujupy.JujuBackend._now', 164 return_value=backend.soft_deadline): 165 with backend.juju_async('cmd', ('args',), [], 'home'): 166 pass 167 now = backend.soft_deadline + timedelta(seconds=1) 168 with patch('jujupy.JujuBackend._now', return_value=now): 169 with self.assertRaisesRegexp(SoftDeadlineExceeded, 170 'Operation exceeded deadline.'): 171 with backend.juju_async('cmd', ('args',), [], 'home'): 172 pass 173 174 def test_get_juju_output_checks_timeouts(self): 175 backend = JujuBackend( 176 '/bin/path', '2.0', set(), debug=False, 177 soft_deadline=datetime(2015, 1, 2, 3, 4, 5)) 178 with patch('subprocess.Popen') as mock_popen: 179 mock_popen.return_value.returncode = 0 180 mock_popen.return_value.communicate.return_value = ('', '') 181 with patch('jujupy.JujuBackend._now', 182 return_value=backend.soft_deadline): 183 backend.get_juju_output('cmd', ('args',), [], 'home') 184 now = backend.soft_deadline + timedelta(seconds=1) 185 with patch('jujupy.JujuBackend._now', return_value=now): 186 with self.assertRaisesRegexp(SoftDeadlineExceeded, 187 'Operation exceeded deadline.'): 188 backend.get_juju_output('cmd', ('args',), [], 'home') 189 190 def test_get_active_model(self): 191 backend = JujuBackend( 192 '/bin/path', '2.0', set(), debug=False, 193 soft_deadline=None) 194 with patch('subprocess.Popen') as mock_popen: 195 mock_popen.return_value.communicate.return_value = ( 196 b'{"current-model": "model"}', b'') 197 mock_popen.return_value.returncode = 0 198 result = backend.get_active_model('/foo/bar') 199 self.assertEqual(('model'), result) 200 201 def test_get_active_model_none(self): 202 backend = JujuBackend( 203 '/bin/path', '2.0', set(), debug=False, 204 soft_deadline=None) 205 with patch('subprocess.Popen', autospec=True, return_value=FakePopen( 206 '{"models": {}}', '', 0)): 207 with self.assertRaises(NoActiveModel): 208 backend.get_active_model('/foo/bar')