TestFileSystemDataManager.cpp (6114B)
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 "FileSystemDataManager.h" 8 #include "TestHelpers.h" 9 #include "mozilla/MozPromise.h" 10 #include "mozilla/SpinEventLoopUntil.h" 11 #include "mozilla/dom/quota/ForwardDecls.h" 12 #include "mozilla/dom/quota/test/QuotaManagerDependencyFixture.h" 13 14 namespace mozilla::dom::fs::test { 15 16 class TestFileSystemDataManager 17 : public quota::test::QuotaManagerDependencyFixture { 18 public: 19 static void SetUpTestCase() { ASSERT_NO_FATAL_FAILURE(InitializeFixture()); } 20 21 static void TearDownTestCase() { 22 EXPECT_NO_FATAL_FAILURE(ClearStoragesForOrigin(GetTestOriginMetadata())); 23 ASSERT_NO_FATAL_FAILURE(ShutdownFixture()); 24 } 25 }; 26 27 TEST_F(TestFileSystemDataManager, GetOrCreateFileSystemDataManager) { 28 auto backgroundTask = []() { 29 bool done = false; 30 31 data::FileSystemDataManager::GetOrCreateFileSystemDataManager( 32 GetTestOriginMetadata()) 33 ->Then( 34 GetCurrentSerialEventTarget(), __func__, 35 [](Registered<data::FileSystemDataManager> registeredDataManager) { 36 RefPtr<data::FileSystemDataManager> dataManager = 37 registeredDataManager.get(); 38 39 registeredDataManager = nullptr; 40 41 return dataManager->OnClose(); 42 }, 43 [](nsresult rejectValue) { 44 return BoolPromise::CreateAndReject(rejectValue, __func__); 45 }) 46 ->Then( 47 GetCurrentSerialEventTarget(), __func__, 48 [&done](const BoolPromise::ResolveOrRejectValue&) { done = true; }); 49 50 SpinEventLoopUntil("Promise is fulfilled"_ns, [&done]() { return done; }); 51 }; 52 53 PerformOnBackgroundThread(std::move(backgroundTask)); 54 } 55 56 TEST_F(TestFileSystemDataManager, 57 GetOrCreateFileSystemDataManager_PendingOpen) { 58 auto backgroundTask = []() { 59 Registered<data::FileSystemDataManager> rdm1; 60 61 Registered<data::FileSystemDataManager> rdm2; 62 63 { 64 bool done1 = false; 65 66 data::FileSystemDataManager::GetOrCreateFileSystemDataManager( 67 GetTestOriginMetadata()) 68 ->Then( 69 GetCurrentSerialEventTarget(), __func__, 70 [&rdm1, &done1](Registered<data::FileSystemDataManager> 71 registeredDataManager) { 72 ASSERT_TRUE(registeredDataManager->IsOpen()); 73 74 rdm1 = std::move(registeredDataManager); 75 76 done1 = true; 77 }, 78 [&done1](nsresult rejectValue) { done1 = true; }); 79 80 bool done2 = false; 81 82 data::FileSystemDataManager::GetOrCreateFileSystemDataManager( 83 GetTestOriginMetadata()) 84 ->Then( 85 GetCurrentSerialEventTarget(), __func__, 86 [&rdm2, &done2](Registered<data::FileSystemDataManager> 87 registeredDataManager) { 88 ASSERT_TRUE(registeredDataManager->IsOpen()); 89 90 rdm2 = std::move(registeredDataManager); 91 92 done2 = true; 93 }, 94 [&done2](nsresult rejectValue) { done2 = true; }); 95 96 SpinEventLoopUntil("Promise is fulfilled"_ns, 97 [&done1, &done2]() { return done1 && done2; }); 98 } 99 100 RefPtr<data::FileSystemDataManager> dm1 = rdm1.unwrap(); 101 102 RefPtr<data::FileSystemDataManager> dm2 = rdm2.unwrap(); 103 104 { 105 bool done1 = false; 106 107 dm1->OnClose()->Then( 108 GetCurrentSerialEventTarget(), __func__, 109 [&done1](const BoolPromise::ResolveOrRejectValue&) { done1 = true; }); 110 111 bool done2 = false; 112 113 dm2->OnClose()->Then( 114 GetCurrentSerialEventTarget(), __func__, 115 [&done2](const BoolPromise::ResolveOrRejectValue&) { done2 = true; }); 116 117 SpinEventLoopUntil("Promise is fulfilled"_ns, 118 [&done1, &done2]() { return done1 && done2; }); 119 } 120 }; 121 122 PerformOnBackgroundThread(std::move(backgroundTask)); 123 } 124 125 TEST_F(TestFileSystemDataManager, 126 GetOrCreateFileSystemDataManager_PendingClose) { 127 auto backgroundTask = []() { 128 Registered<data::FileSystemDataManager> rdm; 129 130 { 131 bool done = false; 132 133 data::FileSystemDataManager::GetOrCreateFileSystemDataManager( 134 GetTestOriginMetadata()) 135 ->Then( 136 GetCurrentSerialEventTarget(), __func__, 137 [&rdm, &done](Registered<data::FileSystemDataManager> 138 registeredDataManager) { 139 ASSERT_TRUE(registeredDataManager->IsOpen()); 140 141 rdm = std::move(registeredDataManager); 142 143 done = true; 144 }, 145 [&done](nsresult rejectValue) { done = true; }); 146 147 SpinEventLoopUntil("Promise is fulfilled"_ns, [&done]() { return done; }); 148 } 149 150 RefPtr<data::FileSystemDataManager> dm = rdm.unwrap(); 151 152 (void)dm; 153 154 { 155 bool done = false; 156 157 data::FileSystemDataManager::GetOrCreateFileSystemDataManager( 158 GetTestOriginMetadata()) 159 ->Then( 160 GetCurrentSerialEventTarget(), __func__, 161 [](Registered<data::FileSystemDataManager> 162 registeredDataManager) { 163 RefPtr<data::FileSystemDataManager> dataManager = 164 registeredDataManager.get(); 165 166 registeredDataManager = nullptr; 167 168 return dataManager->OnClose(); 169 }, 170 [](nsresult rejectValue) { 171 return BoolPromise::CreateAndReject(rejectValue, __func__); 172 }) 173 ->Then(GetCurrentSerialEventTarget(), __func__, 174 [&done](const BoolPromise::ResolveOrRejectValue&) { 175 done = true; 176 }); 177 178 SpinEventLoopUntil("Promise is fulfilled"_ns, [&done]() { return done; }); 179 } 180 }; 181 182 PerformOnBackgroundThread(std::move(backgroundTask)); 183 } 184 185 } // namespace mozilla::dom::fs::test