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  }