aboutsummaryrefslogtreecommitdiff
path: root/awwan_play_test.go
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2023-10-21 19:52:17 +0700
committerShulhan <ms@kilabit.info>2023-10-21 19:59:10 +0700
commitf1cdc424327be91cfdbeb35449275cd8582bba8d (patch)
tree5d350edefd9a17400179252a1018be7004988fe7 /awwan_play_test.go
parent143e4c8c6825884ae864563b93689200a55c2d49 (diff)
downloadawwan-f1cdc424327be91cfdbeb35449275cd8582bba8d.tar.xz
all: implement remote "#get!" and "#put!" with owner and mode
When script with magic command "#get!" or "#put!" executed using "play" command, one can changes the owner and/or permission mode by setting the user/group and permission bits after the magic command, for example, #get!user:group+0600 src dst Will changes the owner of dst in local into "user:group" with permission "0600", while #put!user:group+0600 src dst Will changes the owner of dst in remote into "user:group" with permission "0600".
Diffstat (limited to 'awwan_play_test.go')
-rw-r--r--awwan_play_test.go182
1 files changed, 181 insertions, 1 deletions
diff --git a/awwan_play_test.go b/awwan_play_test.go
index 7bcc827..0894c3e 100644
--- a/awwan_play_test.go
+++ b/awwan_play_test.go
@@ -16,9 +16,11 @@ import (
type testCaseGetPut struct {
desc string
- fileDest string
lineRange string
+ sudoPass string
+ fileDest string
+
expContent string
expError string
@@ -190,3 +192,181 @@ func TestAwwan_Play_Put(t *testing.T) {
test.Assert(t, `mode`, c.expMode, fi.Mode().Perm())
}
}
+
+func TestAwwan_Play_SudoGet(t *testing.T) {
+ var (
+ baseDir = `testdata/play`
+ scriptDir = filepath.Join(baseDir, `awwanssh.test`)
+ scriptFile = filepath.Join(scriptDir, `get.aww`)
+
+ tdata *test.Data
+ aww *Awwan
+ err error
+ )
+
+ tdata, err = test.LoadData(filepath.Join(scriptDir, `get_test.data`))
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ aww, err = New(baseDir)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ var cases = []testCaseGetPut{{
+ desc: `WithMode`,
+ lineRange: `14`,
+ sudoPass: "awwan\n",
+ fileDest: filepath.Join(scriptDir, `tmp`, `sudoget_with_mode.txt`),
+ expContent: string(tdata.Output[`/etc/crypttab`]),
+ expMode: 0601,
+ }, {
+ desc: `WithOwner`,
+ lineRange: `16`,
+ sudoPass: "awwan\n",
+ fileDest: filepath.Join(scriptDir, `tmp`, `sudoget_with_owner.txt`),
+ expContent: string(tdata.Output[`/etc/crypttab`]),
+ expMode: 420,
+ }, {
+ desc: `WithOwnerAndMode`,
+ lineRange: `18`,
+ sudoPass: "awwan\nawwan\n",
+ fileDest: filepath.Join(scriptDir, `tmp`, `sudoget_with_owner_mode.txt`),
+ expContent: string(tdata.Output[`/etc/crypttab`]),
+ expMode: 0602,
+ }}
+
+ var (
+ mockin = &mockStdin{}
+
+ c testCaseGetPut
+ fi os.FileInfo
+ gotContent []byte
+ )
+
+ for _, c = range cases {
+ t.Log(c.desc)
+
+ if len(c.fileDest) != 0 {
+ _ = os.Remove(c.fileDest)
+ }
+
+ var req = NewRequest(CommandModePlay, scriptFile, c.lineRange)
+
+ // Mock the request stdin to read password from buffer.
+ mockin.buf.Reset()
+ mockin.buf.WriteString(c.sudoPass)
+ req.stdin = mockin
+
+ err = aww.Play(req)
+ if err != nil {
+ test.Assert(t, `play error`, c.expError, err.Error())
+ }
+
+ if len(c.fileDest) == 0 {
+ continue
+ }
+
+ // File successfully copied but maybe error when setting
+ // owner or permission.
+
+ gotContent, err = os.ReadFile(c.fileDest)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ test.Assert(t, `content`, c.expContent, string(gotContent))
+
+ fi, err = os.Stat(c.fileDest)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ test.Assert(t, `mode`, c.expMode, fi.Mode().Perm())
+ }
+}
+
+func TestAwwan_Play_SudoPut(t *testing.T) {
+ var (
+ baseDir = `testdata/play`
+ scriptDir = filepath.Join(baseDir, `awwanssh.test`)
+ scriptFile = filepath.Join(scriptDir, `put.aww`)
+
+ tdata *test.Data
+ aww *Awwan
+ err error
+ )
+
+ tdata, err = test.LoadData(filepath.Join(scriptDir, `put_test.data`))
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ aww, err = New(baseDir)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ var cases = []testCaseGetPut{{
+ desc: `WithMode`,
+ lineRange: `14`,
+ fileDest: `/home/awwanssh/sudoput_with_mode.txt`,
+ expContent: string(tdata.Output[`plain.txt`]),
+ expMode: 0604,
+ }, {
+ desc: `WithOwner`,
+ lineRange: `16`,
+ fileDest: `/home/awwanssh/sudoput_with_owner.txt`,
+ expContent: string(tdata.Output[`plain.txt`]),
+ expMode: 0600,
+ }, {
+ desc: `WithOwnerAndMode`,
+ lineRange: `18`,
+ fileDest: `/home/awwanssh/sudoput_with_owner_mode.txt`,
+ expContent: string(tdata.Output[`plain.txt`]),
+ expMode: 0602,
+ }}
+
+ var (
+ c testCaseGetPut
+ fi os.FileInfo
+ gotContent []byte
+ )
+
+ for _, c = range cases {
+ t.Log(c.desc)
+
+ if len(c.fileDest) != 0 {
+ _ = os.Remove(c.fileDest)
+ }
+
+ var req = NewRequest(CommandModePlay, scriptFile, c.lineRange)
+
+ err = aww.Play(req)
+ if err != nil {
+ test.Assert(t, `play error`, c.expError, err.Error())
+ }
+
+ if len(c.fileDest) == 0 {
+ continue
+ }
+
+ // File successfully copied but maybe error when setting
+ // owner or permission.
+
+ gotContent, err = os.ReadFile(c.fileDest)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ test.Assert(t, `content`, c.expContent, string(gotContent))
+
+ fi, err = os.Stat(c.fileDest)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ test.Assert(t, `mode`, c.expMode, fi.Mode().Perm())
+ }
+}