github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/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 "github.com/juju/names/v5" 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: 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 fakeMountInfo ...string, 44 ) (storage.FilesystemSource, *MockDirFuncs) { 45 rdr := strings.NewReader(strings.Join(fakeMountInfo, "\n")) 46 dirFuncs := &MockDirFuncs{ 47 osDirFuncs{run: run, mountInfoRdr: rdr}, 48 etcDir, 49 set.NewStrings(), 50 } 51 return &managedFilesystemSource{ 52 run, dirFuncs, 53 volumeBlockDevices, filesystems, 54 }, dirFuncs 55 } 56 57 var _ dirFuncs = (*MockDirFuncs)(nil) 58 59 // MockDirFuncs stub out the real mkdir and lstat functions from stdlib. 60 type MockDirFuncs struct { 61 osDirFuncs 62 fakeEtcDir string 63 Dirs set.Strings 64 } 65 66 func (m *MockDirFuncs) etcDir() string { 67 return m.fakeEtcDir 68 } 69 70 func (m *MockDirFuncs) mkDirAll(path string, perm os.FileMode) error { 71 m.Dirs.Add(path) 72 return nil 73 } 74 75 type MockFileInfo struct { 76 isDir bool 77 } 78 79 func (m *MockFileInfo) IsDir() bool { 80 return m.isDir 81 } 82 83 func (m *MockFileInfo) Name() string { 84 return "" 85 } 86 87 func (m *MockFileInfo) Size() int64 { 88 return 0 89 } 90 91 func (m *MockFileInfo) Mode() os.FileMode { 92 return 0 93 } 94 95 func (m *MockFileInfo) ModTime() time.Time { 96 return time.Now() 97 } 98 func (m *MockFileInfo) Sys() interface{} { 99 return nil 100 } 101 102 func (m *MockDirFuncs) lstat(name string) (os.FileInfo, error) { 103 if name == "file" || name == "exists" || m.Dirs.Contains(name) { 104 return &MockFileInfo{name != "file"}, nil 105 } 106 return nil, os.ErrNotExist 107 } 108 109 func (m *MockDirFuncs) fileCount(name string) (int, error) { 110 if strings.HasSuffix(name, "/666") { 111 return 2, nil 112 } 113 return 0, nil 114 } 115 116 func RootfsFilesystemSource(etcDir, storageDir string, run func(string, ...string) (string, error), fakeMountInfo ...string) (storage.FilesystemSource, *MockDirFuncs) { 117 rdr := strings.NewReader(strings.Join(fakeMountInfo, "\n")) 118 d := &MockDirFuncs{ 119 osDirFuncs{run: run, mountInfoRdr: rdr}, 120 etcDir, 121 set.NewStrings(), 122 } 123 return &rootfsFilesystemSource{d, run, storageDir}, d 124 } 125 126 func RootfsProvider(run func(string, ...string) (string, error)) storage.Provider { 127 return &rootfsProvider{run} 128 } 129 130 func TmpfsFilesystemSource(etcDir, storageDir string, run func(string, ...string) (string, error), fakeMountInfo ...string) storage.FilesystemSource { 131 rdr := strings.NewReader(strings.Join(fakeMountInfo, "\n")) 132 return &tmpfsFilesystemSource{ 133 &MockDirFuncs{ 134 osDirFuncs{run: run, mountInfoRdr: rdr}, 135 etcDir, 136 set.NewStrings(), 137 }, 138 run, 139 storageDir, 140 } 141 } 142 143 func TmpfsProvider(run func(string, ...string) (string, error)) storage.Provider { 144 return &tmpfsProvider{run} 145 }