Skip to content
This repository has been archived by the owner on Apr 5, 2024. It is now read-only.

Feat/vfs tests #81

Merged
merged 15 commits into from
May 8, 2023
9 changes: 3 additions & 6 deletions .github/workflows/go_ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,8 @@ jobs:
- name: Check out code into the Go module directory
uses: actions/checkout@v2

- name: Build
run: go build -v ./...

- name: Test
run: go test -v ./...
- name: Clean and Build
run: make clean build

- name: Test Coverage
run: go test -cover ./...
run: make test-cover
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,6 @@

.idea

dummy.go
dummy.go

./vfs/tests
19 changes: 19 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
default: all

all: clean test build

.PHONY: clean
clean:
@go mod tidy

.PHONY: build
build:
@go build -v ./...

.PHONY: test
test:
@go test -v ./...

.PHONY: test-cover
test-cover:
@go test -cover -covermode=atomic ./...
1 change: 0 additions & 1 deletion ioutils/io_utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,5 @@ import "io"
var CloserFunc = func(closer io.Closer) {
err := closer.Close()
if err != nil {

}
}
35 changes: 28 additions & 7 deletions vfs/base_fs.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package vfs

import (
"fmt"
"io"
"net/url"

Expand All @@ -15,13 +16,11 @@ func (b *BaseVFS) Copy(src, dst *url.URL) (err error) {
var srcFile VFile
var srfFileInfo VFileInfo
srcFile, err = b.Open(src)

if err == nil {
defer ioutils.CloserFunc(srcFile)
srfFileInfo, err = srcFile.Info()
if err == nil {
if srfFileInfo.IsDir() {

err = b.Walk(src, func(file VFile) (err error) {
var fileInfo VFileInfo
fileInfo, err = srcFile.Info()
Expand All @@ -30,10 +29,8 @@ func (b *BaseVFS) Copy(src, dst *url.URL) (err error) {

}
}

return
})

// Create directories and copy files
} else {
var destFile VFile
Expand Down Expand Up @@ -73,10 +70,19 @@ func (b *BaseVFS) CreateRaw(u string) (file VFile, err error) {

func (b *BaseVFS) Delete(src *url.URL) (err error) {
var srcFile VFile
var srfFileInfo VFileInfo

srcFile, err = b.Open(src)
if err == nil {
defer ioutils.CloserFunc(srcFile)
err = srcFile.Delete()
srfFileInfo, err = srcFile.Info()
if err == nil {
if srfFileInfo.IsDir() {
err = srcFile.DeleteAll()
} else {
err = srcFile.Delete()
}
}
}
return
}
Expand Down Expand Up @@ -117,6 +123,7 @@ func (b *BaseVFS) MkdirRaw(u string) (vFile VFile, err error) {
}
return
}

func (b *BaseVFS) MkdirAllRaw(u string) (vFile VFile, err error) {
var fileUrl *url.URL
fileUrl, err = url.Parse(u)
Expand Down Expand Up @@ -178,6 +185,7 @@ func (b *BaseVFS) Walk(u *url.URL, fn WalkFn) (err error) {
if err == nil {
if srcFi.IsDir() {
children, err = src.ListAll()
fmt.Println(children)
if err == nil {
for _, child := range children {
childInfo, err = child.Info()
Expand Down Expand Up @@ -212,11 +220,24 @@ func (b *BaseVFS) WalkRaw(raw string, fn WalkFn) (err error) {

func (b *BaseVFS) DeleteMatching(location *url.URL, filter FileFilter) (err error) {
var files []VFile
var fileInfo VFileInfo
files, err = b.Find(location, filter)
if err == nil {
for _, file := range files {
err = file.Delete()
if err != nil {
fileInfo, err = file.Info()
if err == nil {
if fileInfo.IsDir() {
err = file.DeleteAll()
if err != nil {
break
}
} else {
err = file.Delete()
if err != nil {
break
}
}
} else {
break
}
}
Expand Down
10 changes: 8 additions & 2 deletions vfs/local_file.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package vfs

import (
"fmt"
"io/fs"
"io/ioutil"
"net/url"
Expand Down Expand Up @@ -47,6 +48,7 @@ func (o *OsFile) ListAll() (files []VFile, err error) {
var child VFile
var childUrl *url.URL
for _, fi := range fis {
// TODO : in case of nested folder structure, does this work?
childUrl, err = o.Location.Parse(textutils.ForwardSlashStr + fi.Name())
if err == nil {
child, err = manager.Open(childUrl)
Expand All @@ -63,21 +65,26 @@ func (o *OsFile) ListAll() (files []VFile, err error) {
files = children
}
}

return
}

func (o *OsFile) Delete() error {
return os.Remove(o.Location.Path)
}

func (o *OsFile) DeleteAll() error {
return os.RemoveAll(o.Location.Path)
}

func (o *OsFile) Info() (VFileInfo, error) {
return o.file.Stat()
}

func (o *OsFile) Parent() (file VFile, err error) {
var fileInfos []fs.FileInfo
fmt.Println(o.Location.Path)
fileInfos, err = ioutil.ReadDir(o.Location.Path)
fmt.Println(fileInfos)
if err == nil {
for _, info := range fileInfos {
var f *os.File
Expand Down Expand Up @@ -106,5 +113,4 @@ func (o *OsFile) AddProperty(name string, value string) error {
func (o *OsFile) GetProperty(name string) (v string, err error) {
err = errutils.FmtError("Unsupported operation GetProperty for scheme")
return

}
192 changes: 192 additions & 0 deletions vfs/local_file_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
package vfs

import (
"fmt"
"net/url"
"os"
"testing"
"time"
)

func GetParsedUrl(input string) (output *url.URL) {
currentPath, _ := os.Getwd()
u, _ := url.Parse(input)
path := currentPath + u.Path
output, _ = url.Parse(u.Scheme + "://" + path)
return
}

func GetRawPath(input string) (output string) {
currentPath, _ := os.Getwd()
u, _ := url.Parse(input)
path := currentPath + u.Path
output = u.Scheme + "://" + path
return
}

var (
testManager = GetManager()
)

func init() {
for {
testManager = GetManager()
if testManager == nil {
time.Sleep(100 * time.Millisecond)
} else {
break
}
}
}

func TestOsFs_Mkdir(t *testing.T) {
u := GetRawPath("file:///test-data")
_, err := testManager.MkdirRaw(u)
if err != nil {
t.Errorf("MkdirRaw() error = %v", err)
}
}

func TestOsFs_MkdirAll(t *testing.T) {
u := GetRawPath("file:///test-data/raw-folder")
_, err := testManager.MkdirAllRaw(u)
if err != nil {
t.Errorf("MkdirAllRaw() error = %v", err)
}
}

func TestOsFs_Create(t *testing.T) {
u := GetRawPath("file:///test-data/testFile.txt")
createdFile, err := testManager.CreateRaw(u)
if err != nil {
t.Errorf("Create() error = %v", err)
}
fileInfo, err := createdFile.Info()
if err != nil {
t.Errorf("Info() error = %v", err)
}
if fileInfo.Name() != "testFile.txt" {
t.Errorf("Invalid file name")
}

contentType := createdFile.ContentType()
if contentType != "application/octet-stream" {
t.Errorf("ContentType() invalid")
}

fileUrl := createdFile.Url()
urlPath := GetParsedUrl("file:///test-data/testFile.txt")
if fileUrl.Path != urlPath.Path {
t.Errorf("Invalid file URL, got = %s, want = %s", fileUrl, urlPath)
}

err = createdFile.AddProperty("test", "value")
if err.Error() != "Unsupported operation AddProperty for scheme" {
t.Errorf("Invalid expected error")
}

_, err = createdFile.GetProperty("key")
if err.Error() != "Unsupported operation GetProperty for scheme" {
t.Errorf("Invalid expected error")
}

d1 := []byte("hello\ngo")
resp, err := createdFile.Write(d1)
if err != nil {
t.Errorf("Write() error = %v", err)
}
if resp != len(d1) {
t.Errorf("Invalid data written")
}
}

func TestOsFs_Open(t *testing.T) {
u := GetRawPath("file:///test-data/testFile.txt")
openedFile, err := testManager.OpenRaw(u)
defer openedFile.Close()

b1 := make([]byte, 5)
resp, err := openedFile.Read(b1)
if err != nil {
t.Errorf("Read() error = %v", err)
}
if resp != len(b1) {
t.Errorf("Invalid data read")
}
_, err = openedFile.Seek(6, 0)
if err != nil {
t.Errorf("Seek() error = %v", err)
}
b2 := make([]byte, 2)
n2, err := openedFile.Read(b2)
if err != nil {
t.Errorf("Read() error = %v", err)
}
if n2 != len(b2) {
t.Errorf("invalid seek read")
}
}

func TestOsFile_Delete(t *testing.T) {
u := GetParsedUrl("file:///test-data/dummyFile.txt")
createdFile, err := testManager.Create(u)
if err != nil {
t.Errorf("Create() error = %v", err)
}
err = createdFile.Delete()
if err != nil {
t.Errorf("Delete() error = %v", err)
}
}

func TestBaseVFS_CopyRaw(t *testing.T) {
src := GetRawPath("file:///test-data/testFile.txt")
dest := GetRawPath("file:///test-data/testFile-copy.txt")
err := testManager.CopyRaw(src, dest)
if err != nil {
t.Errorf("CopyRaw() error = %v", err)
}
}

func TestBaseVFS_MoveRaw(t *testing.T) {
src := GetRawPath("file:///test-data/testFile.txt")
dest := GetRawPath("file:///test-data/testFile-move.txt")

err := testManager.MoveRaw(src, dest)
if err != nil {
t.Errorf("MoveRaw() error = %v", err)
}
}

func TestBaseVFS_Find(t *testing.T) {
u := GetParsedUrl("file:///test-data/filterFile.txt")
_, err := testManager.Create(u)
if err != nil {
t.Errorf("Create() error = %v", err)
}
filterFunc := func(createdFile VFile) (result bool, err error) {
var fileInfo VFileInfo
result = false

fileInfo, err = createdFile.Info()
if err != nil {
return
}
if fileInfo.Name() == "filterFile.txt" {
result = true
}
return
}
u2 := GetParsedUrl("file:///test-data")
files, err := testManager.Find(u2, filterFunc)
// TODO : filter func not implemented completely due to issue with ListAll()
fmt.Println(len(files))
}

func TestOsFs_Delete(t *testing.T) {
u := GetRawPath("file:///test-data")
err := testManager.DeleteRaw(u)
if err != nil {
t.Errorf("DeleteRaw() error = %v", err)
}
}
Loading