am 5610c287
: am 7d167376
: Merge "Add unit test for passing thread priority & cgroup through Binder." into froyo
Merge commit '5610c2871b5a8abab081c9e209925e2f0f2e3966' into kraken * commit '5610c2871b5a8abab081c9e209925e2f0f2e3966': Add unit test for passing thread priority & cgroup through Binder.
This commit is contained in:
@ -7,9 +7,9 @@ LOCAL_MODULE_TAGS := tests
|
|||||||
# Include all test java files.
|
# Include all test java files.
|
||||||
LOCAL_SRC_FILES := \
|
LOCAL_SRC_FILES := \
|
||||||
$(call all-java-files-under, src) \
|
$(call all-java-files-under, src) \
|
||||||
|
$(call all-Iaidl-files-under, src) \
|
||||||
$(call all-java-files-under, DisabledTestApp/src) \
|
$(call all-java-files-under, DisabledTestApp/src) \
|
||||||
$(call all-java-files-under, EnabledTestApp/src) \
|
$(call all-java-files-under, EnabledTestApp/src)
|
||||||
src/android/os/IAidlTest.aidl
|
|
||||||
|
|
||||||
LOCAL_STATIC_JAVA_LIBRARIES += android-common
|
LOCAL_STATIC_JAVA_LIBRARIES += android-common
|
||||||
|
|
||||||
|
@ -1179,8 +1179,11 @@
|
|||||||
<!-- Application components used for os tests -->
|
<!-- Application components used for os tests -->
|
||||||
|
|
||||||
<service android:name="android.os.MessengerService"
|
<service android:name="android.os.MessengerService"
|
||||||
android:process=":messengerService">
|
android:process=":messengerService" />
|
||||||
</service>
|
|
||||||
|
<!-- Used by BinderThreadPriorityTest -->
|
||||||
|
<service android:name="android.os.BinderThreadPriorityService"
|
||||||
|
android:process=":BinderThreadPriorityService" />
|
||||||
|
|
||||||
<!-- Application components used for search manager tests -->
|
<!-- Application components used for search manager tests -->
|
||||||
|
|
||||||
@ -1198,13 +1201,6 @@
|
|||||||
android:authorities="android.app.SuggestionProvider">
|
android:authorities="android.app.SuggestionProvider">
|
||||||
</provider>
|
</provider>
|
||||||
|
|
||||||
<!-- Used to test IPC. -->
|
|
||||||
<service android:name="com.android.frameworks.coretests.binder.BinderTestService"
|
|
||||||
android:process="binder.BinderTestService" />
|
|
||||||
<service android:name="com.android.frameworks.coretests.binder.BinderPerformanceService"
|
|
||||||
android:process="binder.BinderPerformanceService" />
|
|
||||||
<service android:name="com.android.frameworks.coretests.binder.BinderVsMessagingService"
|
|
||||||
android:process="binder.BinderVsMessagingService" />
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
<instrumentation
|
<instrumentation
|
||||||
|
@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2010 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 android.os;
|
||||||
|
|
||||||
|
import android.app.Service;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service used by {@link BinderThreadPriorityTest} to verify
|
||||||
|
* the conveyance of thread priorities over Binder.
|
||||||
|
*/
|
||||||
|
public class BinderThreadPriorityService extends Service {
|
||||||
|
private static final String TAG = "BinderThreadPriorityService";
|
||||||
|
|
||||||
|
private final IBinderThreadPriorityService.Stub mBinder =
|
||||||
|
new IBinderThreadPriorityService.Stub() {
|
||||||
|
public int getThreadPriority() {
|
||||||
|
return Process.getThreadPriority(Process.myTid());
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getThreadSchedulerGroup() {
|
||||||
|
return BinderThreadPriorityTest.getSchedulerGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void callBack(IBinderThreadPriorityService recurse) {
|
||||||
|
try {
|
||||||
|
recurse.callBack(this);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
Log.e(TAG, "Binder callback failed", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPriorityAndCallBack(int priority, IBinderThreadPriorityService recurse) {
|
||||||
|
Process.setThreadPriority(priority);
|
||||||
|
try {
|
||||||
|
recurse.callBack(this);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
Log.e(TAG, "Binder callback failed", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public IBinder onBind(Intent intent) {
|
||||||
|
return mBinder;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,146 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2010 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 android.os;
|
||||||
|
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.ServiceConnection;
|
||||||
|
import android.test.AndroidTestCase;
|
||||||
|
import android.test.suitebuilder.annotation.MediumTest;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test whether Binder calls inherit thread priorities correctly.
|
||||||
|
*/
|
||||||
|
public class BinderThreadPriorityTest extends AndroidTestCase {
|
||||||
|
private static final String TAG = "BinderThreadPriorityTest";
|
||||||
|
private IBinderThreadPriorityService mService;
|
||||||
|
private int mSavedPriority;
|
||||||
|
|
||||||
|
private ServiceConnection mConnection = new ServiceConnection() {
|
||||||
|
public void onServiceConnected(ComponentName name, IBinder service) {
|
||||||
|
synchronized (BinderThreadPriorityTest.this) {
|
||||||
|
mService = IBinderThreadPriorityService.Stub.asInterface(service);
|
||||||
|
BinderThreadPriorityTest.this.notifyAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onServiceDisconnected(ComponentName name) {
|
||||||
|
mService = null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private static class ServiceStub extends IBinderThreadPriorityService.Stub {
|
||||||
|
public int getThreadPriority() { fail(); return -999; }
|
||||||
|
public String getThreadSchedulerGroup() { fail(); return null; }
|
||||||
|
public void setPriorityAndCallBack(int p, IBinderThreadPriorityService cb) { fail(); }
|
||||||
|
public void callBack(IBinderThreadPriorityService cb) { fail(); }
|
||||||
|
private static void fail() { throw new RuntimeException("unimplemented"); }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setUp() throws Exception {
|
||||||
|
super.setUp();
|
||||||
|
|
||||||
|
getContext().bindService(
|
||||||
|
new Intent(getContext(), BinderThreadPriorityService.class),
|
||||||
|
mConnection, Context.BIND_AUTO_CREATE);
|
||||||
|
|
||||||
|
synchronized (this) {
|
||||||
|
if (mService == null) {
|
||||||
|
try {
|
||||||
|
wait(30000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
assertNotNull("Gave up waiting for BinderThreadPriorityService", mService);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mSavedPriority = Process.getThreadPriority(Process.myTid());
|
||||||
|
Process.setThreadPriority(mSavedPriority); // To realign priority & cgroup, if needed
|
||||||
|
assertEquals(expectedSchedulerGroup(mSavedPriority), getSchedulerGroup());
|
||||||
|
Log.i(TAG, "Saved priority: " + mSavedPriority);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void tearDown() throws Exception {
|
||||||
|
// HACK -- see bug 2665914 -- setThreadPriority() doesn't always set the
|
||||||
|
// scheduler group reliably unless we start out with background priority.
|
||||||
|
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
|
||||||
|
Process.setThreadPriority(mSavedPriority);
|
||||||
|
assertEquals(mSavedPriority, Process.getThreadPriority(Process.myTid()));
|
||||||
|
assertEquals(expectedSchedulerGroup(mSavedPriority), getSchedulerGroup());
|
||||||
|
|
||||||
|
getContext().unbindService(mConnection);
|
||||||
|
super.tearDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getSchedulerGroup() {
|
||||||
|
String fn = "/proc/" + Process.myPid() + "/task/" + Process.myTid() + "/cgroup";
|
||||||
|
try {
|
||||||
|
String cgroup = FileUtils.readTextFile(new File(fn), 1024, null);
|
||||||
|
for (String line : cgroup.split("\n")) {
|
||||||
|
String fields[] = line.trim().split(":");
|
||||||
|
if (fields.length == 3 && fields[1].equals("cpu")) return fields[2];
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.e(TAG, "Can't read: " + fn, e);
|
||||||
|
}
|
||||||
|
return null; // Unknown
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String expectedSchedulerGroup(int prio) {
|
||||||
|
return prio < Process.THREAD_PRIORITY_BACKGROUND ? "/" : "/bg_non_interactive";
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testPassPriorityToService() throws Exception {
|
||||||
|
for (int prio = 19; prio >= -20; prio--) {
|
||||||
|
Process.setThreadPriority(prio);
|
||||||
|
|
||||||
|
// Local
|
||||||
|
assertEquals(prio, Process.getThreadPriority(Process.myTid()));
|
||||||
|
assertEquals(expectedSchedulerGroup(prio), getSchedulerGroup());
|
||||||
|
|
||||||
|
// Remote
|
||||||
|
assertEquals(prio, mService.getThreadPriority());
|
||||||
|
assertEquals(expectedSchedulerGroup(prio), mService.getThreadSchedulerGroup());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCallBackFromServiceWithPriority() throws Exception {
|
||||||
|
for (int prio = -20; prio <= 19; prio++) {
|
||||||
|
final int expected = prio;
|
||||||
|
mService.setPriorityAndCallBack(prio, new ServiceStub() {
|
||||||
|
public void callBack(IBinderThreadPriorityService cb) {
|
||||||
|
assertEquals(expected, Process.getThreadPriority(Process.myTid()));
|
||||||
|
assertEquals(expectedSchedulerGroup(expected), getSchedulerGroup());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assertEquals(mSavedPriority, Process.getThreadPriority(Process.myTid()));
|
||||||
|
|
||||||
|
// BROKEN -- see bug 2665954 -- scheduler group doesn't get reset
|
||||||
|
// properly after a back-call with a different priority.
|
||||||
|
// assertEquals(expectedSchedulerGroup(mSavedPriority), getSchedulerGroup());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2010 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 android.os;
|
||||||
|
|
||||||
|
interface IBinderThreadPriorityService {
|
||||||
|
int getThreadPriority();
|
||||||
|
String getThreadSchedulerGroup();
|
||||||
|
void callBack(IBinderThreadPriorityService recurse);
|
||||||
|
void setPriorityAndCallBack(int priority, IBinderThreadPriorityService recurse);
|
||||||
|
}
|
Reference in New Issue
Block a user