diff options
| author | Shulhan <ms@kilabit.info> | 2023-10-21 19:52:17 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2023-10-21 19:59:10 +0700 |
| commit | f1cdc424327be91cfdbeb35449275cd8582bba8d (patch) | |
| tree | 5d350edefd9a17400179252a1018be7004988fe7 /awwan_play_test.go | |
| parent | 143e4c8c6825884ae864563b93689200a55c2d49 (diff) | |
| download | awwan-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.go | 182 |
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()) + } +} |
