Merge pull request #93 from JulienTant/develop

Add decompress tests
This commit is contained in:
Dane Everitt 2021-06-05 08:46:14 -07:00 committed by GitHub
commit f74a74cd5e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 75 additions and 16 deletions

View File

@ -0,0 +1,55 @@
package filesystem
import (
"io/ioutil"
"sync/atomic"
"testing"
. "github.com/franela/goblin"
)
// Given an archive named test.{ext}, with the following file structure:
// test/
// |──inside/
// |────finside.txt
// |──outside.txt
// this test will ensure that it's being decompressed as expected
func TestFilesystem_DecompressFile(t *testing.T) {
g := Goblin(t)
fs, rfs := NewFs()
g.Describe("Decompress", func() {
for _, ext := range []string{"zip", "rar", "tar", "tar.gz"} {
g.It("can decompress a "+ext, func() {
// copy the file to the new FS
c, err := ioutil.ReadFile("./testdata/test." + ext)
g.Assert(err).IsNil()
err = rfs.CreateServerFile("./test."+ext, c)
g.Assert(err).IsNil()
// decompress
err = fs.DecompressFile("/", "test."+ext)
g.Assert(err).IsNil()
// make sure everything is where it is supposed to be
_, err = rfs.StatServerFile("test/outside.txt")
g.Assert(err).IsNil()
st, err := rfs.StatServerFile("test/inside")
g.Assert(err).IsNil()
g.Assert(st.IsDir()).IsTrue()
_, err = rfs.StatServerFile("test/inside/finside.txt")
g.Assert(err).IsNil()
g.Assert(st.IsDir()).IsTrue()
})
}
g.AfterEach(func() {
rfs.reset()
atomic.StoreInt64(&fs.diskUsed, 0)
atomic.StoreInt64(&fs.diskLimit, 0)
})
})
}

View File

