• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 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.dumprendertree;
18 
19 import android.app.Activity;
20 import android.content.Intent;
21 import android.os.Environment;
22 import android.os.Handler;
23 import android.os.Message;
24 import android.test.ActivityInstrumentationTestCase2;
25 import android.util.Log;
26 
27 import java.io.BufferedOutputStream;
28 import java.io.BufferedReader;
29 import java.io.File;
30 import java.io.FileNotFoundException;
31 import java.io.FileOutputStream;
32 import java.io.FileReader;
33 import java.io.IOException;
34 import java.io.InputStream;
35 import java.io.OutputStream;
36 
37 public class ReliabilityTest extends ActivityInstrumentationTestCase2<ReliabilityTestActivity> {
38 
39     private static final String LOGTAG = "ReliabilityTest";
40     private static final String PKG_NAME = "com.android.dumprendertree";
41     private static final String EXTERNAL_DIR =
42         Environment.getExternalStorageDirectory().toString();
43     private static final String TEST_LIST_FILE = EXTERNAL_DIR +
44         "/android/reliability_tests_list.txt";
45     private static final String TEST_STATUS_FILE = EXTERNAL_DIR +
46         "/android/reliability_running_test.txt";
47     private static final String TEST_TIMEOUT_FILE = EXTERNAL_DIR +
48         "/android/reliability_timeout_test.txt";
49     private static final String TEST_LOAD_TIME_FILE = EXTERNAL_DIR +
50         "/android/reliability_load_time.txt";
51     private static final String TEST_DONE = "#DONE";
52     static final String RELIABILITY_TEST_RUNNER_FILES[] = {
53         "run_reliability_tests.py"
54     };
55 
ReliabilityTest()56     public ReliabilityTest() {
57         super(PKG_NAME, ReliabilityTestActivity.class);
58     }
59 
runReliabilityTest()60     public void runReliabilityTest() throws Throwable {
61 //        ReliabilityTestActivity activity = getActivity();
62         LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner)getInstrumentation();
63 
64         File testListFile = new File(TEST_LIST_FILE);
65         if(!testListFile.exists())
66             throw new FileNotFoundException("test list file not found.");
67 
68         BufferedReader listReader = new BufferedReader(
69                 new FileReader(testListFile));
70 
71         //always try to resume first, hence cleaning up status will be the
72         //responsibility of driver scripts
73         String lastUrl = FsUtils.readTestStatus(TEST_STATUS_FILE);
74         if(lastUrl != null && !TEST_DONE.equals(lastUrl))
75             fastForward(listReader, lastUrl);
76 
77         String url = null;
78         Handler handler = null;
79         boolean timeoutFlag = false;
80         long start, elapsed;
81 
82         Intent intent = new Intent(runner.getContext(), ReliabilityTestActivity.class);
83         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
84         ReliabilityTestActivity activity = (ReliabilityTestActivity)runner.startActivitySync(
85             intent);
86         //read from BufferedReader instead of populating a list in advance,
87         //this will avoid excessive memory usage in case of a large list
88         while((url = listReader.readLine()) != null) {
89             url = url.trim();
90             if(url.length() == 0)
91                 continue;
92             start = System.currentTimeMillis();
93             Log.v(LOGTAG, "Testing URL: " + url);
94             FsUtils.updateTestStatus(TEST_STATUS_FILE, url);
95             activity.reset();
96             //use message to send new URL to avoid interacting with
97             //WebView in non-UI thread
98             handler = activity.getHandler();
99             Message msg = handler.obtainMessage(
100                     ReliabilityTestActivity.MSG_NAVIGATE,
101                     runner.mTimeoutInMillis, runner.mDelay);
102             msg.getData().putString(ReliabilityTestActivity.MSG_NAV_URL, url);
103             msg.getData().putBoolean(ReliabilityTestActivity.MSG_NAV_LOGTIME,
104                     runner.mLogtime);
105             handler.sendMessage(msg);
106             timeoutFlag = activity.waitUntilDone();
107             elapsed = System.currentTimeMillis() - start;
108             if(elapsed < 1000) {
109                 Log.w(LOGTAG, "Page load finished in " + elapsed
110                         + "ms, too soon?");
111             } else {
112                 Log.v(LOGTAG, "Page load finished in " + elapsed + "ms");
113             }
114             if(timeoutFlag) {
115                 writeTimeoutFile(url);
116             }
117             if(runner.mLogtime) {
118                 writeLoadTime(url, activity.getPageLoadTime());
119             }
120             System.runFinalization();
121             System.gc();
122             System.gc();
123         }
124         activity.finish();
125         FsUtils.updateTestStatus(TEST_STATUS_FILE, TEST_DONE);
126 //        activity.finish();
127         listReader.close();
128     }
129 
copyRunnerAssetsToCache()130     public void copyRunnerAssetsToCache() {
131         try {
132             String out_dir = getActivity().getApplicationContext()
133             .getCacheDir().getPath() + "/";
134 
135             for( int i=0; i< RELIABILITY_TEST_RUNNER_FILES.length; i++) {
136                 InputStream in = getActivity().getAssets().open(
137                         RELIABILITY_TEST_RUNNER_FILES[i]);
138                 OutputStream out = new FileOutputStream(
139                         out_dir + RELIABILITY_TEST_RUNNER_FILES[i]);
140 
141                 byte[] buf = new byte[2048];
142                 int len;
143 
144                 while ((len = in.read(buf)) >= 0 ) {
145                     out.write(buf, 0, len);
146                 }
147                 out.close();
148                 in.close();
149             }
150         }catch (IOException e) {
151             Log.e(LOGTAG, "Cannot extract scripts for testing.", e);
152         }
153     }
154 
fastForward(BufferedReader testListReader, String lastUrl)155     private void fastForward(BufferedReader testListReader, String lastUrl) {
156         //fastforward the BufferedReader to the position right after last url
157         if(lastUrl == null)
158             return;
159 
160         String line = null;
161         try {
162             while((line = testListReader.readLine()) != null) {
163                 if(lastUrl.equals(line))
164                     return;
165             }
166         } catch (IOException ioe) {
167             Log.e(LOGTAG, "Error while reading test list.", ioe);
168             return;
169         }
170     }
171 
writeTimeoutFile(String s)172     private void writeTimeoutFile(String s) {
173         //append to the file containing the list of timeout urls
174         try {
175             BufferedOutputStream bos = new BufferedOutputStream(
176                     new FileOutputStream(TEST_TIMEOUT_FILE, true));
177             bos.write(s.getBytes());
178             bos.write('\n');
179             bos.close();
180         } catch (Exception e) {
181             Log.e(LOGTAG, "Cannot update file " + TEST_TIMEOUT_FILE, e);
182         }
183     }
184 
writeLoadTime(String s, long time)185     private void writeLoadTime(String s, long time) {
186         //append to the file containing the list of timeout urls
187         try {
188             BufferedOutputStream bos = new BufferedOutputStream(
189                     new FileOutputStream(TEST_LOAD_TIME_FILE, true));
190             bos.write((s + '|' + time + '\n').getBytes());
191             bos.close();
192         } catch (Exception e) {
193             Log.e(LOGTAG, "Cannot update file " + TEST_LOAD_TIME_FILE, e);
194         }
195     }
196 }
197