github.com/StackPointCloud/packer@v0.10.2-0.20180716202532-b28098e0f79b/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/hashicorp/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  	config["generated"] = false
    50  	err = p.Prepare(config)
    51  	if err == nil {
    52  		t.Fatalf("should required existing file")
    53  	}
    54  }
    55  
    56  func TestProvisionerPrepare_ValidSource(t *testing.T) {
    57  	var p Provisioner
    58  
    59  	tf, err := ioutil.TempFile("", "packer")
    60  	if err != nil {
    61  		t.Fatalf("error tempfile: %s", err)
    62  	}
    63  	defer os.Remove(tf.Name())
    64  
    65  	config := testConfig()
    66  	config["source"] = tf.Name()
    67  	err = p.Prepare(config)
    68  	if err != nil {
    69  		t.Fatalf("should allow valid file: %s", err)
    70  	}
    71  
    72  	config["generated"] = false
    73  	err = p.Prepare(config)
    74  	if err != nil {
    75  		t.Fatalf("should allow valid file: %s", err)
    76  	}
    77  }
    78  
    79  func TestProvisionerPrepare_GeneratedSource(t *testing.T) {
    80  	var p Provisioner
    81  
    82  	config := testConfig()
    83  	config["source"] = "/this/should/not/exist"
    84  	config["generated"] = true
    85  	err := p.Prepare(config)
    86  	if err != nil {
    87  		t.Fatalf("should allow non-existing file: %s", err)
    88  	}
    89  }
    90  
    91  func TestProvisionerPrepare_EmptyDestination(t *testing.T) {
    92  	var p Provisioner
    93  
    94  	config := testConfig()
    95  	delete(config, "destination")
    96  	err := p.Prepare(config)
    97  	if err == nil {
    98  		t.Fatalf("should require destination path")
    99  	}
   100  }
   101  
   102  type stubUi struct {
   103  	sayMessages string
   104  }
   105  
   106  func (su *stubUi) Ask(string) (string, error) {
   107  	return "", nil
   108  }
   109  
   110  func (su *stubUi) Error(string) {
   111  }
   112  
   113  func (su *stubUi) Machine(string, ...string) {
   114  }
   115  
   116  func (su *stubUi) Message(string) {
   117  }
   118  
   119  func (su *stubUi) Say(msg string) {
   120  	su.sayMessages += msg
   121  }
   122  
   123  func TestProvisionerProvision_SendsFile(t *testing.T) {
   124  	var p Provisioner
   125  	tf, err := ioutil.TempFile("", "packer")
   126  	if err != nil {
   127  		t.Fatalf("error tempfile: %s", err)
   128  	}
   129  	defer os.Remove(tf.Name())
   130  
   131  	if _, err = tf.Write([]byte("hello")); err != nil {
   132  		t.Fatalf("error writing tempfile: %s", err)
   133  	}
   134  
   135  	config := map[string]interface{}{
   136  		"source":      tf.Name(),
   137  		"destination": "something",
   138  	}
   139  
   140  	if err := p.Prepare(config); err != nil {
   141  		t.Fatalf("err: %s", err)
   142  	}
   143  
   144  	ui := &stubUi{}
   145  	comm := &packer.MockCommunicator{}
   146  	err = p.Provision(ui, comm)
   147  	if err != nil {
   148  		t.Fatalf("should successfully provision: %s", err)
   149  	}
   150  
   151  	if !strings.Contains(ui.sayMessages, tf.Name()) {
   152  		t.Fatalf("should print source filename")
   153  	}
   154  
   155  	if !strings.Contains(ui.sayMessages, "something") {
   156  		t.Fatalf("should print destination filename")
   157  	}
   158  
   159  	if comm.UploadPath != "something" {
   160  		t.Fatalf("should upload to configured destination")
   161  	}
   162  
   163  	if comm.UploadData != "hello" {
   164  		t.Fatalf("should upload with source file's data")
   165  	}
   166  }
   167  
   168  func TestProvisionDownloadMkdirAll(t *testing.T) {
   169  	tests := []struct {
   170  		path string
   171  	}{
   172  		{"dir"},
   173  		{"dir/"},
   174  		{"dir/subdir"},
   175  		{"dir/subdir/"},
   176  		{"path/to/dir"},
   177  		{"path/to/dir/"},
   178  	}
   179  	tmpDir, err := ioutil.TempDir("", "packer-file")
   180  	if err != nil {
   181  		t.Fatalf("error tempdir: %s", err)
   182  	}
   183  	defer os.RemoveAll(tmpDir)
   184  	tf, err := ioutil.TempFile(tmpDir, "packer")
   185  	if err != nil {
   186  		t.Fatalf("error tempfile: %s", err)
   187  	}
   188  	defer os.Remove(tf.Name())
   189  
   190  	config := map[string]interface{}{
   191  		"source": tf.Name(),
   192  	}
   193  	var p Provisioner
   194  	for _, test := range tests {
   195  		path := filepath.Join(tmpDir, test.path)
   196  		config["destination"] = filepath.Join(path, "something")
   197  		if err := p.Prepare(config); err != nil {
   198  			t.Fatalf("err: %s", err)
   199  		}
   200  		ui := &stubUi{}
   201  		comm := &packer.MockCommunicator{}
   202  		err = p.ProvisionDownload(ui, comm)
   203  		if err != nil {
   204  			t.Fatalf("should successfully provision: %s", err)
   205  		}
   206  
   207  		if !strings.Contains(ui.sayMessages, tf.Name()) {
   208  			t.Fatalf("should print source filename")
   209  		}
   210  
   211  		if !strings.Contains(ui.sayMessages, "something") {
   212  			t.Fatalf("should print destination filename")
   213  		}
   214  
   215  		if _, err := os.Stat(path); err != nil {
   216  			t.Fatalf("stat of download dir should not error: %s", err)
   217  		}
   218  
   219  		if _, err := os.Stat(config["destination"].(string)); err != nil {
   220  			t.Fatalf("stat of destination file should not error: %s", err)
   221  		}
   222  	}
   223  }