github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/plugin/resource_provisioner_test.go (about) 1 package plugin 2 3 import ( 4 "errors" 5 "reflect" 6 "testing" 7 8 "github.com/hashicorp/go-plugin" 9 "github.com/hashicorp/terraform/terraform" 10 ) 11 12 func TestResourceProvisioner_impl(t *testing.T) { 13 var _ plugin.Plugin = new(ResourceProvisionerPlugin) 14 var _ terraform.ResourceProvisioner = new(ResourceProvisioner) 15 } 16 17 func TestResourceProvisioner_stop(t *testing.T) { 18 // Create a mock provider 19 p := new(terraform.MockResourceProvisioner) 20 client, _ := plugin.TestPluginRPCConn(t, pluginMap(&ServeOpts{ 21 ProvisionerFunc: testProvisionerFixed(p), 22 })) 23 defer client.Close() 24 25 // Request the provider 26 raw, err := client.Dispense(ProvisionerPluginName) 27 if err != nil { 28 t.Fatalf("err: %s", err) 29 } 30 provider := raw.(terraform.ResourceProvisioner) 31 32 // Stop 33 e := provider.Stop() 34 if !p.StopCalled { 35 t.Fatal("stop should be called") 36 } 37 if e != nil { 38 t.Fatalf("bad: %#v", e) 39 } 40 } 41 42 func TestResourceProvisioner_stopErrors(t *testing.T) { 43 p := new(terraform.MockResourceProvisioner) 44 p.StopReturnError = errors.New("foo") 45 46 // Create a mock provider 47 client, _ := plugin.TestPluginRPCConn(t, pluginMap(&ServeOpts{ 48 ProvisionerFunc: testProvisionerFixed(p), 49 })) 50 defer client.Close() 51 52 // Request the provider 53 raw, err := client.Dispense(ProvisionerPluginName) 54 if err != nil { 55 t.Fatalf("err: %s", err) 56 } 57 provider := raw.(terraform.ResourceProvisioner) 58 59 // Stop 60 e := provider.Stop() 61 if !p.StopCalled { 62 t.Fatal("stop should be called") 63 } 64 if e == nil { 65 t.Fatal("should have error") 66 } 67 if e.Error() != "foo" { 68 t.Fatalf("bad: %s", e) 69 } 70 } 71 72 func TestResourceProvisioner_apply(t *testing.T) { 73 // Create a mock provider 74 p := new(terraform.MockResourceProvisioner) 75 client, _ := plugin.TestPluginRPCConn(t, pluginMap(&ServeOpts{ 76 ProvisionerFunc: testProvisionerFixed(p), 77 })) 78 defer client.Close() 79 80 // Request the provider 81 raw, err := client.Dispense(ProvisionerPluginName) 82 if err != nil { 83 t.Fatalf("err: %s", err) 84 } 85 provisioner := raw.(terraform.ResourceProvisioner) 86 87 // Apply 88 output := &terraform.MockUIOutput{} 89 state := &terraform.InstanceState{} 90 conf := &terraform.ResourceConfig{} 91 err = provisioner.Apply(output, state, conf) 92 if !p.ApplyCalled { 93 t.Fatal("apply should be called") 94 } 95 if !reflect.DeepEqual(p.ApplyConfig, conf) { 96 t.Fatalf("bad: %#v", p.ApplyConfig) 97 } 98 if err != nil { 99 t.Fatalf("bad: %#v", err) 100 } 101 } 102 103 func TestResourceProvisioner_validate(t *testing.T) { 104 // Create a mock provider 105 p := new(terraform.MockResourceProvisioner) 106 client, _ := plugin.TestPluginRPCConn(t, pluginMap(&ServeOpts{ 107 ProvisionerFunc: testProvisionerFixed(p), 108 })) 109 defer client.Close() 110 111 // Request the provider 112 raw, err := client.Dispense(ProvisionerPluginName) 113 if err != nil { 114 t.Fatalf("err: %s", err) 115 } 116 provisioner := raw.(terraform.ResourceProvisioner) 117 118 // Configure 119 config := &terraform.ResourceConfig{ 120 Raw: map[string]interface{}{"foo": "bar"}, 121 } 122 w, e := provisioner.Validate(config) 123 if !p.ValidateCalled { 124 t.Fatal("configure should be called") 125 } 126 if !reflect.DeepEqual(p.ValidateConfig, config) { 127 t.Fatalf("bad: %#v", p.ValidateConfig) 128 } 129 if w != nil { 130 t.Fatalf("bad: %#v", w) 131 } 132 if e != nil { 133 t.Fatalf("bad: %#v", e) 134 } 135 } 136 137 func TestResourceProvisioner_validate_errors(t *testing.T) { 138 // Create a mock provider 139 p := new(terraform.MockResourceProvisioner) 140 client, _ := plugin.TestPluginRPCConn(t, pluginMap(&ServeOpts{ 141 ProvisionerFunc: testProvisionerFixed(p), 142 })) 143 defer client.Close() 144 145 // Request the provider 146 raw, err := client.Dispense(ProvisionerPluginName) 147 if err != nil { 148 t.Fatalf("err: %s", err) 149 } 150 provisioner := raw.(terraform.ResourceProvisioner) 151 152 p.ValidateReturnErrors = []error{errors.New("foo")} 153 154 // Configure 155 config := &terraform.ResourceConfig{ 156 Raw: map[string]interface{}{"foo": "bar"}, 157 } 158 w, e := provisioner.Validate(config) 159 if !p.ValidateCalled { 160 t.Fatal("configure should be called") 161 } 162 if !reflect.DeepEqual(p.ValidateConfig, config) { 163 t.Fatalf("bad: %#v", p.ValidateConfig) 164 } 165 if w != nil { 166 t.Fatalf("bad: %#v", w) 167 } 168 169 if len(e) != 1 { 170 t.Fatalf("bad: %#v", e) 171 } 172 if e[0].Error() != "foo" { 173 t.Fatalf("bad: %#v", e) 174 } 175 } 176 177 func TestResourceProvisioner_validate_warns(t *testing.T) { 178 // Create a mock provider 179 p := new(terraform.MockResourceProvisioner) 180 client, _ := plugin.TestPluginRPCConn(t, pluginMap(&ServeOpts{ 181 ProvisionerFunc: testProvisionerFixed(p), 182 })) 183 defer client.Close() 184 185 // Request the provider 186 raw, err := client.Dispense(ProvisionerPluginName) 187 if err != nil { 188 t.Fatalf("err: %s", err) 189 } 190 provisioner := raw.(terraform.ResourceProvisioner) 191 192 p.ValidateReturnWarns = []string{"foo"} 193 194 // Configure 195 config := &terraform.ResourceConfig{ 196 Raw: map[string]interface{}{"foo": "bar"}, 197 } 198 w, e := provisioner.Validate(config) 199 if !p.ValidateCalled { 200 t.Fatal("configure should be called") 201 } 202 if !reflect.DeepEqual(p.ValidateConfig, config) { 203 t.Fatalf("bad: %#v", p.ValidateConfig) 204 } 205 if e != nil { 206 t.Fatalf("bad: %#v", e) 207 } 208 209 expected := []string{"foo"} 210 if !reflect.DeepEqual(w, expected) { 211 t.Fatalf("bad: %#v", w) 212 } 213 } 214 215 func TestResourceProvisioner_close(t *testing.T) { 216 // Create a mock provider 217 p := new(terraform.MockResourceProvisioner) 218 client, _ := plugin.TestPluginRPCConn(t, pluginMap(&ServeOpts{ 219 ProvisionerFunc: testProvisionerFixed(p), 220 })) 221 defer client.Close() 222 223 // Request the provider 224 raw, err := client.Dispense(ProvisionerPluginName) 225 if err != nil { 226 t.Fatalf("err: %s", err) 227 } 228 provisioner := raw.(terraform.ResourceProvisioner) 229 230 pCloser, ok := raw.(terraform.ResourceProvisionerCloser) 231 if !ok { 232 t.Fatal("should be a ResourceProvisionerCloser") 233 } 234 235 if err := pCloser.Close(); err != nil { 236 t.Fatalf("failed to close provisioner: %s", err) 237 } 238 239 // The connection should be closed now, so if we to make a 240 // new call we should get an error. 241 o := &terraform.MockUIOutput{} 242 s := &terraform.InstanceState{} 243 c := &terraform.ResourceConfig{} 244 err = provisioner.Apply(o, s, c) 245 if err == nil { 246 t.Fatal("should have error") 247 } 248 }