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