github.phpd.cn/hashicorp/packer@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 }