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 =
3871716223201a01a4f4b6fe182ad97720b7d06124Guang Zhu        EXTERNAL_DIR + "/webkit/layout_tests/http/tests/";
398b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer    static final String HTTPS_TESTS_PREFIX =
4071716223201a01a4f4b6fe182ad97720b7d06124Guang Zhu        EXTERNAL_DIR + "/webkit/layout_tests/http/tests/ssl/";
418b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer    static final String HTTP_LOCAL_TESTS_PREFIX =
4271716223201a01a4f4b6fe182ad97720b7d06124Guang Zhu        EXTERNAL_DIR + "/webkit/layout_tests/http/tests/local/";
438b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer    static final String HTTP_MEDIA_TESTS_PREFIX =
4471716223201a01a4f4b6fe182ad97720b7d06124Guang Zhu        EXTERNAL_DIR + "/webkit/layout_tests/http/tests/media/";
458b85dceadf281705a94d7546556fa5969364a658Christian Mehlmauer    static final String HTTP_WML_TESTS_PREFIX =
4671716223201a01a4f4b6fe182ad97720b7d06124Guang Zhu        EXTERNAL_DIR + "/webkit/layout_tests/http/tests/wml/";
476bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu
48f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu    private FsUtils() {
49f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        //no creation of instances
50f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu    }
51f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
529b815d080145f0bc8effc9e011090010ad51f203Ben Murdoch    /**
539b815d080145f0bc8effc9e011090010ad51f203Ben Murdoch     * @return the number of tests in the list.
549b815d080145f0bc8effc9e011090010ad51f203Ben Murdoch     */
559b815d080145f0bc8effc9e011090010ad51f203Ben Murdoch    public static int writeLayoutTestListRecursively(BufferedOutputStream bos,
56cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block            String dir, boolean ignoreResultsInDir) throws IOException {
579b815d080145f0bc8effc9e011090010ad51f203Ben Murdoch
589b815d080145f0bc8effc9e011090010ad51f203Ben Murdoch        int testCount = 0;
59f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        Log.v(LOGTAG, "Searching tests under " + dir);
60f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
61f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        File d = new File(dir);
62f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        if (!d.isDirectory()) {
63f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            throw new AssertionError("A directory expected, but got " + dir);
64f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        }
65cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block        ignoreResultsInDir |= FileFilter.ignoreResult(dir);
66f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
67f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        String[] files = d.list();
68f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        for (int i = 0; i < files.length; i++) {
69f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            String s = dir + "/" + files[i];
70cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block
71cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block            File f = new File(s);
72cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block            if (f.isDirectory()) {
73cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                // If this is not a test directory, we don't recurse into it.
74cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                if (!FileFilter.isNonTestDir(s)) {
75cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                    Log.v(LOGTAG, "Recursing on " + s);
769b815d080145f0bc8effc9e011090010ad51f203Ben Murdoch                    testCount += writeLayoutTestListRecursively(bos, s, ignoreResultsInDir);
77cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                }
785e8f52f5c5ac97cbc514e72c4fc84b6fa46ebc57Steve Block                continue;
795e8f52f5c5ac97cbc514e72c4fc84b6fa46ebc57Steve Block            }
80cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block
81cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block            // If this test should be ignored, we skip it completely.
82f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            if (FileFilter.ignoreTest(s)) {
83cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                Log.v(LOGTAG, "Ignoring: " + s);
84f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                continue;
85f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            }
86cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block
87177eb38ef571e8602547dfd9ba78376822e18e01Ben Murdoch            if ((s.toLowerCase().endsWith(".html")
88177eb38ef571e8602547dfd9ba78376822e18e01Ben Murdoch                    || s.toLowerCase().endsWith(".xml")
89177eb38ef571e8602547dfd9ba78376822e18e01Ben Murdoch                    || s.toLowerCase().endsWith(".xhtml"))
90cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                    && !s.endsWith("TEMPLATE.html")) {
91cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                Log.v(LOGTAG, "Recording " + s);
92f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                bos.write(s.getBytes());
93cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                // If the result of this test should be ignored, we still run the test.
94cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                if (ignoreResultsInDir || FileFilter.ignoreResult(s)) {
95cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                    bos.write((" IGNORE_RESULT").getBytes());
96cf0fd7892b7208ebfa35809b63fc8e4d60e4d466Steve Block                }
97f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                bos.write('\n');
989b815d080145f0bc8effc9e011090010ad51f203Ben Murdoch                testCount++;
99f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            }
100f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        }
1019b815d080145f0bc8effc9e011090010ad51f203Ben Murdoch        return testCount;
102f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu    }
103f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
104f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu    public static void updateTestStatus(String statusFile, String s) {
105f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        try {
106f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            BufferedOutputStream bos = new BufferedOutputStream(
107f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                    new FileOutputStream(statusFile));
108f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            bos.write(s.getBytes());
109f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            bos.close();
110f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        } catch (Exception e) {
111f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            Log.e(LOGTAG, "Cannot update file " + statusFile);
112f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        }
113f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu    }
114f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
115f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu    public static String readTestStatus(String statusFile) {
116f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        // read out the test name it stopped last time.
117f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        String status = null;
118f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        File testStatusFile = new File(statusFile);
119f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        if(testStatusFile.exists()) {
120f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            try {
121f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                BufferedReader inReader = new BufferedReader(
122f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                        new FileReader(testStatusFile));
123f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                status = inReader.readLine();
124f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                inReader.close();
125f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            } catch (IOException e) {
126f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu                Log.e(LOGTAG, "Error reading test status.", e);
127f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu            }
128f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        }
129f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu        return status;
130f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu    }
131f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu
1326bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu    public static String getTestUrl(String path) {
1336bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu        String url = null;
1346bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu        if (!path.startsWith(HTTP_TESTS_PREFIX)) {
1356bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu            url = "file://" + path;
1366bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu        } else {
1376bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu            ForwardService.getForwardService().startForwardService();
1386bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu            if (path.startsWith(HTTPS_TESTS_PREFIX)) {
1396bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu                // still cut the URL after "http/tests/"
1406bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu                url = "https://127.0.0.1:8443/" + path.substring(HTTP_TESTS_PREFIX.length());
1416bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu            } else if (!path.startsWith(HTTP_LOCAL_TESTS_PREFIX)
1426bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu                    && !path.startsWith(HTTP_MEDIA_TESTS_PREFIX)
1436bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu                    && !path.startsWith(HTTP_WML_TESTS_PREFIX)) {
144d467347d7301043664c2c4b5a05170ae1b7b0afdGuang Zhu                url = "http://127.0.0.1:8000/" + path.substring(HTTP_TESTS_PREFIX.length());
1456bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu            } else {
1466bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu                url = "file://" + path;
1476bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu            }
1486bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu        }
1496bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu        return url;
1506bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu    }
1516bf18bae60ae1ff0bf2407e8db115cbbab6f1b84Guang Zhu
152ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu    public static boolean diffIgnoreSpaces(String file1, String file2)  throws IOException {
153ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu        BufferedReader br1 = new BufferedReader(new FileReader(file1));
154ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu        BufferedReader br2 = new BufferedReader(new FileReader(file2));
155ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu        boolean same = true;
156ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu        Pattern trailingSpace = Pattern.compile("\\s+$");
157ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu
158ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu        while(true) {
159ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu            String line1 = br1.readLine();
160ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu            String line2 = br2.readLine();
161ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu
162ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu            if (line1 == null && line2 == null)
163ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu                break;
164ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu            if (line1 != null) {
165ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu                line1 = trailingSpace.matcher(line1).replaceAll("");
166ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu            } else {
167ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu                line1 = "";
168ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu            }
169ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu            if (line2 != null) {
170ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu                line2 = trailingSpace.matcher(line2).replaceAll("");
171ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu            } else {
172ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu                line2 = "";
173ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu            }
174ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu            if(!line1.equals(line2)) {
175ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu                same = false;
176ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu                break;
177ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu            }
178ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu        }
179ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu
180ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu        br1.close();
181ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu        br2.close();
182ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu
183ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu        return same;
184ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu    }
185ea48cd6dd4e64bcb5c840a12fe052f704510e01cGuang Zhu
1865dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu    public static boolean isTestPageUrl(String url) {
1875dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        int qmPostion = url.indexOf('?');
1885dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        int slashPostion = url.lastIndexOf('/');
1895dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        if (slashPostion < qmPostion) {
1905dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu            String fileName = url.substring(slashPostion + 1, qmPostion);
1915dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu            if ("index.html".equals(fileName)) {
1925dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu                return true;
1935dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu            }
1945dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        }
1955dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        return false;
1965dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu    }
1975dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu
1985dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu    public static String getLastSegmentInPath(String path) {
1995dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        int endPos = path.lastIndexOf('/');
2005dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        path = path.substring(0, endPos);
2015dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        endPos = path.lastIndexOf('/');
2025dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        return path.substring(endPos + 1);
2035dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu    }
2045dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu
2055dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu    public static void writeDrawTime(String fileName, String url, long[] times) {
2065dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        StringBuffer lineBuffer = new StringBuffer();
2075dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        // grab the last segment of path in url
2085dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        lineBuffer.append(getLastSegmentInPath(url));
2095dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        for (long time : times) {
2105dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu            lineBuffer.append('\t');
2115dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu            lineBuffer.append(time);
2125dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        }
2135dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        lineBuffer.append('\n');
2145dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        String line = lineBuffer.toString();
2155dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        Log.v(LOGTAG, "logging draw times: " + line);
2165dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        try {
2175dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu            FileWriter fw = new FileWriter(fileName, true);
2185dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu            fw.write(line);
2195dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu            fw.close();
2205dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        } catch (IOException ioe) {
2215dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu            Log.e(LOGTAG, "Failed to log draw times", ioe);
2225dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu        }
2235dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu    }
2245dc4f21ab6360b45f464c1451f8d403dd4df3c63Guang Zhu
225f92bd42a702af7047ac4bd7c95b4a82973b7a79dGuang Zhu}
226