1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.tradefed.result; 18 19 import com.android.tradefed.build.BuildInfo; 20 import com.android.tradefed.build.IBuildInfo; 21 import com.android.tradefed.util.FileUtil; 22 import com.android.tradefed.util.StreamUtil; 23 24 import junit.framework.TestCase; 25 26 import org.easymock.EasyMock; 27 28 import java.io.BufferedInputStream; 29 import java.io.BufferedReader; 30 import java.io.ByteArrayInputStream; 31 import java.io.File; 32 import java.io.FileInputStream; 33 import java.io.FileReader; 34 import java.io.IOException; 35 import java.io.InputStream; 36 import java.io.OutputStream; 37 import java.text.ParseException; 38 import java.text.SimpleDateFormat; 39 import java.util.Date; 40 import java.util.zip.GZIPInputStream; 41 import java.util.zip.ZipEntry; 42 import java.util.zip.ZipFile; 43 44 /** 45 * Unit tests for {@link LogFileSaver}. 46 */ 47 public class LogFileSaverTest extends TestCase { 48 49 private File mRootDir; 50 51 @Override 52 protected void setUp() throws Exception { 53 super.setUp(); 54 mRootDir = FileUtil.createTempDir("tmpdir"); 55 } 56 57 @Override 58 protected void tearDown() throws Exception { 59 FileUtil.recursiveDelete(mRootDir); 60 super.tearDown(); 61 } 62 63 /** 64 * Test that a unique directory is created 65 */ 66 public void testGetFileDir() { 67 final String buildId = "88888"; 68 final String branch = "somebranch"; 69 final String testtag = "sometest"; 70 IBuildInfo mockBuild = EasyMock.createMock(IBuildInfo.class); 71 EasyMock.expect(mockBuild.getBuildBranch()).andReturn(branch).anyTimes(); 72 EasyMock.expect(mockBuild.getBuildId()).andReturn(buildId).anyTimes(); 73 EasyMock.expect(mockBuild.getTestTag()).andReturn(testtag).anyTimes(); 74 EasyMock.replay(mockBuild); 75 LogFileSaver saver = new LogFileSaver(mockBuild, mRootDir); 76 File generatedDir = saver.getFileDir(); 77 File tagDir = generatedDir.getParentFile(); 78 // ensure a directory with name == testtag is parent of generated directory 79 assertEquals(testtag, tagDir.getName()); 80 File buildDir = tagDir.getParentFile(); 81 // ensure a directory with name == build number is parent of generated directory 82 assertEquals(buildId, buildDir.getName()); 83 // ensure a directory with name == branch is parent of generated directory 84 File branchDir = buildDir.getParentFile(); 85 assertEquals(branch, branchDir.getName()); 86 // ensure parent directory is rootDir 87 assertEquals(0, mRootDir.compareTo(branchDir.getParentFile())); 88 89 // now create a new log saver, 90 LogFileSaver newsaver = new LogFileSaver(mockBuild, mRootDir); 91 File newgeneratedDir = newsaver.getFileDir(); 92 // ensure a new dir is created 93 assertTrue(generatedDir.compareTo(newgeneratedDir) != 0); 94 // verify tagDir is reused 95 File newTagDir = newgeneratedDir.getParentFile(); 96 assertEquals(0, tagDir.compareTo(newTagDir)); 97 } 98 99 /** 100 * Test that a unique directory is created when no branch is specified 101 */ 102 public void testGetFileDir_nobranch() { 103 final String buildId = "88888"; 104 final String testtag = "sometest"; 105 IBuildInfo mockBuild = EasyMock.createMock(IBuildInfo.class); 106 EasyMock.expect(mockBuild.getBuildBranch()).andReturn(null).anyTimes(); 107 EasyMock.expect(mockBuild.getBuildId()).andReturn(buildId).anyTimes(); 108 EasyMock.expect(mockBuild.getTestTag()).andReturn(testtag).anyTimes(); 109 EasyMock.replay(mockBuild); 110 LogFileSaver saver = new LogFileSaver(mockBuild, mRootDir); 111 File generatedDir = saver.getFileDir(); 112 File tagDir = generatedDir.getParentFile(); 113 // ensure a directory with name == testtag is parent of generated directory 114 assertEquals(testtag, tagDir.getName()); 115 File buildDir = tagDir.getParentFile(); 116 // ensure a directory with name == build number is parent of generated directory 117 assertEquals(buildId, buildDir.getName()); 118 // ensure parent directory is rootDir 119 assertEquals(0, mRootDir.compareTo(buildDir.getParentFile())); 120 } 121 122 /** 123 * Test that retention file creation 124 */ 125 @SuppressWarnings("deprecation") 126 public void testGetFileDir_retention() throws IOException, ParseException { 127 final String buildId = "88888"; 128 final String branch = "somebranch"; 129 final String testtag = "sometest"; 130 IBuildInfo mockBuild = EasyMock.createMock(IBuildInfo.class); 131 EasyMock.expect(mockBuild.getBuildBranch()).andReturn(branch).anyTimes(); 132 EasyMock.expect(mockBuild.getBuildId()).andReturn(buildId).anyTimes(); 133 EasyMock.expect(mockBuild.getTestTag()).andReturn(testtag).anyTimes(); 134 EasyMock.replay(mockBuild); 135 LogFileSaver saver = new LogFileSaver(mockBuild, mRootDir, 1); 136 File retentionFile = new File(saver.getFileDir(), RetentionFileSaver.RETENTION_FILE_NAME); 137 assertTrue(retentionFile.isFile()); 138 String timestamp = StreamUtil.getStringFromStream(new FileInputStream(retentionFile)); 139 SimpleDateFormat formatter = new SimpleDateFormat(RetentionFileSaver.RETENTION_DATE_FORMAT); 140 Date retentionDate = formatter.parse(timestamp); 141 Date currentDate = new Date(); 142 int expectedDay = currentDate.getDay() == 6 ? 0 : currentDate.getDay() + 1; 143 assertEquals(expectedDay, retentionDate.getDay()); 144 } 145 146 /** 147 * Simple normal case test for 148 * {@link LogFileSaver#saveLogData(String, LogDataType, InputStream)}. 149 */ 150 public void testSaveLogData() throws IOException { 151 File logFile = null; 152 BufferedReader logFileReader = null; 153 try { 154 // TODO: would be nice to create a mock file output to make this test not use disk I/O 155 LogFileSaver saver = new LogFileSaver(new BuildInfo(), mRootDir); 156 final String testData = "Here's some test data, blah"; 157 ByteArrayInputStream mockInput = new ByteArrayInputStream(testData.getBytes()); 158 logFile = saver.saveLogData("testSaveLogData", LogDataType.TEXT, mockInput); 159 160 // Verify test data was written to file 161 logFileReader = new BufferedReader(new FileReader(logFile)); 162 String actualLogString = logFileReader.readLine().trim(); 163 assertTrue(actualLogString.equals(testData)); 164 } finally { 165 if (logFileReader != null) { 166 logFileReader.close(); 167 } 168 if (logFile != null) { 169 logFile.delete(); 170 } 171 } 172 } 173 174 /** 175 * Simple normal case test for {@link LogFileSaver#saveAndGZipLogData}. 176 */ 177 public void testSaveAndGZipLogData() throws IOException { 178 File logFile = null; 179 GZIPInputStream gzipStream = null; 180 try { 181 // TODO: would be nice to create a mock file output to make this test not use disk I/O 182 LogFileSaver saver = new LogFileSaver(new BuildInfo(), mRootDir); 183 final String testData = "Here's some test data, blah"; 184 ByteArrayInputStream mockInput = new ByteArrayInputStream(testData.getBytes()); 185 logFile = saver.saveAndGZipLogData("testSaveLogData", LogDataType.TEXT, mockInput); 186 187 assertTrue(logFile.getName().endsWith(LogDataType.GZIP.getFileExt())); 188 // Verify test data was written to file 189 gzipStream = new GZIPInputStream(new FileInputStream(logFile)); 190 String actualLogString = StreamUtil.getStringFromStream(gzipStream); 191 assertTrue(actualLogString.equals(testData)); 192 } finally { 193 StreamUtil.close(gzipStream); 194 FileUtil.deleteFile(logFile); 195 } 196 } 197 198 /** 199 * Simple normal case test for {@link LogFileSaver#saveAndZipLogData}. 200 */ 201 public void testSaveAndZipLogData() throws IOException { 202 File logFile = null; 203 ZipFile zipFile = null; 204 try { 205 // TODO: would be nice to create a mock file output to make this test not use disk I/O 206 LogFileSaver saver = new LogFileSaver(new BuildInfo(), mRootDir); 207 final String testData = "Here's some test data, blah"; 208 ByteArrayInputStream mockInput = new ByteArrayInputStream(testData.getBytes()); 209 logFile = saver.saveAndZipLogData("testSaveLogData", LogDataType.TEXT, mockInput); 210 211 assertTrue(logFile.getName().endsWith(LogDataType.ZIP.getFileExt())); 212 // Verify test data was written to file 213 zipFile = new ZipFile(logFile); 214 215 String actualLogString = StreamUtil.getStringFromStream(zipFile.getInputStream( 216 new ZipEntry("testSaveLogData.txt"))); 217 assertTrue(actualLogString.equals(testData)); 218 } finally { 219 if (zipFile != null) { 220 zipFile.close(); 221 } 222 FileUtil.deleteFile(logFile); 223 } 224 } 225 226 /** 227 * Simple normal case test for {@link LogFileSaver#createCompressedLogFile} and 228 * {@link LogFileSaver#createGZipLogStream(File)} 229 */ 230 public void testCreateAndGZipLogData() throws IOException { 231 File logFile = null; 232 OutputStream gzipOutStream = null; 233 InputStream gzipInputStream = null; 234 try { 235 // TODO: would be nice to create a mock file output to make this test not use disk I/O 236 LogFileSaver saver = new LogFileSaver(new BuildInfo(), mRootDir); 237 logFile = saver.createCompressedLogFile("testSaveAndGZipLogData", LogDataType.TEXT); 238 assertTrue(logFile.getName().endsWith(LogDataType.TEXT.getFileExt() + "." + 239 LogDataType.GZIP.getFileExt())); 240 assertTrue(logFile.exists()); 241 242 // write data 243 gzipOutStream = saver.createGZipLogStream(logFile); 244 final String testData = "Here's some test data, blah"; 245 ByteArrayInputStream mockInput = new ByteArrayInputStream(testData.getBytes()); 246 StreamUtil.copyStreams(mockInput, gzipOutStream); 247 StreamUtil.close(gzipOutStream); 248 // Verify test data was written to file 249 gzipInputStream = new GZIPInputStream(new BufferedInputStream( 250 new FileInputStream(logFile))); 251 252 String actualLogString = StreamUtil.getStringFromStream(gzipInputStream); 253 assertTrue(actualLogString.equals(testData)); 254 } finally { 255 StreamUtil.close(gzipInputStream); 256 FileUtil.deleteFile(logFile); 257 } 258 } 259 260 public void testSaveLogDataRaw() throws Exception { 261 File logFile = null; 262 BufferedReader logFileReader = null; 263 try { 264 // TODO: would be nice to create a mock file output to make this test not use disk I/O 265 LogFileSaver saver = new LogFileSaver(new BuildInfo(), mRootDir); 266 final String testData = "Here's some test data, blah"; 267 ByteArrayInputStream mockInput = new ByteArrayInputStream(testData.getBytes()); 268 logFile = saver.saveLogDataRaw( 269 "testSaveLogData", LogDataType.TEXT.getFileExt(), mockInput); 270 271 // Verify test data was written to file 272 logFileReader = new BufferedReader(new FileReader(logFile)); 273 String actualLogString = logFileReader.readLine().trim(); 274 assertEquals(actualLogString, testData); 275 } finally { 276 StreamUtil.close(logFileReader); 277 FileUtil.deleteFile(logFile); 278 } 279 } 280 } 281