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