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