zip_file_creator_browsertest.cc revision 010d83a9304c5a91596085d917d248abff47903a
15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/file_manager/zip_file_creator.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector>
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/bind.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/file_util.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/files/file_path.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/files/scoped_temp_dir.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/rand_util.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/run_loop.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/test/test_utils.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "third_party/zlib/google/zip_reader.h"
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace file_manager {
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void TestCallback(bool* out_success, const base::Closure& quit, bool success) {
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  *out_success = success;
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  quit.Run();
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ZipFileCreatorTest : public InProcessBrowserTest {
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected:
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(dir_.CreateUniqueTempDir());
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(zip_base_dir()));
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::FilePath zip_archive_path() const {
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return dir_.path().AppendASCII("test.zip");
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::FilePath zip_base_dir() const {
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return dir_.path().AppendASCII("files");
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected:
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ScopedTempDir dir_;
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ZipFileCreatorTest, FailZipForAbsentFile) {
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop run_loop;
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool success = true;
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<base::FilePath> paths;
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  paths.push_back(base::FilePath(FILE_PATH_LITERAL("not.exist")));
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  (new ZipFileCreator(
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       base::Bind(
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           &TestCallback, &success, content::GetQuitTaskForRunLoop(&run_loop)),
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       zip_base_dir(),
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       paths,
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       zip_archive_path()))->Start();
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::RunThisRunLoop(&run_loop);
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(success);
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ZipFileCreatorTest, SomeFilesZip) {
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Prepare files.
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::FilePath kDir1(FILE_PATH_LITERAL("foo"));
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::FilePath kFile1(kDir1.AppendASCII("bar"));
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::FilePath kFile2(FILE_PATH_LITERAL("random"));
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int kRandomDataSize = 100000;
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::string kRandomData = base::RandBytesAsString(kRandomDataSize);
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::CreateDirectory(zip_base_dir().Append(kDir1));
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::WriteFile(zip_base_dir().Append(kFile1), "123", 3);
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::WriteFile(zip_base_dir().Append(kFile2),
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  kRandomData.c_str(), kRandomData.size());
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool success = false;
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop run_loop;
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<base::FilePath> paths;
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  paths.push_back(kDir1);
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  paths.push_back(kFile1);
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  paths.push_back(kFile2);
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  (new ZipFileCreator(
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       base::Bind(
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           &TestCallback, &success, content::GetQuitTaskForRunLoop(&run_loop)),
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       zip_base_dir(),
90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       paths,
91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       zip_archive_path()))->Start();
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::RunThisRunLoop(&run_loop);
94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(success);
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check the archive content.
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  zip::ZipReader reader;
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(reader.Open(zip_archive_path()));
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(3, reader.num_entries());
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  while (reader.HasMore()) {
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(reader.OpenCurrentEntryInZip());
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const zip::ZipReader::EntryInfo* entry = reader.current_entry_info();
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // ZipReader returns directory path with trailing slash.
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (entry->file_path() == kDir1.AsEndingWithSeparator()) {
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_TRUE(entry->is_directory());
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } else if (entry->file_path() == kFile1) {
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_FALSE(entry->is_directory());
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(3, entry->original_size());
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } else if (entry->file_path() == kFile2) {
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_FALSE(entry->is_directory());
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(kRandomDataSize, entry->original_size());
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const base::FilePath out = dir_.path().AppendASCII("archived_content");
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_TRUE(reader.ExtractCurrentEntryToFilePath(out));
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_TRUE(base::ContentsEqual(zip_base_dir().Append(kFile2), out));
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } else {
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ADD_FAILURE();
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(reader.AdvanceToNextEntry());
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace file_manager
124