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')