github.com/HashDataInc/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  }