github.com/jhixson74/hashicorp-terraform@v0.11.12-beta1/communicator/communicator_mock.go (about)

     1  package communicator
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"io"
     7  	"strings"
     8  	"time"
     9  
    10  	"github.com/hashicorp/terraform/communicator/remote"
    11  	"github.com/hashicorp/terraform/terraform"
    12  )
    13  
    14  // MockCommunicator is an implementation of Communicator that can be used for tests.
    15  type MockCommunicator struct {
    16  	RemoteScriptPath string
    17  	Commands         map[string]bool
    18  	Uploads          map[string]string
    19  	UploadScripts    map[string]string
    20  	UploadDirs       map[string]string
    21  	CommandFunc      func(*remote.Cmd) error
    22  	DisconnectFunc   func() error
    23  	ConnTimeout      time.Duration
    24  }
    25  
    26  // Connect implementation of communicator.Communicator interface
    27  func (c *MockCommunicator) Connect(o terraform.UIOutput) error {
    28  	return nil
    29  }
    30  
    31  // Disconnect implementation of communicator.Communicator interface
    32  func (c *MockCommunicator) Disconnect() error {
    33  	if c.DisconnectFunc != nil {
    34  		return c.DisconnectFunc()
    35  	}
    36  	return nil
    37  }
    38  
    39  // Timeout implementation of communicator.Communicator interface
    40  func (c *MockCommunicator) Timeout() time.Duration {
    41  	if c.ConnTimeout != 0 {
    42  		return c.ConnTimeout
    43  	}
    44  	return time.Duration(5 * time.Second)
    45  }
    46  
    47  // ScriptPath implementation of communicator.Communicator interface
    48  func (c *MockCommunicator) ScriptPath() string {
    49  	return c.RemoteScriptPath
    50  }
    51  
    52  // Start implementation of communicator.Communicator interface
    53  func (c *MockCommunicator) Start(r *remote.Cmd) error {
    54  	r.Init()
    55  
    56  	if c.CommandFunc != nil {
    57  		return c.CommandFunc(r)
    58  	}
    59  
    60  	if !c.Commands[r.Command] {
    61  		return fmt.Errorf("Command not found!")
    62  	}
    63  
    64  	r.SetExitStatus(0, nil)
    65  
    66  	return nil
    67  }
    68  
    69  // Upload implementation of communicator.Communicator interface
    70  func (c *MockCommunicator) Upload(path string, input io.Reader) error {
    71  	f, ok := c.Uploads[path]
    72  	if !ok {
    73  		return fmt.Errorf("Path %q not found!", path)
    74  	}
    75  
    76  	var buf bytes.Buffer
    77  	buf.ReadFrom(input)
    78  	content := strings.TrimSpace(buf.String())
    79  
    80  	f = strings.TrimSpace(f)
    81  	if f != content {
    82  		return fmt.Errorf("expected: %q\n\ngot: %q\n", f, content)
    83  	}
    84  
    85  	return nil
    86  }
    87  
    88  // UploadScript implementation of communicator.Communicator interface
    89  func (c *MockCommunicator) UploadScript(path string, input io.Reader) error {
    90  	c.Uploads = c.UploadScripts
    91  	return c.Upload(path, input)
    92  }
    93  
    94  // UploadDir implementation of communicator.Communicator interface
    95  func (c *MockCommunicator) UploadDir(dst string, src string) error {
    96  	v, ok := c.UploadDirs[src]
    97  	if !ok {
    98  		return fmt.Errorf("Directory not found!")
    99  	}
   100  
   101  	if v != dst {
   102  		return fmt.Errorf("expected: %q\n\ngot: %q\n", v, dst)
   103  	}
   104  
   105  	return nil
   106  }