Code maintenance: OS package for file system

- OS custom internal package for file system interaction
- Remove fileManager external dependency
- Closer API to Go's native API on the OS
- Create directories at startup
- Better testability
- Move Unsetenv to os interface
This commit is contained in:
Quentin McGaw
2020-12-29 00:55:31 +00:00
parent f5366c33bc
commit 73479bab26
43 changed files with 923 additions and 353 deletions

9
internal/os/alias.go Normal file
View File

@@ -0,0 +1,9 @@
package os
import nativeos "os"
// Aliases used for convenience so "os" does not have to be imported
type FileMode nativeos.FileMode
var IsNotExist = nativeos.IsNotExist

16
internal/os/constants.go Normal file
View File

@@ -0,0 +1,16 @@
package os
import (
nativeos "os"
)
// Constants used for convenience so "os" does not have to be imported
//nolint:golint
const (
O_CREATE = nativeos.O_CREATE
O_TRUNC = nativeos.O_TRUNC
O_WRONLY = nativeos.O_WRONLY
O_RDONLY = nativeos.O_RDONLY
O_RDWR = nativeos.O_RDWR
)

15
internal/os/file.go Normal file
View File

@@ -0,0 +1,15 @@
package os
import (
"io"
nativeos "os"
)
//go:generate mockgen -destination=mock_$GOPACKAGE/$GOFILE . File
type File interface {
io.ReadWriteCloser
WriteString(s string) (int, error)
Chown(uid, gid int) error
Chmod(mode nativeos.FileMode) error
}

10
internal/os/funcs.go Normal file
View File

@@ -0,0 +1,10 @@
package os
import (
nativeos "os"
)
type OpenFileFunc func(name string, flag int, perm FileMode) (File, error)
type MkdirAllFunc func(name string, perm nativeos.FileMode) error
type RemoveFunc func(name string) error
type ChownFunc func(name string, uid int, gid int) error

121
internal/os/mock_os/file.go Normal file
View File

