cachingfs_test.go 1.21 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
package unionfs

import (
	"os"
	"github.com/hanwen/go-fuse/fuse"
	"fmt"
	"log"
	"syscall"
	"testing"
)

var _ = fmt.Print
var _ = log.Print

func modeMapEq(m1, m2 map[string]uint32) bool {
	if len(m1) != len(m2) {
		return false
	}

	for k, v := range m1 {
		val, ok := m2[k]
		if !ok || val != v {
			return false
		}
	}
	return true
}

func TestCachingFs(t *testing.T) {
	wd := fuse.MakeTempDir()
	defer os.RemoveAll(wd)
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
32

33 34 35 36 37 38 39
	fs := fuse.NewLoopbackFileSystem(wd)
	cfs := NewCachingFileSystem(fs, 0)

	os.Mkdir(wd+"/orig", 0755)
	fi, code := cfs.GetAttr("orig")
	if !code.Ok() {
		t.Fatal("GetAttr failure", code)
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
40
	}
41 42 43
	if !fi.IsDirectory() {
		t.Error("unexpected attr", fi)
	}
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
44

45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
	os.Symlink("orig", wd+"/symlink")

	val, code := cfs.Readlink("symlink")
	if val != "orig" {
		t.Error("unexpected readlink", val)
	}
	if !code.Ok() {
		t.Error("code !ok ", code)
	}

	stream, code := cfs.OpenDir("")
	if !code.Ok() {
		t.Fatal("Readdir fail", code)
	}

	results := make(map[string]uint32)
	for v := range stream {
		results[v.Name] = v.Mode &^ 07777
	}
	expected := map[string]uint32{
		"symlink": syscall.S_IFLNK,
Han-Wen Nienhuys's avatar
Han-Wen Nienhuys committed
66
		"orig":    fuse.S_IFDIR,
67 68 69 70 71
	}
	if !modeMapEq(results, expected) {
		t.Error("Unexpected readdir result", results, expected)
	}
}