Files
mongo/buildscripts/tests/mobile/test_adb_monitor.py

137 lines
4.6 KiB
Python

""" Unit tests for adb_monitor. """
from __future__ import absolute_import
import distutils.spawn # pylint: disable=no-name-in-module
import os
import shutil
import sys
import tempfile
import unittest
import buildscripts.mobile.adb_monitor as adb_monitor
_IS_WINDOWS = sys.platform == "win32" or sys.platform == "cygwin"
if _IS_WINDOWS:
import win32file
# pylint: disable=missing-docstring,protected-access
def mock_adb_and_systrace(directory):
"""Mock adb and systrace.py."""
# Create mock 'adb', which is really 'echo'.
adb_binary = os.path.join(directory, "adb")
echo_binary = distutils.spawn.find_executable("echo")
if _IS_WINDOWS:
adb_binary = "{}.exe".format(adb_binary)
shutil.copyfile(echo_binary, adb_binary)
else:
os.symlink(echo_binary, adb_binary)
os.environ["PATH"] = "{}{}{}".format(directory, os.path.pathsep, os.environ["PATH"])
# Create mock 'systrace.py'.
systrace_dir = os.path.join(directory, "systrace")
os.mkdir(systrace_dir)
systrace = os.path.join(systrace_dir, "systrace.py")
with open(systrace, "w") as fh:
fh.write("import optparse\n")
fh.write("raw_input('waiting...')\n")
fh.write("print('Wrote trace')\n")
fh.write("parser = optparse.OptionParser()\n")
fh.write("parser.add_option('-o', dest='output_file')\n")
fh.write("parser.add_option('--json', dest='json_opts', action='store_true')\n")
fh.write("options, args = parser.parse_args()\n")
fh.write("with open(options.output_file, 'w') as fh:\n")
fh.write("\tfh.write('{hello:1}')\n")
def file_contents(path):
with open(path, "r") as fh:
return fh.read()
class AdbTestCase(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.temp_dir = tempfile.mkdtemp()
mock_adb_and_systrace(cls.temp_dir)
cls.adb = adb_monitor.Adb()
@classmethod
def tearDownClass(cls):
shutil.rmtree(cls.temp_dir)
class AdbTest(AdbTestCase):
def test_bad_adb(self):
self.assertRaises(EnvironmentError, lambda: adb_monitor.Adb("bad_adb"))
def test_devices(self):
self.adb.devices()
def test_battery(self):
temp_file = os.path.join(self.temp_dir, "battery_output")
self.adb.battery(output_file=temp_file)
self.assertTrue(os.path.isfile(temp_file))
def test_memory(self):
temp_file = os.path.join(self.temp_dir, "memory_output")
self.adb.memory(output_file=temp_file)
self.assertTrue(os.path.isfile(temp_file))
def test_systrace(self):
temp_file = os.path.join(self.temp_dir, "systrace_output")
self.adb.systrace_start(output_file=temp_file)
self.adb.systrace_stop()
self.assertTrue(os.path.isfile(temp_file))
class AdbControlTestCase(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.temp_dir = tempfile.mkdtemp()
mock_adb_and_systrace(cls.temp_dir)
cls.adb = adb_monitor.Adb()
@classmethod
def tearDownClass(cls):
shutil.rmtree(cls.temp_dir)
class AdbControlTest(AdbControlTestCase):
def _test_files(self, num_samples=1, collection_time_secs=0, sample_interval_ms=500,
arg_list=None):
args = {}
arg_file_list = []
for arg_name in arg_list:
arg_test_file = tempfile.NamedTemporaryFile(delete=False).name
args[arg_name] = arg_test_file
arg_file_list.append(arg_test_file)
adb_control = adb_monitor.AdbControl(self.adb, collection_time_secs=collection_time_secs,
num_samples=num_samples,
sample_interval_ms=sample_interval_ms, **args)
adb_control.start()
adb_control.wait()
for arg_file in arg_file_list:
self.assertGreater(os.stat(arg_file).st_size, 0)
os.remove(arg_file)
def test_all_files_num_samples(self):
self._test_files(num_samples=5, arg_list=["battery_file", "cpu_file", "memory_file"])
def test_all_files_collection_time_secs(self):
self._test_files(collection_time_secs=3,
arg_list=["battery_file", "cpu_file", "memory_file"])
def test_all_files_collection_and_samples(self):
self._test_files(collection_time_secs=3, num_samples=5,
arg_list=["battery_file", "cpu_file", "memory_file"])
def test_no_file_arg(self):
self.assertRaises(ValueError, lambda: adb_monitor.AdbControl(self.adb))
def test_bad_file_arg(self):
self.assertRaises(TypeError, lambda: self._test_files(arg_list=["bad_file_arg"]))