Home | History | Annotate | Download | only in util
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <windows.h>
      6 
      7 #include "base/files/file_util.h"
      8 #include "base/files/scoped_temp_dir.h"
      9 #include "base/path_service.h"
     10 #include "chrome/common/chrome_paths.h"
     11 #include "chrome/installer/util/lzma_util.h"
     12 #include "testing/gtest/include/gtest/gtest.h"
     13 
     14 namespace {
     15 
     16 class LzmaUtilTest : public testing::Test {
     17  protected:
     18   virtual void SetUp() {
     19     ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_dir_));
     20     data_dir_ = data_dir_.AppendASCII("installer");
     21     ASSERT_TRUE(base::PathExists(data_dir_));
     22 
     23     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
     24   }
     25 
     26   base::ScopedTempDir temp_dir_;
     27 
     28   // The path to input data used in tests.
     29   base::FilePath data_dir_;
     30 };
     31 
     32 }  // namespace
     33 
     34 // Test that we can open archives successfully.
     35 TEST_F(LzmaUtilTest, OpenArchiveTest) {
     36   base::FilePath archive = data_dir_.AppendASCII("archive1.7z");
     37   LzmaUtil lzma_util;
     38   EXPECT_EQ(lzma_util.OpenArchive(archive.value()), NO_ERROR);
     39 
     40   // We allow opening another archive (which will automatically close the first
     41   // archive).
     42   archive = data_dir_.AppendASCII("archive2.7z");
     43   EXPECT_EQ(lzma_util.OpenArchive(archive.value()), NO_ERROR);
     44 
     45   // Explicitly close and open the first archive again.
     46   lzma_util.CloseArchive();
     47   archive = data_dir_.AppendASCII("archive1.7z");
     48   EXPECT_EQ(lzma_util.OpenArchive(archive.value()), NO_ERROR);
     49 
     50   // Make sure non-existent archive returns error.
     51   archive = data_dir_.AppendASCII("archive.non_existent.7z");
     52   EXPECT_EQ(lzma_util.OpenArchive(archive.value()), ERROR_FILE_NOT_FOUND);
     53 }
     54 
     55 // Test that we can extract archives successfully.
     56 TEST_F(LzmaUtilTest, UnPackTest) {
     57   base::FilePath extract_dir(temp_dir_.path());
     58   extract_dir = extract_dir.AppendASCII("UnPackTest");
     59   ASSERT_FALSE(base::PathExists(extract_dir));
     60   EXPECT_TRUE(base::CreateDirectory(extract_dir));
     61   ASSERT_TRUE(base::PathExists(extract_dir));
     62 
     63   base::FilePath archive = data_dir_.AppendASCII("archive1.7z");
     64   LzmaUtil lzma_util;
     65   EXPECT_EQ(lzma_util.OpenArchive(archive.value()), NO_ERROR);
     66   std::wstring unpacked_file;
     67   EXPECT_EQ(lzma_util.UnPack(extract_dir.value(), &unpacked_file),
     68             NO_ERROR);
     69   EXPECT_TRUE(base::PathExists(extract_dir.AppendASCII("a.exe")));
     70   EXPECT_TRUE(unpacked_file == extract_dir.AppendASCII("a.exe").value());
     71 
     72   archive = data_dir_.AppendASCII("archive2.7z");
     73   EXPECT_EQ(lzma_util.OpenArchive(archive.value()), NO_ERROR);
     74   EXPECT_EQ(lzma_util.UnPack(extract_dir.value(), &unpacked_file),
     75             NO_ERROR);
     76   EXPECT_TRUE(base::PathExists(extract_dir.AppendASCII("b.exe")));
     77   EXPECT_TRUE(unpacked_file == extract_dir.AppendASCII("b.exe").value());
     78 
     79   lzma_util.CloseArchive();
     80   archive = data_dir_.AppendASCII("invalid_archive.7z");
     81   EXPECT_EQ(lzma_util.UnPack(extract_dir.value(), &unpacked_file),
     82             ERROR_INVALID_HANDLE);
     83   EXPECT_EQ(lzma_util.OpenArchive(archive.value()), NO_ERROR);
     84   EXPECT_EQ(lzma_util.UnPack(extract_dir.value(), &unpacked_file),
     85             ERROR_INVALID_HANDLE);
     86 
     87   archive = data_dir_.AppendASCII("archive3.7z");
     88   EXPECT_EQ(lzma_util.OpenArchive(archive.value()), NO_ERROR);
     89   EXPECT_EQ(lzma_util.UnPack(extract_dir.value(), &unpacked_file),
     90             NO_ERROR);
     91   EXPECT_TRUE(base::PathExists(extract_dir.AppendASCII("archive\\a.exe")));
     92   EXPECT_TRUE(base::PathExists(
     93       extract_dir.AppendASCII("archive\\sub_dir\\text.txt")));
     94 }
     95 
     96 // Test the static method that can be used to unpack archives.
     97 TEST_F(LzmaUtilTest, UnPackArchiveTest) {
     98   base::FilePath extract_dir(temp_dir_.path());
     99   extract_dir = extract_dir.AppendASCII("UnPackArchiveTest");
    100   ASSERT_FALSE(base::PathExists(extract_dir));
    101   EXPECT_TRUE(base::CreateDirectory(extract_dir));
    102   ASSERT_TRUE(base::PathExists(extract_dir));
    103 
    104   base::FilePath archive = data_dir_.AppendASCII("archive1.7z");
    105   std::wstring unpacked_file;
    106   EXPECT_EQ(LzmaUtil::UnPackArchive(archive.value(), extract_dir.value(),
    107                                     &unpacked_file), NO_ERROR);
    108   EXPECT_TRUE(base::PathExists(extract_dir.AppendASCII("a.exe")));
    109   EXPECT_TRUE(unpacked_file == extract_dir.AppendASCII("a.exe").value());
    110 
    111   archive = data_dir_.AppendASCII("archive2.7z");
    112   EXPECT_EQ(LzmaUtil::UnPackArchive(archive.value(), extract_dir.value(),
    113                                     &unpacked_file), NO_ERROR);
    114   EXPECT_TRUE(base::PathExists(extract_dir.AppendASCII("b.exe")));
    115   EXPECT_TRUE(unpacked_file == extract_dir.AppendASCII("b.exe").value());
    116 
    117   archive = data_dir_.AppendASCII("invalid_archive.7z");
    118   EXPECT_NE(LzmaUtil::UnPackArchive(archive.value(), extract_dir.value(),
    119                                     &unpacked_file), NO_ERROR);
    120 }
    121