open_file_operation_unittest.cc revision 8bcbed890bc3ce4d7a057a8f32cab53fa534672e
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"
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chromeos/drive/file_errors.h"
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chromeos/drive/file_system/operation_test_base.h"
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/google_apis/test_util.h"
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace drive {
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace file_system {
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass OpenFileOperationTest : public OperationTestBase {
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
24424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    OperationTestBase::SetUp();
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    operation_.reset(new OpenFileOperation(
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        blocking_task_runner(), observer(), scheduler(), metadata(), cache(),
29a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        temp_dir()));
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<OpenFileOperation> operation_;
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(OpenFileOperationTest, OpenExistingFile) {
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::FilePath file_in_root(
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FILE_PATH_LITERAL("drive/root/File 1.txt"));
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ResourceEntry src_entry;
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(file_in_root, &src_entry));
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const int64 file_size = src_entry.file_info().size();
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FileError error = FILE_ERROR_FAILED;
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath file_path;
44a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback;
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      OPEN_FILE,
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
49a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
50a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback));
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  test_util::RunBlockingPoolTask();
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK, error);
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(file_path));
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int64 local_file_size;
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(file_util::GetFileSize(file_path, &local_file_size));
577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(file_size, local_file_size);
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
59a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ASSERT_FALSE(close_callback.is_null());
60a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  close_callback.Run();
61a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_EQ(
62a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      1U,
6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      observer()->upload_needed_local_ids().count(src_entry.local_id()));
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(OpenFileOperationTest, OpenNonExistingFile) {
677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::FilePath file_in_root(
687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FILE_PATH_LITERAL("drive/root/not-exist.txt"));
697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FileError error = FILE_ERROR_FAILED;
717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath file_path;
72a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback;
737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      OPEN_FILE,
763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
77a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
78a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback));
797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  test_util::RunBlockingPoolTask();
807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_NOT_FOUND, error);
81a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(close_callback.is_null());
827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
847dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(OpenFileOperationTest, CreateExistingFile) {
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::FilePath file_in_root(
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FILE_PATH_LITERAL("drive/root/File 1.txt"));
877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ResourceEntry src_entry;
887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(file_in_root, &src_entry));
897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FileError error = FILE_ERROR_FAILED;
917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath file_path;
92a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback;
937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      CREATE_FILE,
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
97a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
98a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback));
997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  test_util::RunBlockingPoolTask();
1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_EXISTS, error);
102a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(close_callback.is_null());
1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(OpenFileOperationTest, CreateNonExistingFile) {
1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::FilePath file_in_root(
1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FILE_PATH_LITERAL("drive/root/not-exist.txt"));
1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FileError error = FILE_ERROR_FAILED;
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath file_path;
111a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback;
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      CREATE_FILE,
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
116a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
117a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback));
1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  test_util::RunBlockingPoolTask();
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(1U, observer()->get_changed_paths().size());
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(observer()->get_changed_paths().count(file_in_root.DirName()));
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK, error);
1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(file_path));
1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int64 local_file_size;
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(file_util::GetFileSize(file_path, &local_file_size));
1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(0, local_file_size);  // Should be an empty file.
1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
129a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ASSERT_FALSE(close_callback.is_null());
130a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  close_callback.Run();
13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(
13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      1U,
13368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      observer()->upload_needed_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));
1527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  test_util::RunBlockingPoolTask();
1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Notified because 'available offline' status of the existing file changes.
15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(1U, observer()->get_changed_paths().size());
15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(observer()->get_changed_paths().count(file_in_root.DirName()));
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;
1617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(file_util::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();
166a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_EQ(
167a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      1U,
16868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      observer()->upload_needed_local_ids().count(src_entry.local_id()));
16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bool success = false;
17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FileCacheEntry cache_entry;
1728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::PostTaskAndReplyWithResult(
1738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      blocking_task_runner(),
1748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      FROM_HERE,
1758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      base::Bind(&internal::FileCache::GetCacheEntry,
1768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                 base::Unretained(cache()),
1778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                 src_entry.local_id(),
1788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                 &cache_entry),
1798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      google_apis::test_util::CreateCopyResultCallback(&success));
18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  test_util::RunBlockingPoolTask();
18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(success);
18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(cache_entry.is_present());
18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(cache_entry.is_dirty());
1847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1867dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(OpenFileOperationTest, OpenOrCreateNonExistingFile) {
1877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::FilePath file_in_root(
1887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FILE_PATH_LITERAL("drive/root/not-exist.txt"));
1897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FileError error = FILE_ERROR_FAILED;
1917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath file_path;
192a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback;
1937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
1947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
1957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      OPEN_OR_CREATE_FILE,
1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
197a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
198a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback));
1997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  test_util::RunBlockingPoolTask();
2007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK, error);
2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(file_path));
2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int64 local_file_size;
2047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(file_util::GetFileSize(file_path, &local_file_size));
2057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(0, local_file_size);  // Should be an empty file.
2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
207a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ASSERT_FALSE(close_callback.is_null());
208a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  close_callback.Run();
20968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(
21068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      1U,
21168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      observer()->upload_needed_local_ids().count(GetLocalId(file_in_root)));
2127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(OpenFileOperationTest, OpenFileTwice) {
2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::FilePath file_in_root(
2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FILE_PATH_LITERAL("drive/root/File 1.txt"));
2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ResourceEntry src_entry;
2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(file_in_root, &src_entry));
2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const int64 file_size = src_entry.file_info().size();
2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FileError error = FILE_ERROR_FAILED;
2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath file_path;
223a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback;
2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      OPEN_FILE,
2273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
228a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
229a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback));
2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  test_util::RunBlockingPoolTask();
2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK, error);
2337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(file_path));
2347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int64 local_file_size;
2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(file_util::GetFileSize(file_path, &local_file_size));
2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(file_size, local_file_size);
2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Open again.
2397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  error = FILE_ERROR_FAILED;
240a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::Closure close_callback2;
2417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  operation_->OpenFile(
2427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_in_root,
2437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      OPEN_FILE,
2443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string(),  // mime_type
245a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      google_apis::test_util::CreateCopyResultCallback(
246a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          &error, &file_path, &close_callback2));
2477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  test_util::RunBlockingPoolTask();
2487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK, error);
2507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(file_path));
2517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(file_util::GetFileSize(file_path, &local_file_size));
2527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(file_size, local_file_size);
2537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
254a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ASSERT_FALSE(close_callback.is_null());
255a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ASSERT_FALSE(close_callback2.is_null());
256a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
257a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  close_callback.Run();
258a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
259a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // There still remains a client opening the file, so it shouldn't be
260a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // uploaded yet.
261424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_TRUE(observer()->upload_needed_local_ids().empty());
262a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
263a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  close_callback2.Run();
264a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
265a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Here, all the clients close the file, so it should be uploaded then.
266a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_EQ(
267a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      1U,
26868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      observer()->upload_needed_local_ids().count(src_entry.local_id()));
2697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace file_system
2727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace drive
273