package os import ( "bytes" "fmt" "io/ioutil" "os" "path/filepath" "testing" "github.com/stretchr/testify/require" ) func TestCopyFile(t *testing.T) { tmpfile, err := ioutil.TempFile("", "example") if err != nil { t.Fatal(err) } defer os.Remove(tmpfile.Name()) content := []byte("hello world") if _, err := tmpfile.Write(content); err != nil { t.Fatal(err) } copyfile := fmt.Sprintf("%s.copy", tmpfile.Name()) if err := CopyFile(tmpfile.Name(), copyfile); err != nil { t.Fatal(err) } if _, err := os.Stat(copyfile); os.IsNotExist(err) { t.Fatal("copy should exist") } data, err := ioutil.ReadFile(copyfile) if err != nil { t.Fatal(err) } if !bytes.Equal(data, content) { t.Fatalf("copy file content differs: expected %v, got %v", content, data) } os.Remove(copyfile) } func TestEnsureDir(t *testing.T) { tmp, err := ioutil.TempDir("", "ensure-dir") require.NoError(t, err) defer os.RemoveAll(tmp) // Should be possible to create a new directory. err = EnsureDir(filepath.Join(tmp, "dir"), 0755) require.NoError(t, err) require.DirExists(t, filepath.Join(tmp, "dir")) // Should succeed on existing directory. err = EnsureDir(filepath.Join(tmp, "dir"), 0755) require.NoError(t, err) // Should fail on file. err = ioutil.WriteFile(filepath.Join(tmp, "file"), []byte{}, 0644) require.NoError(t, err) err = EnsureDir(filepath.Join(tmp, "file"), 0755) require.Error(t, err) // Should allow symlink to dir. err = os.Symlink(filepath.Join(tmp, "dir"), filepath.Join(tmp, "linkdir")) require.NoError(t, err) err = EnsureDir(filepath.Join(tmp, "linkdir"), 0755) require.NoError(t, err) // Should error on symlink to file. err = os.Symlink(filepath.Join(tmp, "file"), filepath.Join(tmp, "linkfile")) require.NoError(t, err) err = EnsureDir(filepath.Join(tmp, "linkfile"), 0755) require.Error(t, err) }