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/files/file_path.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.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"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/drive/file_change.h"
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chromeos/drive/file_errors.h"
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chromeos/drive/file_system/operation_test_base.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/test/test_utils.h"
19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/test_util.h"
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace drive {
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace file_system {
247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass OpenFileOperationTest : public OperationTestBase {
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
27424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    OperationTestBase::SetUp();
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    operation_.reset(new OpenFileOperation(
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        blocking_task_runner(), delegate(), scheduler(), metadata(), cache(),
32a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        temp_dir()));
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<OpenFileOperation> operation_;
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(OpenFileOperationTest, OpenExistingFile) {
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::FilePath file_in_root(
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FILE_PATH_LITERAL("drive/root/File 1.txt"));
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ResourceEntry src_entry;
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(file_in_root, &src_entry));
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const int64 file_size = src_entry.file_info().size();
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FileError error = FILE_ERROR_FAILED;
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath file_path;
47a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback;
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      OPEN_FILE,
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
52a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
53a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback));
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK, error);
577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(file_path));
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int64 local_file_size;
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::GetFileSize(file_path, &local_file_size));
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(file_size, local_file_size);
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
62a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ASSERT_FALSE(close_callback.is_null());
63a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  close_callback.Run();
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1U, delegate()->updated_local_ids().count(src_entry.local_id()));
657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
677dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(OpenFileOperationTest, OpenNonExistingFile) {
687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::FilePath file_in_root(
697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FILE_PATH_LITERAL("drive/root/not-exist.txt"));
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FileError error = FILE_ERROR_FAILED;
727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath file_path;
73a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback;
747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      OPEN_FILE,
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
78a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
79a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback));
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_NOT_FOUND, error);
82a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(close_callback.is_null());
837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(OpenFileOperationTest, CreateExistingFile) {
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::FilePath file_in_root(
877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FILE_PATH_LITERAL("drive/root/File 1.txt"));
887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ResourceEntry src_entry;
897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(file_in_root, &src_entry));
907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FileError error = FILE_ERROR_FAILED;
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath file_path;
93a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback;
947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      CREATE_FILE,
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
98a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
99a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback));
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_EXISTS, error);
103a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(close_callback.is_null());
1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(OpenFileOperationTest, CreateNonExistingFile) {
1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::FilePath file_in_root(
1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FILE_PATH_LITERAL("drive/root/not-exist.txt"));
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FileError error = FILE_ERROR_FAILED;
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath file_path;
112a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback;
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      CREATE_FILE,
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
117a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
118a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback));
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1U, delegate()->get_changed_files().size());
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(delegate()->get_changed_files().count(file_in_root));
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK, error);
1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(file_path));
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int64 local_file_size;
127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::GetFileSize(file_path, &local_file_size));
1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(0, local_file_size);  // Should be an empty file.
1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
130a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ASSERT_FALSE(close_callback.is_null());
131a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  close_callback.Run();
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1U,
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            delegate()->updated_local_ids().count(GetLocalId(file_in_root)));
1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(OpenFileOperationTest, OpenOrCreateExistingFile) {
1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::FilePath file_in_root(
1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FILE_PATH_LITERAL("drive/root/File 1.txt"));
1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ResourceEntry src_entry;
1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(file_in_root, &src_entry));
1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const int64 file_size = src_entry.file_info().size();
1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FileError error = FILE_ERROR_FAILED;
1447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath file_path;
145a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback;
1467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
1477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      OPEN_OR_CREATE_FILE,
1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
150a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
151a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback));
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Notified because 'available offline' status of the existing file changes.
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1U, delegate()->get_changed_files().size());
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(delegate()->get_changed_files().count(file_in_root));
15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK, error);
1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(file_path));
1607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int64 local_file_size;
161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::GetFileSize(file_path, &local_file_size));
1627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(file_size, local_file_size);
1637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
164a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ASSERT_FALSE(close_callback.is_null());
165a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  close_callback.Run();
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1U, delegate()->updated_local_ids().count(src_entry.local_id()));
16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ResourceEntry result_entry;
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(file_in_root, &result_entry));
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(result_entry.file_specific_info().cache_state().is_present());
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(result_entry.file_specific_info().cache_state().is_dirty());
1727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1747dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(OpenFileOperationTest, OpenOrCreateNonExistingFile) {
1757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::FilePath file_in_root(
1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FILE_PATH_LITERAL("drive/root/not-exist.txt"));
1777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FileError error = FILE_ERROR_FAILED;
1797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath file_path;
180a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback;
1817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
1827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
1837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      OPEN_OR_CREATE_FILE,
1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
185a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
186a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback));
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
1887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK, error);
1907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(file_path));
1917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int64 local_file_size;
192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::GetFileSize(file_path, &local_file_size));
1937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(0, local_file_size);  // Should be an empty file.
1947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
195a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ASSERT_FALSE(close_callback.is_null());
196a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  close_callback.Run();
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1U,
1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            delegate()->updated_local_ids().count(GetLocalId(file_in_root)));
1997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(OpenFileOperationTest, OpenFileTwice) {
2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::FilePath file_in_root(
2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FILE_PATH_LITERAL("drive/root/File 1.txt"));
2047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ResourceEntry src_entry;
2057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(file_in_root, &src_entry));
2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const int64 file_size = src_entry.file_info().size();
2077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FileError error = FILE_ERROR_FAILED;
2097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath file_path;
210a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback;
2117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
2127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      OPEN_FILE,
2143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
215a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
216a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback));
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK, error);
2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(file_path));
2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int64 local_file_size;
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::GetFileSize(file_path, &local_file_size));
2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(file_size, local_file_size);
2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Open again.
2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  error = FILE_ERROR_FAILED;
227a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback2;
2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      OPEN_FILE,
2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
232a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
233a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback2));
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RunAllBlockingPoolTasksUntilIdle();
2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK, error);
2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(file_path));
238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::GetFileSize(file_path, &local_file_size));
2397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(file_size, local_file_size);
2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
241a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ASSERT_FALSE(close_callback.is_null());
242a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ASSERT_FALSE(close_callback2.is_null());
243a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
244a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  close_callback.Run();
245a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
246a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // There still remains a client opening the file, so it shouldn't be
247a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // uploaded yet.
2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(delegate()->updated_local_ids().empty());
249a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
250a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  close_callback2.Run();
251a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
252a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Here, all the clients close the file, so it should be uploaded then.
2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1U, delegate()->updated_local_ids().count(src_entry.local_id()));
2547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace file_system
2577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace drive
258