Add upload tests
These are skipped without the SSH_UPLOAD_TEST flag, since they require connecting to a running ssh server on localhost as the current user, and one creates a very large file.
This commit is contained in:
parent
e1f06e5d0f
commit
e6f58f5817
|
@ -3,9 +3,15 @@
|
|||
package ssh
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"math/rand"
|
||||
"net"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"strings"
|
||||
"testing"
|
||||
|
@ -165,6 +171,117 @@ func TestStart(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestAccUploadFile(t *testing.T) {
|
||||
// use the local ssh server and scp binary to check uploads
|
||||
if ok := os.Getenv("SSH_UPLOAD_TEST"); ok == "" {
|
||||
t.Log("Skipping Upload Acceptance without SSH_UPLOAD_TEST set")
|
||||
t.Skip()
|
||||
}
|
||||
|
||||
r := &terraform.InstanceState{
|
||||
Ephemeral: terraform.EphemeralState{
|
||||
ConnInfo: map[string]string{
|
||||
"type": "ssh",
|
||||
"user": os.Getenv("USER"),
|
||||
"host": "127.0.0.1",
|
||||
"port": "22",
|
||||
"timeout": "30s",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
c, err := New(r)
|
||||
if err != nil {
|
||||
t.Fatalf("error creating communicator: %s", err)
|
||||
}
|
||||
|
||||
tmpDir, err := ioutil.TempDir("", "communicator")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer os.RemoveAll(tmpDir)
|
||||
|
||||
content := []byte("this is the file content")
|
||||
source := bytes.NewReader(content)
|
||||
tmpFile := filepath.Join(tmpDir, "tempFile.out")
|
||||
err = c.Upload(tmpFile, source)
|
||||
if err != nil {
|
||||
t.Fatalf("error uploading file: %s", err)
|
||||
}
|
||||
|
||||
data, err := ioutil.ReadFile(tmpFile)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if !bytes.Equal(data, content) {
|
||||
t.Fatalf("bad: %s", data)
|
||||
}
|
||||
}
|
||||
|
||||
func TestAccHugeUploadFile(t *testing.T) {
|
||||
// use the local ssh server and scp binary to check uploads
|
||||
if ok := os.Getenv("SSH_UPLOAD_TEST"); ok == "" {
|
||||
t.Log("Skipping Upload Acceptance without SSH_UPLOAD_TEST set")
|
||||
t.Skip()
|
||||
}
|
||||
|
||||
r := &terraform.InstanceState{
|
||||
Ephemeral: terraform.EphemeralState{
|
||||
ConnInfo: map[string]string{
|
||||
"type": "ssh",
|
||||
"user": os.Getenv("USER"),
|
||||
"host": "127.0.0.1",
|
||||
"port": "22",
|
||||
"timeout": "30s",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
c, err := New(r)
|
||||
if err != nil {
|
||||
t.Fatalf("error creating communicator: %s", err)
|
||||
}
|
||||
|
||||
// copy 4GB of data, random to prevent compression.
|
||||
size := int64(1 << 32)
|
||||
source := io.LimitReader(rand.New(rand.NewSource(0)), size)
|
||||
|
||||
dest, err := ioutil.TempFile("", "communicator")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
destName := dest.Name()
|
||||
dest.Close()
|
||||
defer os.Remove(destName)
|
||||
|
||||
t.Log("Uploading to", destName)
|
||||
|
||||
// bypass the Upload method so we can directly supply the file size
|
||||
// preventing the extra copy of the huge file.
|
||||
targetDir := filepath.Dir(destName)
|
||||
targetFile := filepath.Base(destName)
|
||||
|
||||
scpFunc := func(w io.Writer, stdoutR *bufio.Reader) error {
|
||||
return scpUploadFile(targetFile, source, w, stdoutR, size)
|
||||
}
|
||||
|
||||
err = c.scpSession("scp -vt "+targetDir, scpFunc)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// check the final file size
|
||||
fs, err := os.Stat(destName)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if fs.Size() != size {
|
||||
t.Fatalf("expected file size of %d, got %d", size, fs.Size())
|
||||
}
|
||||
}
|
||||
|
||||
func TestScriptPath(t *testing.T) {
|
||||
cases := []struct {
|
||||
Input string
|
||||
|
|
Loading…
Reference in New Issue