SysuiTestCase.java revision e97892844a5c21c91c7f82b96f82202b18a1a24d
1930eccaf44239d010cbafb246651697996f567b5Chris Wren/* 2930eccaf44239d010cbafb246651697996f567b5Chris Wren * Copyright (C) 2014 The Android Open Source Project 3930eccaf44239d010cbafb246651697996f567b5Chris Wren * 4930eccaf44239d010cbafb246651697996f567b5Chris Wren * Licensed under the Apache License, Version 2.0 (the "License"); 5930eccaf44239d010cbafb246651697996f567b5Chris Wren * you may not use this file except in compliance with the License. 6930eccaf44239d010cbafb246651697996f567b5Chris Wren * You may obtain a copy of the License at 7930eccaf44239d010cbafb246651697996f567b5Chris Wren * 8930eccaf44239d010cbafb246651697996f567b5Chris Wren * http://www.apache.org/licenses/LICENSE-2.0 9930eccaf44239d010cbafb246651697996f567b5Chris Wren * 10930eccaf44239d010cbafb246651697996f567b5Chris Wren * Unless required by applicable law or agreed to in writing, software 11930eccaf44239d010cbafb246651697996f567b5Chris Wren * distributed under the License is distributed on an "AS IS" BASIS, 12930eccaf44239d010cbafb246651697996f567b5Chris Wren * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13930eccaf44239d010cbafb246651697996f567b5Chris Wren * See the License for the specific language governing permissions and 14930eccaf44239d010cbafb246651697996f567b5Chris Wren * limitations under the License. 15930eccaf44239d010cbafb246651697996f567b5Chris Wren */ 16930eccaf44239d010cbafb246651697996f567b5Chris Wrenpackage com.android.systemui; 17930eccaf44239d010cbafb246651697996f567b5Chris Wren 182c403db659db615831d8bd02661f8769c7762241Geoffrey Pitschimport android.content.Context; 192c403db659db615831d8bd02661f8769c7762241Geoffrey Pitschimport android.support.test.InstrumentationRegistry; 2086bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monkimport android.os.Handler; 2186bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monkimport android.os.Looper; 2286bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monkimport android.os.MessageQueue; 23e97892844a5c21c91c7f82b96f82202b18a1a24dJason Monk 24e97892844a5c21c91c7f82b96f82202b18a1a24dJason Monkimport com.android.systemui.utils.TestableContext; 25e97892844a5c21c91c7f82b96f82202b18a1a24dJason Monk 26e97892844a5c21c91c7f82b96f82202b18a1a24dJason Monkimport org.junit.After; 272c403db659db615831d8bd02661f8769c7762241Geoffrey Pitschimport org.junit.Before; 28930eccaf44239d010cbafb246651697996f567b5Chris Wren 29930eccaf44239d010cbafb246651697996f567b5Chris Wren/** 30930eccaf44239d010cbafb246651697996f567b5Chris Wren * Base class that does System UI specific setup. 31930eccaf44239d010cbafb246651697996f567b5Chris Wren */ 322c403db659db615831d8bd02661f8769c7762241Geoffrey Pitschpublic class SysuiTestCase { 3386bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk 3486bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk private Handler mHandler; 35e97892844a5c21c91c7f82b96f82202b18a1a24dJason Monk protected TestableContext mContext; 362c403db659db615831d8bd02661f8769c7762241Geoffrey Pitsch 372c403db659db615831d8bd02661f8769c7762241Geoffrey Pitsch @Before 382c403db659db615831d8bd02661f8769c7762241Geoffrey Pitsch public void SysuiSetup() throws Exception { 39e97892844a5c21c91c7f82b96f82202b18a1a24dJason Monk mContext = new TestableContext(InstrumentationRegistry.getTargetContext()); 40e97892844a5c21c91c7f82b96f82202b18a1a24dJason Monk } 41e97892844a5c21c91c7f82b96f82202b18a1a24dJason Monk 42e97892844a5c21c91c7f82b96f82202b18a1a24dJason Monk @After 43e97892844a5c21c91c7f82b96f82202b18a1a24dJason Monk public void cleanup() throws Exception { 44e97892844a5c21c91c7f82b96f82202b18a1a24dJason Monk mContext.getSettingsProvider().clearOverrides(this); 452c403db659db615831d8bd02661f8769c7762241Geoffrey Pitsch } 462c403db659db615831d8bd02661f8769c7762241Geoffrey Pitsch 472c403db659db615831d8bd02661f8769c7762241Geoffrey Pitsch protected Context getContext() { 482c403db659db615831d8bd02661f8769c7762241Geoffrey Pitsch return mContext; 49930eccaf44239d010cbafb246651697996f567b5Chris Wren } 5086bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk 5186bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk protected void waitForIdleSync() { 5286bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk if (mHandler == null) { 5386bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk mHandler = new Handler(Looper.getMainLooper()); 5486bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk } 5586bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk waitForIdleSync(mHandler); 5686bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk } 5786bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk 5886bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk protected void waitForIdleSync(Handler h) { 5986bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk validateThread(h.getLooper()); 6086bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk Idler idler = new Idler(null); 6186bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk h.getLooper().getQueue().addIdleHandler(idler); 6286bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk // Ensure we are non-idle, so the idle handler can run. 6386bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk h.post(new EmptyRunnable()); 6486bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk idler.waitForIdle(); 6586bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk } 6686bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk 6786bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk private static final void validateThread(Looper l) { 6886bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk if (Looper.myLooper() == l) { 6986bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk throw new RuntimeException( 7086bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk "This method can not be called from the looper being synced"); 7186bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk } 7286bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk } 7386bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk 7486bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk public static final class EmptyRunnable implements Runnable { 7586bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk public void run() { 7686bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk } 7786bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk } 7886bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk 7986bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk public static final class Idler implements MessageQueue.IdleHandler { 8086bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk private final Runnable mCallback; 8186bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk private boolean mIdle; 8286bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk 8386bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk public Idler(Runnable callback) { 8486bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk mCallback = callback; 8586bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk mIdle = false; 8686bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk } 8786bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk 8886bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk @Override 8986bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk public boolean queueIdle() { 9086bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk if (mCallback != null) { 9186bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk mCallback.run(); 9286bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk } 9386bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk synchronized (this) { 9486bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk mIdle = true; 9586bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk notifyAll(); 9686bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk } 9786bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk return false; 9886bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk } 9986bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk 10086bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk public void waitForIdle() { 10186bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk synchronized (this) { 10286bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk while (!mIdle) { 10386bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk try { 10486bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk wait(); 10586bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk } catch (InterruptedException e) { 10686bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk } 10786bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk } 10886bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk } 10986bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk } 11086bc33188948e7b6beb07dbb5ddba59b5ea3c1fcJason Monk } 111930eccaf44239d010cbafb246651697996f567b5Chris Wren} 112