TestFileSystemUsageTracking.cpp (5823B)
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 "FileSystemParentTest.h" 8 #include "FileSystemParentTestHelpers.h" 9 #include "FileSystemParentTypes.h" 10 #include "gtest/gtest.h" 11 #include "mozilla/dom/quota/UsageInfo.h" 12 13 // This file is intended for integration tests which verify usage tracking 14 // without any restart in between. 15 16 namespace mozilla::dom::fs::test { 17 18 class TestFileSystemUsageTracking : public FileSystemParentTest {}; 19 20 TEST_F(TestFileSystemUsageTracking, CheckUsageBeforeAnyFilesOnDisk) { 21 // For uninitialized database, origin usage is nothing 22 quota::UsageInfo usageNow; 23 ASSERT_NO_FATAL_FAILURE(GetOriginUsage(usageNow)); 24 ASSERT_NO_FATAL_FAILURE(CheckUsageIsNothing(usageNow)); 25 26 // Initialize database 27 ASSERT_NO_FATAL_FAILURE(EnsureDataManager()); 28 29 // After initialization, 30 // * database usage is not zero 31 // * GetDatabaseUsage and GetOriginUsage should agree 32 ASSERT_NO_FATAL_FAILURE(GetDatabaseUsage(usageNow)); 33 ASSERT_NO_FATAL_FAILURE(CheckUsageGreaterThan(usageNow, 0u)); 34 35 uint64_t initialDbUsage; 36 ASSERT_NO_FATAL_FAILURE(GetUsageValue(usageNow, initialDbUsage)); 37 38 ASSERT_NO_FATAL_FAILURE(GetOriginUsage(usageNow)); 39 ASSERT_NO_FATAL_FAILURE(CheckUsageEqualTo(usageNow, initialDbUsage)); 40 41 // Create a new empty file 42 EntryId testFileId; 43 ASSERT_NO_FATAL_FAILURE(CreateNewEmptyFile(testFileId)); 44 45 // After a new file has been created (only in the database), 46 // * database usage has increased 47 // * GetDatabaseUsage and GetOriginUsage should agree 48 const auto increasedDbUsage = initialDbUsage + 2 * GetPageSize(); 49 50 ASSERT_NO_FATAL_FAILURE(GetDatabaseUsage(usageNow)); 51 ASSERT_NO_FATAL_FAILURE(CheckUsageEqualTo(usageNow, increasedDbUsage)); 52 53 ASSERT_NO_FATAL_FAILURE(GetOriginUsage(usageNow)); 54 ASSERT_NO_FATAL_FAILURE(CheckUsageEqualTo(usageNow, increasedDbUsage)); 55 } 56 57 TEST_F(TestFileSystemUsageTracking, WritesToFilesShouldIncreaseUsage) { 58 // Initialize database 59 ASSERT_NO_FATAL_FAILURE(EnsureDataManager()); 60 61 // Create a new empty file 62 EntryId testFileId; 63 ASSERT_NO_FATAL_FAILURE(CreateNewEmptyFile(testFileId)); 64 65 quota::UsageInfo usageNow; 66 ASSERT_NO_FATAL_FAILURE(GetDatabaseUsage(usageNow)); 67 ASSERT_NO_FATAL_FAILURE(CheckUsageGreaterThan(usageNow, 0u)); 68 69 uint64_t initialDbUsage; 70 ASSERT_NO_FATAL_FAILURE(GetUsageValue(usageNow, initialDbUsage)); 71 72 ASSERT_NO_FATAL_FAILURE(GetOriginUsage(usageNow)); 73 ASSERT_NO_FATAL_FAILURE(CheckUsageEqualTo(usageNow, initialDbUsage)); 74 75 // Fill the file with some content 76 ASSERT_NO_FATAL_FAILURE(LockExclusive(testFileId)); 77 78 const nsCString& testData = GetTestData(); 79 80 ASSERT_NO_FATAL_FAILURE(WriteDataToFile(testFileId, testData)); 81 82 // After the content has been written to the file, 83 // * database usage is the same (the usage is updated later during file 84 // unlocking) 85 // * origin usage has increased 86 ASSERT_NO_FATAL_FAILURE(GetDatabaseUsage(usageNow)); 87 ASSERT_NO_FATAL_FAILURE(CheckUsageEqualTo(usageNow, initialDbUsage)); 88 89 const auto increasedDbUsage = initialDbUsage + testData.Length(); 90 91 ASSERT_NO_FATAL_FAILURE(GetOriginUsage(usageNow)); 92 ASSERT_NO_FATAL_FAILURE(CheckUsageEqualTo(usageNow, increasedDbUsage)); 93 94 ASSERT_NO_FATAL_FAILURE(UnlockExclusive(testFileId)); 95 96 // After the file has been unlocked, 97 // * database usage has increased 98 // * GetDatabaseUsage and GetOriginUsage should now agree 99 ASSERT_NO_FATAL_FAILURE(GetDatabaseUsage(usageNow)); 100 ASSERT_NO_FATAL_FAILURE(CheckUsageEqualTo(usageNow, increasedDbUsage)); 101 102 ASSERT_NO_FATAL_FAILURE(GetOriginUsage(usageNow)); 103 ASSERT_NO_FATAL_FAILURE(CheckUsageEqualTo(usageNow, increasedDbUsage)); 104 } 105 106 TEST_F(TestFileSystemUsageTracking, RemovingFileShouldDecreaseUsage) { 107 // Initialize database 108 ASSERT_NO_FATAL_FAILURE(EnsureDataManager()); 109 110 // Create a new empty file 111 EntryId testFileId; 112 ASSERT_NO_FATAL_FAILURE(CreateNewEmptyFile(testFileId)); 113 114 quota::UsageInfo usageNow; 115 ASSERT_NO_FATAL_FAILURE(GetDatabaseUsage(usageNow)); 116 ASSERT_NO_FATAL_FAILURE(CheckUsageGreaterThan(usageNow, 0u)); 117 118 uint64_t initialDbUsage; 119 ASSERT_NO_FATAL_FAILURE(GetUsageValue(usageNow, initialDbUsage)); 120 121 ASSERT_NO_FATAL_FAILURE(GetOriginUsage(usageNow)); 122 ASSERT_NO_FATAL_FAILURE(CheckUsageEqualTo(usageNow, initialDbUsage)); 123 124 // Fill the file with some content 125 ASSERT_NO_FATAL_FAILURE(LockExclusive(testFileId)); 126 127 const nsCString& testData = GetTestData(); 128 129 ASSERT_NO_FATAL_FAILURE(WriteDataToFile(testFileId, testData)); 130 131 ASSERT_NO_FATAL_FAILURE(UnlockExclusive(testFileId)); 132 133 // After the file has been unlocked, 134 // * database usage has increased 135 // * GetDatabaseUsage and GetOriginUsage should now agree 136 const auto increasedDbUsage = initialDbUsage + testData.Length(); 137 138 ASSERT_NO_FATAL_FAILURE(GetDatabaseUsage(usageNow)); 139 ASSERT_NO_FATAL_FAILURE(CheckUsageEqualTo(usageNow, increasedDbUsage)); 140 141 ASSERT_NO_FATAL_FAILURE(GetOriginUsage(usageNow)); 142 ASSERT_NO_FATAL_FAILURE(CheckUsageEqualTo(usageNow, increasedDbUsage)); 143 144 // Remove the file 145 bool wasRemoved; 146 ASSERT_NO_FATAL_FAILURE(RemoveFile(wasRemoved)); 147 ASSERT_TRUE(wasRemoved); 148 149 // After the file has been removed, 150 // * database usage has decreased (to the initial value) 151 // * GetDatabaseUsage and GetOriginUsage should agree 152 ASSERT_NO_FATAL_FAILURE(GetDatabaseUsage(usageNow)); 153 ASSERT_NO_FATAL_FAILURE(CheckUsageEqualTo(usageNow, initialDbUsage)); 154 155 ASSERT_NO_FATAL_FAILURE(GetOriginUsage(usageNow)); 156 ASSERT_NO_FATAL_FAILURE(CheckUsageEqualTo(usageNow, initialDbUsage)); 157 } 158 159 } // namespace mozilla::dom::fs::test