diff options
author | 2018-10-04 12:01:01 -0700 | |
---|---|---|
committer | 2018-10-04 12:01:01 -0700 | |
commit | 8e2b745c85cdb39d718ca2251680a825dc276b4e (patch) | |
tree | 48d8e4913eab02ba6e1aea6fc403fbef6a78e482 | |
parent | 05ceb67558d3b756ce782ac9e70101e08464060d (diff) | |
parent | 2c5f2a5d8a1d5c5c32e2c03a1fddd0e4451637fb (diff) |
Merge "startop: Add iorapd binder integration test" am: 4ddd969fb9
am: 2c5f2a5d8a
Change-Id: I4c53714c87fd357cc813e38ce4818f1c832e86f4
-rw-r--r-- | startop/iorap/Android.bp | 23 | ||||
-rw-r--r-- | startop/iorap/tests/Android.bp | 40 | ||||
-rw-r--r-- | startop/iorap/tests/Android.mk | 46 | ||||
-rw-r--r-- | startop/iorap/tests/AndroidManifest.xml (renamed from startop/iorap/AndroidManifest.xml) | 8 | ||||
-rw-r--r-- | startop/iorap/tests/src/com/google/android/startop/iorap/IIorapIntegrationTest.kt | 117 |
5 files changed, 210 insertions, 24 deletions
diff --git a/startop/iorap/Android.bp b/startop/iorap/Android.bp index 91f6aace2192..b3b09001e7ee 100644 --- a/startop/iorap/Android.bp +++ b/startop/iorap/Android.bp @@ -26,26 +26,3 @@ java_library_static { "**/*.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"], -} diff --git a/startop/iorap/tests/Android.bp b/startop/iorap/tests/Android.bp new file mode 100644 index 000000000000..76057846e896 --- /dev/null +++ b/startop/iorap/tests/Android.bp @@ -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"], +} diff --git a/startop/iorap/tests/Android.mk b/startop/iorap/tests/Android.mk new file mode 100644 index 000000000000..1b2aa46a6418 --- /dev/null +++ b/startop/iorap/tests/Android.mk @@ -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) diff --git a/startop/iorap/AndroidManifest.xml b/startop/iorap/tests/AndroidManifest.xml index 8e5fe975b522..99f4add6579f 100644 --- a/startop/iorap/AndroidManifest.xml +++ b/startop/iorap/tests/AndroidManifest.xml @@ -25,7 +25,13 @@ android:name="android.support.test.runner.AndroidJUnitRunner" 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" /> </application> </manifest> diff --git a/startop/iorap/tests/src/com/google/android/startop/iorap/IIorapIntegrationTest.kt b/startop/iorap/tests/src/com/google/android/startop/iorap/IIorapIntegrationTest.kt new file mode 100644 index 000000000000..4ba44a93f2a8 --- /dev/null +++ b/startop/iorap/tests/src/com/google/android/startop/iorap/IIorapIntegrationTest.kt @@ -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)) + } + } +} |