• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.tradefed.device.connection;
17 
18 import com.android.ddmlib.IDevice;
19 import com.android.tradefed.build.IBuildInfo;
20 import com.android.tradefed.device.IConfigurableVirtualDevice;
21 import com.android.tradefed.device.ITestDevice;
22 import com.android.tradefed.device.ManagedTestDeviceFactory;
23 import com.android.tradefed.device.NativeDevice;
24 import com.android.tradefed.device.NullDevice;
25 import com.android.tradefed.device.RemoteAndroidDevice;
26 import com.android.tradefed.device.RemoteAvdIDevice;
27 import com.android.tradefed.device.TestDeviceOptions.InstanceType;
28 import com.android.tradefed.device.cloud.GceAvdInfo;
29 import com.android.tradefed.device.cloud.RemoteAndroidVirtualDevice;
30 import com.android.tradefed.log.ITestLogger;
31 import com.android.tradefed.log.LogUtil.CLog;
32 import com.android.tradefed.util.IRunUtil;
33 import com.android.tradefed.util.MultiMap;
34 
35 /**
36  * Default connection representation of a device, assumed to be a standard adb connection of the
37  * device.
38  */
39 public class DefaultConnection extends AbstractConnection {
40 
41     private final IRunUtil mRunUtil;
42     private final ITestDevice mDevice;
43     private final IBuildInfo mBuildInfo;
44     private final MultiMap<String, String> mAttributes;
45     private final String mInitialIpDevice;
46     private final String mInitialUser;
47     private final Integer mInitialDeviceNumOffset;
48     private final String mInitialSerial;
49     private final ITestLogger mTestLogger;
50     private final boolean mPreExisting;
51 
52     private final boolean mTemporaryHolder;
53 
createInopConnection(ConnectionBuilder builder)54     public static DefaultConnection createInopConnection(ConnectionBuilder builder) {
55         return new DefaultConnection(builder);
56     }
57 
58     /** Create the requested connection. */
createConnection(ConnectionBuilder builder)59     public static DefaultConnection createConnection(ConnectionBuilder builder) {
60         ITestDevice device = builder.device;
61         if (device == null) {
62             return new DefaultConnection(builder);
63         }
64 
65         final InstanceType type = device.getOptions().getInstanceType();
66         final boolean isRemoteAvd =
67                 type.equals(InstanceType.CUTTLEFISH) || type.equals(InstanceType.REMOTE_NESTED_AVD);
68         if (!device.getOptions().evaluateDeviceConnection()) {
69             CLog.d("Instance type for connection: %s", type);
70             if (device instanceof RemoteAndroidVirtualDevice) {
71                 ((NativeDevice) device).setFastbootEnabled(isRemoteAvd);
72                 ((NativeDevice) device).setLogStartDelay(0);
73                 return new AdbSshConnection(builder);
74             }
75             if (device instanceof RemoteAndroidDevice) {
76                 return new AdbTcpConnection(builder);
77             }
78         }
79 
80         CLog.d("Instance type for connection: %s. Evaluating for connection type.", type);
81         if (isRemoteAvd) {
82             if (ManagedTestDeviceFactory.isTcpDeviceSerial(device.getSerialNumber())) {
83                 // TODO: Add support for remote environment
84                 // If the device is already started just go for TcpConnection
85                 return new AdbTcpConnection(builder);
86             } else if (type.equals(InstanceType.REMOTE_NESTED_AVD)
87                     && device.getIDevice() instanceof RemoteAvdIDevice
88                     && ((RemoteAvdIDevice) device.getIDevice()).getKnownDeviceIp() != null) {
89                 builder.markPreexisting();
90                 return new AdbTcpConnection(builder);
91             } else {
92                 ((NativeDevice) device).setLogStartDelay(0);
93                 return new AdbSshConnection(builder);
94             }
95         }
96 
97         return new DefaultConnection(builder);
98     }
99 
100     /** Builder used to described the connection. */
101     public static class ConnectionBuilder {
102 
103         ITestDevice device;
104         IBuildInfo buildInfo;
105         MultiMap<String, String> attributes;
106         IRunUtil runUtil;
107         ITestLogger logger;
108         GceAvdInfo existingAvdInfo;
109         boolean preExisting;
110 
ConnectionBuilder( IRunUtil runUtil, ITestDevice device, IBuildInfo buildInfo, ITestLogger logger)111         public ConnectionBuilder(
112                 IRunUtil runUtil, ITestDevice device, IBuildInfo buildInfo, ITestLogger logger) {
113             this.runUtil = runUtil;
114             this.device = device;
115             this.buildInfo = buildInfo;
116             this.logger = logger;
117             attributes = new MultiMap<String, String>();
118         }
119 
addAttributes(MultiMap<String, String> attributes)120         public ConnectionBuilder addAttributes(MultiMap<String, String> attributes) {
121             this.attributes.putAll(attributes);
122             return this;
123         }
124 
setExistingAvdInfo(GceAvdInfo info)125         public ConnectionBuilder setExistingAvdInfo(GceAvdInfo info) {
126             existingAvdInfo = info;
127             return this;
128         }
129 
markPreexisting()130         public ConnectionBuilder markPreexisting() {
131             preExisting = true;
132             return this;
133         }
134     }
135 
136     /** Constructor */
DefaultConnection(ConnectionBuilder builder)137     protected DefaultConnection(ConnectionBuilder builder) {
138         mRunUtil = builder.runUtil;
139         mDevice = builder.device;
140         mBuildInfo = builder.buildInfo;
141         mAttributes = builder.attributes;
142         IDevice idevice = mDevice.getIDevice();
143         mInitialSerial = mDevice.getSerialNumber();
144         mTestLogger = builder.logger;
145         mPreExisting = builder.preExisting;
146         if (idevice instanceof IConfigurableVirtualDevice) {
147             mInitialIpDevice = ((IConfigurableVirtualDevice) idevice).getKnownDeviceIp();
148             mInitialUser = ((IConfigurableVirtualDevice) idevice).getKnownUser();
149             mInitialDeviceNumOffset = ((IConfigurableVirtualDevice) idevice).getDeviceNumOffset();
150         } else {
151             mInitialIpDevice = null;
152             mInitialUser = null;
153             mInitialDeviceNumOffset = null;
154         }
155         if (idevice instanceof NullDevice) {
156             mTemporaryHolder = ((NullDevice) idevice).isTemporary();
157         } else {
158             mTemporaryHolder = false;
159         }
160     }
161 
162     /** Returns {@link IRunUtil} to execute commands. */
getRunUtil()163     protected IRunUtil getRunUtil() {
164         return mRunUtil;
165     }
166 
getDevice()167     public final ITestDevice getDevice() {
168         return mDevice;
169     }
170 
getBuildInfo()171     public final IBuildInfo getBuildInfo() {
172         return mBuildInfo;
173     }
174 
getAttributes()175     public final MultiMap<String, String> getAttributes() {
176         return mAttributes;
177     }
178 
179     /**
180      * Returns the initial associated ip to the device if any. Returns null if no known initial ip.
181      */
getInitialIp()182     public String getInitialIp() {
183         return mInitialIpDevice;
184     }
185 
186     /** Returns the initial known user if any. Returns null if no initial known user. */
getInitialUser()187     public String getInitialUser() {
188         return mInitialUser;
189     }
190 
191     /** Returns the known device num offset if any. Returns null if not available. */
getInitialDeviceNumOffset()192     public Integer getInitialDeviceNumOffset() {
193         return mInitialDeviceNumOffset;
194     }
195 
196     /** Returns the initial serial name of the device. */
getInitialSerial()197     public String getInitialSerial() {
198         return mInitialSerial;
199     }
200 
201     /** Returns the {@link ITestLogger} to log files. */
getLogger()202     public ITestLogger getLogger() {
203         return mTestLogger;
204     }
205 
wasTemporaryHolder()206     public boolean wasTemporaryHolder() {
207         return mTemporaryHolder;
208     }
209 
wasPreExisting()210     public boolean wasPreExisting() {
211         return mPreExisting;
212     }
213 }
214