1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/bind.h" 6 #include "base/run_loop.h" 7 #include "testing/gtest/include/gtest/gtest.h" 8 #include "webkit/browser/fileapi/async_file_test_helper.h" 9 #include "webkit/browser/fileapi/file_system_backend.h" 10 #include "webkit/browser/fileapi/file_system_context.h" 11 #include "webkit/browser/fileapi/file_system_operation_runner.h" 12 #include "webkit/browser/fileapi/file_system_url.h" 13 #include "webkit/browser/quota/quota_manager.h" 14 #include "webkit/common/fileapi/file_system_util.h" 15 16 namespace fileapi { 17 18 namespace { 19 20 typedef FileSystemOperation::FileEntryList FileEntryList; 21 22 void AssignAndQuit(base::RunLoop* run_loop, 23 base::PlatformFileError* result_out, 24 base::PlatformFileError result) { 25 *result_out = result; 26 run_loop->Quit(); 27 } 28 29 base::Callback<void(base::PlatformFileError)> 30 AssignAndQuitCallback(base::RunLoop* run_loop, 31 base::PlatformFileError* result) { 32 return base::Bind(&AssignAndQuit, run_loop, base::Unretained(result)); 33 } 34 35 void GetMetadataCallback(base::RunLoop* run_loop, 36 base::PlatformFileError* result_out, 37 base::PlatformFileInfo* file_info_out, 38 base::PlatformFileError result, 39 const base::PlatformFileInfo& file_info) { 40 *result_out = result; 41 if (file_info_out) 42 *file_info_out = file_info; 43 run_loop->Quit(); 44 } 45 46 void CreateSnapshotFileCallback( 47 base::RunLoop* run_loop, 48 base::PlatformFileError* result_out, 49 base::FilePath* platform_path_out, 50 base::PlatformFileError result, 51 const base::PlatformFileInfo& file_info, 52 const base::FilePath& platform_path, 53 const scoped_refptr<webkit_blob::ShareableFileReference>& file_ref) { 54 DCHECK(!file_ref.get()); 55 *result_out = result; 56 if (platform_path_out) 57 *platform_path_out = platform_path; 58 run_loop->Quit(); 59 } 60 61 void ReadDirectoryCallback(base::RunLoop* run_loop, 62 base::PlatformFileError* result_out, 63 FileEntryList* entries_out, 64 base::PlatformFileError result, 65 const FileEntryList& entries, 66 bool has_more) { 67 *result_out = result; 68 *entries_out = entries; 69 if (result != base::PLATFORM_FILE_OK || !has_more) 70 run_loop->Quit(); 71 } 72 73 void DidGetUsageAndQuota(quota::QuotaStatusCode* status_out, 74 int64* usage_out, 75 int64* quota_out, 76 quota::QuotaStatusCode status, 77 int64 usage, 78 int64 quota) { 79 if (status_out) 80 *status_out = status; 81 if (usage_out) 82 *usage_out = usage; 83 if (quota_out) 84 *quota_out = quota; 85 } 86 87 } // namespace 88 89 const int64 AsyncFileTestHelper::kDontCheckSize = -1; 90 91 base::PlatformFileError AsyncFileTestHelper::Copy( 92 FileSystemContext* context, 93 const FileSystemURL& src, 94 const FileSystemURL& dest) { 95 base::PlatformFileError result = base::PLATFORM_FILE_ERROR_FAILED; 96 base::RunLoop run_loop; 97 context->operation_runner()->Copy( 98 src, dest, AssignAndQuitCallback(&run_loop, &result)); 99 run_loop.Run(); 100 return result; 101 } 102 103 base::PlatformFileError AsyncFileTestHelper::Move( 104 FileSystemContext* context, 105 const FileSystemURL& src, 106 const FileSystemURL& dest) { 107 base::PlatformFileError result = base::PLATFORM_FILE_ERROR_FAILED; 108 base::RunLoop run_loop; 109 context->operation_runner()->Move( 110 src, dest, AssignAndQuitCallback(&run_loop, &result)); 111 run_loop.Run(); 112 return result; 113 } 114 115 base::PlatformFileError AsyncFileTestHelper::Remove( 116 FileSystemContext* context, 117 const FileSystemURL& url, 118 bool recursive) { 119 base::PlatformFileError result = base::PLATFORM_FILE_ERROR_FAILED; 120 base::RunLoop run_loop; 121 context->operation_runner()->Remove( 122 url, recursive, AssignAndQuitCallback(&run_loop, &result)); 123 run_loop.Run(); 124 return result; 125 } 126 127 base::PlatformFileError AsyncFileTestHelper::ReadDirectory( 128 FileSystemContext* context, 129 const FileSystemURL& url, 130 FileEntryList* entries) { 131 base::PlatformFileError result = base::PLATFORM_FILE_ERROR_FAILED; 132 DCHECK(entries); 133 entries->clear(); 134 base::RunLoop run_loop; 135 context->operation_runner()->ReadDirectory( 136 url, base::Bind(&ReadDirectoryCallback, &run_loop, &result, entries)); 137 run_loop.Run(); 138 return result; 139 } 140 141 base::PlatformFileError AsyncFileTestHelper::CreateDirectory( 142 FileSystemContext* context, 143 const FileSystemURL& url) { 144 base::PlatformFileError result = base::PLATFORM_FILE_ERROR_FAILED; 145 base::RunLoop run_loop; 146 context->operation_runner()->CreateDirectory( 147 url, 148 false /* exclusive */, 149 false /* recursive */, 150 AssignAndQuitCallback(&run_loop, &result)); 151 run_loop.Run(); 152 return result; 153 } 154 155 base::PlatformFileError AsyncFileTestHelper::CreateFile( 156 FileSystemContext* context, 157 const FileSystemURL& url) { 158 base::PlatformFileError result = base::PLATFORM_FILE_ERROR_FAILED; 159 base::RunLoop run_loop; 160 context->operation_runner()->CreateFile( 161 url, false /* exclusive */, 162 AssignAndQuitCallback(&run_loop, &result)); 163 run_loop.Run(); 164 return result; 165 } 166 167 base::PlatformFileError AsyncFileTestHelper::TruncateFile( 168 FileSystemContext* context, 169 const FileSystemURL& url, 170 size_t size) { 171 base::RunLoop run_loop; 172 base::PlatformFileError result = base::PLATFORM_FILE_ERROR_FAILED; 173 context->operation_runner()->Truncate( 174 url, size, AssignAndQuitCallback(&run_loop, &result)); 175 run_loop.Run(); 176 return result; 177 } 178 179 base::PlatformFileError AsyncFileTestHelper::GetMetadata( 180 FileSystemContext* context, 181 const FileSystemURL& url, 182 base::PlatformFileInfo* file_info) { 183 base::PlatformFileError result = base::PLATFORM_FILE_ERROR_FAILED; 184 base::RunLoop run_loop; 185 context->operation_runner()->GetMetadata( 186 url, base::Bind(&GetMetadataCallback, &run_loop, &result, 187 file_info)); 188 run_loop.Run(); 189 return result; 190 } 191 192 base::PlatformFileError AsyncFileTestHelper::GetPlatformPath( 193 FileSystemContext* context, 194 const FileSystemURL& url, 195 base::FilePath* platform_path) { 196 base::PlatformFileError result = base::PLATFORM_FILE_ERROR_FAILED; 197 base::RunLoop run_loop; 198 context->operation_runner()->CreateSnapshotFile( 199 url, base::Bind(&CreateSnapshotFileCallback, &run_loop, &result, 200 platform_path)); 201 run_loop.Run(); 202 return result; 203 } 204 205 bool AsyncFileTestHelper::FileExists( 206 FileSystemContext* context, 207 const FileSystemURL& url, 208 int64 expected_size) { 209 base::PlatformFileInfo file_info; 210 base::PlatformFileError result = GetMetadata(context, url, &file_info); 211 if (result != base::PLATFORM_FILE_OK || file_info.is_directory) 212 return false; 213 return expected_size == kDontCheckSize || file_info.size == expected_size; 214 } 215 216 bool AsyncFileTestHelper::DirectoryExists( 217 FileSystemContext* context, 218 const FileSystemURL& url) { 219 base::PlatformFileInfo file_info; 220 base::PlatformFileError result = GetMetadata(context, url, &file_info); 221 return (result == base::PLATFORM_FILE_OK) && file_info.is_directory; 222 } 223 224 quota::QuotaStatusCode AsyncFileTestHelper::GetUsageAndQuota( 225 quota::QuotaManager* quota_manager, 226 const GURL& origin, 227 FileSystemType type, 228 int64* usage, 229 int64* quota) { 230 quota::QuotaStatusCode status = quota::kQuotaStatusUnknown; 231 quota_manager->GetUsageAndQuota( 232 origin, 233 FileSystemTypeToQuotaStorageType(type), 234 base::Bind(&DidGetUsageAndQuota, &status, usage, quota)); 235 base::MessageLoop::current()->RunUntilIdle(); 236 return status; 237 } 238 239 } // namespace fileapi 240