github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/storage/provider/export_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package provider 5 6 import ( 7 "os" 8 "strings" 9 "time" 10 11 "github.com/juju/collections/set" 12 "gopkg.in/juju/names.v2" 13 14 "github.com/juju/juju/storage" 15 ) 16 17 var Getpagesize = &getpagesize 18 19 func LoopVolumeSource( 20 etcDir string, 21 storageDir string, 22 run func(string, ...string) (string, error), 23 ) (storage.VolumeSource, *MockDirFuncs) { 24 dirFuncs := &MockDirFuncs{ 25 osDirFuncs{run}, 26 etcDir, 27 set.NewStrings(), 28 } 29 return &loopVolumeSource{dirFuncs, run, storageDir}, dirFuncs 30 } 31 32 func LoopProvider( 33 run func(string, ...string) (string, error), 34 ) storage.Provider { 35 return &loopProvider{run} 36 } 37 38 func NewMockManagedFilesystemSource( 39 etcDir string, 40 run func(string, ...string) (string, error), 41 volumeBlockDevices map[names.VolumeTag]storage.BlockDevice, 42 filesystems map[names.FilesystemTag]storage.Filesystem, 43 ) (storage.FilesystemSource, *MockDirFuncs) { 44 dirFuncs := &MockDirFuncs{ 45 osDirFuncs{run}, 46 etcDir, 47 set.NewStrings(), 48 } 49 return &managedFilesystemSource{ 50 run, dirFuncs, 51 volumeBlockDevices, filesystems, 52 }, dirFuncs 53 } 54 55 var _ dirFuncs = (*MockDirFuncs)(nil) 56 57 // MockDirFuncs stub out the real mkdir and lstat functions from stdlib. 58 type MockDirFuncs struct { 59 osDirFuncs 60 fakeEtcDir string 61 Dirs set.Strings 62 } 63 64 func (m *MockDirFuncs) etcDir() string { 65 return m.fakeEtcDir 66 } 67 68 func (m *MockDirFuncs) mkDirAll(path string, perm os.FileMode) error { 69 m.Dirs.Add(path) 70 return nil 71 } 72 73 type MockFileInfo struct { 74 isDir bool 75 } 76 77 func (m *MockFileInfo) IsDir() bool { 78 return m.isDir 79 } 80 81 func (m *MockFileInfo) Name() string { 82 return "" 83 } 84 85 func (m *MockFileInfo) Size() int64 { 86 return 0 87 } 88 89 func (m *MockFileInfo) Mode() os.FileMode { 90 return 0 91 } 92 93 func (m *MockFileInfo) ModTime() time.Time { 94 return time.Now() 95 } 96 func (m *MockFileInfo) Sys() interface{} { 97 return nil 98 } 99 100 func (m *MockDirFuncs) lstat(name string) (os.FileInfo, error) { 101 if name == "file" || name == "exists" || m.Dirs.Contains(name) { 102 return &MockFileInfo{name != "file"}, nil 103 } 104 return nil, os.ErrNotExist 105 } 106 107 func (m *MockDirFuncs) fileCount(name string) (int, error) { 108 if strings.HasSuffix(name, "/666") { 109 return 2, nil 110 } 111 return 0, nil 112 } 113 114 func RootfsFilesystemSource(etcDir, storageDir string, run func(string, ...string) (string, error)) (storage.FilesystemSource, *MockDirFuncs) { 115 d := &MockDirFuncs{ 116 osDirFuncs{run}, 117 etcDir, 118 set.NewStrings(), 119 } 120 return &rootfsFilesystemSource{d, run, storageDir}, d 121 } 122 123 func RootfsProvider(run func(string, ...string) (string, error)) storage.Provider { 124 return &rootfsProvider{run} 125 } 126 127 func TmpfsFilesystemSource(etcDir, storageDir string, run func(string, ...string) (string, error)) storage.FilesystemSource { 128 return &tmpfsFilesystemSource{ 129 &MockDirFuncs{ 130 osDirFuncs{run}, 131 etcDir, 132 set.NewStrings(), 133 }, 134 run, 135 storageDir, 136 } 137 } 138 139 func TmpfsProvider(run func(string, ...string) (string, error)) storage.Provider { 140 return &tmpfsProvider{run} 141 }