github.com/amanya/packer@v0.12.1-0.20161117214323-902ac5ab2eb6/provisioner/file/provisioner_test.go (about)

     1  package file
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"path/filepath"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/mitchellh/packer/packer"
    11  )
    12  
    13  func testConfig() map[string]interface{} {
    14  	return map[string]interface{}{
    15  		"destination": "something",
    16  	}
    17  }
    18  
    19  func TestProvisioner_Impl(t *testing.T) {
    20  	var raw interface{}
    21  	raw = &Provisioner{}
    22  	if _, ok := raw.(packer.Provisioner); !ok {
    23  		t.Fatalf("must be a provisioner")
    24  	}
    25  }
    26  
    27  func TestProvisionerPrepare_InvalidKey(t *testing.T) {
    28  	var p Provisioner
    29  	config := testConfig()
    30  
    31  	// Add a random key
    32  	config["i_should_not_be_valid"] = true
    33  	err := p.Prepare(config)
    34  	if err == nil {
    35  		t.Fatal("should have error")
    36  	}
    37  }
    38  
    39  func TestProvisionerPrepare_InvalidSource(t *testing.T) {
    40  	var p Provisioner
    41  	config := testConfig()
    42  	config["source"] = "/this/should/not/exist"
    43  
    44  	err := p.Prepare(config)
    45  	if err == nil {
    46  		t.Fatalf("should require existing file")
    47  	}
    48  }
    49  
    50  func TestProvisionerPrepare_ValidSource(t *testing.T) {
    51  	var p Provisioner
    52  
    53  	tf, err := ioutil.TempFile("", "packer")
    54  	if err != nil {
    55  		t.Fatalf("error tempfile: %s", err)
    56  	}
    57  	defer os.Remove(tf.Name())
    58  
    59  	config := testConfig()
    60  	config["source"] = tf.Name()
    61  
    62  	err = p.Prepare(config)
    63  	if err != nil {
    64  		t.Fatalf("should allow valid file: %s", err)
    65  	}
    66  }
    67  
    68  func TestProvisionerPrepare_EmptyDestination(t *testing.T) {
    69  	var p Provisioner
    70  
    71  	config := testConfig()
    72  	delete(config, "destination")
    73  	err := p.Prepare(config)
    74  	if err == nil {
    75  		t.Fatalf("should require destination path")
    76  	}
    77  }
    78  
    79  type stubUi struct {
    80  	sayMessages string
    81  }
    82  
    83  func (su *stubUi) Ask(string) (string, error) {
    84  	return "", nil
    85  }
    86  
    87  func (su *stubUi) Error(string) {
    88  }
    89  
    90  func (su *stubUi) Machine(string, ...string) {
    91  }
    92  
    93  func (su *stubUi) Message(string) {
    94  }
    95  
    96  func (su *stubUi) Say(msg string) {
    97  	su.sayMessages += msg
    98  }
    99  
   100  func TestProvisionerProvision_SendsFile(t *testing.T) {
   101  	var p Provisioner
   102  	tf, err := ioutil.TempFile("", "packer")
   103  	if err != nil {
   104  		t.Fatalf("error tempfile: %s", err)
   105  	}
   106  	defer os.Remove(tf.Name())
   107  
   108  	if _, err = tf.Write([]byte("hello")); err != nil {
   109  		t.Fatalf("error writing tempfile: %s", err)
   110  	}
   111  
   112  	config := map[string]interface{}{
   113  		"source":      tf.Name(),
   114  		"destination": "something",
   115  	}
   116  
   117  	if err := p.Prepare(config); err != nil {
   118  		t.Fatalf("err: %s", err)
   119  	}
   120  
   121  	ui := &stubUi{}
   122  	comm := &packer.MockCommunicator{}
   123  	err = p.Provision(ui, comm)
   124  	if err != nil {
   125  		t.Fatalf("should successfully provision: %s", err)
   126  	}
   127  
   128  	if !strings.Contains(ui.sayMessages, tf.Name()) {
   129  		t.Fatalf("should print source filename")
   130  	}
   131  
   132  	if !strings.Contains(ui.sayMessages, "something") {
   133  		t.Fatalf("should print destination filename")
   134  	}
   135  
   136  	if comm.UploadPath != "something" {
   137  		t.Fatalf("should upload to configured destination")
   138  	}
   139  
   140  	if comm.UploadData != "hello" {
   141  		t.Fatalf("should upload with source file's data")
   142  	}
   143  }
   144  
   145  func TestProvisionDownloadMkdirAll(t *testing.T) {
   146  	tests := []struct {
   147  		path string
   148  	}{
   149  		{"dir"},
   150  		{"dir/"},
   151  		{"dir/subdir"},
   152  		{"dir/subdir/"},
   153  		{"path/to/dir"},
   154  		{"path/to/dir/"},
   155  	}
   156  	tmpDir, err := ioutil.TempDir("", "packer-file")
   157  	if err != nil {
   158  		t.Fatalf("error tempdir: %s", err)
   159  	}
   160  	defer os.RemoveAll(tmpDir)
   161  	tf, err := ioutil.TempFile(tmpDir, "packer")
   162  	if err != nil {
   163  		t.Fatalf("error tempfile: %s", err)
   164  	}
   165  	defer os.Remove(tf.Name())
   166  
   167  	config := map[string]interface{}{
   168  		"source": tf.Name(),
   169  	}
   170  	var p Provisioner
   171  	for _, test := range tests {
   172  		path := filepath.Join(tmpDir, test.path)
   173  		config["destination"] = filepath.Join(path, "something")
   174  		if err := p.Prepare(config); err != nil {
   175  			t.Fatalf("err: %s", err)
   176  		}
   177  		ui := &stubUi{}
   178  		comm := &packer.MockCommunicator{}
   179  		err = p.ProvisionDownload(ui, comm)
   180  		if err != nil {
   181  			t.Fatalf("should successfully provision: %s", err)
   182  		}
   183  
   184  		if !strings.Contains(ui.sayMessages, tf.Name()) {
   185  			t.Fatalf("should print source filename")
   186  		}
   187  
   188  		if !strings.Contains(ui.sayMessages, "something") {
   189  			t.Fatalf("should print destination filename")
   190  		}
   191  
   192  		if _, err := os.Stat(path); err != nil {
   193  			t.Fatalf("stat of download dir should not error: %s", err)
   194  		}
   195  
   196  		if _, err := os.Stat(config["destination"].(string)); err != nil {
   197  			t.Fatalf("stat of destination file should not error: %s", err)
   198  		}
   199  	}
   200  }