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  }