-
Notifications
You must be signed in to change notification settings - Fork 5.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix filecount plugin size tests (#6038)
- Loading branch information
1 parent
aa84011
commit bd9ddd8
Showing
4 changed files
with
236 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
package filecount | ||
|
||
import ( | ||
"errors" | ||
"io" | ||
"os" | ||
"time" | ||
) | ||
|
||
/* | ||
The code below is lifted from numerous articles and originates from Andrew Gerrand's 10 things you (probably) don't know about Go. | ||
it allows for mocking a filesystem; this allows for consistent testing of this code across platforms (directory sizes reported | ||
differently by different platforms, for example), while preserving the rest of the functionality as-is, without modification. | ||
*/ | ||
|
||
type fileSystem interface { | ||
Open(name string) (file, error) | ||
Stat(name string) (os.FileInfo, error) | ||
} | ||
|
||
type file interface { | ||
io.Closer | ||
io.Reader | ||
io.ReaderAt | ||
io.Seeker | ||
Stat() (os.FileInfo, error) | ||
} | ||
|
||
// osFS implements fileSystem using the local disk | ||
type osFS struct{} | ||
|
||
func (osFS) Open(name string) (file, error) { return os.Open(name) } | ||
func (osFS) Stat(name string) (os.FileInfo, error) { return os.Stat(name) } | ||
|
||
/* | ||
The following are for mocking the filesystem - this allows us to mock Stat() files. This means that we can set file attributes, and know that they | ||
will be the same regardless of the platform sitting underneath our tests (directory sizes vary see https://github.com/influxdata/telegraf/issues/6011) | ||
NOTE: still need the on-disk file structure to mirror this because the 3rd party library ("github.com/karrick/godirwalk") uses its own | ||
walk functions, that we cannot mock from here. | ||
*/ | ||
|
||
type fakeFileSystem struct { | ||
files map[string]fakeFileInfo | ||
} | ||
|
||
type fakeFileInfo struct { | ||
name string | ||
size int64 | ||
filemode uint32 | ||
modtime time.Time | ||
isdir bool | ||
sys interface{} | ||
} | ||
|
||
func (f fakeFileInfo) Name() string { return f.name } | ||
func (f fakeFileInfo) Size() int64 { return f.size } | ||
func (f fakeFileInfo) Mode() os.FileMode { return os.FileMode(f.filemode) } | ||
func (f fakeFileInfo) ModTime() time.Time { return f.modtime } | ||
func (f fakeFileInfo) IsDir() bool { return f.isdir } | ||
func (f fakeFileInfo) Sys() interface{} { return f.sys } | ||
|
||
func (f fakeFileSystem) Open(name string) (file, error) { | ||
return nil, &os.PathError{Op: "Open", Path: name, Err: errors.New("Not implemented by fake filesystem")} | ||
} | ||
|
||
func (f fakeFileSystem) Stat(name string) (os.FileInfo, error) { | ||
if fakeInfo, found := f.files[name]; found { | ||
return fakeInfo, nil | ||
} | ||
return nil, &os.PathError{Op: "Stat", Path: name, Err: errors.New("No such file or directory")} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
package filecount | ||
|
||
import ( | ||
"testing" | ||
"time" | ||
|
||
"github.com/stretchr/testify/require" | ||
) | ||
|
||
func TestMTime(t *testing.T) { | ||
//this is the time our foo file should have | ||
mtime := time.Date(2015, time.December, 14, 18, 25, 5, 0, time.UTC) | ||
|
||
fs := getTestFileSystem() | ||
fileInfo, err := fs.Stat("/testdata/foo") | ||
require.Nil(t, err) | ||
require.Equal(t, mtime, fileInfo.ModTime()) | ||
} | ||
|
||
func TestSize(t *testing.T) { | ||
//this is the time our foo file should have | ||
size := int64(4096) | ||
fs := getTestFileSystem() | ||
fileInfo, err := fs.Stat("/testdata") | ||
require.Nil(t, err) | ||
require.Equal(t, size, fileInfo.Size()) | ||
} | ||
|
||
func TestIsDir(t *testing.T) { | ||
//this is the time our foo file should have | ||
dir := true | ||
fs := getTestFileSystem() | ||
fileInfo, err := fs.Stat("/testdata") | ||
require.Nil(t, err) | ||
require.Equal(t, dir, fileInfo.IsDir()) | ||
} | ||
|
||
func TestRealFS(t *testing.T) { | ||
//test that the default (non-test) empty FS causes expected behaviour | ||
var fs fileSystem = osFS{} | ||
//the following file exists on disk - and not in our fake fs | ||
fileInfo, err := fs.Stat(getTestdataDir() + "/qux") | ||
require.Nil(t, err) | ||
require.Equal(t, false, fileInfo.IsDir()) | ||
require.Equal(t, int64(446), fileInfo.Size()) | ||
|
||
// now swap out real, for fake filesystem | ||
fs = getTestFileSystem() | ||
// now, the same test as above will return an error as the file doesn't exist in our fake fs | ||
expectedError := "Stat " + getTestdataDir() + "/qux: No such file or directory" | ||
fileInfo, err = fs.Stat(getTestdataDir() + "/qux") | ||
require.Equal(t, expectedError, err.Error()) | ||
// and verify that what we DO expect to find, we do | ||
fileInfo, err = fs.Stat("/testdata/foo") | ||
require.Nil(t, err) | ||
} | ||
|
||
func getTestFileSystem() fakeFileSystem { | ||
/* | ||
create our desired "filesystem" object, complete with an internal map allowing our funcs to return meta data as requested | ||
type FileInfo interface { | ||
Name() string // base name of the file | ||
Size() int64 // length in bytes of file | ||
Mode() FileMode // file mode bits | ||
ModTime() time.Time // modification time | ||
IsDir() bool // returns bool indicating if a Dir or not | ||
Sys() interface{} // underlying data source. always nil (in this case) | ||
} | ||
*/ | ||
|
||
mtime := time.Date(2015, time.December, 14, 18, 25, 5, 0, time.UTC) | ||
|
||
// set file permisions | ||
var fmask uint32 = 0666 | ||
var dmask uint32 = 0666 | ||
|
||
// set directory bit | ||
dmask |= (1 << uint(32-1)) | ||
|
||
fileList := map[string]fakeFileInfo{ | ||
"/testdata": {name: "testdata", size: int64(4096), filemode: uint32(dmask), modtime: mtime, isdir: true}, | ||
"/testdata/foo": {name: "foo", filemode: uint32(fmask), modtime: mtime}, | ||
} | ||
|
||
fs := fakeFileSystem{files: fileList} | ||
return fs | ||
|
||
} |