1 /*
2  * Copyright (C) 2014 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.framework.multidexlegacytestservices.test;
18 
19 import android.content.Intent;
20 import android.test.InstrumentationTestCase;
21 import android.util.Log;
22 
23 import java.io.File;
24 
25 /**
26  * Run the tests with: <code>adb shell am instrument -w
27  com.android.framework.multidexlegacytestservices.test/android.test.InstrumentationTestRunner
28 </code>
29  */
30 public class ServicesTests extends InstrumentationTestCase {
31     private static final String SERVICE_BASE_ACTION =
32             "com.android.framework.multidexlegacytestservices.action.Service";
33     private static final int MIN_SERVICE = 1;
34     private static final int MAX_SERVICE = 19;
35 
36 
testStressConcurentFirstLaunch()37     public void testStressConcurentFirstLaunch() {
38         File targetFilesDir = getInstrumentation().getTargetContext().getFilesDir();
39         for (int i = MIN_SERVICE; i <= MAX_SERVICE; i++) {
40             File resultFile = new File(targetFilesDir, "Service" + i);
41             resultFile.delete();
42             assertFalse("Failed to delete result file '" + resultFile.getAbsolutePath() + "'.",
43                     resultFile.exists());
44             File completeFile = new File(targetFilesDir, "Service" + i + ".complete");
45             completeFile.delete();
46             assertFalse("Failed to delete completion file '" + completeFile.getAbsolutePath() +
47                     "'.", completeFile.exists());
48        }
49         for (int i = MIN_SERVICE; i <= MAX_SERVICE; i++) {
50             getInstrumentation().getContext().startService(new Intent(SERVICE_BASE_ACTION + i));
51             try {
52                 Thread.sleep((i - 1) * (1 << (i / 5)));
53             } catch (InterruptedException e) {
54             }
55        }
56 
57 
58         Log.i("ServicesTests", "start sleeping");
59         int attempt = 0;
60         int maxAttempt = 50; // 10 is enough for a nexus S
61         do {
62             try {
63                 Thread.sleep(5000);
64             } catch (InterruptedException e) {
65             }
66             attempt ++;
67             if (attempt >= maxAttempt) {
68                 fail();
69             }
70         } while (!areAllServicesRunning(targetFilesDir));
71 
72         for (int i = MIN_SERVICE; i <= MAX_SERVICE; i++) {
73             File resultFile = new File(targetFilesDir, "Service" + i);
74             assertTrue("Service" + i + " never completed.", resultFile.isFile());
75             assertEquals("Service" + i + " was restarted.", 8L, resultFile.length());
76         }
77     }
78 
areAllServicesRunning(File tagetFilesDir)79     private static boolean areAllServicesRunning(File tagetFilesDir) {
80         for (int i = MIN_SERVICE; i <= MAX_SERVICE; i++) {
81             File completeFile = new File(tagetFilesDir, "Service" + i + ".complete");
82             if (!completeFile.exists()) {
83                 return false;
84             }
85         }
86         return true;
87 
88     }
89 }
90