Home | History | Annotate | Download | only in messaging
      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 {
     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 
     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 
     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