/* * Copyright (C) 2016 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.android.mobly.snippet; import android.app.Instrumentation; import android.app.Notification; import android.app.NotificationManager; import android.content.Context; import android.os.Bundle; import android.os.Process; import android.support.test.runner.AndroidJUnitRunner; import com.google.android.mobly.snippet.rpc.AndroidProxy; import com.google.android.mobly.snippet.util.EmptyTestClass; import com.google.android.mobly.snippet.util.Log; import com.google.android.mobly.snippet.util.NotificationIdFactory; import java.io.IOException; import java.net.SocketException; import java.util.Locale; /** * A launcher that starts the snippet server as an instrumentation so that it has access to the * target app's context. * *
We have to extend some subclass of {@link android.test.InstrumentationTestRunner} because * snippets are launched with 'am instrument'. We're specifically extending {@link * AndroidJUnitRunner} because Espresso requires being called through it, since it sets up {@link * android.support.test.InstrumentationRegistry} which Espresso requires. * *
The launch and communication protocol between snippet and client is versionated and reported * as follows: * *
Incrementing this means that compatibility with clients using the older version is broken. * Avoid breaking compatibility unless there is no other choice. */ public static final int PROTOCOL_MAJOR_VERSION = 1; /** * Minor version of the launch and communication protocol. * *
Increment this when new features are added to the launch and communication protocol that
* are backwards compatible with the old protocol and don't break existing clients.
*/
public static final int PROTOCOL_MINOR_VERSION = 0;
private static final String ARG_ACTION = "action";
private static final String ARG_PORT = "port";
private enum Action {
START,
STOP
};
private static final int NOTIFICATION_ID = NotificationIdFactory.create();
private Bundle mArguments;
private NotificationManager mNotificationManager;
private Notification mNotification;
@Override
public void onCreate(Bundle arguments) {
mArguments = arguments;
// First-run static setup
Log.initLogTag(getContext());
// First order of business is to report HELLO to instrumentation output.
sendString(
"SNIPPET START, PROTOCOL " + PROTOCOL_MAJOR_VERSION + " " + PROTOCOL_MINOR_VERSION);
// Prevent this runner from triggering any real JUnit tests in the snippet by feeding it a
// hardcoded empty test class.
mArguments.putString("class", EmptyTestClass.class.getCanonicalName());
mNotificationManager =
(NotificationManager)
getTargetContext().getSystemService(Context.NOTIFICATION_SERVICE);
super.onCreate(mArguments);
}
@Override
public void onStart() {
String actionStr = mArguments.getString(ARG_ACTION);
if (actionStr == null) {
throw new IllegalArgumentException("\"--e action