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  }