diff options
| -rw-r--r-- | awwan_test.go | 133 | ||||
| -rw-r--r-- | session.go | 4 | ||||
| -rw-r--r-- | testdata/encrypt/encrypted.txt.org (renamed from testdata/encrypt/file.txt.org) | 0 | ||||
| -rw-r--r-- | testdata/encrypt/encrypted.txt.vault (renamed from testdata/encrypt/file.txt.vault) | 0 | ||||
| -rw-r--r-- | testdata/encrypt/local.aww | 4 | ||||
| -rw-r--r-- | testdata/encrypt/plain.txt | 2 | ||||
| -rw-r--r-- | testdata/encrypt/test.data | 6 | ||||
| -rw-r--r-- | testdata/encrypt/tmp/.gitignore | 2 |
8 files changed, 81 insertions, 70 deletions
diff --git a/awwan_test.go b/awwan_test.go index 7973325..77e64ec 100644 --- a/awwan_test.go +++ b/awwan_test.go @@ -214,16 +214,15 @@ func TestAwwanLocal_withEncryption(t *testing.T) { } } -func TestAwwanLocalPut_withEncryption(t *testing.T) { +func TestAwwanLocalPut(t *testing.T) { type testCase struct { - desc string - tdataOut string - passphrase string - expError string - - // If true, the Awwan.cryptoc.privateKey will be set to nil - // before running Local. - resetPrivateKey bool + desc string + passphrase string + lineRange string + fileDest string + tdataStdout string + tdataFileOut string + expError string } // Load the test data output. @@ -238,84 +237,82 @@ func TestAwwanLocalPut_withEncryption(t *testing.T) { t.Fatal(err) } - // Create the Awwan instance. + var cases = []testCase{{ + desc: `With text file`, + lineRange: `3`, + fileDest: filepath.Join(baseDir, `tmp`, `plain.txt`), + tdataFileOut: `tmp/plain.txt`, + }, { + desc: `With encrypted file`, + lineRange: `5`, + fileDest: filepath.Join(baseDir, `tmp`, `decrypted.txt`), + tdataFileOut: `tmp/decrypted.txt`, + passphrase: "s3cret\r", + }, { + desc: `With encrypted file, empty passphrase`, + expError: "!!! Copy: generateFileInput: private key is missing or not loaded\n", + lineRange: `5`, + }, { + desc: `With encrypted file, invalid passphrase`, + passphrase: "invalid\r", + lineRange: `5`, + expError: `Local: NewSession: loadEnvFromPaths: LoadPrivateKeyInteractive: x509: decryption password incorrect`, + }} + var ( + script = filepath.Join(baseDir, `local.aww`) mockout = bytes.Buffer{} mockerr = bytes.Buffer{} mockrw = mock.ReadWriter{} - aww = Awwan{} - ) - - err = aww.init(baseDir) - if err != nil { - t.Fatal(err) - } - - // Mock terminal to read passphrase for private key. - mockrw.BufRead.WriteString("s3cret\r") - aww.cryptoc.termrw = &mockrw - - var ( - script = filepath.Join(baseDir, `local.aww`) - lineRange = `3` - fileDest = filepath.Join(baseDir, `file.txt.decrypted`) - - cases = []testCase{{ - desc: `WithSuccess`, - tdataOut: `local.aww:3:exp_file_content`, - }, { - desc: `WithEmptyPrivateKey`, - expError: `Local: NewSession: loadEnvFromPaths: private key is missing or not loaded`, - resetPrivateKey: true, - }, { - desc: `WithInvalidPassphrase`, - passphrase: "invalid\r", - expError: `Local: NewSession: loadEnvFromPaths: LoadPrivateKeyInteractive: x509: decryption password incorrect`, - resetPrivateKey: true, - }} + aww *Awwan c testCase - expContent string + expContent []byte gotContent []byte ) for _, c = range cases { - t.Run(c.desc, func(tt *testing.T) { - _ = os.Remove(fileDest) + t.Log(c.desc) - if c.resetPrivateKey { - aww.cryptoc.privateKey = nil + aww, err = New(baseDir) + if err != nil { + t.Fatal(err) + } - // Mock terminal to read passphrase for private key. - mockrw.BufRead.Reset() - mockrw.BufRead.WriteString(c.passphrase) - } + // Mock terminal to read passphrase for private key. + mockrw.BufRead.Reset() + mockrw.BufRead.WriteString(c.passphrase) + aww.cryptoc.termrw = &mockrw - var req = NewRequest(CommandModeLocal, script, lineRange) + if len(c.fileDest) != 0 { + _ = os.Remove(c.fileDest) + } - mockout.Reset() - mockerr.Reset() - req.stdout = &mockout - req.stderr = &mockerr + var req = NewRequest(CommandModeLocal, script, c.lineRange) - err = aww.Local(req) - if err != nil { - test.Assert(tt, c.desc, c.expError, err.Error()) - return - } + mockout.Reset() + mockerr.Reset() + req.stdout = &mockout + req.stderr = &mockerr + + err = aww.Local(req) + if err != nil { + test.Assert(t, c.desc, c.expError, err.Error()) + return + } - // We cannot assert the stdout since its print dynamic - // paths. + // The stdout cannot be asserted since its print dynamic + // paths. - test.Assert(tt, `stderr`, ``, mockerr.String()) + test.Assert(t, `stderr`, c.expError, mockerr.String()) - gotContent, err = os.ReadFile(fileDest) + if len(c.fileDest) != 0 { + gotContent, err = os.ReadFile(c.fileDest) if err != nil { - tt.Fatal(err) + t.Fatal(err) } - expContent = string(tdata.Output[c.tdataOut]) - - test.Assert(tt, `content`, expContent, string(gotContent)) - }) + expContent = tdata.Output[c.tdataFileOut] + test.Assert(t, `content`, string(expContent), string(gotContent)) + } } } @@ -567,6 +567,10 @@ func (ses *Session) loadEnvFromPaths() (err error) { err = ses.loadFileEnv(awwanEnv, true) if err != nil { + if errors.Is(err, errPrivateKeyMissing) { + log.Printf(`%s: %s: %s`, logp, awwanEnv, err) + continue + } return fmt.Errorf(`%s: %w`, logp, err) } } diff --git a/testdata/encrypt/file.txt.org b/testdata/encrypt/encrypted.txt.org index de6797e..de6797e 100644 --- a/testdata/encrypt/file.txt.org +++ b/testdata/encrypt/encrypted.txt.org diff --git a/testdata/encrypt/file.txt.vault b/testdata/encrypt/encrypted.txt.vault index 43cb223..43cb223 100644 --- a/testdata/encrypt/file.txt.vault +++ b/testdata/encrypt/encrypted.txt.vault diff --git a/testdata/encrypt/local.aww b/testdata/encrypt/local.aww index 31e737d..a77ec42 100644 --- a/testdata/encrypt/local.aww +++ b/testdata/encrypt/local.aww @@ -1,3 +1,5 @@ echo {{.Val "secret::pass"}} -#put: {{.ScriptDir}}/file.txt {{.ScriptDir}}/file.txt.decrypted +#put: {{.ScriptDir}}/plain.txt {{.ScriptDir}}/tmp/plain.txt + +#put: {{.ScriptDir}}/encrypted.txt {{.ScriptDir}}/tmp/decrypted.txt diff --git a/testdata/encrypt/plain.txt b/testdata/encrypt/plain.txt new file mode 100644 index 0000000..de6797e --- /dev/null +++ b/testdata/encrypt/plain.txt @@ -0,0 +1,2 @@ +The host name is {{.Val "host::name"}}. +The secret password is {{.Val "secret::pass"}}. diff --git a/testdata/encrypt/test.data b/testdata/encrypt/test.data index 40ad1de..330e646 100644 --- a/testdata/encrypt/test.data +++ b/testdata/encrypt/test.data @@ -8,6 +8,10 @@ this_is_a_secret --> local: 1: echo this_is_a_secret_in_sub this_is_a_secret_in_sub -<<< local.aww:3:exp_file_content +<<< tmp/plain.txt +The host name is encrypt. +The secret password is . + +<<< tmp/decrypted.txt The host name is encrypt. The secret password is this_is_a_secret. diff --git a/testdata/encrypt/tmp/.gitignore b/testdata/encrypt/tmp/.gitignore new file mode 100644 index 0000000..120f485 --- /dev/null +++ b/testdata/encrypt/tmp/.gitignore @@ -0,0 +1,2 @@ +* +!/.gitignore |
