summaryrefslogtreecommitdiff
path: root/emu_test/test_boot/test_boot.py
blob: 9e9551f01f1d52cb767c1925f9d62ba0901bc2ba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
"""Test the emulator boot time"""

import unittest
import os
import time
import psutil
import shutil

from utils.emu_error import *
from utils.emu_argparser import emu_args
import utils.emu_testcase
from utils.emu_testcase import EmuBaseTestCase, AVDConfig

class BootTestCase(EmuBaseTestCase):
    def __init__(self, *args, **kwargs):
        super(BootTestCase, self).__init__(*args, **kwargs)
        self.avd_config = None
    @classmethod
    def setUpClass(cls):
        super(BootTestCase, cls).setUpClass()

    def tearDown(self):

        def kill_proc_by_name(proc_names):
            for x in psutil.process_iter():
                try:
                    proc = psutil.Process(x.pid)
                    # mips 64 use qemu-system-mipsel64, others emulator-[arch]
                    if any([x in proc.name() for x in proc_names]):
                        if proc.status() != psutil.STATUS_ZOMBIE:
                            self.m_logger.info("kill_proc_by_name - %s, %s" % (proc.name(), proc.status()))
                            proc.kill()
                except psutil.NoSuchProcess:
                    pass

        self.m_logger.debug('First try - quit emulator by adb emu kill')
        kill_proc = psutil.Popen(["adb", "emu", "kill"])
        # check emulator process is terminated
        result = self.term_check(timeout=5)
        if not result:
            self.m_logger.debug('Second try - quit emulator by psutil')
            kill_proc_by_name(["emulator", "qemu-system"])
            result = self.term_check(timeout=10)
            self.m_logger.debug("term_check after psutil.kill - %s", result)
        self.m_logger.info("Remove AVD inside of tear down")
        # avd should be found $HOME/.android/avd/
        avd_dir = os.path.join(os.path.expanduser('~'), '.android', 'avd')
        try:
            if result:
                self.start_proc.wait()
            kill_proc_by_name(["crash-service"])
            psutil.Popen(["adb", "kill-server"])
            os.remove(os.path.join(avd_dir, '%s.ini' % self.avd_config.name()))
            shutil.rmtree(os.path.join(avd_dir, '%s.avd' % self.avd_config.name()), ignore_errors=True)
        except:
            pass

    def boot_check(self, avd):
        self.boot_time = self.launch_emu_and_wait(avd)
        self.m_logger.info('AVD %s, boot time: %s, expected time: %s', avd, self.boot_time, emu_args.expected_boot_time)
        self.assertLessEqual(self.boot_time, emu_args.expected_boot_time)

    def run_boot_test(self, avd_config):
        self.avd_config = avd_config
        self.assertEqual(self.create_avd(avd_config), 0)
        self.boot_check(avd_config)


def create_test_case_for_avds():
    avd_list = emu_args.avd_list
    for avd in avd_list:
        def fn(i):
            return lambda self: self.boot_check(i)
        setattr(BootTestCase, "test_boot_%s" % avd, fn(avd))

if emu_args.config_file is None:
    create_test_case_for_avds()
else:
    utils.emu_testcase.create_test_case_from_file("boot", BootTestCase, BootTestCase.run_boot_test)

if __name__ == '__main__':
    os.environ["SHELL"] = "/bin/bash"
    emu_argparser.emu_args = emu_argparser.get_parser().parse_args()
    print emu_argparser.emu_args
    sys.argv[1:] = emu_args.unittest_args
    unittest.main()