From 326baeaca101fdee43b22c45a7c304a0fdea027f Mon Sep 17 00:00:00 2001 From: Simon Ruderich Date: Sun, 4 Apr 2021 21:25:14 +0200 Subject: [PATCH] sync: move file related test functions to new package filetest They will be used by other packages in the near future. --- cmd/safcm-remote/sync/files_test.go | 270 +++++++-------------- cmd/safcm-remote/sync/filetest/filetest.go | 134 ++++++++++ 2 files changed, 215 insertions(+), 189 deletions(-) create mode 100644 cmd/safcm-remote/sync/filetest/filetest.go diff --git a/cmd/safcm-remote/sync/files_test.go b/cmd/safcm-remote/sync/files_test.go index 22daa63..c5c7216 100644 --- a/cmd/safcm-remote/sync/files_test.go +++ b/cmd/safcm-remote/sync/files_test.go @@ -20,66 +20,17 @@ import ( "io/fs" "math/rand" "os" - "os/user" "path/filepath" "reflect" "regexp" - "strconv" - "syscall" "testing" "github.com/google/go-cmp/cmp" "ruderich.org/simon/safcm" + ft "ruderich.org/simon/safcm/cmd/safcm-remote/sync/filetest" ) -type File struct { - Path string - Mode fs.FileMode - Data []byte -} - -func walkDir(basePath string) ([]File, error) { - var res []File - err := filepath.WalkDir(basePath, func(path string, d fs.DirEntry, err error) error { - if err != nil { - return err - } - info, err := d.Info() - if err != nil { - return err - } - rel, err := filepath.Rel(basePath, path) - if err != nil { - return err - } - - f := File{ - Path: rel, - Mode: info.Mode(), - } - if f.Mode.Type() == 0 { - x, err := os.ReadFile(path) - if err != nil { - return err - } - f.Data = x - } else if f.Mode.Type() == fs.ModeSymlink { - x, err := os.Readlink(path) - if err != nil { - return err - } - f.Data = []byte(x) - } - res = append(res, f) - return nil - }) - if err != nil { - return nil, err - } - return res, nil -} - var randFilesRegexp = regexp.MustCompile(`\d+"$`) func TestSyncFiles(t *testing.T) { @@ -98,11 +49,11 @@ func TestSyncFiles(t *testing.T) { t.Fatal(err) } - root := File{ + root := ft.File{ Path: ".", Mode: fs.ModeDir | 0700, } - user, uid, group, gid := currentUserAndGroup() + user, uid, group, gid := ft.CurrentUserAndGroup() tmpTestFilePath := "/tmp/safcm-sync-files-test-file" @@ -111,7 +62,7 @@ func TestSyncFiles(t *testing.T) { req safcm.MsgSyncReq prepare func() triggers []string - expFiles []File + expFiles []ft.File expResp safcm.MsgSyncResp expDbg []string expErr error @@ -153,7 +104,7 @@ func TestSyncFiles(t *testing.T) { }, nil, nil, - []File{ + []ft.File{ root, { Path: "dir", @@ -235,11 +186,11 @@ func TestSyncFiles(t *testing.T) { }, }, func() { - createDirectory("dir", 0755) - createFile("dir/file", "content\n", 0644) + ft.CreateDirectory("dir", 0755) + ft.CreateFile("dir/file", "content\n", 0644) }, nil, - []File{ + []ft.File{ root, { Path: "dir", @@ -276,7 +227,7 @@ func TestSyncFiles(t *testing.T) { }, nil, nil, - []File{ + []ft.File{ root, }, safcm.MsgSyncResp{}, @@ -299,7 +250,7 @@ func TestSyncFiles(t *testing.T) { }, nil, nil, - []File{ + []ft.File{ root, }, safcm.MsgSyncResp{}, @@ -355,7 +306,7 @@ func TestSyncFiles(t *testing.T) { }, nil, nil, - []File{ + []ft.File{ root, }, safcm.MsgSyncResp{}, @@ -406,11 +357,11 @@ func TestSyncFiles(t *testing.T) { }, }, func() { - createDirectory("dir", 0755) - createFile("dir/file", "content\n", 0644) + ft.CreateDirectory("dir", 0755) + ft.CreateFile("dir/file", "content\n", 0644) }, nil, - []File{ + []ft.File{ root, { Path: "dir", @@ -473,13 +424,13 @@ func TestSyncFiles(t *testing.T) { if err != nil { panic(err) } - createDirectory("dir", 0755) - createFile("dir/file", "content\n", 0644) + ft.CreateDirectory("dir", 0755) + ft.CreateFile("dir/file", "content\n", 0644) }, []string{ ".", }, - []File{ + []ft.File{ root, { Path: "dir", @@ -561,14 +512,14 @@ func TestSyncFiles(t *testing.T) { }, }, func() { - createDirectory("dir", 0750) - createFile("dir/file", "content\n", 0644) + ft.CreateDirectory("dir", 0750) + ft.CreateFile("dir/file", "content\n", 0644) }, []string{ ".", "dir", }, - []File{ + []ft.File{ root, { Path: "dir", @@ -651,14 +602,14 @@ func TestSyncFiles(t *testing.T) { }, }, func() { - createDirectory("dir", 0755) + ft.CreateDirectory("dir", 0755) }, []string{ ".", "dir", "dir/file", }, - []File{ + []ft.File{ root, { Path: "dir", @@ -742,7 +693,7 @@ func TestSyncFiles(t *testing.T) { "dir", "dir/file", }, - []File{ + []ft.File{ root, { Path: "dir", @@ -856,7 +807,7 @@ func TestSyncFiles(t *testing.T) { // Don't use variable for more robust test "/tmp/safcm-sync-files-test-file", }, - []File{ + []ft.File{ root, }, safcm.MsgSyncResp{ @@ -927,7 +878,7 @@ func TestSyncFiles(t *testing.T) { cmp.Diff(tc.expDbg, dbg)) } - files, err := walkDir(path) + files, err := ft.WalkDir(path) if err != nil { t.Fatal(err) } @@ -971,11 +922,11 @@ func TestSyncFile(t *testing.T) { t.Fatal(err) } - root := File{ + root := ft.File{ Path: ".", Mode: fs.ModeDir | 0700, } - user, uid, group, gid := currentUserAndGroup() + user, uid, group, gid := ft.CurrentUserAndGroup() tests := []struct { name string @@ -983,7 +934,7 @@ func TestSyncFile(t *testing.T) { file *safcm.File prepare func() expChanged bool - expFiles []File + expFiles []ft.File expResp safcm.MsgSyncResp expDbg []string expErr error @@ -1009,7 +960,7 @@ func TestSyncFile(t *testing.T) { }, nil, true, - []File{ + []ft.File{ root, { Path: "file", @@ -1055,7 +1006,7 @@ func TestSyncFile(t *testing.T) { }, nil, true, - []File{root}, + []ft.File{root}, safcm.MsgSyncResp{ FileChanges: []safcm.FileChange{ { @@ -1091,10 +1042,10 @@ func TestSyncFile(t *testing.T) { OrigGroup: "group", }, func() { - createFile("file", "content\n", 0644) + ft.CreateFile("file", "content\n", 0644) }, false, - []File{ + []ft.File{ root, { Path: "file", @@ -1123,10 +1074,10 @@ func TestSyncFile(t *testing.T) { OrigGroup: "group", }, func() { - createFile("file", "content\n", 0644) + ft.CreateFile("file", "content\n", 0644) }, false, - []File{ + []ft.File{ root, { Path: "file", @@ -1153,10 +1104,10 @@ func TestSyncFile(t *testing.T) { OrigGroup: "group", }, func() { - createFile("file", "content\n", 0755) + ft.CreateFile("file", "content\n", 0755) }, true, - []File{ + []ft.File{ root, { Path: "file", @@ -1206,10 +1157,10 @@ func TestSyncFile(t *testing.T) { OrigGroup: "group", }, func() { - createFile("file", "old content\n", 0644) + ft.CreateFile("file", "old content\n", 0644) }, true, - []File{ + []ft.File{ root, { Path: "file", @@ -1267,7 +1218,7 @@ func TestSyncFile(t *testing.T) { }, nil, true, - []File{ + []ft.File{ root, { Path: "link", @@ -1310,10 +1261,10 @@ func TestSyncFile(t *testing.T) { OrigGroup: "group", }, func() { - createFile(".link8717895732742165505", "", 0600) + ft.CreateFile(".link8717895732742165505", "", 0600) }, true, - []File{ + []ft.File{ root, { Path: ".link8717895732742165505", @@ -1365,7 +1316,7 @@ func TestSyncFile(t *testing.T) { }, nil, true, - []File{root}, + []ft.File{root}, safcm.MsgSyncResp{ FileChanges: []safcm.FileChange{ { @@ -1401,10 +1352,10 @@ func TestSyncFile(t *testing.T) { OrigGroup: "group", }, func() { - createSymlink("link", "target") + ft.CreateSymlink("link", "target") }, false, - []File{ + []ft.File{ root, { Path: "link", @@ -1431,10 +1382,10 @@ func TestSyncFile(t *testing.T) { OrigGroup: "group", }, func() { - createSymlink("link", "old-target") + ft.CreateSymlink("link", "old-target") }, true, - []File{ + []ft.File{ root, { Path: "link", @@ -1490,7 +1441,7 @@ func TestSyncFile(t *testing.T) { }, nil, true, - []File{ + []ft.File{ root, { Path: "dir", @@ -1535,7 +1486,7 @@ func TestSyncFile(t *testing.T) { }, nil, true, - []File{root}, + []ft.File{root}, safcm.MsgSyncResp{ FileChanges: []safcm.FileChange{ { @@ -1570,10 +1521,10 @@ func TestSyncFile(t *testing.T) { OrigGroup: "group", }, func() { - createDirectory("dir", 0755) + ft.CreateDirectory("dir", 0755) }, false, - []File{ + []ft.File{ root, { Path: "dir", @@ -1598,10 +1549,10 @@ func TestSyncFile(t *testing.T) { OrigGroup: "group", }, func() { - createDirectory("dir", 0500|fs.ModeSticky) + ft.CreateDirectory("dir", 0500|fs.ModeSticky) }, true, - []File{ + []ft.File{ root, { Path: "dir", @@ -1650,10 +1601,10 @@ func TestSyncFile(t *testing.T) { OrigGroup: "group", }, func() { - createFile("path", "content\n", 0644) + ft.CreateFile("path", "content\n", 0644) }, true, - []File{ + []ft.File{ root, { Path: "path", @@ -1708,10 +1659,10 @@ func TestSyncFile(t *testing.T) { Data: []byte("target"), }, func() { - createFile("path", "content\n", 0644) + ft.CreateFile("path", "content\n", 0644) }, true, - []File{ + []ft.File{ root, { Path: "path", @@ -1766,10 +1717,10 @@ func TestSyncFile(t *testing.T) { Data: []byte("content\n"), }, func() { - createSymlink("path", "target") + ft.CreateSymlink("path", "target") }, true, - []File{ + []ft.File{ root, { Path: "path", @@ -1823,10 +1774,10 @@ func TestSyncFile(t *testing.T) { OrigGroup: "group", }, func() { - createSymlink("path", "target") + ft.CreateSymlink("path", "target") }, true, - []File{ + []ft.File{ root, { Path: "path", @@ -1881,10 +1832,10 @@ func TestSyncFile(t *testing.T) { Data: []byte("content\n"), }, func() { - createDirectory("path", 0777) + ft.CreateDirectory("path", 0777) }, true, - []File{ + []ft.File{ root, { Path: "path", @@ -1935,10 +1886,10 @@ func TestSyncFile(t *testing.T) { Data: []byte("target"), }, func() { - createDirectory("path", 0777) + ft.CreateDirectory("path", 0777) }, true, - []File{ + []ft.File{ root, { Path: "path", @@ -1989,10 +1940,10 @@ func TestSyncFile(t *testing.T) { Data: []byte("content\n"), }, func() { - createFifo("path", 0666) + ft.CreateFifo("path", 0666) }, true, - []File{ + []ft.File{ root, { Path: "path", @@ -2042,10 +1993,10 @@ func TestSyncFile(t *testing.T) { Data: []byte("target"), }, func() { - createFifo("path", 0666) + ft.CreateFifo("path", 0666) }, true, - []File{ + []ft.File{ root, { Path: "path", @@ -2094,10 +2045,10 @@ func TestSyncFile(t *testing.T) { OrigGroup: "group", }, func() { - createFifo("path", 0666) + ft.CreateFifo("path", 0666) }, true, - []File{ + []ft.File{ root, { Path: "path", @@ -2148,10 +2099,10 @@ func TestSyncFile(t *testing.T) { Data: []byte("target"), }, func() { - createFile("path", "target", 0644) + ft.CreateFile("path", "target", 0644) }, true, - []File{ + []ft.File{ root, { Path: "path", @@ -2211,14 +2162,14 @@ file OrigGroup: "group", }, func() { - createFile("file", `this + ft.CreateFile("file", `this is file ! `, 0644) }, true, - []File{ + []ft.File{ root, { Path: "file", @@ -2283,10 +2234,10 @@ file OrigGroup: "group", }, func() { - createFile("file", "\x00\x01\x02", 0644) + ft.CreateFile("file", "\x00\x01\x02", 0644) }, true, - []File{ + []ft.File{ root, { Path: "file", @@ -2338,10 +2289,10 @@ file OrigGroup: "group", }, func() { - createFile("file", "\x00\x01\x02", 0644) + ft.CreateFile("file", "\x00\x01\x02", 0644) }, true, - []File{ + []ft.File{ root, { Path: "file", @@ -2397,10 +2348,10 @@ file OrigGroup: "group", }, func() { - createFile("file", "content\n", 0644) + ft.CreateFile("file", "content\n", 0644) }, true, - []File{ + []ft.File{ root, { Path: "file", @@ -2485,7 +2436,7 @@ file cmp.Diff(tc.expDbg, dbg)) } - files, err := walkDir(path) + files, err := ft.WalkDir(path) if err != nil { t.Fatal(err) } @@ -2511,62 +2462,3 @@ file } } } - -// Helper functions - -func createFile(path string, data string, mode fs.FileMode) { - err := os.WriteFile(path, []byte(data), 0644) - if err != nil { - panic(err) - } - err = os.Chmod(path, mode) - if err != nil { - panic(err) - } -} -func createSymlink(path string, data string) { - err := os.Symlink(data, path) - if err != nil { - panic(err) - } -} -func createDirectory(path string, mode fs.FileMode) { - err := os.Mkdir(path, 0700) - if err != nil { - panic(err) - } - err = os.Chmod(path, mode) - if err != nil { - panic(err) - } -} -func createFifo(path string, mode fs.FileMode) { - err := syscall.Mkfifo(path, 0600) - if err != nil { - panic(err) - } - err = os.Chmod(path, mode) - if err != nil { - panic(err) - } -} - -func currentUserAndGroup() (string, int, string, int) { - u, err := user.Current() - if err != nil { - panic(err) - } - g, err := user.LookupGroupId(u.Gid) - if err != nil { - panic(err) - } - uid, err := strconv.Atoi(u.Uid) - if err != nil { - panic(err) - } - gid, err := strconv.Atoi(g.Gid) - if err != nil { - panic(err) - } - return u.Username, uid, g.Name, gid -} diff --git a/cmd/safcm-remote/sync/filetest/filetest.go b/cmd/safcm-remote/sync/filetest/filetest.go new file mode 100644 index 0000000..b6fcb7c --- /dev/null +++ b/cmd/safcm-remote/sync/filetest/filetest.go @@ -0,0 +1,134 @@ +// Utility functions useful for file-related tests + +// Copyright (C) 2021 Simon Ruderich +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +package filetest + +import ( + "io/fs" + "os" + "os/user" + "path/filepath" + "strconv" + "syscall" +) + +type File struct { + Path string + Mode fs.FileMode + Data []byte +} + +func WalkDir(basePath string) ([]File, error) { + var res []File + err := filepath.WalkDir(basePath, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + info, err := d.Info() + if err != nil { + return err + } + rel, err := filepath.Rel(basePath, path) + if err != nil { + return err + } + + f := File{ + Path: rel, + Mode: info.Mode(), + } + if f.Mode.Type() == 0 { + x, err := os.ReadFile(path) + if err != nil { + return err + } + f.Data = x + } else if f.Mode.Type() == fs.ModeSymlink { + x, err := os.Readlink(path) + if err != nil { + return err + } + f.Data = []byte(x) + } + res = append(res, f) + return nil + }) + if err != nil { + return nil, err + } + return res, nil +} + +func CurrentUserAndGroup() (string, int, string, int) { + u, err := user.Current() + if err != nil { + panic(err) + } + g, err := user.LookupGroupId(u.Gid) + if err != nil { + panic(err) + } + uid, err := strconv.Atoi(u.Uid) + if err != nil { + panic(err) + } + gid, err := strconv.Atoi(g.Gid) + if err != nil { + panic(err) + } + return u.Username, uid, g.Name, gid +} + +func CreateFile(path string, data string, mode fs.FileMode) { + err := os.WriteFile(path, []byte(data), 0644) + if err != nil { + panic(err) + } + err = os.Chmod(path, mode) + if err != nil { + panic(err) + } +} + +func CreateSymlink(path string, data string) { + err := os.Symlink(data, path) + if err != nil { + panic(err) + } +} + +func CreateDirectory(path string, mode fs.FileMode) { + err := os.Mkdir(path, 0700) + if err != nil { + panic(err) + } + err = os.Chmod(path, mode) + if err != nil { + panic(err) + } +} + +func CreateFifo(path string, mode fs.FileMode) { + err := syscall.Mkfifo(path, 0600) + if err != nil { + panic(err) + } + err = os.Chmod(path, mode) + if err != nil { + panic(err) + } +} -- 2.44.1