@ -44,17 +44,21 @@ type rootFs struct {
root string root string
} }
func (rfs *rootFs) CreateServerFile(p string, c string) error { func (rfs *rootFs) CreateServerFile(p string, c []byte) error {
f, err := os.Create(filepath.Join(rfs.root, "/server", p)) f, err := os.Create(filepath.Join(rfs.root, "/server", p))
if err == nil { if err == nil {
f.Write([]byte(c)) f.Write(c)
f.Close() f.Close()
} }
return err return err
} }
func (rfs *rootFs) CreateServerFileFromString(p string, c string) error {
return rfs.CreateServerFile(p, []byte(c))
}
func (rfs *rootFs) StatServerFile(p string) (os.FileInfo, error) { func (rfs *rootFs) StatServerFile(p string) (os.FileInfo, error) {
return os.Stat(filepath.Join(rfs.root, "/server", p)) return os.Stat(filepath.Join(rfs.root, "/server", p))
} }
@ -79,7 +83,7 @@ func TestFilesystem_Readfile(t *testing.T) {
buf := &bytes.Buffer{} buf := &bytes.Buffer{}
g.It("opens a file if it exists on the system", func() { g.It("opens a file if it exists on the system", func() {
err := rfs.CreateServerFile("test.txt", "testing") err := rfs.CreateServerFileFromString("test.txt", "testing")
g.Assert(err).IsNil() g.Assert(err).IsNil()
err = fs.Readfile("test.txt", buf) err = fs.Readfile("test.txt", buf)
@ -103,7 +107,7 @@ func TestFilesystem_Readfile(t *testing.T) {
}) })
g.It("cannot open a file outside the root directory", func() { g.It("cannot open a file outside the root directory", func() {
err := rfs.CreateServerFile("/../test.txt", "testing") err := rfs.CreateServerFileFromString("/../test.txt", "testing")
g.Assert(err).IsNil() g.Assert(err).IsNil()
err = fs.Readfile("/../test.txt", buf) err = fs.Readfile("/../test.txt", buf)
@ -281,13 +285,13 @@ func TestFilesystem_Rename(t *testing.T) {
g.Describe("Rename", func() { g.Describe("Rename", func() {
g.BeforeEach(func() { g.BeforeEach(func() {
if err := rfs.CreateServerFile("source.txt", "text content"); err != nil { if err := rfs.CreateServerFileFromString("source.txt", "text content"); err != nil {
panic(err) panic(err)
} }
}) })
g.It("returns an error if the target already exists", func() { g.It("returns an error if the target already exists", func() {
err := rfs.CreateServerFile("target.txt", "taget content") err := rfs.CreateServerFileFromString("target.txt", "taget content")
g.Assert(err).IsNil() g.Assert(err).IsNil()
err = fs.Rename("source.txt", "target.txt") err = fs.Rename("source.txt", "target.txt")
@ -314,7 +318,7 @@ func TestFilesystem_Rename(t *testing.T) {
}) })
g.It("does not allow renaming from a location outside the root", func() { g.It("does not allow renaming from a location outside the root", func() {
err := rfs.CreateServerFile("/../ext-source.txt", "taget content") err := rfs.CreateServerFileFromString("/../ext-source.txt", "taget content")
err = fs.Rename("/../ext-source.txt", "target.txt") err = fs.Rename("/../ext-source.txt", "target.txt")
g.Assert(err).IsNotNil() g.Assert(err).IsNotNil()
@ -378,7 +382,7 @@ func TestFilesystem_Copy(t *testing.T) {
g.Describe("Copy", func() { g.Describe("Copy", func() {
g.BeforeEach(func() { g.BeforeEach(func() {
if err := rfs.CreateServerFile("source.txt", "text content"); err != nil { if err := rfs.CreateServerFileFromString("source.txt", "text content"); err != nil {
panic(err) panic(err)
} }
@ -392,7 +396,7 @@ func TestFilesystem_Copy(t *testing.T) {
}) })
g.It("should return an error if the source is outside the root", func() { g.It("should return an error if the source is outside the root", func() {
err := rfs.CreateServerFile("/../ext-source.txt", "text content") err := rfs.CreateServerFileFromString("/../ext-source.txt", "text content")
err = fs.Copy("../ext-source.txt") err = fs.Copy("../ext-source.txt")
g.Assert(err).IsNotNil() g.Assert(err).IsNotNil()
@ -403,7 +407,7 @@ func TestFilesystem_Copy(t *testing.T) {
err := os.MkdirAll(filepath.Join(rfs.root, "/nested/in/dir"), 0755) err := os.MkdirAll(filepath.Join(rfs.root, "/nested/in/dir"), 0755)
g.Assert(err).IsNil() g.Assert(err).IsNil()
err = rfs.CreateServerFile("/../nested/in/dir/ext-source.txt", "external content") err = rfs.CreateServerFileFromString("/../nested/in/dir/ext-source.txt", "external content")
g.Assert(err).IsNil() g.Assert(err).IsNil()
err = fs.Copy("../nested/in/dir/ext-source.txt") err = fs.Copy("../nested/in/dir/ext-source.txt")
@ -464,7 +468,7 @@ func TestFilesystem_Copy(t *testing.T) {
err := os.MkdirAll(filepath.Join(rfs.root, "/server/nested/in/dir"), 0755) err := os.MkdirAll(filepath.Join(rfs.root, "/server/nested/in/dir"), 0755)
g.Assert(err).IsNil() g.Assert(err).IsNil()
err = rfs.CreateServerFile("nested/in/dir/source.txt", "test content") err = rfs.CreateServerFileFromString("nested/in/dir/source.txt", "test content")
g.Assert(err).IsNil() g.Assert(err).IsNil()
err = fs.Copy("nested/in/dir/source.txt") err = fs.Copy("nested/in/dir/source.txt")
@ -492,7 +496,7 @@ func TestFilesystem_Delete(t *testing.T) {
g.Describe("Delete", func() { g.Describe("Delete", func() {
g.BeforeEach(func() { g.BeforeEach(func() {
if err := rfs.CreateServerFile("source.txt", "test content"); err != nil { if err := rfs.CreateServerFileFromString("source.txt", "test content"); err != nil {
panic(err) panic(err)
} }
@ -500,7 +504,7 @@ func TestFilesystem_Delete(t *testing.T) {
}) })
g.It("does not delete files outside the root directory", func() { g.It("does not delete files outside the root directory", func() {
err := rfs.CreateServerFile("/../ext-source.txt", "external content") err := rfs.CreateServerFileFromString("/../ext-source.txt", "external content")
err = fs.Delete("../ext-source.txt") err = fs.Delete("../ext-source.txt")
g.Assert(err).IsNotNil() g.Assert(err).IsNotNil()
@ -544,7 +548,7 @@ func TestFilesystem_Delete(t *testing.T) {
g.Assert(err).IsNil() g.Assert(err).IsNil()
for _, s := range sources { for _, s := range sources {
err = rfs.CreateServerFile(s, "test content") err = rfs.CreateServerFileFromString(s, "test content")
g.Assert(err).IsNil() g.Assert(err).IsNil()
} }

View File

@ -103,7 +103,7 @@ func TestFilesystem_Blocks_Symlinks(t *testing.T) {
g := Goblin(t) g := Goblin(t)
fs, rfs := NewFs() fs, rfs := NewFs()
if err := rfs.CreateServerFile("/../malicious.txt", "external content"); err != nil { if err := rfs.CreateServerFileFromString("/../malicious.txt", "external content"); err != nil {
panic(err) panic(err)
} }
@ -181,7 +181,7 @@ func TestFilesystem_Blocks_Symlinks(t *testing.T) {
}) })
g.It("cannot rename a file to a location outside the directory root", func() { g.It("cannot rename a file to a location outside the directory root", func() {
rfs.CreateServerFile("my_file.txt", "internal content") rfs.CreateServerFileFromString("my_file.txt", "internal content")
err := fs.Rename("my_file.txt", "external_dir/my_file.txt") err := fs.Rename("my_file.txt", "external_dir/my_file.txt")
g.Assert(err).IsNotNil() g.Assert(err).IsNotNil()

BIN
server/filesystem/testdata/test.rar vendored Normal file

Binary file not shown.

BIN
server/filesystem/testdata/test.tar vendored Normal file

Binary file not shown.

BIN
server/filesystem/testdata/test.tar.gz vendored Normal file

Binary file not shown.

BIN
server/filesystem/testdata/test.zip vendored Normal file

Binary file not shown.