tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

TestFileSystemDirectoryHandle.cpp (8232B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
      5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #include "FileSystemMocks.h"
      8 #include "gtest/gtest.h"
      9 #include "mozilla/UniquePtr.h"
     10 #include "mozilla/dom/FileSystemDirectoryHandle.h"
     11 #include "mozilla/dom/FileSystemDirectoryHandleBinding.h"
     12 #include "mozilla/dom/FileSystemHandle.h"
     13 #include "mozilla/dom/FileSystemHandleBinding.h"
     14 #include "mozilla/dom/FileSystemManager.h"
     15 #include "mozilla/dom/StorageManager.h"
     16 #include "nsIGlobalObject.h"
     17 
     18 using ::testing::_;
     19 
     20 namespace mozilla::dom::fs::test {
     21 
     22 class TestFileSystemDirectoryHandle : public ::testing::Test {
     23 protected:
     24  void SetUp() override {
     25    // TODO: Fix the test to not depend on CreateFileSystemManagerParent
     26    // failure because of the pref set to false.
     27    nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
     28    prefs->SetBoolPref("dom.fs.enabled", false);
     29 
     30    mRequestHandler = MakeUnique<MockFileSystemRequestHandler>();
     31    mMetadata = FileSystemEntryMetadata("dir"_ns, u"Directory"_ns,
     32                                        /* directory */ true);
     33    mName = u"testDir"_ns;
     34    mManager = MakeAndAddRef<FileSystemManager>(mGlobal, nullptr);
     35  }
     36 
     37  void TearDown() override {
     38    nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
     39    prefs->SetBoolPref("dom.fs.enabled", true);
     40 
     41    if (!mManager->IsShutdown()) {
     42      mManager->Shutdown();
     43    }
     44  }
     45 
     46  nsIGlobalObject* mGlobal = GetGlobal();
     47  const IterableIteratorBase::IteratorType mIteratorType =
     48      IterableIteratorBase::IteratorType::Keys;
     49  UniquePtr<MockFileSystemRequestHandler> mRequestHandler;
     50  FileSystemEntryMetadata mMetadata;
     51  nsString mName;
     52  RefPtr<FileSystemManager> mManager;
     53 };
     54 
     55 TEST_F(TestFileSystemDirectoryHandle, constructDirectoryHandleRefPointer) {
     56  RefPtr<FileSystemDirectoryHandle> dirHandle =
     57      MakeAndAddRef<FileSystemDirectoryHandle>(mGlobal, mManager, mMetadata);
     58 
     59  ASSERT_TRUE(dirHandle);
     60 }
     61 
     62 TEST_F(TestFileSystemDirectoryHandle, initIterator) {
     63  RefPtr<FileSystemDirectoryHandle> dirHandle =
     64      MakeAndAddRef<FileSystemDirectoryHandle>(mGlobal, mManager, mMetadata,
     65                                               mRequestHandler.release());
     66 
     67  ASSERT_TRUE(dirHandle);
     68 
     69  RefPtr<FileSystemDirectoryHandle::iterator_t> iterator =
     70      new FileSystemDirectoryHandle::iterator_t(dirHandle.get(), mIteratorType);
     71  IgnoredErrorResult rv;
     72  dirHandle->InitAsyncIteratorData(iterator->Data(), mIteratorType, rv);
     73  ASSERT_TRUE(iterator->Data().mImpl);
     74 }
     75 
     76 class MockFileSystemDirectoryIteratorImpl final
     77    : public FileSystemDirectoryIterator::Impl {
     78 public:
     79  MOCK_METHOD(already_AddRefed<Promise>, Next,
     80              (nsIGlobalObject * aGlobal, RefPtr<FileSystemManager>& aManager,
     81               ErrorResult& aError),
     82              (override));
     83 };
     84 
     85 TEST_F(TestFileSystemDirectoryHandle, isNextPromiseReturned) {
     86  RefPtr<FileSystemDirectoryHandle> dirHandle =
     87      MakeAndAddRef<FileSystemDirectoryHandle>(mGlobal, mManager, mMetadata,
     88                                               mRequestHandler.release());
     89 
     90  ASSERT_TRUE(dirHandle);
     91 
     92  auto mockIter = MakeRefPtr<MockFileSystemDirectoryIteratorImpl>();
     93  IgnoredErrorResult error;
     94  EXPECT_CALL(*mockIter, Next(_, _, _))
     95      .WillOnce(::testing::Return(Promise::Create(mGlobal, error)));
     96 
     97  RefPtr<FileSystemDirectoryHandle::iterator_t> iterator =
     98      MakeAndAddRef<FileSystemDirectoryHandle::iterator_t>(dirHandle.get(),
     99                                                           mIteratorType);
    100  iterator->Data().mImpl = std::move(mockIter);
    101 
    102  IgnoredErrorResult rv;
    103  RefPtr<Promise> promise =
    104      dirHandle->GetNextIterationResult(iterator.get(), rv);
    105  ASSERT_TRUE(promise);
    106 }
    107 
    108 TEST_F(TestFileSystemDirectoryHandle, isHandleKindDirectory) {
    109  RefPtr<FileSystemDirectoryHandle> dirHandle =
    110      MakeAndAddRef<FileSystemDirectoryHandle>(mGlobal, mManager, mMetadata,
    111                                               mRequestHandler.release());
    112 
    113  ASSERT_TRUE(dirHandle);
    114 
    115  ASSERT_EQ(FileSystemHandleKind::Directory, dirHandle->Kind());
    116 }
    117 
    118 TEST_F(TestFileSystemDirectoryHandle, isFileHandleReturned) {
    119  EXPECT_CALL(*mRequestHandler, GetFileHandle(_, _, _, _, _))
    120      .WillOnce(::testing::ReturnArg<3>());
    121  RefPtr<FileSystemDirectoryHandle> dirHandle =
    122      MakeAndAddRef<FileSystemDirectoryHandle>(mGlobal, mManager, mMetadata,
    123                                               mRequestHandler.release());
    124 
    125  ASSERT_TRUE(dirHandle);
    126 
    127  FileSystemGetFileOptions options;
    128  IgnoredErrorResult rv;
    129  RefPtr<Promise> promise = dirHandle->GetFileHandle(mName, options, rv);
    130 
    131  ASSERT_TRUE(rv.ErrorCodeIs(NS_OK));
    132 }
    133 
    134 TEST_F(TestFileSystemDirectoryHandle, doesGetFileHandleFailOnNullGlobal) {
    135  mGlobal = nullptr;
    136  RefPtr<FileSystemDirectoryHandle> dirHandle =
    137      MakeAndAddRef<FileSystemDirectoryHandle>(mGlobal, mManager, mMetadata);
    138 
    139  ASSERT_TRUE(dirHandle);
    140 
    141  FileSystemGetFileOptions options;
    142  IgnoredErrorResult rv;
    143  RefPtr<Promise> promise = dirHandle->GetFileHandle(mName, options, rv);
    144 
    145  ASSERT_TRUE(rv.ErrorCodeIs(NS_ERROR_UNEXPECTED));
    146 }
    147 
    148 TEST_F(TestFileSystemDirectoryHandle, isDirectoryHandleReturned) {
    149  EXPECT_CALL(*mRequestHandler, GetDirectoryHandle(_, _, _, _, _))
    150      .WillOnce(::testing::ReturnArg<3>());
    151  RefPtr<FileSystemDirectoryHandle> dirHandle =
    152      MakeAndAddRef<FileSystemDirectoryHandle>(mGlobal, mManager, mMetadata,
    153                                               mRequestHandler.release());
    154 
    155  ASSERT_TRUE(dirHandle);
    156 
    157  FileSystemGetDirectoryOptions options;
    158  IgnoredErrorResult rv;
    159  RefPtr<Promise> promise = dirHandle->GetDirectoryHandle(mName, options, rv);
    160 
    161  ASSERT_TRUE(rv.ErrorCodeIs(NS_OK));
    162 }
    163 
    164 TEST_F(TestFileSystemDirectoryHandle, doesGetDirectoryHandleFailOnNullGlobal) {
    165  mGlobal = nullptr;
    166  RefPtr<FileSystemDirectoryHandle> dirHandle =
    167      MakeAndAddRef<FileSystemDirectoryHandle>(mGlobal, mManager, mMetadata);
    168 
    169  ASSERT_TRUE(dirHandle);
    170 
    171  FileSystemGetDirectoryOptions options;
    172  IgnoredErrorResult rv;
    173  RefPtr<Promise> promise = dirHandle->GetDirectoryHandle(mName, options, rv);
    174 
    175  ASSERT_TRUE(rv.ErrorCodeIs(NS_ERROR_UNEXPECTED));
    176 }
    177 
    178 TEST_F(TestFileSystemDirectoryHandle, isRemoveEntrySuccessful) {
    179  EXPECT_CALL(*mRequestHandler, RemoveEntry(_, _, _, _, _))
    180      .WillOnce(::testing::ReturnArg<3>());
    181  RefPtr<FileSystemDirectoryHandle> dirHandle =
    182      MakeAndAddRef<FileSystemDirectoryHandle>(mGlobal, mManager, mMetadata,
    183                                               mRequestHandler.release());
    184 
    185  ASSERT_TRUE(dirHandle);
    186 
    187  FileSystemRemoveOptions options;
    188  IgnoredErrorResult rv;
    189  RefPtr<Promise> promise = dirHandle->RemoveEntry(mName, options, rv);
    190 
    191  ASSERT_TRUE(rv.ErrorCodeIs(NS_OK));
    192 }
    193 
    194 TEST_F(TestFileSystemDirectoryHandle, doesRemoveEntryFailOnNullGlobal) {
    195  mGlobal = nullptr;
    196  RefPtr<FileSystemDirectoryHandle> dirHandle =
    197      MakeAndAddRef<FileSystemDirectoryHandle>(mGlobal, mManager, mMetadata);
    198 
    199  ASSERT_TRUE(dirHandle);
    200 
    201  FileSystemRemoveOptions options;
    202  IgnoredErrorResult rv;
    203  RefPtr<Promise> promise = dirHandle->RemoveEntry(mName, options, rv);
    204 
    205  ASSERT_TRUE(rv.ErrorCodeIs(NS_ERROR_UNEXPECTED));
    206 }
    207 
    208 TEST_F(TestFileSystemDirectoryHandle, isResolveSuccessful) {
    209  RefPtr<FileSystemDirectoryHandle> dirHandle =
    210      MakeAndAddRef<FileSystemDirectoryHandle>(mGlobal, mManager, mMetadata,
    211                                               mRequestHandler.release());
    212 
    213  ASSERT_TRUE(dirHandle);
    214 
    215  IgnoredErrorResult rv;
    216  RefPtr<Promise> promise = dirHandle->Resolve(*dirHandle, rv);
    217 
    218  ASSERT_TRUE(rv.ErrorCodeIs(NS_OK));
    219 }
    220 
    221 TEST_F(TestFileSystemDirectoryHandle, doesResolveFailOnNullGlobal) {
    222  mGlobal = nullptr;
    223  RefPtr<FileSystemDirectoryHandle> dirHandle =
    224      MakeAndAddRef<FileSystemDirectoryHandle>(mGlobal, mManager, mMetadata);
    225 
    226  ASSERT_TRUE(dirHandle);
    227 
    228  IgnoredErrorResult rv;
    229  RefPtr<Promise> promise = dirHandle->Resolve(*dirHandle, rv);
    230 
    231  ASSERT_TRUE(rv.ErrorCodeIs(NS_ERROR_UNEXPECTED));
    232 }
    233 
    234 }  // namespace mozilla::dom::fs::test