open_file_operation_unittest.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// found in the LICENSE file.
47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chromeos/drive/file_system/open_file_operation.h"
67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include <map>
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/file_util.h"
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/files/file_path.h"
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/scoped_ptr.h"
128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/task_runner_util.h"
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chromeos/drive/drive.pb.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_cache.h"
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chromeos/drive/file_errors.h"
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chromeos/drive/file_system/operation_test_base.h"
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/test_util.h"
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace drive {
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace file_system {
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass OpenFileOperationTest : public OperationTestBase {
247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
25424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    OperationTestBase::SetUp();
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    operation_.reset(new OpenFileOperation(
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        blocking_task_runner(), observer(), scheduler(), metadata(), cache(),
30a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        temp_dir()));
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<OpenFileOperation> operation_;
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(OpenFileOperationTest, OpenExistingFile) {
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::FilePath file_in_root(
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FILE_PATH_LITERAL("drive/root/File 1.txt"));
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ResourceEntry src_entry;
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(file_in_root, &src_entry));
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const int64 file_size = src_entry.file_info().size();
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FileError error = FILE_ERROR_FAILED;
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath file_path;
45a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback;
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      OPEN_FILE,
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
50a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
51a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback));
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  test_util::RunBlockingPoolTask();
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK, error);
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(file_path));
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int64 local_file_size;
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::GetFileSize(file_path, &local_file_size));
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(file_size, local_file_size);
597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
60a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ASSERT_FALSE(close_callback.is_null());
61a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  close_callback.Run();
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1U, observer()->updated_local_ids().count(src_entry.local_id()));
637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
657dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(OpenFileOperationTest, OpenNonExistingFile) {
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::FilePath file_in_root(
677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FILE_PATH_LITERAL("drive/root/not-exist.txt"));
687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FileError error = FILE_ERROR_FAILED;
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath file_path;
71a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback;
727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      OPEN_FILE,
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
76a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
77a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback));
787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  test_util::RunBlockingPoolTask();
797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_NOT_FOUND, error);
80a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(close_callback.is_null());
817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
837dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(OpenFileOperationTest, CreateExistingFile) {
847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::FilePath file_in_root(
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FILE_PATH_LITERAL("drive/root/File 1.txt"));
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ResourceEntry src_entry;
877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(file_in_root, &src_entry));
887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FileError error = FILE_ERROR_FAILED;
907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath file_path;
91a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback;
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      CREATE_FILE,
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
96a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
97a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback));
987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  test_util::RunBlockingPoolTask();
997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_EXISTS, error);
101a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(close_callback.is_null());
1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(OpenFileOperationTest, CreateNonExistingFile) {
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::FilePath file_in_root(
1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FILE_PATH_LITERAL("drive/root/not-exist.txt"));
1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FileError error = FILE_ERROR_FAILED;
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath file_path;
110a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback;
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      CREATE_FILE,
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
115a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
116a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback));
1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  test_util::RunBlockingPoolTask();
1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(1U, observer()->get_changed_paths().size());
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(observer()->get_changed_paths().count(file_in_root.DirName()));
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK, error);
1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(file_path));
1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int64 local_file_size;
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::GetFileSize(file_path, &local_file_size));
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(0, local_file_size);  // Should be an empty file.
1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
128a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ASSERT_FALSE(close_callback.is_null());
129a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  close_callback.Run();
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1U,
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            observer()->updated_local_ids().count(GetLocalId(file_in_root)));
1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(OpenFileOperationTest, OpenOrCreateExistingFile) {
1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::FilePath file_in_root(
1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FILE_PATH_LITERAL("drive/root/File 1.txt"));
1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ResourceEntry src_entry;
1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(file_in_root, &src_entry));
1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const int64 file_size = src_entry.file_info().size();
1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FileError error = FILE_ERROR_FAILED;
1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath file_path;
143a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback;
1447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
1467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      OPEN_OR_CREATE_FILE,
1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
148a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
149a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback));
1507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  test_util::RunBlockingPoolTask();
1517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Notified because 'available offline' status of the existing file changes.
15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(1U, observer()->get_changed_paths().size());
15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(observer()->get_changed_paths().count(file_in_root.DirName()));
15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK, error);
1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(file_path));
1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int64 local_file_size;
159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::GetFileSize(file_path, &local_file_size));
1607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(file_size, local_file_size);
1617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
162a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ASSERT_FALSE(close_callback.is_null());
163a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  close_callback.Run();
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1U, observer()->updated_local_ids().count(src_entry.local_id()));
16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ResourceEntry result_entry;
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(file_in_root, &result_entry));
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(result_entry.file_specific_info().cache_state().is_present());
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(result_entry.file_specific_info().cache_state().is_dirty());
1707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1727dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(OpenFileOperationTest, OpenOrCreateNonExistingFile) {
1737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::FilePath file_in_root(
1747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FILE_PATH_LITERAL("drive/root/not-exist.txt"));
1757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FileError error = FILE_ERROR_FAILED;
1777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath file_path;
178a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback;
1797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
1807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
1817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      OPEN_OR_CREATE_FILE,
1823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
183a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
184a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback));
1857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  test_util::RunBlockingPoolTask();
1867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK, error);
1887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(file_path));
1897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int64 local_file_size;
190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::GetFileSize(file_path, &local_file_size));
1917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(0, local_file_size);  // Should be an empty file.
1927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
193a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ASSERT_FALSE(close_callback.is_null());
194a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  close_callback.Run();
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1U,
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            observer()->updated_local_ids().count(GetLocalId(file_in_root)));
1977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1997dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(OpenFileOperationTest, OpenFileTwice) {
2007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::FilePath file_in_root(
2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FILE_PATH_LITERAL("drive/root/File 1.txt"));
2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ResourceEntry src_entry;
2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(file_in_root, &src_entry));
2047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const int64 file_size = src_entry.file_info().size();
2057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FileError error = FILE_ERROR_FAILED;
2077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath file_path;
208a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback;
2097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
2107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
2117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      OPEN_FILE,
2123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
213a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
214a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback));
2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  test_util::RunBlockingPoolTask();
2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK, error);
2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(file_path));
2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int64 local_file_size;
220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::GetFileSize(file_path, &local_file_size));
2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(file_size, local_file_size);
2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Open again.
2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  error = FILE_ERROR_FAILED;
225a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback2;
2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      OPEN_FILE,
2293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
230a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
231a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback2));
2327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  test_util::RunBlockingPoolTask();
2337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK, error);
2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(file_path));
236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::GetFileSize(file_path, &local_file_size));
2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(file_size, local_file_size);
2387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
239a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ASSERT_FALSE(close_callback.is_null());
240a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ASSERT_FALSE(close_callback2.is_null());
241a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
242a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  close_callback.Run();
243a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
244a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // There still remains a client opening the file, so it shouldn't be
245a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // uploaded yet.
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(observer()->updated_local_ids().empty());
247a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
248a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  close_callback2.Run();
249a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
250a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Here, all the clients close the file, so it should be uploaded then.
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1U, observer()->updated_local_ids().count(src_entry.local_id()));
2527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace file_system
2557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace drive
256