blob: d022790fc290869a5ccae392e094d3ef18582931 [file] [log] [blame]
#!/usr/bin/env python
'''
As is tests for installApp.py prior to refactoring,
just going for characterization, not completeness
'''
import unittest
import os
from mock import Mock
# fake the DM, since it doesn't exist in repo land
# taken from http://code.activestate.com/recipes/82234-importing-a
# -dynamically-generated-module/
import sys
import imp
def make_fake_module(name):
module = imp.new_module(name)
exec '' in module.__dict__
sys.modules[name] = module
return module
# now add the mocks we need to the dm
devicemanagerSUT = make_fake_module('devicemanagerSUT')
# the_mock is the instance of DeviceManagerSUT class that will be
# instantiated. By setting it as the return value, no other mocking is
# done in the DeviceManagerSUT class.
the_mock = Mock()
devicemanagerSUT.DeviceManagerSUT = Mock(return_value=the_mock)
# since sut_lib methods are imported directly, we'll create the fake
# module, then add mocks for the cited routines
sut_lib = make_fake_module('sut_lib')
sut_lib = Mock()
# And the mocks we need from sut_lib
import sut_lib
# the routines we import by name from sut_lib, each need their own
# mock, so they are present when installApp imports them by name
sut_lib.getOurIP = Mock()
sut_lib.calculatePort = Mock()
sut_lib.clearFlag = Mock()
sut_lib.setFlag = Mock()
sut_lib.checkDeviceRoot = Mock(return_value='/fake_root')
sut_lib.getDeviceTimestamp = Mock()
sut_lib.setDeviceTimestamp = Mock()
sut_lib.getResolution = Mock(return_value=[1024, 768])
sut_lib.waitForDevice = Mock()
sut_lib.runCommand = Mock()
import time
import installApp
class InstallAppTestCase(unittest.TestCase):
def setUp(self):
# every test should reset the counts
the_mock.reset_mock()
# we want to ensure a "success" from the installApp method
the_mock.installApp.return_value = None
# don't exercise find code by default
os.path.exists = Mock(return_value=True)
# we don't really want to wait during testing
time.sleep = Mock()
class CheckBasicExecution(InstallAppTestCase):
def setUp(self):
super(CheckBasicExecution, self).setUp()
os.environ['SUT_NAME'] = 'fred'
def test_errors_no_args(self):
# TypeError is a side effect of being run in
# not-the-normal-foopy environment.
self.assertRaises(TypeError, installApp.main)
def test_error_short_args(self):
# we expect the script to exit via sys.exit(1)
try:
# since a "normal" or "clean" script exits via sys.exit(0),
# we need to catch the exception, and inspect the return
# code (i.e. we can't use the normal "assertRaises"
# approach)
installApp.main(['app', 1])
except SystemExit as e:
self.assertEqual(1, e.code)
else:
self.fail('should have exited via sys.exit(1)')
def test_two_args_okay(self):
installApp.main(['app', 1, '/path/to/source_file'])
def test_three_args_okay(self):
installApp.main(['app', 1, '/path/to/source_file', 3])
class CheckArguementHandling(InstallAppTestCase):
# N.B. the 3rd arguement to installApp.py is never used, so can
# not be tested
def testIPAddress(self):
for ip in ('hostname', '255.255.255.255'):
installApp.main(['app', ip, 'path/to/something'])
devicemanagerSUT.DeviceManagerSUT.assert_called_with(ip)
def testSourceFileName(self):
root_path = sut_lib.checkDeviceRoot()
for source_file in ['test_1', 'test_2']:
src_path = os.path.join('/path/to', source_file)
installed_path = os.path.join(root_path, source_file)
expected_args = ((installed_path,), {})
installApp.main(['app', 1, src_path])
self.assertTrue(
expected_args in the_mock.installApp.call_args_list)
class CheckOriginalContract(InstallAppTestCase):
def setUp(self):
super(CheckOriginalContract, self).setUp()
the_mock.reset_mock()
# bummer expectedFailure decorator is not supported before py 2.7
# unittest, so just disable the test
# @unittest.expectedFailure
def XXXtestOneSetOfCalls(self):
root_path = sut_lib.checkDeviceRoot()
source_file = 'testing'
source_path = os.path.join('/path/to', source_file)
installed_path = os.path.join(root_path, source_file)
installApp.main(['app', 1, source_path])
the_mock.pushFile.assert_called_once_with(source_path, installed_path)
the_mock.installApp.assert_called_once_with(installed_path)
class CheckNewContract(InstallAppTestCase):
def test_robocop_found(self):
root_path = sut_lib.checkDeviceRoot()
source_file = 'fennec.eggs.arm.apk'
robocop_file = 'robocop.apk'
source_path = os.path.join('build/', source_file)
robocop_source_path = os.path.join('build/tests/bin', robocop_file)
installed_path = os.path.join(root_path, source_file)
robocop_installed_path = os.path.join(root_path, robocop_file)
expected_pushFile_calls = [((source_path, installed_path), {}),
((robocop_source_path, robocop_installed_path), {})]
expected_installApp_calls = [((installed_path,), {}),
((robocop_installed_path,), {})]
installApp.main(['app', 1, source_path])
self.assertEqual(the_mock.installApp.call_args_list,
expected_installApp_calls)
self.assertEqual(the_mock.pushFile.call_args_list,
expected_pushFile_calls)
def test_robocop_not_found(self):
root_path = sut_lib.checkDeviceRoot()
source_file = 'fennec.eggs.arm.apk'
source_path = os.path.join('build/', source_file)
installed_path = os.path.join(root_path, source_file)
expected_pushFile_calls = [((source_path, installed_path), {}), ]
expected_installApp_calls = [((installed_path,), {}), ]
# simulate not finding robocop.apk - should not attempt install
# then
os.path.exists.return_value = False
installApp.main(['app', 1, source_path])
self.assertEqual(the_mock.installApp.call_args_list,
expected_installApp_calls)
self.assertEqual(the_mock.pushFile.call_args_list,
expected_pushFile_calls)
class CheckRobocopFind(InstallAppTestCase):
def test_null_path_if_not_found(self):
os.path.exists.return_value = False
found_path = installApp.find_robocop()
self.assertFalse(found_path,
"Should not have found robocop.apk")
def test_correct_path_if_found(self):
os.path.exists.return_value = True
found_path = installApp.find_robocop()
self.assertTrue(found_path,
"Should have found robocop.apk")
if __name__ == '__main__':
unittest.main()