1ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project/*
2ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project *
4ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * you may not use this file except in compliance with the License.
6ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * You may obtain a copy of the License at
7ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project *
8ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project *
10ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * See the License for the specific language governing permissions and
14ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * limitations under the License.
15ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project */
16ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
17ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectpackage com.android.dumprendertree;
18ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
1940656be65870932592daf070c7cbbc382dda67b5Guang Zhuimport dalvik.system.VMRuntime;
2040656be65870932592daf070c7cbbc382dda67b5Guang Zhu
21ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.app.Instrumentation;
22ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.content.Intent;
23ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.os.Bundle;
24b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhuimport android.os.Debug;
2540656be65870932592daf070c7cbbc382dda67b5Guang Zhuimport android.os.Process;
26ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.test.ActivityInstrumentationTestCase2;
2740656be65870932592daf070c7cbbc382dda67b5Guang Zhuimport android.util.Log;
28ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
29ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.io.FileOutputStream;
30ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport java.io.IOException;
31b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhuimport java.io.InputStream;
32b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhuimport java.io.OutputStream;
33b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhuimport java.io.PrintStream;
34ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
35ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectpublic class LoadTestsAutoTest extends ActivityInstrumentationTestCase2<TestShellActivity> {
36ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
37ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private final static String LOGTAG = "LoadTest";
38ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private final static String LOAD_TEST_RESULT = "/sdcard/load_test_result.txt";
39b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu    private boolean mFinished;
40b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu    static final String LOAD_TEST_RUNNER_FILES[] = {
41b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu        "run_page_cycler.py"
424010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu    };
43b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu
44ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public LoadTestsAutoTest() {
45ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        super("com.android.dumprendertree", TestShellActivity.class);
46ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
47ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
48ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    // This function writes the result of the layout test to
49ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    // Am status so that it can be picked up from a script.
50ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public void passOrFailCallback(String file, boolean result) {
51ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Instrumentation inst = getInstrumentation();
52ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Bundle bundle = new Bundle();
53ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        bundle.putBoolean(file, result);
54ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        inst.sendStatus(0, bundle);
55ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
56b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu
57ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    // Invokes running of layout tests
58ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    // and waits till it has finished running.
59b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu    public void runPageCyclerTest() {
60ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        LayoutTestsAutoRunner runner = (LayoutTestsAutoRunner) getInstrumentation();
61ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
62ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        if (runner.mTestPath == null) {
63ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            Log.e(LOGTAG, "No test specified");
64ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            return;
65ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
66b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu
67ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        TestShellActivity activity = (TestShellActivity) getActivity();
68ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
692a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu        Log.v(LOGTAG, "About to run tests, calling gc first...");
7040656be65870932592daf070c7cbbc382dda67b5Guang Zhu        freeMem();
712a197b128a2317eec6efaa0a21e529cdf534c6f2Guang Zhu
72ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // Run tests
735dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        runTestAndWaitUntilDone(activity, runner.mTestPath, runner.mTimeoutInMillis,
745dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu                runner.mGetDrawTime, runner.mSaveImagePath);
75ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
76889181d7fdf54b50a3cf4ee7e0f402a2fc026afeGuang Zhu        activity.clearCache();
771f6c72bff6fa875a08f2d5510b5a61ce766643d2Guang Zhu        try {
781f6c72bff6fa875a08f2d5510b5a61ce766643d2Guang Zhu            Thread.sleep(5000);
791f6c72bff6fa875a08f2d5510b5a61ce766643d2Guang Zhu        } catch (InterruptedException e) {
801f6c72bff6fa875a08f2d5510b5a61ce766643d2Guang Zhu        }
81b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu        dumpMemoryInfo();
82b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu
83ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // Kill activity
84ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        activity.finish();
85ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
86ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
8740656be65870932592daf070c7cbbc382dda67b5Guang Zhu    private void freeMem() {
8840656be65870932592daf070c7cbbc382dda67b5Guang Zhu        Log.v(LOGTAG, "freeMem: calling gc/finalization...");
8940656be65870932592daf070c7cbbc382dda67b5Guang Zhu        final VMRuntime runtime = VMRuntime.getRuntime();
9040656be65870932592daf070c7cbbc382dda67b5Guang Zhu
9140656be65870932592daf070c7cbbc382dda67b5Guang Zhu        runtime.gcSoftReferences();
9240656be65870932592daf070c7cbbc382dda67b5Guang Zhu        runtime.runFinalizationSync();
9340656be65870932592daf070c7cbbc382dda67b5Guang Zhu        runtime.gcSoftReferences();
9440656be65870932592daf070c7cbbc382dda67b5Guang Zhu        runtime.runFinalizationSync();
9540656be65870932592daf070c7cbbc382dda67b5Guang Zhu        runtime.gcSoftReferences();
9640656be65870932592daf070c7cbbc382dda67b5Guang Zhu        runtime.runFinalizationSync();
9740656be65870932592daf070c7cbbc382dda67b5Guang Zhu        Runtime.getRuntime().runFinalization();
9840656be65870932592daf070c7cbbc382dda67b5Guang Zhu        Runtime.getRuntime().gc();
9940656be65870932592daf070c7cbbc382dda67b5Guang Zhu        Runtime.getRuntime().gc();
10040656be65870932592daf070c7cbbc382dda67b5Guang Zhu
10140656be65870932592daf070c7cbbc382dda67b5Guang Zhu    }
10240656be65870932592daf070c7cbbc382dda67b5Guang Zhu
10340656be65870932592daf070c7cbbc382dda67b5Guang Zhu    private void printRow(PrintStream ps, String format, Object...objs) {
10440656be65870932592daf070c7cbbc382dda67b5Guang Zhu        ps.println(String.format(format, objs));
10540656be65870932592daf070c7cbbc382dda67b5Guang Zhu    }
10640656be65870932592daf070c7cbbc382dda67b5Guang Zhu
107b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu    private void dumpMemoryInfo() {
108ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        try {
10940656be65870932592daf070c7cbbc382dda67b5Guang Zhu            freeMem();
110b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu            Log.v(LOGTAG, "Dumping memory information.");
111b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu
112ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            FileOutputStream out = new FileOutputStream(LOAD_TEST_RESULT, true);
113b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu            PrintStream ps = new PrintStream(out);
114b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu
115b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu            ps.print("\n\n\n");
11640656be65870932592daf070c7cbbc382dda67b5Guang Zhu            ps.println("** MEMINFO in pid " + Process.myPid()
11740656be65870932592daf070c7cbbc382dda67b5Guang Zhu                    + " [com.android.dumprendertree] **");
11840656be65870932592daf070c7cbbc382dda67b5Guang Zhu            String formatString = "%17s %8s %8s %8s %8s";
11940656be65870932592daf070c7cbbc382dda67b5Guang Zhu
12040656be65870932592daf070c7cbbc382dda67b5Guang Zhu            long nativeMax = Debug.getNativeHeapSize() / 1024;
12140656be65870932592daf070c7cbbc382dda67b5Guang Zhu            long nativeAllocated = Debug.getNativeHeapAllocatedSize() / 1024;
12240656be65870932592daf070c7cbbc382dda67b5Guang Zhu            long nativeFree = Debug.getNativeHeapFreeSize() / 1024;
12340656be65870932592daf070c7cbbc382dda67b5Guang Zhu            Runtime runtime = Runtime.getRuntime();
12440656be65870932592daf070c7cbbc382dda67b5Guang Zhu            long dalvikMax = runtime.totalMemory() / 1024;
12540656be65870932592daf070c7cbbc382dda67b5Guang Zhu            long dalvikFree = runtime.freeMemory() / 1024;
12640656be65870932592daf070c7cbbc382dda67b5Guang Zhu            long dalvikAllocated = dalvikMax - dalvikFree;
12740656be65870932592daf070c7cbbc382dda67b5Guang Zhu
12840656be65870932592daf070c7cbbc382dda67b5Guang Zhu
12940656be65870932592daf070c7cbbc382dda67b5Guang Zhu            Debug.MemoryInfo memInfo = new Debug.MemoryInfo();
13040656be65870932592daf070c7cbbc382dda67b5Guang Zhu            Debug.getMemoryInfo(memInfo);
13140656be65870932592daf070c7cbbc382dda67b5Guang Zhu
13240656be65870932592daf070c7cbbc382dda67b5Guang Zhu            final int nativeShared = memInfo.nativeSharedDirty;
13340656be65870932592daf070c7cbbc382dda67b5Guang Zhu            final int dalvikShared = memInfo.dalvikSharedDirty;
13440656be65870932592daf070c7cbbc382dda67b5Guang Zhu            final int otherShared = memInfo.otherSharedDirty;
13540656be65870932592daf070c7cbbc382dda67b5Guang Zhu
13640656be65870932592daf070c7cbbc382dda67b5Guang Zhu            final int nativePrivate = memInfo.nativePrivateDirty;
13740656be65870932592daf070c7cbbc382dda67b5Guang Zhu            final int dalvikPrivate = memInfo.dalvikPrivateDirty;
13840656be65870932592daf070c7cbbc382dda67b5Guang Zhu            final int otherPrivate = memInfo.otherPrivateDirty;
13940656be65870932592daf070c7cbbc382dda67b5Guang Zhu
14040656be65870932592daf070c7cbbc382dda67b5Guang Zhu            printRow(ps, formatString, "", "native", "dalvik", "other", "total");
14140656be65870932592daf070c7cbbc382dda67b5Guang Zhu            printRow(ps, formatString, "size:", nativeMax, dalvikMax, "N/A", nativeMax + dalvikMax);
14240656be65870932592daf070c7cbbc382dda67b5Guang Zhu            printRow(ps, formatString, "allocated:", nativeAllocated, dalvikAllocated, "N/A",
14340656be65870932592daf070c7cbbc382dda67b5Guang Zhu                    nativeAllocated + dalvikAllocated);
14440656be65870932592daf070c7cbbc382dda67b5Guang Zhu            printRow(ps, formatString, "free:", nativeFree, dalvikFree, "N/A",
14540656be65870932592daf070c7cbbc382dda67b5Guang Zhu                    nativeFree + dalvikFree);
14640656be65870932592daf070c7cbbc382dda67b5Guang Zhu
14740656be65870932592daf070c7cbbc382dda67b5Guang Zhu            printRow(ps, formatString, "(Pss):", memInfo.nativePss, memInfo.dalvikPss,
14840656be65870932592daf070c7cbbc382dda67b5Guang Zhu                    memInfo.otherPss, memInfo.nativePss + memInfo.dalvikPss + memInfo.otherPss);
14940656be65870932592daf070c7cbbc382dda67b5Guang Zhu
15040656be65870932592daf070c7cbbc382dda67b5Guang Zhu            printRow(ps, formatString, "(shared dirty):", nativeShared, dalvikShared, otherShared,
15140656be65870932592daf070c7cbbc382dda67b5Guang Zhu                    nativeShared + dalvikShared + otherShared);
15240656be65870932592daf070c7cbbc382dda67b5Guang Zhu            printRow(ps, formatString, "(priv dirty):", nativePrivate, dalvikPrivate, otherPrivate,
15340656be65870932592daf070c7cbbc382dda67b5Guang Zhu                    nativePrivate + dalvikPrivate + otherPrivate);
154b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu            ps.print("\n\n\n");
155b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu            ps.flush();
156b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu            ps.close();
157b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu            out.flush();
158b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu            out.close();
159ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        } catch (IOException e) {
160ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            Log.e(LOGTAG, e.getMessage());
161b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu        }
162ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
163b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu
164ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    // A convenient method to be called by another activity.
1655dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu    private void runTestAndWaitUntilDone(TestShellActivity activity, String url, int timeout,
1665dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu            boolean getDrawTime, String saveImagePath) {
167ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        activity.setCallback(new TestShellCallback() {
168ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            public void finished() {
169ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                synchronized (LoadTestsAutoTest.this) {
170b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                    mFinished = true;
171ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    LoadTestsAutoTest.this.notifyAll();
172ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                }
173b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu            }
17440656be65870932592daf070c7cbbc382dda67b5Guang Zhu
1754010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            public void timedOut(String url) {
1764010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu            }
177ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        });
178b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu
179b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu        mFinished = false;
180ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Intent intent = new Intent(Intent.ACTION_VIEW);
181ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        intent.setClass(activity, TestShellActivity.class);
182ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
183ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        intent.putExtra(TestShellActivity.TEST_URL, url);
184ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        intent.putExtra(TestShellActivity.TIMEOUT_IN_MILLIS, timeout);
185ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        intent.putExtra(TestShellActivity.RESULT_FILE, LOAD_TEST_RESULT);
1865dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        intent.putExtra(TestShellActivity.GET_DRAW_TIME, getDrawTime);
1875dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        if (saveImagePath != null)
1885dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu            intent.putExtra(TestShellActivity.SAVE_IMAGE, saveImagePath);
189ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        activity.startActivity(intent);
190b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu
191ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        // Wait until done.
192ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        synchronized (this) {
193b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu            while(!mFinished) {
194b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                try {
195b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                    this.wait();
196b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                } catch (InterruptedException e) { }
197b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu            }
198ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
199b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu    }
200b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu
201b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu    public void copyRunnerAssetsToCache() {
202b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu        try {
203b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu            String out_dir = getActivity().getApplicationContext()
204b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                .getCacheDir().getPath() + "/";
205b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu
206b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu            for( int i=0; i< LOAD_TEST_RUNNER_FILES.length; i++) {
207b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                InputStream in = getActivity().getAssets().open(
208b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                        LOAD_TEST_RUNNER_FILES[i]);
209b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                OutputStream out = new FileOutputStream(
210b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                        out_dir + LOAD_TEST_RUNNER_FILES[i]);
211b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu
212b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                byte[] buf = new byte[2048];
213b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                int len;
214b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu
215b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                while ((len = in.read(buf)) >= 0 ) {
216b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                    out.write(buf, 0, len);
217b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                }
218b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                out.close();
219b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu                in.close();
220b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu            }
221b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu        }catch (IOException e) {
222b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu          e.printStackTrace();
223b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu        }
224b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu
225b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu    }
226b933f669e26afad8a2466edcae8c1ffda6c15721Guang Zhu
227ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project}
228