lzma_util_unittest.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
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/file_util.h"
8#include "base/files/scoped_temp_dir.h"
9#include "base/path_service.h"
10#include "base/process_util.h"
11#include "chrome/common/chrome_paths.h"
12#include "chrome/installer/util/lzma_util.h"
13#include "testing/gtest/include/gtest/gtest.h"
14
15namespace {
16class 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
33// Test that we can open archives successfully.
34TEST_F(LzmaUtilTest, OpenArchiveTest) {
35  base::FilePath archive = data_dir_.AppendASCII("archive1.7z");
36  LzmaUtil lzma_util;
37  EXPECT_EQ(lzma_util.OpenArchive(archive.value()), NO_ERROR);
38
39  // We allow opening another archive (which will automatically close the first
40  // archive).
41  archive = data_dir_.AppendASCII("archive2.7z");
42  EXPECT_EQ(lzma_util.OpenArchive(archive.value()), NO_ERROR);
43
44  // Explicitly close and open the first archive again.
45  lzma_util.CloseArchive();
46  archive = data_dir_.AppendASCII("archive1.7z");
47  EXPECT_EQ(lzma_util.OpenArchive(archive.value()), NO_ERROR);
48
49  // Make sure non-existent archive returns error.
50  archive = data_dir_.AppendASCII("archive.non_existent.7z");
51  EXPECT_EQ(lzma_util.OpenArchive(archive.value()), ERROR_FILE_NOT_FOUND);
52}
53
54// Test that we can extract archives successfully.
55TEST_F(LzmaUtilTest, UnPackTest) {
56  base::FilePath extract_dir(temp_dir_.path());
57  extract_dir = extract_dir.AppendASCII("UnPackTest");
58  ASSERT_FALSE(base::PathExists(extract_dir));
59  EXPECT_TRUE(file_util::CreateDirectory(extract_dir));
60  ASSERT_TRUE(base::PathExists(extract_dir));
61
62  base::FilePath archive = data_dir_.AppendASCII("archive1.7z");
63  LzmaUtil lzma_util;
64  EXPECT_EQ(lzma_util.OpenArchive(archive.value()), NO_ERROR);
65  std::wstring unpacked_file;
66  EXPECT_EQ(lzma_util.UnPack(extract_dir.value(), &unpacked_file),
67            NO_ERROR);
68  EXPECT_TRUE(base::PathExists(extract_dir.AppendASCII("a.exe")));
69  EXPECT_TRUE(unpacked_file == extract_dir.AppendASCII("a.exe").value());
70
71  archive = data_dir_.AppendASCII("archive2.7z");
72  EXPECT_EQ(lzma_util.OpenArchive(archive.value()), NO_ERROR);
73  EXPECT_EQ(lzma_util.UnPack(extract_dir.value(), &unpacked_file),
74            NO_ERROR);
75  EXPECT_TRUE(base::PathExists(extract_dir.AppendASCII("b.exe")));
76  EXPECT_TRUE(unpacked_file == extract_dir.AppendASCII("b.exe").value());
77
78  lzma_util.CloseArchive();
79  archive = data_dir_.AppendASCII("invalid_archive.7z");
80  EXPECT_EQ(lzma_util.UnPack(extract_dir.value(), &unpacked_file),
81            ERROR_INVALID_HANDLE);
82  EXPECT_EQ(lzma_util.OpenArchive(archive.value()), NO_ERROR);
83  EXPECT_EQ(lzma_util.UnPack(extract_dir.value(), &unpacked_file),
84            ERROR_INVALID_HANDLE);
85
86  archive = data_dir_.AppendASCII("archive3.7z");
87  EXPECT_EQ(lzma_util.OpenArchive(archive.value()), NO_ERROR);
88  EXPECT_EQ(lzma_util.UnPack(extract_dir.value(), &unpacked_file),
89            NO_ERROR);
90  EXPECT_TRUE(base::PathExists(extract_dir.AppendASCII("archive\\a.exe")));
91  EXPECT_TRUE(base::PathExists(
92      extract_dir.AppendASCII("archive\\sub_dir\\text.txt")));
93}
94
95// Test the static method that can be used to unpack archives.
96TEST_F(LzmaUtilTest, UnPackArchiveTest) {
97  base::FilePath extract_dir(temp_dir_.path());
98  extract_dir = extract_dir.AppendASCII("UnPackArchiveTest");
99  ASSERT_FALSE(base::PathExists(extract_dir));
100  EXPECT_TRUE(file_util::CreateDirectory(extract_dir));
101  ASSERT_TRUE(base::PathExists(extract_dir));
102
103  base::FilePath archive = data_dir_.AppendASCII("archive1.7z");
104  std::wstring unpacked_file;
105  EXPECT_EQ(LzmaUtil::UnPackArchive(archive.value(), extract_dir.value(),
106                                    &unpacked_file), NO_ERROR);
107  EXPECT_TRUE(base::PathExists(extract_dir.AppendASCII("a.exe")));
108  EXPECT_TRUE(unpacked_file == extract_dir.AppendASCII("a.exe").value());
109
110  archive = data_dir_.AppendASCII("archive2.7z");
111  EXPECT_EQ(LzmaUtil::UnPackArchive(archive.value(), extract_dir.value(),
112                                    &unpacked_file), NO_ERROR);
113  EXPECT_TRUE(base::PathExists(extract_dir.AppendASCII("b.exe")));
114  EXPECT_TRUE(unpacked_file == extract_dir.AppendASCII("b.exe").value());
115
116  archive = data_dir_.AppendASCII("invalid_archive.7z");
117  EXPECT_NE(LzmaUtil::UnPackArchive(archive.value(), extract_dir.value(),
118                                    &unpacked_file), NO_ERROR);
119}
120