/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.tradefed.result;
import com.android.tradefed.build.BuildInfo;
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.util.FileUtil;
import com.android.tradefed.util.StreamUtil;
import junit.framework.TestCase;
import org.easymock.EasyMock;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.zip.GZIPInputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
/**
* Unit tests for {@link LogFileSaver}.
*/
public class LogFileSaverTest extends TestCase {
private File mRootDir;
@Override
protected void setUp() throws Exception {
super.setUp();
mRootDir = FileUtil.createTempDir("tmpdir");
}
@Override
protected void tearDown() throws Exception {
FileUtil.recursiveDelete(mRootDir);
super.tearDown();
}
/**
* Test that a unique directory is created
*/
public void testGetFileDir() throws IOException {
final String buildId = "88888";
final String branch = "somebranch";
final String testtag = "sometest";
IBuildInfo mockBuild = EasyMock.createMock(IBuildInfo.class);
EasyMock.expect(mockBuild.getBuildBranch()).andReturn(branch).anyTimes();
EasyMock.expect(mockBuild.getBuildId()).andReturn(buildId).anyTimes();
EasyMock.expect(mockBuild.getTestTag()).andReturn(testtag).anyTimes();
EasyMock.replay(mockBuild);
ILogFileSaver saver = new LogFileSaver(mockBuild, mRootDir);
File generatedDir = saver.getFileDir();
File tagDir = generatedDir.getParentFile();
// ensure a directory with name == testtag is parent of generated directory
assertEquals(testtag, tagDir.getName());
File buildDir = tagDir.getParentFile();
// ensure a directory with name == build number is parent of generated directory
assertEquals(buildId, buildDir.getName());
// ensure a directory with name == branch is parent of generated directory
File branchDir = buildDir.getParentFile();
assertEquals(branch, branchDir.getName());
// ensure parent directory is rootDir
assertEquals(0, mRootDir.compareTo(branchDir.getParentFile()));
// now create a new log saver,
ILogFileSaver newsaver = new LogFileSaver(mockBuild, mRootDir);
File newgeneratedDir = newsaver.getFileDir();
// ensure a new dir is created
assertTrue(generatedDir.compareTo(newgeneratedDir) != 0);
// verify tagDir is reused
File newTagDir = newgeneratedDir.getParentFile();
assertEquals(0, tagDir.compareTo(newTagDir));
}
/**
* Test that a unique directory is created when no branch is specified
*/
public void testGetFileDir_nobranch() throws IOException {
final String buildId = "88888";
final String testtag = "sometest";
IBuildInfo mockBuild = EasyMock.createMock(IBuildInfo.class);
EasyMock.expect(mockBuild.getBuildBranch()).andReturn(null).anyTimes();
EasyMock.expect(mockBuild.getBuildId()).andReturn(buildId).anyTimes();
EasyMock.expect(mockBuild.getTestTag()).andReturn(testtag).anyTimes();
EasyMock.replay(mockBuild);
ILogFileSaver saver = new LogFileSaver(mockBuild, mRootDir);
File generatedDir = saver.getFileDir();
File tagDir = generatedDir.getParentFile();
// ensure a directory with name == testtag is parent of generated directory
assertEquals(testtag, tagDir.getName());
File buildDir = tagDir.getParentFile();
// ensure a directory with name == build number is parent of generated directory
assertEquals(buildId, buildDir.getName());
// ensure parent directory is rootDir
assertEquals(0, mRootDir.compareTo(buildDir.getParentFile()));
}
/**
* Test that retention file creation
*/
@SuppressWarnings("deprecation")
public void testGetFileDir_retention() throws IOException, ParseException {
final String buildId = "88888";
final String branch = "somebranch";
final String testtag = "sometest";
IBuildInfo mockBuild = EasyMock.createMock(IBuildInfo.class);
EasyMock.expect(mockBuild.getBuildBranch()).andReturn(branch).anyTimes();
EasyMock.expect(mockBuild.getBuildId()).andReturn(buildId).anyTimes();
EasyMock.expect(mockBuild.getTestTag()).andReturn(testtag).anyTimes();
EasyMock.replay(mockBuild);
ILogFileSaver saver = new LogFileSaver(mockBuild, mRootDir, 1);
File retentionFile = new File(saver.getFileDir(), RetentionFileSaver.RETENTION_FILE_NAME);
assertTrue(retentionFile.isFile());
String timestamp = StreamUtil.getStringFromStream(new FileInputStream(retentionFile));
SimpleDateFormat formatter = new SimpleDateFormat(RetentionFileSaver.RETENTION_DATE_FORMAT);
Date retentionDate = formatter.parse(timestamp);
Date currentDate = new Date();
int expectedDay = currentDate.getDay() == 6 ? 0 : currentDate.getDay() + 1;
assertEquals(expectedDay, retentionDate.getDay());
}
/**
* Simple normal case test for
* {@link LogFileSaver#saveLogData(String, LogDataType, InputStream)}.
*/
public void testSaveLogData() throws IOException {
File logFile = null;
BufferedReader logFileReader = null;
try {
// TODO: would be nice to create a mock file output to make this test not use disk I/O
ILogFileSaver saver = new LogFileSaver(new BuildInfo(), mRootDir);
final String testData = "Here's some test data, blah";
ByteArrayInputStream mockInput = new ByteArrayInputStream(testData.getBytes());
logFile = saver.saveLogData("testSaveLogData", LogDataType.TEXT, mockInput);
// Verify test data was written to file
logFileReader = new BufferedReader(new FileReader(logFile));
String actualLogString = logFileReader.readLine().trim();
assertTrue(actualLogString.equals(testData));
} finally {
if (logFileReader != null) {
logFileReader.close();
}
if (logFile != null) {
logFile.delete();
}
}
}
/**
* Simple normal case test for
* {@link LogFileSaver#saveAndZipLogData}.
*/
public void testSaveAndZipLogData() throws IOException {
File logFile = null;
try {
// TODO: would be nice to create a mock file output to make this test not use disk I/O
ILogFileSaver saver = new LogFileSaver(new BuildInfo(), mRootDir);
final String testData = "Here's some test data, blah";
ByteArrayInputStream mockInput = new ByteArrayInputStream(testData.getBytes());
logFile = saver.saveAndZipLogData("testSaveLogData", LogDataType.TEXT, mockInput);
assertTrue(logFile.getName().endsWith(LogDataType.ZIP.getFileExt()));
// Verify test data was written to file
ZipFile zipFile = new ZipFile(logFile);
String actualLogString = StreamUtil.getStringFromStream(zipFile.getInputStream(
new ZipEntry("testSaveLogData.txt")));
assertTrue(actualLogString.equals(testData));
} finally {
FileUtil.deleteFile(logFile);
}
}
/**
* Simple normal case test for
* {@link LogFileSaver#createCompressedLogFile} and
* {@link LogFileSaver#createGZipLogStream(File)}
*/
public void testCreateAndGZipLogData() throws IOException {
File logFile = null;
OutputStream gzipOutStream = null;
InputStream gzipInputStream = null;
try {
// TODO: would be nice to create a mock file output to make this test not use disk I/O
ILogFileSaver saver = new LogFileSaver(new BuildInfo(), mRootDir);
logFile = saver.createCompressedLogFile("testSaveAndGZipLogData", LogDataType.TEXT,
LogDataType.GZIP);
assertTrue(logFile.getName().endsWith(LogDataType.TEXT.getFileExt() + "." +
LogDataType.GZIP.getFileExt()));
assertTrue(logFile.exists());
// write data
gzipOutStream = saver.createGZipLogStream(logFile);
final String testData = "Here's some test data, blah";
ByteArrayInputStream mockInput = new ByteArrayInputStream(testData.getBytes());
StreamUtil.copyStreams(mockInput, gzipOutStream);
StreamUtil.close(gzipOutStream);
// Verify test data was written to file
gzipInputStream = new GZIPInputStream(new BufferedInputStream(
new FileInputStream(logFile)));
String actualLogString = StreamUtil.getStringFromStream(gzipInputStream);
assertTrue(actualLogString.equals(testData));
} finally {
StreamUtil.close(gzipInputStream);
FileUtil.deleteFile(logFile);
}
}
}