Home | History | Annotate | Download | only in fileapi
      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