github.com/johnathanhowell/sia@v0.5.1-beta.0.20160524050156-83dcc3d37c94/modules/host/storagemanager/storagefolders_errors_test.go (about)

     1  package storagemanager
     2  
     3  import (
     4  	"errors"
     5  	"path/filepath"
     6  	"testing"
     7  
     8  	"github.com/NebulousLabs/Sia/modules"
     9  )
    10  
    11  // TestClosedStorageManagerOperations tries a bunch of operations on the storage manager
    12  // after it has been closed.
    13  func TestClosedStorageManagerOperations(t *testing.T) {
    14  	if testing.Short() {
    15  		t.SkipNow()
    16  	}
    17  	t.Parallel()
    18  	smt, err := newStorageManagerTester("TestClosedStorageManagerOperations")
    19  	if err != nil {
    20  		t.Fatal(err)
    21  	}
    22  	// Close the storage manager.
    23  	err = smt.sm.Close()
    24  	if err != nil {
    25  		t.Fatal(err)
    26  	}
    27  	defer smt.Close()
    28  
    29  	err = smt.sm.AddStorageFolder(filepath.Join(smt.persistDir, modules.StorageManagerDir), minimumStorageFolderSize)
    30  	if err != errStorageManagerClosed {
    31  		t.Fatal("expected errStorageManagerClosed:", err)
    32  	}
    33  	err = smt.sm.RemoveStorageFolder(1, true)
    34  	if err != errStorageManagerClosed {
    35  		t.Fatal("expected errStorageManagerClosed:", err)
    36  	}
    37  	err = smt.sm.ResizeStorageFolder(0, minimumStorageFolderSize)
    38  	if err != errStorageManagerClosed {
    39  		t.Fatal("expected errStorageManagerClosed:", err)
    40  	}
    41  	// Number of storage folders should still be zero.
    42  	if len(smt.sm.storageFolders) != 0 {
    43  		t.Error("storage folder should not have been added to the storage manager as the storage manager is closed.")
    44  	}
    45  }
    46  
    47  // faultyRand is a mocked filesystem which can be configured to fail for certain
    48  // files and folders.
    49  type faultyRand struct {
    50  	productionDependencies
    51  }
    52  
    53  // errMockBadRand is returned when a mocked dependency is intentionally
    54  // returning an error instead of randomly generating data.
    55  var errMockBadRand = errors.New("mocked randomness is intentionally failing")
    56  
    57  // randRead replaces the production dependency crypto/rand.Read with a faulty
    58  // reader - an error is always returned.
    59  func (faultyRand) randRead([]byte) (int, error) {
    60  	return 0, errMockBadRand
    61  }
    62  
    63  // TestAddFolderNoRand tries adding a folder to the storage manager when the
    64  // cryptographic randomness generator is not working.
    65  func TestAddFolderNoRand(t *testing.T) {
    66  	if testing.Short() {
    67  		t.SkipNow()
    68  	}
    69  	t.Parallel()
    70  	smt, err := newStorageManagerTester("TestAddFolderNoRand")
    71  	if err != nil {
    72  		t.Fatal(err)
    73  	}
    74  	defer smt.Close()
    75  
    76  	// Replace the storage manager with one that cannot do randomness
    77  	// operations.
    78  	err = smt.sm.Close()
    79  	if err != nil {
    80  		t.Fatal(err)
    81  	}
    82  	smt.sm, err = newStorageManager(faultyRand{}, filepath.Join(smt.persistDir, modules.StorageManagerDir))
    83  	if err != nil {
    84  		t.Fatal(err)
    85  	}
    86  	err = smt.sm.AddStorageFolder(filepath.Join(smt.persistDir, modules.StorageManagerDir), minimumStorageFolderSize)
    87  	if err != errMockBadRand {
    88  		t.Fatal(err)
    89  	}
    90  	// Number of storage folders should be zero.
    91  	storageFolders := smt.sm.StorageFolders()
    92  	if len(storageFolders) != 0 {
    93  		t.Error("storage folder was added to the storage manager despite a dependency failure")
    94  	}
    95  }