github.com/mmcquillan/packer@v1.1.1-0.20171009221028-c85cf0483a5d/communicator/winrm/communicator_test.go (about) 1 package winrm 2 3 import ( 4 "bytes" 5 "io" 6 "strings" 7 "testing" 8 "time" 9 10 "github.com/dylanmei/winrmtest" 11 "github.com/hashicorp/packer/packer" 12 ) 13 14 const PAYLOAD = "stuff" 15 const BASE64_ENCODED_PAYLOAD = "c3R1ZmY=" 16 17 func newMockWinRMServer(t *testing.T) *winrmtest.Remote { 18 wrm := winrmtest.NewRemote() 19 20 wrm.CommandFunc( 21 winrmtest.MatchText("echo foo"), 22 func(out, err io.Writer) int { 23 out.Write([]byte("foo")) 24 return 0 25 }) 26 27 wrm.CommandFunc( 28 winrmtest.MatchPattern(`^echo c29tZXRoaW5n >> ".*"$`), 29 func(out, err io.Writer) int { 30 return 0 31 }) 32 33 wrm.CommandFunc( 34 winrmtest.MatchPattern(`^echo `+BASE64_ENCODED_PAYLOAD+` >> ".*"$`), 35 func(out, err io.Writer) int { 36 return 0 37 }) 38 39 wrm.CommandFunc( 40 winrmtest.MatchPattern(`^powershell.exe -EncodedCommand .*$`), 41 func(out, err io.Writer) int { 42 out.Write([]byte(BASE64_ENCODED_PAYLOAD)) 43 return 0 44 }) 45 46 wrm.CommandFunc( 47 winrmtest.MatchText("powershell"), 48 func(out, err io.Writer) int { 49 return 0 50 }) 51 52 return wrm 53 } 54 55 func TestStart(t *testing.T) { 56 wrm := newMockWinRMServer(t) 57 defer wrm.Close() 58 59 c, err := New(&Config{ 60 Host: wrm.Host, 61 Port: wrm.Port, 62 Username: "user", 63 Password: "pass", 64 Timeout: 30 * time.Second, 65 }) 66 if err != nil { 67 t.Fatalf("error creating communicator: %s", err) 68 } 69 70 var cmd packer.RemoteCmd 71 stdout := new(bytes.Buffer) 72 cmd.Command = "echo foo" 73 cmd.Stdout = stdout 74 75 err = c.Start(&cmd) 76 if err != nil { 77 t.Fatalf("error executing remote command: %s", err) 78 } 79 cmd.Wait() 80 81 if stdout.String() != "foo" { 82 t.Fatalf("bad command response: expected %q, got %q", "foo", stdout.String()) 83 } 84 } 85 86 func TestUpload(t *testing.T) { 87 wrm := newMockWinRMServer(t) 88 defer wrm.Close() 89 90 c, err := New(&Config{ 91 Host: wrm.Host, 92 Port: wrm.Port, 93 Username: "user", 94 Password: "pass", 95 Timeout: 30 * time.Second, 96 }) 97 if err != nil { 98 t.Fatalf("error creating communicator: %s", err) 99 } 100 file := "C:/Temp/packer.cmd" 101 err = c.Upload(file, strings.NewReader(PAYLOAD), nil) 102 if err != nil { 103 t.Fatalf("error uploading file: %s", err) 104 } 105 106 dest := new(bytes.Buffer) 107 err = c.Download(file, dest) 108 if err != nil { 109 t.Fatalf("error downloading file: %s", err) 110 } 111 downloadedPayload := dest.String() 112 113 if downloadedPayload != PAYLOAD { 114 t.Fatalf("files are not equal: expected [%s] length: %v, got [%s] length %v", PAYLOAD, len(PAYLOAD), downloadedPayload, len(downloadedPayload)) 115 } 116 117 }