ManagerService.java revision f460dd42190ada4a2c147db5127a9d7870fe0101
17ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski/*
27ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski * Copyright (C) 2010 The Android Open Source Project
37ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski *
47ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski * Licensed under the Apache License, Version 2.0 (the "License");
57ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski * you may not use this file except in compliance with the License.
67ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski * You may obtain a copy of the License at
77ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski *
87ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski *      http://www.apache.org/licenses/LICENSE-2.0
97ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski *
107ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski * Unless required by applicable law or agreed to in writing, software
117ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski * distributed under the License is distributed on an "AS IS" BASIS,
127ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski * See the License for the specific language governing permissions and
147ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski * limitations under the License.
157ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski */
167ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski
177ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowskipackage com.android.dumprendertree2;
187ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski
197ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowskiimport android.app.Service;
207ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowskiimport android.content.Intent;
215f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowskiimport android.os.Bundle;
225f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowskiimport android.os.Environment;
237ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowskiimport android.os.Handler;
247ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowskiimport android.os.IBinder;
257ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowskiimport android.os.Message;
267ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowskiimport android.os.Messenger;
277ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowskiimport android.util.Log;
287ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski
295f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowskiimport java.io.File;
30c83712e68642b9816a561916c6ec044509bd6759Maksymilian Osowskiimport java.util.ArrayList;
31c83712e68642b9816a561916c6ec044509bd6759Maksymilian Osowskiimport java.util.List;
325f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski
337ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski/**
347ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski * A service that handles managing the results of tests, informing of crashes, generating
357ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski * summaries, etc.
367ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski */
377ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowskipublic class ManagerService extends Service {
387ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski
397ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski    private static final String LOG_TAG = "ManagerService";
407ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski
41bcf114c2bbef4dd4af266a635a74076d568d125cMaksymilian Osowski    private static final int MSG_CRASH_TIMEOUT_EXPIRED = 0;
429893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski    private static final int MSG_SUMMARIZER_DONE = 1;
4323a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski
4423a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski    private static final int CRASH_TIMEOUT_MS = 20 * 1000;
4523a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski
465f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski    /** TODO: make it a setting */
475f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski    static final String RESULTS_ROOT_DIR_PATH =
48bdebd0621b2a4422a30bea21ea549afd20a9e918Steve Block            Environment.getExternalStorageDirectory() + File.separator + "layout-test-results";
495f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski
505f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski    /** TODO: Make it a setting */
51c83712e68642b9816a561916c6ec044509bd6759Maksymilian Osowski    private static final List<String> EXPECTED_RESULT_LOCATION_RELATIVE_DIR_PREFIXES =
52c83712e68642b9816a561916c6ec044509bd6759Maksymilian Osowski            new ArrayList<String>(3);
53c83712e68642b9816a561916c6ec044509bd6759Maksymilian Osowski    {
54c83712e68642b9816a561916c6ec044509bd6759Maksymilian Osowski        EXPECTED_RESULT_LOCATION_RELATIVE_DIR_PREFIXES.add("platform" + File.separator +
55c83712e68642b9816a561916c6ec044509bd6759Maksymilian Osowski                "android-v8" + File.separator);
56c83712e68642b9816a561916c6ec044509bd6759Maksymilian Osowski        EXPECTED_RESULT_LOCATION_RELATIVE_DIR_PREFIXES.add("platform" + File.separator +
57c83712e68642b9816a561916c6ec044509bd6759Maksymilian Osowski                "android" + File.separator);
58c83712e68642b9816a561916c6ec044509bd6759Maksymilian Osowski        EXPECTED_RESULT_LOCATION_RELATIVE_DIR_PREFIXES.add("");
59c83712e68642b9816a561916c6ec044509bd6759Maksymilian Osowski    }
605f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski
615f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski    /** TODO: Make these settings */
625f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski    private static final String TEXT_RESULT_EXTENSION = "txt";
635f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski    private static final String IMAGE_RESULT_EXTENSION = "png";
645f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski
657ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski    static final int MSG_PROCESS_ACTUAL_RESULTS = 0;
665f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski    static final int MSG_ALL_TESTS_FINISHED = 1;
6723a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski    static final int MSG_FIRST_TEST = 2;
68bcf114c2bbef4dd4af266a635a74076d568d125cMaksymilian Osowski    static final int MSG_CURRENT_TEST_CRASHED = 3;
697ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski
7023a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski    /**
7123a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski     * This handler is purely for IPC. It is used to create mMessenger
7223a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski     * that generates a binder returned in onBind method.
7323a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski     */
747ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski    private Handler mIncomingHandler = new Handler() {
757ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski        @Override
767ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski        public void handleMessage(Message msg) {
777ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski            switch (msg.what) {
7823a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski                case MSG_FIRST_TEST:
79ea46f2595a8718d4478e016fd40b2d57658289cfMaksymilian Osowski                    mSummarizer.reset();
8023a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski                    Bundle bundle = msg.getData();
8123a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski                    ensureNextTestSetup(bundle.getString("firstTest"), bundle.getInt("index"));
8223a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski                    break;
8323a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski
847ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski                case MSG_PROCESS_ACTUAL_RESULTS:
852e5982a55ac031110ed39515a76f7a5ec9ff2c14Maksymilian Osowski                    Log.d(LOG_TAG,"mIncomingHandler: " + msg.getData().getString("relativePath"));
865f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski                    onActualResultsObtained(msg.getData());
875f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski                    break;
885f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski
89bcf114c2bbef4dd4af266a635a74076d568d125cMaksymilian Osowski                case MSG_CURRENT_TEST_CRASHED:
909893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski                    mInternalMessagesHandler.removeMessages(MSG_CRASH_TIMEOUT_EXPIRED);
91bcf114c2bbef4dd4af266a635a74076d568d125cMaksymilian Osowski                    onTestCrashed();
92bcf114c2bbef4dd4af266a635a74076d568d125cMaksymilian Osowski                    break;
93bcf114c2bbef4dd4af266a635a74076d568d125cMaksymilian Osowski
945f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski                case MSG_ALL_TESTS_FINISHED:
959893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski                    /** We run it in a separate thread to avoid ANR */
969893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski                    new Thread() {
979893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski                        @Override
989893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski                        public void run() {
999893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski                            mSummarizer.setTestsRelativePath(mAllTestsRelativePath);
1009893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski                            Message msg = Message.obtain(mInternalMessagesHandler,
1019893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski                                    MSG_SUMMARIZER_DONE);
1029893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski                            mSummarizer.summarize(msg);
1039893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski                        }
1049893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski                    }.start();
1057ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski            }
1067ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski        }
1077ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski    };
1087ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski
1097ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski    private Messenger mMessenger = new Messenger(mIncomingHandler);
1107ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski
1119893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski    private Handler mInternalMessagesHandler = new Handler() {
11223a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski        @Override
11323a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski        public void handleMessage(Message msg) {
1149893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski            switch (msg.what) {
1159893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski                case MSG_CRASH_TIMEOUT_EXPIRED:
1169893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski                    onTestCrashed();
1179893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski                    break;
1189893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski
1199893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski                case MSG_SUMMARIZER_DONE:
1209893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski                    Intent intent = new Intent(ManagerService.this, TestsListActivity.class);
1219893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski                    intent.setAction(Intent.ACTION_SHUTDOWN);
1229893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski                    /** This flag is needed because we send the intent from the service */
1239893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
1249893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski                    startActivity(intent);
1259893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski                    break;
12623a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski            }
12723a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski        }
12823a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski    };
12923a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski
1305f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski    private FileFilter mFileFilter;
1315f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski    private Summarizer mSummarizer;
1325f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski
13323a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski    private String mCurrentlyRunningTest;
13423a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski    private int mCurrentlyRunningTestIndex;
13523a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski
13601c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski    /**
13701c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski     * These are implementation details of getExpectedResultPath() used to reduce the number
13801c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski     * of requests required to the host server.
13901c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski     */
14001c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski    private String mLastExpectedResultPathRequested;
14101c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski    private String mLastExpectedResultPathFetched;
14201c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski
1432e64bb7afdd97c954491877306ccb8318f8ec3ceMaksymilian Osowski    private String mAllTestsRelativePath;
1442e64bb7afdd97c954491877306ccb8318f8ec3ceMaksymilian Osowski
1457ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski    @Override
1467ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski    public void onCreate() {
1477ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski        super.onCreate();
1485f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski
14934c68912be678ad50a70c1bfa54a91444e993df5Steve Block        mFileFilter = new FileFilter();
150394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        mSummarizer = new Summarizer(mFileFilter, RESULTS_ROOT_DIR_PATH, getApplicationContext());
1517ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski    }
1527ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski
1537ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski    @Override
15423a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski    public int onStartCommand(Intent intent, int flags, int startId) {
1552e64bb7afdd97c954491877306ccb8318f8ec3ceMaksymilian Osowski        mAllTestsRelativePath = intent.getStringExtra("path");
1562e64bb7afdd97c954491877306ccb8318f8ec3ceMaksymilian Osowski        assert mAllTestsRelativePath != null;
15723a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski        return START_STICKY;
15823a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski    }
15923a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski
16023a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski    @Override
1617ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski    public IBinder onBind(Intent intent) {
1627ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski        return mMessenger.getBinder();
1637ddc0b7a72aa66d699fecce3d855a6c70f844647Maksymilian Osowski    }
1645f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski
1655f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski    private void onActualResultsObtained(Bundle bundle) {
1669893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski        mInternalMessagesHandler.removeMessages(MSG_CRASH_TIMEOUT_EXPIRED);
16723a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski        ensureNextTestSetup(bundle.getString("nextTest"), bundle.getInt("testIndex") + 1);
16823a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski
1695f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski        AbstractResult results =
1705f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski                AbstractResult.TestType.valueOf(bundle.getString("type")).createResult(bundle);
17123a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski
1722e5982a55ac031110ed39515a76f7a5ec9ff2c14Maksymilian Osowski        Log.i(LOG_TAG, "onActualResultObtained: " + results.getRelativePath());
17323a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski        handleResults(results);
17423a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski    }
17523a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski
17623a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski    private void ensureNextTestSetup(String nextTest, int index) {
17723a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski        if (nextTest == null) {
1782e5982a55ac031110ed39515a76f7a5ec9ff2c14Maksymilian Osowski            Log.w(LOG_TAG, "ensureNextTestSetup(): nextTest=null");
17923a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski            return;
18023a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski        }
18123a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski
18223a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski        mCurrentlyRunningTest = nextTest;
18323a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski        mCurrentlyRunningTestIndex = index;
1849893d96d1231235f3d984e9dc751f08409a5f873Maksymilian Osowski        mInternalMessagesHandler.sendEmptyMessageDelayed(MSG_CRASH_TIMEOUT_EXPIRED, CRASH_TIMEOUT_MS);
18523a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski    }
18623a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski
18723a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski    /**
18823a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski     * This sends an intent to TestsListActivity to restart LayoutTestsExecutor.
18923a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski     * The more detailed description of the flow is in the comment of onNewIntent
19023a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski     * method in TestsListActivity.
19123a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski     */
19223a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski    private void onTestCrashed() {
19323a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski        handleResults(new CrashedDummyResult(mCurrentlyRunningTest));
19423a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski
1952e5982a55ac031110ed39515a76f7a5ec9ff2c14Maksymilian Osowski        Log.w(LOG_TAG, "onTestCrashed(): " + mCurrentlyRunningTest +
1962e5982a55ac031110ed39515a76f7a5ec9ff2c14Maksymilian Osowski                " (" + mCurrentlyRunningTestIndex + ")");
19723a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski
19823a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski        Intent intent = new Intent(this, TestsListActivity.class);
19923a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski        intent.setAction(Intent.ACTION_REBOOT);
200c8fb818b947f15d4eb467c229ea43806dd75c01eMaksymilian Osowski        /** This flag is needed because we send the intent from the service */
201c8fb818b947f15d4eb467c229ea43806dd75c01eMaksymilian Osowski        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
20223a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski        intent.putExtra("crashedTestIndex", mCurrentlyRunningTestIndex);
20323a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski        startActivity(intent);
20423a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski    }
20523a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski
20623a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski    private void handleResults(AbstractResult results) {
2075f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski        String relativePath = results.getRelativePath();
2085f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski        results.setExpectedTextResult(getExpectedTextResult(relativePath));
20901c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski        results.setExpectedTextResultPath(getExpectedTextResultPath(relativePath));
2105f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski        results.setExpectedImageResult(getExpectedImageResult(relativePath));
21101c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski        results.setExpectedImageResultPath(getExpectedImageResultPath(relativePath));
2125f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski
2135f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski        dumpActualTextResult(results);
2145f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski        dumpActualImageResult(results);
2155f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski
2165f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski        mSummarizer.appendTest(results);
2175f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski    }
2185f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski
2195f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski    private void dumpActualTextResult(AbstractResult result) {
2205f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski        String testPath = result.getRelativePath();
2215f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski        String actualTextResult = result.getActualTextResult();
2225f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski        if (actualTextResult == null) {
2235f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski            return;
2245f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski        }
2255f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski
2265f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski        String resultPath = FileFilter.setPathEnding(testPath, "-actual." + TEXT_RESULT_EXTENSION);
2275f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski        FsUtils.writeDataToStorage(new File(RESULTS_ROOT_DIR_PATH, resultPath),
2285f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski                actualTextResult.getBytes(), false);
2295f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski    }
2305f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski
2315f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski    private void dumpActualImageResult(AbstractResult result) {
2325f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski        String testPath = result.getRelativePath();
2335f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski        byte[] actualImageResult = result.getActualImageResult();
2345f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski        if (actualImageResult == null) {
2355f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski            return;
2365f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski        }
2375f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski
23823a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski        String resultPath = FileFilter.setPathEnding(testPath,
23923a0ee4758da5e2d24ec6c9e8a63c127463a096fMaksymilian Osowski                "-actual." + IMAGE_RESULT_EXTENSION);
2405f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski        FsUtils.writeDataToStorage(new File(RESULTS_ROOT_DIR_PATH, resultPath),
2415f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski                actualImageResult, false);
2425f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski    }
2435f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski
24401c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski    public String getExpectedTextResult(String relativePath) {
245dd4bff62b54033bedc254f517397ae8f954d0dc9Maksymilian Osowski        byte[] result = getExpectedResult(relativePath, TEXT_RESULT_EXTENSION);
246dd4bff62b54033bedc254f517397ae8f954d0dc9Maksymilian Osowski        if (result != null) {
247dd4bff62b54033bedc254f517397ae8f954d0dc9Maksymilian Osowski            return new String(result);
248dd4bff62b54033bedc254f517397ae8f954d0dc9Maksymilian Osowski        }
249dd4bff62b54033bedc254f517397ae8f954d0dc9Maksymilian Osowski        return null;
2505f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski    }
2515f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski
25201c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski    public byte[] getExpectedImageResult(String relativePath) {
2535f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski        return getExpectedResult(relativePath, IMAGE_RESULT_EXTENSION);
2545f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski    }
2555f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski
25601c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski    private byte[] getExpectedResult(String relativePath, String extension) {
257c83712e68642b9816a561916c6ec044509bd6759Maksymilian Osowski        String originalRelativePath =
258c83712e68642b9816a561916c6ec044509bd6759Maksymilian Osowski                FileFilter.setPathEnding(relativePath, "-expected." + extension);
25901c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski        mLastExpectedResultPathRequested = originalRelativePath;
260c83712e68642b9816a561916c6ec044509bd6759Maksymilian Osowski
261c83712e68642b9816a561916c6ec044509bd6759Maksymilian Osowski        byte[] bytes = null;
262c83712e68642b9816a561916c6ec044509bd6759Maksymilian Osowski        List<String> locations = EXPECTED_RESULT_LOCATION_RELATIVE_DIR_PREFIXES;
2635f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski
264c83712e68642b9816a561916c6ec044509bd6759Maksymilian Osowski        int size = EXPECTED_RESULT_LOCATION_RELATIVE_DIR_PREFIXES.size();
265c83712e68642b9816a561916c6ec044509bd6759Maksymilian Osowski        for (int i = 0; bytes == null && i < size; i++) {
266c83712e68642b9816a561916c6ec044509bd6759Maksymilian Osowski            relativePath = locations.get(i) + originalRelativePath;
267c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            bytes = FsUtils.readDataFromUrl(FileFilter.getUrl(relativePath));
2685f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski        }
2695f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski
270f460dd42190ada4a2c147db5127a9d7870fe0101Steve Block        mLastExpectedResultPathFetched = bytes == null ? null : relativePath;
2715f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski        return bytes;
2725f0ccd76a88586ce85c17cb4db058934e693a4fcMaksymilian Osowski    }
27301c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski
27401c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski    private String getExpectedTextResultPath(String relativePath) {
27501c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski        return getExpectedResultPath(relativePath, TEXT_RESULT_EXTENSION);
27601c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski    }
27701c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski
27801c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski    private String getExpectedImageResultPath(String relativePath) {
27901c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski        return getExpectedResultPath(relativePath, IMAGE_RESULT_EXTENSION);
28001c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski    }
28101c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski
28201c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski    private String getExpectedResultPath(String relativePath, String extension) {
28301c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski        String originalRelativePath =
28401c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski            FileFilter.setPathEnding(relativePath, "-expected." + extension);
28501c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski        if (!originalRelativePath.equals(mLastExpectedResultPathRequested)) {
28601c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski            getExpectedResult(relativePath, extension);
28701c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski        }
28801c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski
28901c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski        return mLastExpectedResultPathFetched;
29001c1f9d9e9e7ab3a40a9bf27195a434eb0c9bb9bMaksymilian Osowski    }
29134c68912be678ad50a70c1bfa54a91444e993df5Steve Block}
292