fusego/samples/roloopbackfs/roloopbackfs_test.go

179 lines
4.4 KiB
Go
Raw Normal View History

2021-03-30 14:24:55 +03:00
// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package roloopbackfs_test
import (
"fmt"
"io/ioutil"
"log"
"math/rand"
"os"
"path/filepath"
"strings"
"testing"
"time"
"github.com/jacobsa/fuse/samples"
"github.com/jacobsa/fuse/samples/roloopbackfs"
. "github.com/jacobsa/ogletest"
)
var (
letters = []byte("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
)
func TestReadonlyLoopbackFS(t *testing.T) { RunTests(t) }
type ReadonlyLoopbackFSTest struct {
samples.SampleTest
physicalPath string
}
func init() {
RegisterTestSuite(&ReadonlyLoopbackFSTest{})
rand.Seed(time.Now().UnixNano())
}
func (t *ReadonlyLoopbackFSTest) SetUp(ti *TestInfo) {
var err error
t.physicalPath, err = ioutil.TempDir("", "")
if err != nil {
panic(err)
}
err = os.MkdirAll(t.physicalPath, 0777)
if err != nil {
panic(err)
}
t.fillPhysicalFS()
t.Server, err = roloopbackfs.NewReadonlyLoopbackServer(
t.physicalPath,
log.New(os.Stdout, "", 0),
)
AssertEq(nil, err)
t.SampleTest.SetUp(ti)
}
func (t *ReadonlyLoopbackFSTest) TearDown() {
t.SampleTest.TearDown()
err := os.RemoveAll(t.physicalPath)
if err != nil {
panic(err)
}
}
func createDirectories(parentPath string, namePrefix string, count int, onDir func(dirPath string)) {
var err error
for i := 0; i < count; i++ {
dirName := fmt.Sprintf("%v_%v", namePrefix, i+1)
dirPath := filepath.Join(parentPath, dirName)
err = os.Mkdir(dirPath, 0777)
if err != nil {
panic(err)
}
if onDir != nil {
onDir(dirPath)
}
}
}
func randomString(n int) []byte {
bytes := make([]byte, n)
for i := range bytes {
bytes[i] = letters[rand.Intn(len(letters))]
}
return bytes
}
func (t *ReadonlyLoopbackFSTest) fillPhysicalFS() {
var err error
createDirectories(t.physicalPath, "top_dir", 10, func(dirPath string) {
fileName := fmt.Sprintf("secondary_file.txt")
contents := randomString(17)
err = ioutil.WriteFile(filepath.Join(dirPath, fileName), contents, 0777)
if err != nil {
panic(err)
}
createDirectories(dirPath, "secondary_dir", 5, func(dirPath string) {
for i := 0; i < 3; i++ {
fileName := fmt.Sprintf("file_%v.txt", i+1)
contents := randomString(i * 10)
err = ioutil.WriteFile(filepath.Join(dirPath, fileName), contents, 0777)
if err != nil {
panic(err)
}
}
})
})
}
func (t *ReadonlyLoopbackFSTest) ListDirUsingWalk() {
countedFiles, countedDirs := 0, 0
err := filepath.Walk(t.Dir, func(path string, info os.FileInfo, err error) error {
AssertNe(nil, info)
if info.IsDir() {
countedDirs++
} else {
if strings.Contains(path, "file_1.txt") {
AssertEq(0, info.Size())
} else {
AssertTrue(info.Size() > 0)
}
countedFiles++
}
return nil
})
AssertEq(nil, err)
AssertEq(1+10+10*5, countedDirs)
AssertEq(10+10*5*3, countedFiles)
}
func (t *ReadonlyLoopbackFSTest) ListDirUsingDirectQuery() {
infos, err := ioutil.ReadDir(filepath.Join(t.Dir, "top_dir_3"))
AssertEq(nil, err)
AssertEq(1+5, len(infos))
for i := 0; i < 5; i++ {
AssertEq(fmt.Sprintf("secondary_dir_%v", i+1), infos[i].Name())
AssertTrue(infos[i].IsDir())
}
AssertEq("secondary_file.txt", infos[5].Name())
AssertFalse(infos[5].IsDir())
infos, err = ioutil.ReadDir(filepath.Join(t.Dir, "top_dir_4", "secondary_dir_1"))
AssertEq(nil, err)
AssertEq(3, len(infos))
for i := 0; i < 3; i++ {
AssertEq(fmt.Sprintf("file_%v.txt", i+1), infos[i].Name())
AssertFalse(infos[i].IsDir())
}
}
func (t *ReadonlyLoopbackFSTest) ReadFile() {
bytes, err := ioutil.ReadFile(filepath.Join(t.Dir, "top_dir_1", "secondary_file.txt"))
AssertEq(nil, err)
AssertEq(17, len(bytes))
bytes, err = ioutil.ReadFile(filepath.Join(t.Dir, "top_dir_1", "secondary_dir_3", "file_1.txt"))
AssertEq(nil, err)
AssertEq(0, len(bytes))
bytes, err = ioutil.ReadFile(filepath.Join(t.Dir, "top_dir_1", "secondary_dir_3", "file_3.txt"))
AssertEq(nil, err)
AssertEq(20, len(bytes))
}