github.com/homburg/packer@v0.6.1-0.20140528012651-1dcaf1716848/packer/communicator_mock.go (about) 1 package packer 2 3 import ( 4 "bytes" 5 "io" 6 "sync" 7 ) 8 9 // MockCommunicator is a valid Communicator implementation that can be 10 // used for tests. 11 type MockCommunicator struct { 12 StartCalled bool 13 StartCmd *RemoteCmd 14 StartStderr string 15 StartStdout string 16 StartStdin string 17 StartExitStatus int 18 19 UploadCalled bool 20 UploadPath string 21 UploadData string 22 23 UploadDirDst string 24 UploadDirSrc string 25 UploadDirExclude []string 26 27 DownloadCalled bool 28 DownloadPath string 29 DownloadData string 30 } 31 32 func (c *MockCommunicator) Start(rc *RemoteCmd) error { 33 c.StartCalled = true 34 c.StartCmd = rc 35 36 go func() { 37 var wg sync.WaitGroup 38 if rc.Stdout != nil && c.StartStdout != "" { 39 wg.Add(1) 40 go func() { 41 rc.Stdout.Write([]byte(c.StartStdout)) 42 wg.Done() 43 }() 44 } 45 46 if rc.Stderr != nil && c.StartStderr != "" { 47 wg.Add(1) 48 go func() { 49 rc.Stderr.Write([]byte(c.StartStderr)) 50 wg.Done() 51 }() 52 } 53 54 if rc.Stdin != nil { 55 wg.Add(1) 56 go func() { 57 defer wg.Done() 58 var data bytes.Buffer 59 io.Copy(&data, rc.Stdin) 60 c.StartStdin = data.String() 61 }() 62 } 63 64 wg.Wait() 65 rc.SetExited(c.StartExitStatus) 66 }() 67 68 return nil 69 } 70 71 func (c *MockCommunicator) Upload(path string, r io.Reader) error { 72 c.UploadCalled = true 73 c.UploadPath = path 74 75 var data bytes.Buffer 76 if _, err := io.Copy(&data, r); err != nil { 77 panic(err) 78 } 79 80 c.UploadData = data.String() 81 82 return nil 83 } 84 85 func (c *MockCommunicator) UploadDir(dst string, src string, excl []string) error { 86 c.UploadDirDst = dst 87 c.UploadDirSrc = src 88 c.UploadDirExclude = excl 89 90 return nil 91 } 92 93 func (c *MockCommunicator) Download(path string, w io.Writer) error { 94 c.DownloadCalled = true 95 c.DownloadPath = path 96 w.Write([]byte(c.DownloadData)) 97 98 return nil 99 }