blob: 6e1ba320fda036585732bfe417c523b57edf0298 [file] [log] [blame]
Sam Chiu5029a252018-11-06 20:54:13 +08001#!/usr/bin/env python
2#
3# Copyright 2018 - The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
cylan4569dca2018-11-02 12:12:53 +080016"""Tests for instance class."""
Sam Chiu943b64d2019-02-13 22:16:39 +080017
Sam Chiu5029a252018-11-06 20:54:13 +080018import collections
herbertxue6705f5b2018-12-25 14:47:53 +080019import datetime
Sam Chiu5029a252018-11-06 20:54:13 +080020import subprocess
21
22import unittest
chojoyce7a361732018-11-26 16:26:13 +080023import mock
Sam Chiu5029a252018-11-06 20:54:13 +080024
herbertxue6705f5b2018-12-25 14:47:53 +080025# pylint: disable=import-error
26import dateutil.parser
27import dateutil.tz
28
Sam Chiu5029a252018-11-06 20:54:13 +080029from acloud.internal import constants
30from acloud.internal.lib import driver_test_lib
Sam Chiu943b64d2019-02-13 22:16:39 +080031from acloud.internal.lib.adb_tools import AdbTools
Sam Chiu5029a252018-11-06 20:54:13 +080032from acloud.list import instance
33
34
35class InstanceTest(driver_test_lib.BaseDriverTest):
36 """Test instance."""
37 PS_SSH_TUNNEL = ("/fake_ps_1 --fake arg \n"
38 "/fake_ps_2 --fake arg \n"
39 "/usr/bin/ssh -i ~/.ssh/acloud_rsa "
40 "-o UserKnownHostsFile=/dev/null "
41 "-o StrictHostKeyChecking=no -L 12345:127.0.0.1:6444 "
cylan1b003212019-06-13 16:00:47 +080042 "-L 54321:127.0.0.1:6520 -N -f -l user 1.1.1.1")
Sam Chiu5029a252018-11-06 20:54:13 +080043 PS_LAUNCH_CVD = ("Sat Nov 10 21:55:10 2018 /fake_path/bin/launch_cvd "
44 "--daemon --cpus 2 --x_res 1080 --y_res 1920 --dpi 480"
45 " --memory_mb 4096 --blank_data_image_mb 4096 --data_policy"
46 " always_create --system_image_dir /fake "
47 "--vnc_server_port 6444")
cylan1b003212019-06-13 16:00:47 +080048 GCE_INSTANCE = {
49 constants.INS_KEY_NAME: "fake_ins_name",
50 constants.INS_KEY_CREATETIME: "fake_create_time",
51 constants.INS_KEY_STATUS: "fake_status",
52 "networkInterfaces": [{"accessConfigs": [{"natIP": "1.1.1.1"}]}],
53 "labels": {constants.INS_KEY_AVD_TYPE: "fake_type",
54 constants.INS_KEY_AVD_FLAVOR: "fake_flavor"},
55 "metadata": {
56 "items":[{"key":constants.INS_KEY_AVD_TYPE,
57 "value":"fake_type"},
58 {"key":constants.INS_KEY_AVD_FLAVOR,
59 "value":"fake_flavor"}]}
60 }
Sam Chiu5029a252018-11-06 20:54:13 +080061
62 # pylint: disable=protected-access
63 def testCreateLocalInstance(self):
64 """"Test get local instance info from launch_cvd process."""
65 self.Patch(subprocess, "check_output", return_value=self.PS_LAUNCH_CVD)
herbertxue6705f5b2018-12-25 14:47:53 +080066 self.Patch(instance, "_GetElapsedTime", return_value="fake_time")
Sam Chiu5029a252018-11-06 20:54:13 +080067 local_instance = instance.LocalInstance()
68 self.assertEqual(constants.LOCAL_INS_NAME, local_instance.name)
69 self.assertEqual(True, local_instance.islocal)
70 self.assertEqual("1080x1920 (480)", local_instance.display)
71 self.assertEqual("Sat Nov 10 21:55:10 2018", local_instance.createtime)
herbertxue6705f5b2018-12-25 14:47:53 +080072 expected_full_name = "device serial: 127.0.0.1:%s (%s) elapsed time: %s" % (
herbertxue543457e2019-03-18 18:13:34 +080073 constants.CF_ADB_PORT, constants.LOCAL_INS_NAME, "fake_time")
Sam Chiu5029a252018-11-06 20:54:13 +080074 self.assertEqual(expected_full_name, local_instance.fullname)
75
76 # test return None if no launch_cvd process found
77 self.Patch(subprocess, "check_output", return_value="no launch_cvd "
78 "found")
79 self.assertEqual(None, instance.LocalInstance())
80
herbertxue6705f5b2018-12-25 14:47:53 +080081 def testGetElapsedTime(self):
82 """Test _GetElapsedTime"""
83 # Instance time can't parse
84 start_time = "error time"
85 self.assertEqual(instance._MSG_UNABLE_TO_CALCULATE,
86 instance._GetElapsedTime(start_time))
87
88 # Remote instance elapsed time
89 now = "2019-01-14T13:00:00.000-07:00"
90 start_time = "2019-01-14T03:00:00.000-07:00"
91 self.Patch(instance, "datetime")
92 instance.datetime.datetime.now.return_value = dateutil.parser.parse(now)
93 self.assertEqual(
94 datetime.timedelta(hours=10), instance._GetElapsedTime(start_time))
95
96 # Local instance elapsed time
97 now = "Mon Jan 14 10:10:10 2019"
98 start_time = "Mon Jan 14 08:10:10 2019"
99 instance.datetime.datetime.now.return_value = dateutil.parser.parse(
100 now).replace(tzinfo=dateutil.tz.tzlocal())
101 self.assertEqual(
102 datetime.timedelta(hours=2), instance._GetElapsedTime(start_time))
103
Sam Chiu5029a252018-11-06 20:54:13 +0800104 # pylint: disable=protected-access
105 def testGetAdbVncPortFromSSHTunnel(self):
106 """"Test Get forwarding adb and vnc port from ssh tunnel."""
107 self.Patch(subprocess, "check_output", return_value=self.PS_SSH_TUNNEL)
herbertxue6705f5b2018-12-25 14:47:53 +0800108 self.Patch(instance, "_GetElapsedTime", return_value="fake_time")
chojoyce7a361732018-11-26 16:26:13 +0800109 forwarded_ports = instance.RemoteInstance(
110 mock.MagicMock()).GetAdbVncPortFromSSHTunnel(
cylan1b003212019-06-13 16:00:47 +0800111 "1.1.1.1", constants.TYPE_CF)
Sam Chiu5029a252018-11-06 20:54:13 +0800112 self.assertEqual(54321, forwarded_ports.adb_port)
113 self.assertEqual(12345, forwarded_ports.vnc_port)
114
115 # pylint: disable=protected-access
116 def testProcessGceInstance(self):
117 """"Test process instance detail."""
Sam Chiu5029a252018-11-06 20:54:13 +0800118 fake_adb = 123456
119 fake_vnc = 654321
120 forwarded_ports = collections.namedtuple("ForwardedPorts",
121 [constants.VNC_PORT,
122 constants.ADB_PORT])
123 self.Patch(
124 instance.RemoteInstance,
Sam Chiu56c58892018-10-25 09:53:19 +0800125 "GetAdbVncPortFromSSHTunnel",
Sam Chiu5029a252018-11-06 20:54:13 +0800126 return_value=forwarded_ports(vnc_port=fake_vnc, adb_port=fake_adb))
herbertxue6705f5b2018-12-25 14:47:53 +0800127 self.Patch(instance, "_GetElapsedTime", return_value="fake_time")
Sam Chiu943b64d2019-02-13 22:16:39 +0800128 self.Patch(AdbTools, "IsAdbConnected", return_value=True)
Sam Chiu5029a252018-11-06 20:54:13 +0800129
cylan4569dca2018-11-02 12:12:53 +0800130 # test ssh_tunnel_is_connected will be true if ssh tunnel connection is found
cylan1b003212019-06-13 16:00:47 +0800131 instance_info = instance.RemoteInstance(self.GCE_INSTANCE)
cylan4569dca2018-11-02 12:12:53 +0800132 self.assertTrue(instance_info.ssh_tunnel_is_connected)
Sam Chiu5029a252018-11-06 20:54:13 +0800133 self.assertEqual(instance_info.forwarding_adb_port, fake_adb)
134 self.assertEqual(instance_info.forwarding_vnc_port, fake_vnc)
cylan1b003212019-06-13 16:00:47 +0800135 self.assertEqual("1.1.1.1", instance_info.ip)
136 self.assertEqual("fake_status", instance_info.status)
137 self.assertEqual("fake_type", instance_info.avd_type)
138 self.assertEqual("fake_flavor", instance_info.avd_flavor)
herbertxue6705f5b2018-12-25 14:47:53 +0800139 expected_full_name = "device serial: 127.0.0.1:%s (%s) elapsed time: %s" % (
cylan1b003212019-06-13 16:00:47 +0800140 fake_adb, self.GCE_INSTANCE[constants.INS_KEY_NAME], "fake_time")
Sam Chiu5029a252018-11-06 20:54:13 +0800141 self.assertEqual(expected_full_name, instance_info.fullname)
142
Sam Chiu943b64d2019-02-13 22:16:39 +0800143 # test ssh tunnel is connected but adb is disconnected
144 self.Patch(AdbTools, "IsAdbConnected", return_value=False)
cylan1b003212019-06-13 16:00:47 +0800145 instance_info = instance.RemoteInstance(self.GCE_INSTANCE)
Sam Chiu943b64d2019-02-13 22:16:39 +0800146 self.assertTrue(instance_info.ssh_tunnel_is_connected)
147 expected_full_name = "device serial: not connected (%s) elapsed time: %s" % (
148 instance_info.name, "fake_time")
149 self.assertEqual(expected_full_name, instance_info.fullname)
150
cylan4569dca2018-11-02 12:12:53 +0800151 # test ssh_tunnel_is_connected will be false if ssh tunnel connection is not found
Sam Chiu5029a252018-11-06 20:54:13 +0800152 self.Patch(
153 instance.RemoteInstance,
Sam Chiu56c58892018-10-25 09:53:19 +0800154 "GetAdbVncPortFromSSHTunnel",
Sam Chiu5029a252018-11-06 20:54:13 +0800155 return_value=forwarded_ports(vnc_port=None, adb_port=None))
cylan1b003212019-06-13 16:00:47 +0800156 instance_info = instance.RemoteInstance(self.GCE_INSTANCE)
cylan4569dca2018-11-02 12:12:53 +0800157 self.assertFalse(instance_info.ssh_tunnel_is_connected)
herbertxue6705f5b2018-12-25 14:47:53 +0800158 expected_full_name = "device serial: not connected (%s) elapsed time: %s" % (
cylan1b003212019-06-13 16:00:47 +0800159 self.GCE_INSTANCE[constants.INS_KEY_NAME], "fake_time")
Sam Chiu5029a252018-11-06 20:54:13 +0800160 self.assertEqual(expected_full_name, instance_info.fullname)
161
cylan1b003212019-06-13 16:00:47 +0800162 def testInstanceSummary(self):
163 """Test instance summary."""
164 fake_adb = 123456
165 fake_vnc = 654321
166 forwarded_ports = collections.namedtuple("ForwardedPorts",
167 [constants.VNC_PORT,
168 constants.ADB_PORT])
169 self.Patch(
170 instance.RemoteInstance,
171 "GetAdbVncPortFromSSHTunnel",
172 return_value=forwarded_ports(vnc_port=fake_vnc, adb_port=fake_adb))
173 self.Patch(instance, "_GetElapsedTime", return_value="fake_time")
174 self.Patch(AdbTools, "IsAdbConnected", return_value=True)
175 remote_instance = instance.RemoteInstance(self.GCE_INSTANCE)
176 result_summary = (" name: fake_ins_name\n "
177 " IP: 1.1.1.1\n "
178 " create time: fake_create_time\n "
179 " elapse time: fake_time\n "
180 " status: fake_status\n "
181 " avd type: fake_type\n "
182 " display: None\n "
183 " vnc: 127.0.0.1:654321\n "
184 " adb serial: 127.0.0.1:123456\n "
185 " product: None\n "
186 " model: None\n "
187 " device: None\n "
188 " transport_id: None")
189 self.assertEqual(remote_instance.Summary(), result_summary)
190
191 self.Patch(
192 instance.RemoteInstance,
193 "GetAdbVncPortFromSSHTunnel",
194 return_value=forwarded_ports(vnc_port=None, adb_port=None))
195 self.Patch(instance, "_GetElapsedTime", return_value="fake_time")
196 self.Patch(AdbTools, "IsAdbConnected", return_value=False)
197 remote_instance = instance.RemoteInstance(self.GCE_INSTANCE)
198 result_summary = (" name: fake_ins_name\n "
199 " IP: 1.1.1.1\n "
200 " create time: fake_create_time\n "
201 " elapse time: fake_time\n "
202 " status: fake_status\n "
203 " avd type: fake_type\n "
204 " display: None\n "
205 " vnc: 127.0.0.1:None\n "
206 " adb serial: disconnected")
207 self.assertEqual(remote_instance.Summary(), result_summary)
208
Sam Chiu5029a252018-11-06 20:54:13 +0800209
210if __name__ == "__main__":
211 unittest.main()