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  }