Merge "startop: Add iorapd binder integration test"
This commit is contained in:
@@ -26,26 +26,3 @@ java_library_static {
|
|||||||
"**/*.java",
|
"**/*.java",
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
android_test {
|
|
||||||
name: "libiorap-java-tests",
|
|
||||||
srcs: ["tests/src/**/*.kt"],
|
|
||||||
|
|
||||||
static_libs: [
|
|
||||||
// non-test dependencies
|
|
||||||
"libiorap-java",
|
|
||||||
// test android dependencies
|
|
||||||
"platform-test-annotations",
|
|
||||||
"android-support-test",
|
|
||||||
// test framework dependencies
|
|
||||||
"mockito-target-inline-minus-junit4",
|
|
||||||
"truth-prebuilt",
|
|
||||||
],
|
|
||||||
|
|
||||||
//sdk_version: "current",
|
|
||||||
//certificate: "platform",
|
|
||||||
|
|
||||||
libs: ["android.test.base"],
|
|
||||||
|
|
||||||
test_suites: ["device-tests"],
|
|
||||||
}
|
|
||||||
|
|||||||
40
startop/iorap/tests/Android.bp
Normal file
40
startop/iorap/tests/Android.bp
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
// Copyright (C) 2018 The Android Open Source Project
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
// TODO: once b/80095087 is fixed, rewrite this back to android_test
|
||||||
|
java_library {
|
||||||
|
name: "libiorap-java-test-lib",
|
||||||
|
srcs: ["src/**/*.kt"],
|
||||||
|
|
||||||
|
static_libs: [
|
||||||
|
// non-test dependencies
|
||||||
|
"libiorap-java",
|
||||||
|
// test android dependencies
|
||||||
|
"platform-test-annotations",
|
||||||
|
"android-support-test",
|
||||||
|
// test framework dependencies
|
||||||
|
"mockito-target-inline-minus-junit4",
|
||||||
|
// "mockito-target-minus-junit4",
|
||||||
|
// Mockito also requires JNI (see Android.mk)
|
||||||
|
// and android:debuggable=true (see AndroidManifest.xml)
|
||||||
|
"truth-prebuilt",
|
||||||
|
],
|
||||||
|
|
||||||
|
// sdk_version: "current",
|
||||||
|
// certificate: "platform",
|
||||||
|
|
||||||
|
libs: ["android.test.base", "android.test.runner"],
|
||||||
|
|
||||||
|
// test_suites: ["device-tests"],
|
||||||
|
}
|
||||||
46
startop/iorap/tests/Android.mk
Normal file
46
startop/iorap/tests/Android.mk
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
# Copyright (C) 2018 The Android Open Source Project
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
# android_test does not support JNI libraries
|
||||||
|
# TODO: once b/80095087 is fixed, rewrite this back to android_test
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_MODULE_TAGS := tests
|
||||||
|
|
||||||
|
LOCAL_JACK_FLAGS := --multi-dex native
|
||||||
|
LOCAL_DX_FLAGS := --multi-dex
|
||||||
|
|
||||||
|
LOCAL_PACKAGE_NAME := libiorap-java-tests
|
||||||
|
LOCAL_COMPATIBILITY_SUITE := device-tests
|
||||||
|
|
||||||
|
LOCAL_STATIC_JAVA_LIBRARIES := \
|
||||||
|
libiorap-java-test-lib
|
||||||
|
|
||||||
|
LOCAL_MULTILIB := both
|
||||||
|
|
||||||
|
LOCAL_JNI_SHARED_LIBRARIES := \
|
||||||
|
libdexmakerjvmtiagent \
|
||||||
|
libstaticjvmtiagent \
|
||||||
|
libmultiplejvmtiagentsinterferenceagent
|
||||||
|
|
||||||
|
LOCAL_JAVA_LIBRARIES := \
|
||||||
|
android.test.base \
|
||||||
|
android.test.runner
|
||||||
|
|
||||||
|
# Use private APIs
|
||||||
|
LOCAL_CERTIFICATE := platform
|
||||||
|
LOCAL_PRIVATE_PLATFORM_APIS := true
|
||||||
|
|
||||||
|
include $(BUILD_PACKAGE)
|
||||||
@@ -25,7 +25,13 @@
|
|||||||
android:name="android.support.test.runner.AndroidJUnitRunner"
|
android:name="android.support.test.runner.AndroidJUnitRunner"
|
||||||
android:targetPackage="com.google.android.startop.iorap.tests" />
|
android:targetPackage="com.google.android.startop.iorap.tests" />
|
||||||
|
|
||||||
<application>
|
<!--
|
||||||
|
'debuggable=true' is required to properly load mockito jvmti dependencies,
|
||||||
|
otherwise it gives the following error at runtime:
|
||||||
|
|
||||||
|
Openjdkjvmti plugin was loaded on a non-debuggable Runtime.
|
||||||
|
Plugin was loaded too late to change runtime state to DEBUGGABLE. -->
|
||||||
|
<application android:debuggable="true">
|
||||||
<uses-library android:name="android.test.runner" />
|
<uses-library android:name="android.test.runner" />
|
||||||
</application>
|
</application>
|
||||||
</manifest>
|
</manifest>
|
||||||
@@ -0,0 +1,117 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* 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.startop.iorap
|
||||||
|
|
||||||
|
import android.net.Uri
|
||||||
|
import android.os.ServiceManager
|
||||||
|
import android.support.test.filters.MediumTest
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.Ignore
|
||||||
|
import org.mockito.Mockito.*
|
||||||
|
|
||||||
|
// @Ignore("Test is disabled until iorapd is added to init and there's selinux policies for it")
|
||||||
|
@MediumTest
|
||||||
|
class IIorapIntegrationTest {
|
||||||
|
/**
|
||||||
|
* @throws ServiceManager.ServiceNotFoundException if iorapd service could not be found
|
||||||
|
*/
|
||||||
|
private val iorapService : IIorap by lazy {
|
||||||
|
// TODO: connect to 'iorapd.stub' which doesn't actually do any work other than reply.
|
||||||
|
IIorap.Stub.asInterface(ServiceManager.getServiceOrThrow("iorapd"))
|
||||||
|
|
||||||
|
// Use 'adb shell setenforce 0' otherwise this whole test fails,
|
||||||
|
// because the servicemanager is not allowed to hand out the binder token for iorapd.
|
||||||
|
|
||||||
|
// TODO: implement the selinux policies for iorapd.
|
||||||
|
}
|
||||||
|
|
||||||
|
// A dummy binder stub implementation is required to use with mockito#spy.
|
||||||
|
// Mockito overrides the methods at runtime and tracks how methods were invoked.
|
||||||
|
open class DummyTaskListener : ITaskListener.Stub() {
|
||||||
|
// Note: make parameters nullable to avoid the kotlin IllegalStateExceptions
|
||||||
|
// from using the mockito matchers (eq, argThat, etc).
|
||||||
|
override fun onProgress(requestId: RequestId?, result: TaskResult?) {
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onComplete(requestId: RequestId?, result: TaskResult?) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun testAnyMethod(func : (RequestId) -> Unit) {
|
||||||
|
val taskListener = spy(DummyTaskListener())!!
|
||||||
|
|
||||||
|
try {
|
||||||
|
iorapService.setTaskListener(taskListener)
|
||||||
|
// Note: Binder guarantees total order for oneway messages sent to the same binder
|
||||||
|
// interface, so we don't need any additional blocking here before sending later calls.
|
||||||
|
|
||||||
|
// Every new method call should have a unique request id.
|
||||||
|
val requestId = RequestId.nextValueForSequence()!!
|
||||||
|
|
||||||
|
// Apply the specific function under test.
|
||||||
|
func(requestId)
|
||||||
|
|
||||||
|
// Typical mockito behavior is to allow any-order callbacks, but we want to test order.
|
||||||
|
val inOrder = inOrder(taskListener)
|
||||||
|
|
||||||
|
// The "stub" behavior of iorapd is that every request immediately gets a response of
|
||||||
|
// BEGAN,ONGOING,COMPLETED
|
||||||
|
inOrder.verify(taskListener, timeout(100)).
|
||||||
|
onProgress(eq(requestId), argThat { it!!.state == TaskResult.STATE_BEGAN })
|
||||||
|
inOrder.verify(taskListener, timeout(100)).
|
||||||
|
onProgress(eq(requestId), argThat { it!!.state == TaskResult.STATE_ONGOING })
|
||||||
|
inOrder.verify(taskListener, timeout(100)).
|
||||||
|
onComplete(eq(requestId), argThat { it!!.state == TaskResult.STATE_COMPLETED })
|
||||||
|
inOrder.verifyNoMoreInteractions()
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
iorapService.setTaskListener(null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testOnPackageEvent() {
|
||||||
|
testAnyMethod { requestId : RequestId ->
|
||||||
|
iorapService.onPackageEvent(requestId,
|
||||||
|
PackageEvent.createReplaced(
|
||||||
|
Uri.parse("https://www.google.com"), "com.fake.package"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testOnAppIntentEvent() {
|
||||||
|
testAnyMethod { requestId : RequestId ->
|
||||||
|
iorapService.onAppIntentEvent(requestId, AppIntentEvent.createDefaultIntentChanged(
|
||||||
|
ActivityInfo("dont care", "dont care"),
|
||||||
|
ActivityInfo("dont care 2", "dont care 2")))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testOnSystemServiceEvent() {
|
||||||
|
testAnyMethod { requestId : RequestId ->
|
||||||
|
iorapService.onSystemServiceEvent(requestId,
|
||||||
|
SystemServiceEvent(SystemServiceEvent.TYPE_START))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testOnSystemServiceUserEvent() {
|
||||||
|
testAnyMethod { requestId : RequestId ->
|
||||||
|
iorapService.onSystemServiceUserEvent(requestId,
|
||||||
|
SystemServiceUserEvent(SystemServiceUserEvent.TYPE_START_USER,0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user