@@ -0,0 +1,121 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: github.com/qdm12/gluetun/internal/os (interfaces: File)
// Package mock_os is a generated GoMock package.
package mock_os
import (
gomock "github.com/golang/mock/gomock"
os "os"
reflect "reflect"
)
// MockFile is a mock of File interface
type MockFile struct {
ctrl *gomock.Controller
recorder *MockFileMockRecorder
}
// MockFileMockRecorder is the mock recorder for MockFile
type MockFileMockRecorder struct {
mock *MockFile
}
// NewMockFile creates a new mock instance
func NewMockFile(ctrl *gomock.Controller) *MockFile {
mock := &MockFile{ctrl: ctrl}
mock.recorder = &MockFileMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use
func (m *MockFile) EXPECT() *MockFileMockRecorder {
return m.recorder
}
// Chmod mocks base method
func (m *MockFile) Chmod(arg0 os.FileMode) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Chmod", arg0)
ret0, _ := ret[0].(error)
return ret0
}
// Chmod indicates an expected call of Chmod
func (mr *MockFileMockRecorder) Chmod(arg0 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Chmod", reflect.TypeOf((*MockFile)(nil).Chmod), arg0)
}
// Chown mocks base method
func (m *MockFile) Chown(arg0, arg1 int) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Chown", arg0, arg1)
ret0, _ := ret[0].(error)
return ret0
}
// Chown indicates an expected call of Chown
func (mr *MockFileMockRecorder) Chown(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Chown", reflect.TypeOf((*MockFile)(nil).Chown), arg0, arg1)
}
// Close mocks base method
func (m *MockFile) Close() error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Close")
ret0, _ := ret[0].(error)
return ret0
}
// Close indicates an expected call of Close
func (mr *MockFileMockRecorder) Close() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockFile)(nil).Close))
}
// Read mocks base method
func (m *MockFile) Read(arg0 []byte) (int, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Read", arg0)
ret0, _ := ret[0].(int)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// Read indicates an expected call of Read
func (mr *MockFileMockRecorder) Read(arg0 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Read", reflect.TypeOf((*MockFile)(nil).Read), arg0)
}
// Write mocks base method
func (m *MockFile) Write(arg0 []byte) (int, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Write", arg0)
ret0, _ := ret[0].(int)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// Write indicates an expected call of Write
func (mr *MockFileMockRecorder) Write(arg0 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Write", reflect.TypeOf((*MockFile)(nil).Write), arg0)
}
// WriteString mocks base method
func (m *MockFile) WriteString(arg0 string) (int, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "WriteString", arg0)
ret0, _ := ret[0].(int)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// WriteString indicates an expected call of WriteString
func (mr *MockFileMockRecorder) WriteString(arg0 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteString", reflect.TypeOf((*MockFile)(nil).WriteString), arg0)
}

121
internal/os/mock_os/os.go Normal file
View File

@@ -0,0 +1,121 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: github.com/qdm12/gluetun/internal/os (interfaces: OS)
// Package mock_os is a generated GoMock package.
package mock_os
import (
gomock "github.com/golang/mock/gomock"
os "github.com/qdm12/gluetun/internal/os"
os0 "os"
reflect "reflect"
)
// MockOS is a mock of OS interface
type MockOS struct {
ctrl *gomock.Controller
recorder *MockOSMockRecorder
}
// MockOSMockRecorder is the mock recorder for MockOS
type MockOSMockRecorder struct {
mock *MockOS
}
// NewMockOS creates a new mock instance
func NewMockOS(ctrl *gomock.Controller) *MockOS {
mock := &MockOS{ctrl: ctrl}
mock.recorder = &MockOSMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use
func (m *MockOS) EXPECT() *MockOSMockRecorder {
return m.recorder
}
// Chown mocks base method
func (m *MockOS) Chown(arg0 string, arg1, arg2 int) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Chown", arg0, arg1, arg2)
ret0, _ := ret[0].(error)
return ret0
}
// Chown indicates an expected call of Chown
func (mr *MockOSMockRecorder) Chown(arg0, arg1, arg2 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Chown", reflect.TypeOf((*MockOS)(nil).Chown), arg0, arg1, arg2)
}
// MkdirAll mocks base method
func (m *MockOS) MkdirAll(arg0 string, arg1 os.FileMode) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "MkdirAll", arg0, arg1)
ret0, _ := ret[0].(error)
return ret0
}
// MkdirAll indicates an expected call of MkdirAll
func (mr *MockOSMockRecorder) MkdirAll(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MkdirAll", reflect.TypeOf((*MockOS)(nil).MkdirAll), arg0, arg1)
}
// OpenFile mocks base method
func (m *MockOS) OpenFile(arg0 string, arg1 int, arg2 os.FileMode) (os.File, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "OpenFile", arg0, arg1, arg2)
ret0, _ := ret[0].(os.File)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// OpenFile indicates an expected call of OpenFile
func (mr *MockOSMockRecorder) OpenFile(arg0, arg1, arg2 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OpenFile", reflect.TypeOf((*MockOS)(nil).OpenFile), arg0, arg1, arg2)
}
// Remove mocks base method
func (m *MockOS) Remove(arg0 string) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Remove", arg0)
ret0, _ := ret[0].(error)
return ret0
}
// Remove indicates an expected call of Remove
func (mr *MockOSMockRecorder) Remove(arg0 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Remove", reflect.TypeOf((*MockOS)(nil).Remove), arg0)
}
// Stat mocks base method
func (m *MockOS) Stat(arg0 string) (os0.FileInfo, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Stat", arg0)
ret0, _ := ret[0].(os0.FileInfo)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// Stat indicates an expected call of Stat
func (mr *MockOSMockRecorder) Stat(arg0 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stat", reflect.TypeOf((*MockOS)(nil).Stat), arg0)
}
// Unsetenv mocks base method
func (m *MockOS) Unsetenv(arg0 string) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Unsetenv", arg0)
ret0, _ := ret[0].(error)
return ret0
}
// Unsetenv indicates an expected call of Unsetenv
func (mr *MockOSMockRecorder) Unsetenv(arg0 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Unsetenv", reflect.TypeOf((*MockOS)(nil).Unsetenv), arg0)
}

39
internal/os/os.go Normal file
View File

@@ -0,0 +1,39 @@
package os
import nativeos "os"
//go:generate mockgen -destination=mock_$GOPACKAGE/$GOFILE . OS
type OS interface {
OpenFile(name string, flag int, perm FileMode) (File, error)
MkdirAll(name string, perm FileMode) error
Remove(name string) error
Chown(name string, uid int, gid int) error
Unsetenv(key string) error
Stat(name string) (nativeos.FileInfo, error)
}
func New() OS {
return &os{}
}
type os struct{}
func (o *os) OpenFile(name string, flag int, perm FileMode) (File, error) {
return nativeos.OpenFile(name, flag, nativeos.FileMode(perm))
}
func (o *os) MkdirAll(name string, perm FileMode) error {
return nativeos.MkdirAll(name, nativeos.FileMode(perm))
}
func (o *os) Remove(name string) error {
return nativeos.Remove(name)
}
func (o *os) Chown(name string, uid, gid int) error {
return nativeos.Chown(name, uid, gid)
}
func (o *os) Unsetenv(key string) error {
return nativeos.Unsetenv(key)
}
func (o *os) Stat(name string) (nativeos.FileInfo, error) {
return nativeos.Stat(name)
}