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