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 }