| /* |
| * Copyright (C) 2015 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.android.messaging; |
| |
| import android.appwidget.AppWidgetManager; |
| import android.content.ComponentName; |
| import android.content.Context; |
| import android.os.PowerManager; |
| import android.test.InstrumentationTestCase; |
| |
| import com.android.messaging.util.LogUtil; |
| import com.android.messaging.widget.BugleWidgetProvider; |
| import com.android.messaging.widget.WidgetConversationProvider; |
| |
| import junit.framework.TestCase; |
| |
| import org.mockito.MockitoAnnotations; |
| |
| /** |
| * Helpers that can be called from all test base classes to 'reset' state and prevent as much as |
| * possible having side effects leak from one test to another. |
| */ |
| public class TestUtil { |
| public static void testSetup(final Context context, final TestCase testCase) { |
| haltIfTestsAreNotAbleToRun(context); |
| |
| // Workaround to get mockito to work. |
| // See https://code.google.com/p/dexmaker/issues/detail?id=2. TODO: Apparently |
| // solvable by using a different runner. |
| System.setProperty("dexmaker.dexcache", |
| context.getCacheDir().getPath()); |
| |
| // Initialize @Mock objects. |
| MockitoAnnotations.initMocks(testCase); |
| |
| // Tests have to explicitly override this |
| Factory.setInstance(null); |
| } |
| |
| public static void testTeardown(final TestCase testCase) { |
| if (testCase instanceof InstrumentationTestCase) { |
| // Make sure the test case is finished running or we'll get NPEs when accessing |
| // Fragment.get() |
| ((InstrumentationTestCase) testCase).getInstrumentation().waitForIdleSync(); |
| } |
| Factory.setInstance(null); |
| } |
| |
| private static void haltIfTestsAreNotAbleToRun(final Context context) { |
| final PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); |
| if (!pm.isScreenOn()) { |
| // Ideally we could turn it on for you using the WindowManager, but we currently run |
| // the tests independently of the activity life cycle. |
| LogUtil.wtf(LogUtil.BUGLE_TAG, "You need to turn on your screen to run tests!"); |
| } |
| |
| final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); |
| int [] conversationWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, |
| WidgetConversationProvider.class)); |
| int [] conversationListWidgetIds = appWidgetManager.getAppWidgetIds(new |
| ComponentName(context, BugleWidgetProvider.class)); |
| |
| if ((conversationWidgetIds.length > 0) || (conversationListWidgetIds.length > 0)) { |
| // Currently widgets asynchronously access our content providers and singletons which |
| // interacts badly with our test setup and tear down. |
| LogUtil.wtf(LogUtil.BUGLE_TAG, "You currently can't reliably run unit tests" + |
| " with a Messaging widget on your desktop!"); |
| } |
| } |
| } |