gitlab.com/SkynetLabs/skyd@v1.6.9/skymodules/renter/filesystem/siadir/siadir_test.go (about) 1 package siadir 2 3 import ( 4 "os" 5 "path/filepath" 6 "testing" 7 8 "gitlab.com/NebulousLabs/errors" 9 "gitlab.com/SkynetLabs/skyd/skymodules" 10 "go.sia.tech/siad/modules" 11 "go.sia.tech/siad/persist" 12 ) 13 14 // TestSiaDir probes the SiaDir subsystem 15 func TestSiaDir(t *testing.T) { 16 if testing.Short() { 17 t.SkipNow() 18 } 19 t.Parallel() 20 21 t.Run("Basic", testSiaDirBasic) 22 t.Run("Delete", testSiaDirDelete) 23 t.Run("UpdatedMetadata", testUpdateMetadata) 24 } 25 26 // testSiaDirBasic tests the basic functionality of the siadir 27 func testSiaDirBasic(t *testing.T) { 28 // Initialize the test directory 29 testDir, err := newSiaDirTestDir(t.Name()) 30 if err != nil { 31 t.Fatal(err) 32 } 33 34 // Create New SiaDir that is two levels deep 35 topDir := filepath.Join(testDir, "TestDir") 36 subDir := "SubDir" 37 path := filepath.Join(topDir, subDir) 38 siaDir, err := New(path, testDir, persist.DefaultDiskPermissionsTest) 39 if err != nil { 40 t.Fatal(err) 41 } 42 43 // Check Sub Dir 44 // 45 // Check that the metadata was initialized properly 46 md := siaDir.metadata 47 if err = VerifyMetadataInit(md); err != nil { 48 t.Fatal(err) 49 } 50 // Check that the directory and .siadir file were created on disk 51 _, err = os.Stat(path) 52 if err != nil { 53 t.Fatal(err) 54 } 55 _, err = os.Stat(filepath.Join(path, skymodules.SiaDirExtension)) 56 if err != nil { 57 t.Fatal(err) 58 } 59 60 // Check Top Directory 61 // 62 // Check that the directory and .siadir file were created on disk 63 _, err = os.Stat(topDir) 64 if err != nil { 65 t.Fatal(err) 66 } 67 _, err = os.Stat(filepath.Join(topDir, skymodules.SiaDirExtension)) 68 if err != nil { 69 t.Fatal(err) 70 } 71 // Get SiaDir 72 topSiaDir, err := LoadSiaDir(topDir, modules.ProdDependencies) 73 if err != nil { 74 t.Fatal(err) 75 } 76 // Check that the metadata was initialized properly 77 md = topSiaDir.metadata 78 if err = VerifyMetadataInit(md); err != nil { 79 t.Fatal(err) 80 } 81 82 // Check Root Directory 83 // 84 // Get SiaDir 85 rootSiaDir, err := LoadSiaDir(testDir, modules.ProdDependencies) 86 if err != nil { 87 t.Fatal(err) 88 } 89 // Check that the metadata was initialized properly 90 md = rootSiaDir.metadata 91 if err = VerifyMetadataInit(md); err != nil { 92 t.Fatal(err) 93 } 94 95 // Check that the directory and the .siadir file were created on disk 96 _, err = os.Stat(testDir) 97 if err != nil { 98 t.Fatal(err) 99 } 100 _, err = os.Stat(filepath.Join(testDir, skymodules.SiaDirExtension)) 101 if err != nil { 102 t.Fatal(err) 103 } 104 } 105 106 // testSiaDirDelete verifies the SiaDir performs as expected after a delete 107 func testSiaDirDelete(t *testing.T) { 108 // Create new siaDir 109 rootDir, err := newRootDir(t) 110 if err != nil { 111 t.Fatal(err) 112 } 113 siaPath, err := modules.NewSiaPath("deleteddir") 114 if err != nil { 115 t.Fatal(err) 116 } 117 siaDirSysPath := siaPath.SiaDirSysPath(rootDir) 118 siaDir, err := New(siaDirSysPath, rootDir, modules.DefaultDirPerm) 119 if err != nil { 120 t.Fatal(err) 121 } 122 123 // Delete the siadir and keep siadir in memory 124 err = siaDir.Delete() 125 if err != nil { 126 t.Fatal(err) 127 } 128 129 // Path should be gone 130 _, err = os.Stat(siaDir.path) 131 if !os.IsNotExist(err) { 132 t.Error("unexpected error", err) 133 } 134 135 // Verify functions either return or error accordingly 136 // 137 // First set should not error or panic 138 if !siaDir.Deleted() { 139 t.Error("SiaDir metadata should reflect the deletion") 140 } 141 _ = siaDir.MDPath() 142 _ = siaDir.Metadata() 143 _ = siaDir.Path() 144 145 // Second Set should return an error 146 err = siaDir.Rename("") 147 if !errors.Contains(err, ErrDeleted) { 148 t.Error("Rename should return with and error for SiaDir deleted") 149 } 150 err = siaDir.SetPath("") 151 if !errors.Contains(err, ErrDeleted) { 152 t.Error("SetPath should return with and error for SiaDir deleted") 153 } 154 _, err = siaDir.DirReader() 155 if !errors.Contains(err, ErrDeleted) { 156 t.Error("DirReader should return with and error for SiaDir deleted") 157 } 158 siaDir.mu.Lock() 159 err = siaDir.updateMetadata(Metadata{}) 160 if !errors.Contains(err, ErrDeleted) { 161 t.Error("updateMetadata should return with and error for SiaDir deleted") 162 } 163 siaDir.mu.Unlock() 164 } 165 166 // testUpdateMetadata probes the UpdateMetadata methods 167 func testUpdateMetadata(t *testing.T) { 168 // Create new siaDir 169 rootDir, err := newRootDir(t) 170 if err != nil { 171 t.Fatal(err) 172 } 173 siaPath, err := skymodules.NewSiaPath("TestDir") 174 if err != nil { 175 t.Fatal(err) 176 } 177 siaDirSysPath := siaPath.SiaDirSysPath(rootDir) 178 siaDir, err := New(siaDirSysPath, rootDir, modules.DefaultDirPerm) 179 if err != nil { 180 t.Fatal(err) 181 } 182 183 // Check metadata was initialized properly in memory and on disk 184 md := siaDir.metadata 185 if err = VerifyMetadataInit(md); err != nil { 186 t.Fatal(err) 187 } 188 siaDir, err = LoadSiaDir(siaDirSysPath, modules.ProdDependencies) 189 if err != nil { 190 t.Fatal(err) 191 } 192 md = siaDir.metadata 193 if err = VerifyMetadataInit(md); err != nil { 194 t.Fatal(err) 195 } 196 197 // Set the metadata 198 metadataUpdate := randomMetadata() 199 200 err = siaDir.UpdateMetadata(metadataUpdate) 201 if err != nil { 202 t.Fatal(err) 203 } 204 205 // Check that the metadata was updated properly in memory and on disk 206 md = siaDir.metadata 207 err = EqualMetadatas(md, metadataUpdate) 208 if err != nil { 209 t.Fatal(err) 210 } 211 siaDir, err = LoadSiaDir(siaDirSysPath, modules.ProdDependencies) 212 if err != nil { 213 t.Fatal(err) 214 } 215 md = siaDir.metadata 216 // Check Time separately due to how the time is persisted 217 if !md.AggregateLastHealthCheckTime.Equal(metadataUpdate.AggregateLastHealthCheckTime) { 218 t.Fatalf("AggregateLastHealthCheckTimes not equal, got %v expected %v", md.AggregateLastHealthCheckTime, metadataUpdate.AggregateLastHealthCheckTime) 219 } 220 metadataUpdate.AggregateLastHealthCheckTime = md.AggregateLastHealthCheckTime 221 if !md.LastHealthCheckTime.Equal(metadataUpdate.LastHealthCheckTime) { 222 t.Fatalf("LastHealthCheckTimes not equal, got %v expected %v", md.LastHealthCheckTime, metadataUpdate.LastHealthCheckTime) 223 } 224 metadataUpdate.LastHealthCheckTime = md.LastHealthCheckTime 225 if !md.AggregateModTime.Equal(metadataUpdate.AggregateModTime) { 226 t.Fatalf("AggregateModTimes not equal, got %v expected %v", md.AggregateModTime, metadataUpdate.AggregateModTime) 227 } 228 metadataUpdate.AggregateModTime = md.AggregateModTime 229 if !md.ModTime.Equal(metadataUpdate.ModTime) { 230 t.Fatalf("ModTimes not equal, got %v expected %v", md.ModTime, metadataUpdate.ModTime) 231 } 232 metadataUpdate.ModTime = md.ModTime 233 // Check the rest of the metadata 234 err = EqualMetadatas(md, metadataUpdate) 235 if err != nil { 236 t.Fatal(err) 237 } 238 239 // TODO Add checks for other update metadata methods 240 }