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  }