blob: 1d4c31c8d5446ff052242733ffb97b5939eddf08 [file] [log] [blame]
# Copyright 2018 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Unit tests for Mobly's ServiceManager."""
import mock
from future.tests.base import unittest
from mobly.controllers.android_device_lib import service_manager
from mobly.controllers.android_device_lib.services import base_service
class MockService(base_service.BaseService):
def __init__(self, device, configs=None):
self._device = device
self._configs = configs
self._alive = False
@property
def is_alive(self):
return self._alive
def start(self, configs=None):
self._alive = True
self._device.start()
def stop(self):
self._alive = False
self._device.stop()
class ServiceManagerTest(unittest.TestCase):
def test_service_manager_instantiation(self):
mock_device = mock.MagicMock()
manager = service_manager.ServiceManager(mock_device)
def test_register(self):
mock_device = mock.MagicMock()
manager = service_manager.ServiceManager(mock_device)
manager.register('mock_service', MockService)
service = manager.mock_service
self.assertTrue(service)
self.assertTrue(service.is_alive)
self.assertTrue(manager.is_any_alive)
def test_register_dup_alias(self):
mock_device = mock.MagicMock()
manager = service_manager.ServiceManager(mock_device)
manager.register('mock_service', MockService)
msg = '.* A service is already registered with alias "mock_service"'
with self.assertRaisesRegex(service_manager.Error, msg):
manager.register('mock_service', MockService)
def test_unregister(self):
mock_device = mock.MagicMock()
manager = service_manager.ServiceManager(mock_device)
manager.register('mock_service', MockService)
service = manager.mock_service
manager.unregister('mock_service')
self.assertFalse(manager.is_any_alive)
self.assertFalse(service.is_alive)
def test_unregister_non_existent(self):
mock_device = mock.MagicMock()
manager = service_manager.ServiceManager(mock_device)
with self.assertRaisesRegex(
service_manager.Error,
'.* No service is registered with alias "mock_service"'):
manager.unregister('mock_service')
@mock.patch('mobly.expects.expect_no_raises')
def test_unregister_handle_error_from_stop(self, mock_expect_func):
mock_device = mock.MagicMock()
manager = service_manager.ServiceManager(mock_device)
manager.register('mock_service', MockService)
service = manager.mock_service
service._device.stop.side_deffect = Exception(
'Something failed in stop.')
manager.unregister('mock_service')
mock_expect_func.assert_called_once_with(
'Failed to stop service instance "mock_service".')
def test_unregister_all(self):
mock_device = mock.MagicMock()
manager = service_manager.ServiceManager(mock_device)
manager.register('mock_service1', MockService)
manager.register('mock_service2', MockService)
service1 = manager.mock_service1
service2 = manager.mock_service2
manager.unregister_all()
self.assertFalse(manager.is_any_alive)
self.assertFalse(service1.is_alive)
self.assertFalse(service2.is_alive)
def test_unregister_all(self):
mock_device = mock.MagicMock()
manager = service_manager.ServiceManager(mock_device)
manager.register('mock_service1', MockService)
manager.register('mock_service2', MockService)
service1 = manager.mock_service1
service2 = manager.mock_service2
manager.unregister_all()
self.assertFalse(manager.is_any_alive)
self.assertFalse(service1.is_alive)
self.assertFalse(service2.is_alive)
def test_unregister_all_with_some_failed(self):
mock_device = mock.MagicMock()
manager = service_manager.ServiceManager(mock_device)
manager.register('mock_service1', MockService)
manager.register('mock_service2', MockService)
service1 = manager.mock_service1
service1._device.stop.side_deffect = Exception(
'Something failed in stop.')
service2 = manager.mock_service2
manager.unregister_all()
self.assertFalse(manager.is_any_alive)
self.assertFalse(service1.is_alive)
self.assertFalse(service2.is_alive)
def test_pause_all(self):
mock_device = mock.MagicMock()
manager = service_manager.ServiceManager(mock_device)
manager.register('mock_service1', MockService)
manager.register('mock_service2', MockService)
service1 = manager.mock_service1
service2 = manager.mock_service2
manager.pause_all()
self.assertFalse(manager.is_any_alive)
self.assertFalse(service1.is_alive)
self.assertFalse(service2.is_alive)
def test_pause_all_with_some_failed(self):
mock_device = mock.MagicMock()
manager = service_manager.ServiceManager(mock_device)
manager.register('mock_service1', MockService)
manager.register('mock_service2', MockService)
service1 = manager.mock_service1
service1._device.pause.side_deffect = Exception(
'Something failed in stop.')
service2 = manager.mock_service2
manager.pause_all()
self.assertFalse(manager.is_any_alive)
# state of service1 is undefined
# verify state of service2
self.assertFalse(service2.is_alive)
def test_resume_all(self):
mock_device = mock.MagicMock()
manager = service_manager.ServiceManager(mock_device)
manager.register('mock_service1', MockService)
manager.register('mock_service2', MockService)
service1 = manager.mock_service1
service2 = manager.mock_service2
manager.pause_all()
manager.resume_all()
self.assertTrue(manager.is_any_alive)
self.assertTrue(service1.is_alive)
self.assertTrue(service2.is_alive)
def test_resume_all_with_some_failed(self):
mock_device = mock.MagicMock()
manager = service_manager.ServiceManager(mock_device)
manager.register('mock_service1', MockService)
manager.register('mock_service2', MockService)
service1 = manager.mock_service1
service1._device.resume.side_deffect = Exception(
'Something failed in stop.')
service2 = manager.mock_service2
manager.pause_all()
manager.resume_all()
self.assertTrue(manager.is_any_alive)
# state of service1 is undefined
# verify state of service2
self.assertTrue(service2.is_alive)
if __name__ == '__main__':
unittest.main()