- add sources.
[platform/framework/web/crosswalk.git] / src / content / browser / fileapi / transient_file_util_unittest.cc
1 // Copyright 2013 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 "base/basictypes.h"
6 #include "base/file_util.h"
7 #include "base/files/file_path.h"
8 #include "base/files/scoped_temp_dir.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/platform_file.h"
11 #include "base/run_loop.h"
12 #include "content/public/test/test_file_system_context.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14 #include "webkit/browser/fileapi/file_system_context.h"
15 #include "webkit/browser/fileapi/file_system_operation_context.h"
16 #include "webkit/browser/fileapi/isolated_context.h"
17 #include "webkit/browser/fileapi/transient_file_util.h"
18 #include "webkit/common/blob/scoped_file.h"
19
20 namespace fileapi {
21
22 class TransientFileUtilTest : public testing::Test {
23  public:
24   TransientFileUtilTest() {}
25   virtual ~TransientFileUtilTest() {}
26
27   virtual void SetUp() OVERRIDE {
28     file_system_context_ = CreateFileSystemContextForTesting(
29         NULL, base::FilePath(FILE_PATH_LITERAL("dummy")));
30     transient_file_util_.reset(new TransientFileUtil);
31
32     ASSERT_TRUE(data_dir_.CreateUniqueTempDir());
33   }
34
35   virtual void TearDown() OVERRIDE {
36     file_system_context_ = NULL;
37     base::RunLoop().RunUntilIdle();
38   }
39
40   void CreateAndRegisterTemporaryFile(
41       FileSystemURL* file_url,
42       base::FilePath* file_path) {
43     EXPECT_TRUE(
44         file_util::CreateTemporaryFileInDir(data_dir_.path(), file_path));
45     IsolatedContext* isolated_context = IsolatedContext::GetInstance();
46     std::string name = "tmp";
47     std::string fsid = isolated_context->RegisterFileSystemForPath(
48         kFileSystemTypeForTransientFile,
49         *file_path,
50         &name);
51     ASSERT_TRUE(!fsid.empty());
52     base::FilePath virtual_path = isolated_context->CreateVirtualRootPath(
53         fsid).AppendASCII(name);
54     *file_url = file_system_context_->CreateCrackedFileSystemURL(
55         GURL("http://foo"),
56         kFileSystemTypeIsolated,
57         virtual_path);
58   }
59
60   scoped_ptr<FileSystemOperationContext> NewOperationContext() {
61     return make_scoped_ptr(
62         new FileSystemOperationContext(file_system_context_.get()));
63   }
64
65   FileSystemFileUtil* file_util() { return transient_file_util_.get(); }
66
67  private:
68   base::MessageLoop message_loop_;
69   base::ScopedTempDir data_dir_;
70   scoped_refptr<FileSystemContext> file_system_context_;
71   scoped_ptr<TransientFileUtil> transient_file_util_;
72
73   DISALLOW_COPY_AND_ASSIGN(TransientFileUtilTest);
74 };
75
76 TEST_F(TransientFileUtilTest, TransientFile) {
77   FileSystemURL temp_url;
78   base::FilePath temp_path;
79
80   CreateAndRegisterTemporaryFile(&temp_url, &temp_path);
81
82   base::PlatformFileError error;
83   base::PlatformFileInfo file_info;
84   base::FilePath path;
85
86   // Make sure the file is there.
87   ASSERT_TRUE(temp_url.is_valid());
88   ASSERT_TRUE(base::PathExists(temp_path));
89   ASSERT_FALSE(base::DirectoryExists(temp_path));
90
91   // Create a snapshot file.
92   {
93     webkit_blob::ScopedFile scoped_file =
94         file_util()->CreateSnapshotFile(NewOperationContext().get(),
95                                         temp_url,
96                                         &error,
97                                         &file_info,
98                                         &path);
99     ASSERT_EQ(base::PLATFORM_FILE_OK, error);
100     ASSERT_EQ(temp_path, path);
101     ASSERT_FALSE(file_info.is_directory);
102
103     // The file should be still there.
104     ASSERT_TRUE(base::PathExists(temp_path));
105     ASSERT_EQ(base::PLATFORM_FILE_OK,
106               file_util()->GetFileInfo(NewOperationContext().get(),
107                                        temp_url, &file_info, &path));
108     ASSERT_EQ(temp_path, path);
109     ASSERT_FALSE(file_info.is_directory);
110   }
111
112   // The file's now scoped out.
113   base::RunLoop().RunUntilIdle();
114
115   // Now the temporary file and the transient filesystem must be gone too.
116   ASSERT_FALSE(base::PathExists(temp_path));
117   ASSERT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND,
118             file_util()->GetFileInfo(NewOperationContext().get(),
119                                      temp_url, &file_info, &path));
120 }
121
122 }  // namespace fileapi