github.com/phobos182/packer@v0.2.3-0.20130819023704-c84d2aeffc68/provisioner/file/provisioner_test.go (about) 1 package file 2 3 import ( 4 "github.com/mitchellh/packer/packer" 5 "io" 6 "io/ioutil" 7 "os" 8 "strings" 9 "testing" 10 ) 11 12 func testConfig() map[string]interface{} { 13 return map[string]interface{}{ 14 "destination": "something", 15 } 16 } 17 18 func TestProvisioner_Impl(t *testing.T) { 19 var raw interface{} 20 raw = &Provisioner{} 21 if _, ok := raw.(packer.Provisioner); !ok { 22 t.Fatalf("must be a provisioner") 23 } 24 } 25 26 func TestProvisionerPrepare_InvalidKey(t *testing.T) { 27 var p Provisioner 28 config := testConfig() 29 30 // Add a random key 31 config["i_should_not_be_valid"] = true 32 err := p.Prepare(config) 33 if err == nil { 34 t.Fatal("should have error") 35 } 36 } 37 38 func TestProvisionerPrepare_InvalidSource(t *testing.T) { 39 var p Provisioner 40 config := testConfig() 41 config["source"] = "/this/should/not/exist" 42 43 err := p.Prepare(config) 44 if err == nil { 45 t.Fatalf("should require existing file") 46 } 47 } 48 49 func TestProvisionerPrepare_ValidSource(t *testing.T) { 50 var p Provisioner 51 52 tf, err := ioutil.TempFile("", "packer") 53 if err != nil { 54 t.Fatalf("error tempfile: %s", err) 55 } 56 defer os.Remove(tf.Name()) 57 58 config := testConfig() 59 config["source"] = tf.Name() 60 61 err = p.Prepare(config) 62 if err != nil { 63 t.Fatalf("should allow valid file: %s", err) 64 } 65 } 66 67 func TestProvisionerPrepare_EmptyDestination(t *testing.T) { 68 var p Provisioner 69 70 config := testConfig() 71 delete(config, "destination") 72 err := p.Prepare(config) 73 if err == nil { 74 t.Fatalf("should require destination path") 75 } 76 } 77 78 type stubUploadCommunicator struct { 79 dest string 80 data []byte 81 } 82 83 func (suc *stubUploadCommunicator) Download(src string, data io.Writer) error { 84 return nil 85 } 86 87 func (suc *stubUploadCommunicator) Upload(dest string, data io.Reader) error { 88 var err error 89 suc.dest = dest 90 suc.data, err = ioutil.ReadAll(data) 91 return err 92 } 93 94 func (suc *stubUploadCommunicator) Start(cmd *packer.RemoteCmd) error { 95 return nil 96 } 97 98 type stubUi struct { 99 sayMessages string 100 } 101 102 func (su *stubUi) Ask(string) (string, error) { 103 return "", nil 104 } 105 106 func (su *stubUi) Error(string) { 107 } 108 109 func (su *stubUi) Machine(string, ...string) { 110 } 111 112 func (su *stubUi) Message(string) { 113 } 114 115 func (su *stubUi) Say(msg string) { 116 su.sayMessages += msg 117 } 118 119 func TestProvisionerProvision_SendsFile(t *testing.T) { 120 var p Provisioner 121 tf, err := ioutil.TempFile("", "packer") 122 if err != nil { 123 t.Fatalf("error tempfile: %s", err) 124 } 125 defer os.Remove(tf.Name()) 126 127 if _, err = tf.Write([]byte("hello")); err != nil { 128 t.Fatalf("error writing tempfile: %s", err) 129 } 130 131 config := map[string]interface{}{ 132 "source": tf.Name(), 133 "destination": "something", 134 } 135 136 if err := p.Prepare(config); err != nil { 137 t.Fatalf("err: %s", err) 138 } 139 140 ui := &stubUi{} 141 comm := &stubUploadCommunicator{} 142 err = p.Provision(ui, comm) 143 if err != nil { 144 t.Fatalf("should successfully provision: %s", err) 145 } 146 147 if !strings.Contains(ui.sayMessages, tf.Name()) { 148 t.Fatalf("should print source filename") 149 } 150 151 if !strings.Contains(ui.sayMessages, "something") { 152 t.Fatalf("should print destination filename") 153 } 154 155 if comm.dest != "something" { 156 t.Fatalf("should upload to configured destination") 157 } 158 159 if string(comm.data) != "hello" { 160 t.Fatalf("should upload with source file's data") 161 } 162 }