blob: 93c189577e23d1baae4babaf1cb1f3a0a0b394e2 [file] [log] [blame]
package tests
import (
"io/ioutil"
"os"
"strings"
"testing"
scp "github.com/bramvdbogaerde/go-scp"
"github.com/bramvdbogaerde/go-scp/auth"
"golang.org/x/crypto/ssh"
)
func establishConnection(t *testing.T) scp.Client {
// Use SSH key authentication from the auth package.
// During testing we ignore the host key, don't to that when you use this.
clientConfig, _ := auth.PasswordKey("bram", "test", ssh.InsecureIgnoreHostKey())
// Create a new SCP client.
client := scp.NewClient("127.0.0.1:2244", &clientConfig)
// Connect to the remote server.
err := client.Connect()
if err != nil {
t.Fatalf("Couldn't establish a connection to the remote server: %s", err)
}
return client
}
// TestCopy tests the basic functionality of copying a file to the remote
// destination.
//
// It assumes that a Docker container is running an SSH server at port 2244
// that is using password authentication. It also assumes that the directory
// /data is writable within that container and is mapped to ./tmp/ within the
// directory the test is run from.
func TestCopy(t *testing.T) {
client := establishConnection(t)
defer client.Close()
// Open a file we can transfer to the remote container.
f, _ := os.Open("./data/upload_file.txt")
defer f.Close()
// Create a file name with exotic characters and spaces in them.
// If this test works for this, simpler files should not be a problem.
filename := "Exöt1ç uploaded file.txt"
// Finaly, copy the file over.
// Usage: CopyFile(fileReader, remotePath, permission).
err := client.CopyFile(f, "/data/"+filename, "0777")
if err != nil {
t.Errorf("Error while copying file: %s", err)
}
// Read what the receiver have written to disk.
content, err := ioutil.ReadFile("./tmp/" + filename)
if err != nil {
t.Errorf("Result file could not be read: %s", err)
}
text := string(content)
expected := "It Works\n"
if strings.Compare(text, expected) != 0 {
t.Errorf("Got different text than expected, expected %q got, %q", expected, text)
}
}
// TestDownloadFile tests the basic functionality of copying a file from the
// remote destination.
//
// It assumes that a Docker container is running an SSH server at port 2244
// that is using password authentication. It also assumes that the directory
// /data is writable within that container and is mapped to ./tmp/ within the
// directory the test is run from.
func TestDownloadFile(t *testing.T) {
client := establishConnection(t)
defer client.Close()
// Open a file we can transfer to the remote container.
f, _ := os.Open("./data/input.txt")
defer f.Close()
// Create a local file to write to.
f, err := os.OpenFile("./tmp/output.txt", os.O_RDWR|os.O_CREATE, 0777)
if err != nil {
t.Errorf("Couldn't open the output file")
}
defer f.Close()
// Use a file name with exotic characters and spaces in them.
// If this test works for this, simpler files should not be a problem.
err = client.CopyFromRemote(f, "/input/Exöt1ç download file.txt.txt")
if err != nil {
t.Errorf("Copy failed from remote")
}
content, err := ioutil.ReadFile("./tmp/output.txt")
if err != nil {
t.Errorf("Result file could not be read: %s", err)
}
text := string(content)
expected := "It works for download!\n"
if strings.Compare(text, expected) != 0 {
t.Errorf("Got different text than expected, expected %q got, %q", expected, text)
}
}