1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.messaging;
18 
19 import android.appwidget.AppWidgetManager;
20 import android.content.ComponentName;
21 import android.content.Context;
22 import android.os.PowerManager;
23 import android.test.InstrumentationTestCase;
24 
25 import com.android.messaging.util.LogUtil;
26 import com.android.messaging.widget.BugleWidgetProvider;
27 import com.android.messaging.widget.WidgetConversationProvider;
28 
29 import junit.framework.TestCase;
30 
31 import org.mockito.MockitoAnnotations;
32 
33 /**
34  * Helpers that can be called from all test base classes to 'reset' state and prevent as much as
35  * possible having side effects leak from one test to another.
36  */
37 public class TestUtil {
testSetup(final Context context, final TestCase testCase)38     public static void testSetup(final Context context, final TestCase testCase) {
39         haltIfTestsAreNotAbleToRun(context);
40 
41         // Workaround to get mockito to work.
42         // See https://code.google.com/p/dexmaker/issues/detail?id=2. TODO: Apparently
43         // solvable by using a different runner.
44         System.setProperty("dexmaker.dexcache",
45                 context.getCacheDir().getPath());
46 
47         // Initialize @Mock objects.
48         MockitoAnnotations.initMocks(testCase);
49 
50         // Tests have to explicitly override this
51         Factory.setInstance(null);
52     }
53 
testTeardown(final TestCase testCase)54     public static void testTeardown(final TestCase testCase) {
55         if (testCase instanceof InstrumentationTestCase) {
56             // Make sure the test case is finished running or we'll get NPEs when accessing
57             // Fragment.get()
58             ((InstrumentationTestCase) testCase).getInstrumentation().waitForIdleSync();
59         }
60         Factory.setInstance(null);
61     }
62 
haltIfTestsAreNotAbleToRun(final Context context)63     private static void haltIfTestsAreNotAbleToRun(final Context context) {
64         final PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
65         if (!pm.isScreenOn()) {
66             // Ideally we could turn it on for you using the WindowManager, but we currently run
67             // the tests independently of the activity life cycle.
68             LogUtil.wtf(LogUtil.BUGLE_TAG, "You need to turn on your screen to run tests!");
69         }
70 
71         final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
72         int [] conversationWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context,
73                 WidgetConversationProvider.class));
74         int [] conversationListWidgetIds = appWidgetManager.getAppWidgetIds(new
75                 ComponentName(context, BugleWidgetProvider.class));
76 
77         if ((conversationWidgetIds.length > 0) || (conversationListWidgetIds.length > 0)) {
78             // Currently widgets asynchronously access our content providers and singletons which
79             // interacts badly with our test setup and tear down.
80             LogUtil.wtf(LogUtil.BUGLE_TAG, "You currently can't reliably run unit tests" +
81                     " with a Messaging widget on your desktop!");
82         }
83     }
84 }
85