FsUtils.java revision 8b85dceadf281705a94d7546556fa5969364a658
16bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu/*
26bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu * Copyright (C) 2009 The Android Open Source Project
36bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu *
46bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu * Licensed under the Apache License, Version 2.0 (the "License");
56bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu * you may not use this file except in compliance with the License.
66bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu * You may obtain a copy of the License at
76bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu *
86bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu *      http://www.apache.org/licenses/LICENSE-2.0
96bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu *
106bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu * Unless required by applicable law or agreed to in writing, software
116bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu * distributed under the License is distributed on an "AS IS" BASIS,
126bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu * See the License for the specific language governing permissions and
146bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu * limitations under the License.
156bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu */
166bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu
17f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhupackage com.android.dumprendertree;
18f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
196bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhuimport com.android.dumprendertree.forwarder.ForwardService;
206bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu
218b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauerimport android.os.Environment;
22f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhuimport android.util.Log;
23f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
24f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhuimport java.io.BufferedOutputStream;
25f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhuimport java.io.BufferedReader;
26f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhuimport java.io.File;
27f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhuimport java.io.FileOutputStream;
28f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhuimport java.io.FileReader;
295dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhuimport java.io.FileWriter;
30f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhuimport java.io.IOException;
31ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhuimport java.util.regex.Pattern;
32f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
33f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhupublic class FsUtils {
34f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
35f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu    private static final String LOGTAG = "FsUtils";
368b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer    static final String EXTERNAL_DIR = Environment.getExternalStorageDirectory().toString();
378b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer    static final String HTTP_TESTS_PREFIX =
388b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer        EXTERNAL_DIR + "/android/layout_tests/http/tests/";
398b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer    static final String HTTPS_TESTS_PREFIX =
408b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer        EXTERNAL_DIR + "/android/layout_tests/http/tests/ssl/";
418b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer    static final String HTTP_LOCAL_TESTS_PREFIX =
428b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer        EXTERNAL_DIR + "/android/layout_tests/http/tests/local/";
438b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer    static final String HTTP_MEDIA_TESTS_PREFIX =
448b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer        EXTERNAL_DIR + "/android/layout_tests/http/tests/media/";
458b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer    static final String HTTP_WML_TESTS_PREFIX =
468b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer        EXTERNAL_DIR + "/android/layout_tests/http/tests/wml/";
476bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu
48f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu    private FsUtils() {
49f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        //no creation of instances
50f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu    }
51f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
52f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu    public static void findLayoutTestsRecursively(BufferedOutputStream bos,
53cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block            String dir, boolean ignoreResultsInDir) throws IOException {
54f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        Log.v(LOGTAG, "Searching tests under " + dir);
55f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
56f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        File d = new File(dir);
57f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        if (!d.isDirectory()) {
58f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            throw new AssertionError("A directory expected, but got " + dir);
59f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        }
60cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block        ignoreResultsInDir |= FileFilter.ignoreResult(dir);
61f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
62f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        String[] files = d.list();
63f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        for (int i = 0; i < files.length; i++) {
64f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            String s = dir + "/" + files[i];
65cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block
66cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block            File f = new File(s);
67cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block            if (f.isDirectory()) {
68cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                // If this is not a test directory, we don't recurse into it.
69cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                if (!FileFilter.isNonTestDir(s)) {
70cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                    Log.v(LOGTAG, "Recursing on " + s);
71cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                    findLayoutTestsRecursively(bos, s, ignoreResultsInDir);
72cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                }
735e8f52f5c5ac97cbc514e72c4fc84b6fa46ebc57Steve Block                continue;
745e8f52f5c5ac97cbc514e72c4fc84b6fa46ebc57Steve Block            }
75cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block
76cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block            // If this test should be ignored, we skip it completely.
77f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            if (FileFilter.ignoreTest(s)) {
78cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                Log.v(LOGTAG, "Ignoring: " + s);
79f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                continue;
80f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            }
81cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block
82cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block            if ((s.toLowerCase().endsWith(".html") || s.toLowerCase().endsWith(".xml"))
83cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                    && !s.endsWith("TEMPLATE.html")) {
84cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                Log.v(LOGTAG, "Recording " + s);
85f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                bos.write(s.getBytes());
86cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                // If the result of this test should be ignored, we still run the test.
87cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                if (ignoreResultsInDir || FileFilter.ignoreResult(s)) {
88cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                    bos.write((" IGNORE_RESULT").getBytes());
89cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                }
90f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                bos.write('\n');
91f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            }
92f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        }
93f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu    }
94f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
95f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu    public static void updateTestStatus(String statusFile, String s) {
96f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        try {
97f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            BufferedOutputStream bos = new BufferedOutputStream(
98f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                    new FileOutputStream(statusFile));
99f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            bos.write(s.getBytes());
100f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            bos.close();
101f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        } catch (Exception e) {
102f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            Log.e(LOGTAG, "Cannot update file " + statusFile);
103f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        }
104f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu    }
105f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
106f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu    public static String readTestStatus(String statusFile) {
107f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        // read out the test name it stopped last time.
108f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        String status = null;
109f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        File testStatusFile = new File(statusFile);
110f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        if(testStatusFile.exists()) {
111f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            try {
112f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                BufferedReader inReader = new BufferedReader(
113f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                        new FileReader(testStatusFile));
114f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                status = inReader.readLine();
115f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                inReader.close();
116f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            } catch (IOException e) {
117f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                Log.e(LOGTAG, "Error reading test status.", e);
118f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            }
119f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        }
120f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        return status;
121f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu    }
122f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
1236bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu    public static String getTestUrl(String path) {
1246bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu        String url = null;
1256bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu        if (!path.startsWith(HTTP_TESTS_PREFIX)) {
1266bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu            url = "file://" + path;
1276bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu        } else {
1286bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu            ForwardService.getForwardService().startForwardService();
1296bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu            if (path.startsWith(HTTPS_TESTS_PREFIX)) {
1306bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu                // still cut the URL after "http/tests/"
1316bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu                url = "https://127.0.0.1:8443/" + path.substring(HTTP_TESTS_PREFIX.length());
1326bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu            } else if (!path.startsWith(HTTP_LOCAL_TESTS_PREFIX)
1336bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu                    && !path.startsWith(HTTP_MEDIA_TESTS_PREFIX)
1346bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu                    && !path.startsWith(HTTP_WML_TESTS_PREFIX)) {
1356bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu                url = "http://127.0.0.1:8000/" + path.substring(HTTP_TESTS_PREFIX.length());
1366bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu            } else {
1376bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu                url = "file://" + path;
1386bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu            }
1396bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu        }
1406bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu        return url;
1416bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu    }
1426bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu
143ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu    public static boolean diffIgnoreSpaces(String file1, String file2)  throws IOException {
144ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu        BufferedReader br1 = new BufferedReader(new FileReader(file1));
145ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu        BufferedReader br2 = new BufferedReader(new FileReader(file2));
146ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu        boolean same = true;
147ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu        Pattern trailingSpace = Pattern.compile("\\s+$");
148ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu
149ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu        while(true) {
150ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu            String line1 = br1.readLine();
151ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu            String line2 = br2.readLine();
152ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu
153ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu            if (line1 == null && line2 == null)
154ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu                break;
155ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu            if (line1 != null) {
156ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu                line1 = trailingSpace.matcher(line1).replaceAll("");
157ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu            } else {
158ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu                line1 = "";
159ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu            }
160ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu            if (line2 != null) {
161ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu                line2 = trailingSpace.matcher(line2).replaceAll("");
162ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu            } else {
163ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu                line2 = "";
164ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu            }
165ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu            if(!line1.equals(line2)) {
166ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu                same = false;
167ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu                break;
168ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu            }
169ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu        }
170ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu
171ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu        br1.close();
172ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu        br2.close();
173ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu
174ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu        return same;
175ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu    }
176ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu
1775dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu    public static boolean isTestPageUrl(String url) {
1785dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        int qmPostion = url.indexOf('?');
1795dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        int slashPostion = url.lastIndexOf('/');
1805dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        if (slashPostion < qmPostion) {
1815dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu            String fileName = url.substring(slashPostion + 1, qmPostion);
1825dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu            if ("index.html".equals(fileName)) {
1835dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu                return true;
1845dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu            }
1855dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        }
1865dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        return false;
1875dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu    }
1885dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu
1895dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu    public static String getLastSegmentInPath(String path) {
1905dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        int endPos = path.lastIndexOf('/');
1915dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        path = path.substring(0, endPos);
1925dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        endPos = path.lastIndexOf('/');
1935dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        return path.substring(endPos + 1);
1945dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu    }
1955dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu
1965dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu    public static void writeDrawTime(String fileName, String url, long[] times) {
1975dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        StringBuffer lineBuffer = new StringBuffer();
1985dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        // grab the last segment of path in url
1995dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        lineBuffer.append(getLastSegmentInPath(url));
2005dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        for (long time : times) {
2015dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu            lineBuffer.append('\t');
2025dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu            lineBuffer.append(time);
2035dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        }
2045dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        lineBuffer.append('\n');
2055dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        String line = lineBuffer.toString();
2065dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        Log.v(LOGTAG, "logging draw times: " + line);
2075dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        try {
2085dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu            FileWriter fw = new FileWriter(fileName, true);
2095dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu            fw.write(line);
2105dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu            fw.close();
2115dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        } catch (IOException ioe) {
2125dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu            Log.e(LOGTAG, "Failed to log draw times", ioe);
2135dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        }
2145dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu    }
2155dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu
216f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu}
217