// Copyright 2024 Matthew Rich . All rights reserved. package resource import ( "context" _ "encoding/json" "fmt" "github.com/stretchr/testify/assert" "gopkg.in/yaml.v3" _ "io" _ "log" _ "net/http" _ "net/http/httptest" _ "net/url" "os" "path/filepath" _ "strings" "syscall" "testing" "time" ) func TestNewFileResource(t *testing.T) { f := NewFile() assert.NotEqual(t, nil, f) } func TestApplyResourceTransformation(t *testing.T) { f := NewFile() assert.NotEqual(t, nil, f) //e := f.Apply() //assert.Equal(t, nil, e) } func TestReadFile(t *testing.T) { ctx := context.Background() file, _ := filepath.Abs(filepath.Join(TempDir, "fooread.txt")) declarationAttributes := ` path: "%s" owner: "nobody" group: "nobody" mode: "0600" atime: 2001-12-15T01:01:01.000000001Z ctime: %s mtime: 2001-12-15T01:01:01.000000001Z content: |- test line 1 test line 2 sha256: f2082f984f1bf1a7886e2af32ccc9ca474fbff3553d131204b070c438114dd51 filetype: "regular" state: present ` decl := fmt.Sprintf(declarationAttributes, file, "2001-12-15T01:01:01.000000001Z") testFile := NewFile() e := testFile.LoadDecl(decl) assert.Equal(t, nil, e) applyErr := testFile.Apply() assert.Nil(t, applyErr) f := NewFile() assert.NotEqual(t, nil, f) f.Path = file r, e := f.Read(ctx) assert.Equal(t, nil, e) assert.Equal(t, "nobody", f.Owner) info, statErr := os.Stat(file) assert.Nil(t, statErr) stat, ok := info.Sys().(*syscall.Stat_t) assert.True(t, ok) cTime := time.Unix(int64(stat.Ctim.Sec), int64(stat.Ctim.Nsec)) expected := fmt.Sprintf(declarationAttributes, file, cTime.Format(time.RFC3339Nano)) assert.YAMLEq(t, expected, string(r)) } func TestReadFileError(t *testing.T) { ctx := context.Background() file, _ := filepath.Abs(filepath.Join(TempDir, "missingfile.txt")) f := NewFile() assert.NotEqual(t, nil, f) f.Path = file _, e := f.Read(ctx) assert.True(t, os.IsNotExist(e)) assert.Equal(t, "absent", f.State) } func TestCreateFile(t *testing.T) { file, _ := filepath.Abs(filepath.Join(TempDir, "foo.txt")) decl := fmt.Sprintf(` path: "%s" owner: "nobody" group: "nobody" mode: "0600" content: |- test line 1 test line 2 state: present `, file) f := NewFile() e := f.LoadDecl(decl) assert.Equal(t, nil, e) assert.Equal(t, "nobody", f.Owner) applyErr := f.Apply() assert.Equal(t, nil, applyErr) assert.FileExists(t, file, nil) s, e := os.Stat(file) assert.Equal(t, nil, e) assert.Greater(t, s.Size(), int64(0)) f.State = "absent" assert.Equal(t, nil, f.Apply()) assert.NoFileExists(t, file, nil) } func TestFileType(t *testing.T) { fileType := []byte(` filetype: "directory" `) var testFile File err := yaml.Unmarshal(fileType, &testFile) assert.Nil(t, err) } func TestFileDirectory(t *testing.T) { file, _ := filepath.Abs(filepath.Join(TempDir, "testdir")) decl := fmt.Sprintf(` path: "%s" owner: "nobody" group: "nobody" mode: "0700" filetype: "directory" state: present `, file) f := NewFile() e := f.LoadDecl(decl) assert.Equal(t, nil, e) assert.Equal(t, "nobody", f.Owner) applyErr := f.Apply() assert.Equal(t, nil, applyErr) assert.DirExists(t, file) f.State = "absent" deleteErr := f.Apply() assert.Nil(t, deleteErr) assert.NoDirExists(t, file) } func TestFileTimes(t *testing.T) { file, _ := filepath.Abs(filepath.Join(TempDir, "testtimes.txt")) decl := fmt.Sprintf(` path: "%s" owner: "nobody" group: "nobody" mtime: 2001-12-15T01:01:01.1Z mode: "0600" filtetype: "regular" state: "present" `, file) expectedTime, timeErr := time.Parse(time.RFC3339, "2001-12-15T01:01:01.1Z") assert.Nil(t, timeErr) f := NewFile() e := f.LoadDecl(decl) assert.Nil(t, e) assert.Equal(t, "nobody", f.Owner) assert.True(t, f.Mtime.Equal(expectedTime)) } func TestFileSetURI(t *testing.T) { file, _ := filepath.Abs(filepath.Join(TempDir, "testuri.txt")) f := NewFile() assert.NotNil(t, f) e := f.SetURI("file://" + file) assert.Nil(t, e) assert.Equal(t, "file", f.Type()) assert.Equal(t, file, f.Path) } func TestFileNormalizePath(t *testing.T) { absFile, absFilePathErr := filepath.Abs(filepath.Join(TempDir, "./testuri.txt")) assert.Nil(t, absFilePathErr) file := filepath.Join(TempDir, "./testuri.txt") f := NewFile() assert.NotNil(t, f) f.Path = file e := f.NormalizePath() assert.Nil(t, e) assert.Equal(t, absFile, f.Path) } func TestFileUpdateAttributesFromFileInfo(t *testing.T) { f := NewFile() assert.NotNil(t, f) info, e := os.Lstat(TempDir) assert.Nil(t, e) updateAttributesErr := f.UpdateAttributesFromFileInfo(info) assert.Nil(t, updateAttributesErr) assert.Equal(t, DirectoryFile, f.FileType) } func TestFileReadStat(t *testing.T) { ctx := context.Background() link := filepath.Join(TempDir, "link.txt") linkTargetFile := filepath.Join(TempDir, "testuri.txt") f := NewFile() assert.NotNil(t, f) f.Path = linkTargetFile e := f.NormalizePath() assert.Nil(t, e) statErr := f.ReadStat() assert.Error(t, statErr) f.Owner = "nobody" f.Group = "nobody" f.State = "present" assert.Nil(t, f.Apply()) assert.Nil(t, f.ReadStat()) l := NewFile() assert.NotNil(t, l) l.FileType = SymbolicLinkFile l.Path = link l.Target = linkTargetFile l.State = "present" applyErr := l.Apply() assert.Nil(t, applyErr) readStatErr := l.ReadStat() assert.Nil(t, readStatErr) testRead := NewFile() testRead.Path = link _,testReadErr := testRead.Read(ctx) assert.Nil(t, testReadErr) assert.Equal(t, linkTargetFile, testRead.Target) }