github.com/phobos182/packer@v0.2.3-0.20130819023704-c84d2aeffc68/provisioner/file/provisioner_test.go (about)

     1  package file
     2  
     3  import (
     4  	"github.com/mitchellh/packer/packer"
     5  	"io"
     6  	"io/ioutil"
     7  	"os"
     8  	"strings"
     9  	"testing"
    10  )
    11  
    12  func testConfig() map[string]interface{} {
    13  	return map[string]interface{}{
    14  		"destination": "something",
    15  	}
    16  }
    17  
    18  func TestProvisioner_Impl(t *testing.T) {
    19  	var raw interface{}
    20  	raw = &Provisioner{}
    21  	if _, ok := raw.(packer.Provisioner); !ok {
    22  		t.Fatalf("must be a provisioner")
    23  	}
    24  }
    25  
    26  func TestProvisionerPrepare_InvalidKey(t *testing.T) {
    27  	var p Provisioner
    28  	config := testConfig()
    29  
    30  	// Add a random key
    31  	config["i_should_not_be_valid"] = true
    32  	err := p.Prepare(config)
    33  	if err == nil {
    34  		t.Fatal("should have error")
    35  	}
    36  }
    37  
    38  func TestProvisionerPrepare_InvalidSource(t *testing.T) {
    39  	var p Provisioner
    40  	config := testConfig()
    41  	config["source"] = "/this/should/not/exist"
    42  
    43  	err := p.Prepare(config)
    44  	if err == nil {
    45  		t.Fatalf("should require existing file")
    46  	}
    47  }
    48  
    49  func TestProvisionerPrepare_ValidSource(t *testing.T) {
    50  	var p Provisioner
    51  
    52  	tf, err := ioutil.TempFile("", "packer")
    53  	if err != nil {
    54  		t.Fatalf("error tempfile: %s", err)
    55  	}
    56  	defer os.Remove(tf.Name())
    57  
    58  	config := testConfig()
    59  	config["source"] = tf.Name()
    60  
    61  	err = p.Prepare(config)
    62  	if err != nil {
    63  		t.Fatalf("should allow valid file: %s", err)
    64  	}
    65  }
    66  
    67  func TestProvisionerPrepare_EmptyDestination(t *testing.T) {
    68  	var p Provisioner
    69  
    70  	config := testConfig()
    71  	delete(config, "destination")
    72  	err := p.Prepare(config)
    73  	if err == nil {
    74  		t.Fatalf("should require destination path")
    75  	}
    76  }
    77  
    78  type stubUploadCommunicator struct {
    79  	dest string
    80  	data []byte
    81  }
    82  
    83  func (suc *stubUploadCommunicator) Download(src string, data io.Writer) error {
    84  	return nil
    85  }
    86  
    87  func (suc *stubUploadCommunicator) Upload(dest string, data io.Reader) error {
    88  	var err error
    89  	suc.dest = dest
    90  	suc.data, err = ioutil.ReadAll(data)
    91  	return err
    92  }
    93  
    94  func (suc *stubUploadCommunicator) Start(cmd *packer.RemoteCmd) error {
    95  	return nil
    96  }
    97  
    98  type stubUi struct {
    99  	sayMessages string
   100  }
   101  
   102  func (su *stubUi) Ask(string) (string, error) {
   103  	return "", nil
   104  }
   105  
   106  func (su *stubUi) Error(string) {
   107  }
   108  
   109  func (su *stubUi) Machine(string, ...string) {
   110  }
   111  
   112  func (su *stubUi) Message(string) {
   113  }
   114  
   115  func (su *stubUi) Say(msg string) {
   116  	su.sayMessages += msg
   117  }
   118  
   119  func TestProvisionerProvision_SendsFile(t *testing.T) {
   120  	var p Provisioner
   121  	tf, err := ioutil.TempFile("", "packer")
   122  	if err != nil {
   123  		t.Fatalf("error tempfile: %s", err)
   124  	}
   125  	defer os.Remove(tf.Name())
   126  
   127  	if _, err = tf.Write([]byte("hello")); err != nil {
   128  		t.Fatalf("error writing tempfile: %s", err)
   129  	}
   130  
   131  	config := map[string]interface{}{
   132  		"source":      tf.Name(),
   133  		"destination": "something",
   134  	}
   135  
   136  	if err := p.Prepare(config); err != nil {
   137  		t.Fatalf("err: %s", err)
   138  	}
   139  
   140  	ui := &stubUi{}
   141  	comm := &stubUploadCommunicator{}
   142  	err = p.Provision(ui, comm)
   143  	if err != nil {
   144  		t.Fatalf("should successfully provision: %s", err)
   145  	}
   146  
   147  	if !strings.Contains(ui.sayMessages, tf.Name()) {
   148  		t.Fatalf("should print source filename")
   149  	}
   150  
   151  	if !strings.Contains(ui.sayMessages, "something") {
   152  		t.Fatalf("should print destination filename")
   153  	}
   154  
   155  	if comm.dest != "something" {
   156  		t.Fatalf("should upload to configured destination")
   157  	}
   158  
   159  	if string(comm.data) != "hello" {
   160  		t.Fatalf("should upload with source file's data")
   161  	}
   162  }