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 }