2013-05-28 21:02:14 -04:00
|
|
|
package packer
|
2013-06-03 13:49:23 -04:00
|
|
|
|
|
|
|
import (
|
2013-07-23 23:35:05 -04:00
|
|
|
"bytes"
|
|
|
|
"io"
|
|
|
|
"strings"
|
2013-06-03 13:49:23 -04:00
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
2013-07-23 23:35:05 -04:00
|
|
|
type TestCommunicator struct {
|
|
|
|
Stderr io.Reader
|
|
|
|
Stdout io.Reader
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *TestCommunicator) Start(rc *RemoteCmd) error {
|
|
|
|
go func() {
|
2013-08-21 13:16:20 -04:00
|
|
|
rc.Lock()
|
|
|
|
defer rc.Unlock()
|
|
|
|
|
2013-07-23 23:35:05 -04:00
|
|
|
if rc.Stdout != nil && c.Stdout != nil {
|
|
|
|
io.Copy(rc.Stdout, c.Stdout)
|
|
|
|
}
|
|
|
|
|
|
|
|
if rc.Stderr != nil && c.Stderr != nil {
|
|
|
|
io.Copy(rc.Stderr, c.Stderr)
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *TestCommunicator) Upload(string, io.Reader) error {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *TestCommunicator) Download(string, io.Writer) error {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestRemoteCmd_StartWithUi(t *testing.T) {
|
|
|
|
data := "hello\nworld\nthere"
|
|
|
|
|
2013-07-23 23:38:03 -04:00
|
|
|
originalOutput := new(bytes.Buffer)
|
2013-07-23 23:35:05 -04:00
|
|
|
rcOutput := new(bytes.Buffer)
|
|
|
|
uiOutput := new(bytes.Buffer)
|
|
|
|
rcOutput.WriteString(data)
|
|
|
|
|
|
|
|
testComm := &TestCommunicator{
|
|
|
|
Stdout: rcOutput,
|
|
|
|
}
|
|
|
|
|
2013-08-11 21:20:27 -04:00
|
|
|
testUi := &BasicUi{
|
2013-07-23 23:35:05 -04:00
|
|
|
Reader: new(bytes.Buffer),
|
|
|
|
Writer: uiOutput,
|
|
|
|
}
|
|
|
|
|
|
|
|
rc := &RemoteCmd{
|
|
|
|
Command: "test",
|
2013-07-23 23:38:03 -04:00
|
|
|
Stdout: originalOutput,
|
2013-07-23 23:35:05 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
2013-07-29 15:04:48 -04:00
|
|
|
rc.SetExited(0)
|
2013-07-23 23:35:05 -04:00
|
|
|
}()
|
|
|
|
|
|
|
|
err := rc.StartWithUi(testComm, testUi)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if uiOutput.String() != strings.TrimSpace(data)+"\n" {
|
|
|
|
t.Fatalf("bad output: '%s'", uiOutput.String())
|
|
|
|
}
|
2013-07-23 23:38:03 -04:00
|
|
|
|
|
|
|
if originalOutput.String() != data {
|
|
|
|
t.Fatalf("original is bad: '%s'", originalOutput.String())
|
|
|
|
}
|
2013-07-23 23:35:05 -04:00
|
|
|
}
|
|
|
|
|
2013-06-03 13:49:23 -04:00
|
|
|
func TestRemoteCmd_Wait(t *testing.T) {
|
|
|
|
var cmd RemoteCmd
|
|
|
|
|
|
|
|
result := make(chan bool)
|
|
|
|
go func() {
|
|
|
|
cmd.Wait()
|
|
|
|
result <- true
|
|
|
|
}()
|
|
|
|
|
2013-07-29 15:04:48 -04:00
|
|
|
cmd.SetExited(42)
|
2013-06-03 13:49:23 -04:00
|
|
|
|
|
|
|
select {
|
|
|
|
case <-result:
|
|
|
|
// Success
|
|
|
|
case <-time.After(500 * time.Millisecond):
|
|
|
|
t.Fatal("never got exit notification")
|
|
|
|
}
|
|
|
|
}
|