gopkg.in/hashicorp/packer.v1@v1.3.2/provisioner/file/provisioner_test.go (about)

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