Home | History | Annotate | Download | only in result
      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