2013-06-18 16:44:57 -04:00
|
|
|
package rpc
|
|
|
|
|
|
|
|
import (
|
2019-03-22 09:56:02 -04:00
|
|
|
"context"
|
2013-07-01 17:59:23 -04:00
|
|
|
"reflect"
|
2013-06-18 16:44:57 -04:00
|
|
|
"testing"
|
2018-01-22 20:21:10 -05:00
|
|
|
|
|
|
|
"github.com/hashicorp/packer/packer"
|
2013-06-18 16:44:57 -04:00
|
|
|
)
|
|
|
|
|
2013-12-09 17:46:33 -05:00
|
|
|
var testPostProcessorArtifact = new(packer.MockArtifact)
|
2013-06-18 16:44:57 -04:00
|
|
|
|
|
|
|
type TestPostProcessor struct {
|
|
|
|
configCalled bool
|
2013-07-01 17:59:23 -04:00
|
|
|
configVal []interface{}
|
2013-06-18 16:44:57 -04:00
|
|
|
ppCalled bool
|
|
|
|
ppArtifact packer.Artifact
|
2013-12-09 22:07:36 -05:00
|
|
|
ppArtifactId string
|
2013-06-19 00:54:33 -04:00
|
|
|
ppUi packer.Ui
|
2019-03-27 07:29:09 -04:00
|
|
|
|
|
|
|
postProcessFn func(context.Context) error
|
2013-06-18 16:44:57 -04:00
|
|
|
}
|
|
|
|
|
2013-07-01 17:59:23 -04:00
|
|
|
func (pp *TestPostProcessor) Configure(v ...interface{}) error {
|
2013-06-18 16:44:57 -04:00
|
|
|
pp.configCalled = true
|
|
|
|
pp.configVal = v
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2019-04-08 13:59:42 -04:00
|
|
|
func (pp *TestPostProcessor) PostProcess(ctx context.Context, ui packer.Ui, a packer.Artifact) (packer.Artifact, bool, bool, error) {
|
2013-06-18 16:44:57 -04:00
|
|
|
pp.ppCalled = true
|
|
|
|
pp.ppArtifact = a
|
2013-12-09 22:07:36 -05:00
|
|
|
pp.ppArtifactId = a.Id()
|
2013-06-18 23:38:21 -04:00
|
|
|
pp.ppUi = ui
|
2019-03-27 07:29:09 -04:00
|
|
|
if pp.postProcessFn != nil {
|
2019-04-08 13:59:42 -04:00
|
|
|
return testPostProcessorArtifact, false, false, pp.postProcessFn(ctx)
|
2019-03-27 07:29:09 -04:00
|
|
|
}
|
2019-04-03 14:32:49 -04:00
|
|
|
return testPostProcessorArtifact, false, false, nil
|
2013-06-18 16:44:57 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestPostProcessorRPC(t *testing.T) {
|
|
|
|
// Create the interface to test
|
|
|
|
p := new(TestPostProcessor)
|
|
|
|
|
|
|
|
// Start the server
|
2013-12-09 19:22:11 -05:00
|
|
|
client, server := testClientServer(t)
|
2013-12-09 17:57:18 -05:00
|
|
|
defer client.Close()
|
2013-12-09 19:22:11 -05:00
|
|
|
defer server.Close()
|
|
|
|
server.RegisterPostProcessor(p)
|
|
|
|
|
2013-12-09 17:57:18 -05:00
|
|
|
ppClient := client.PostProcessor()
|
2013-06-18 16:44:57 -04:00
|
|
|
|
|
|
|
// Test Configure
|
|
|
|
config := 42
|
2013-12-09 17:57:18 -05:00
|
|
|
err := ppClient.Configure(config)
|
2013-06-18 16:44:57 -04:00
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if !p.configCalled {
|
|
|
|
t.Fatal("config should be called")
|
|
|
|
}
|
|
|
|
|
2014-04-26 16:31:22 -04:00
|
|
|
expected := []interface{}{int64(42)}
|
|
|
|
if !reflect.DeepEqual(p.configVal, expected) {
|
2013-06-18 16:44:57 -04:00
|
|
|
t.Fatalf("unknown config value: %#v", p.configVal)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Test PostProcess
|
2013-12-09 18:44:00 -05:00
|
|
|
a := &packer.MockArtifact{
|
|
|
|
IdValue: "ppTestId",
|
|
|
|
}
|
2013-06-18 23:38:21 -04:00
|
|
|
ui := new(testUi)
|
2019-04-08 13:59:42 -04:00
|
|
|
artifact, _, _, err := ppClient.PostProcess(context.Background(), ui, a)
|
2013-06-18 16:44:57 -04:00
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if !p.ppCalled {
|
|
|
|
t.Fatal("postprocess should be called")
|
|
|
|
}
|
|
|
|
|
2013-12-09 22:07:36 -05:00
|
|
|
if p.ppArtifactId != "ppTestId" {
|
|
|
|
t.Fatalf("unknown artifact: %s", p.ppArtifact.Id())
|
2013-06-18 16:44:57 -04:00
|
|
|
}
|
|
|
|
|
2013-12-09 18:44:00 -05:00
|
|
|
if artifact.Id() != "id" {
|
|
|
|
t.Fatalf("unknown artifact: %s", artifact.Id())
|
2013-06-18 16:44:57 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-27 07:29:09 -04:00
|
|
|
func TestPostProcessorRPC_cancel(t *testing.T) {
|
|
|
|
topCtx, cancelTopCtx := context.WithCancel(context.Background())
|
|
|
|
|
|
|
|
p := new(TestPostProcessor)
|
|
|
|
p.postProcessFn = func(ctx context.Context) error {
|
|
|
|
cancelTopCtx()
|
|
|
|
<-ctx.Done()
|
|
|
|
return ctx.Err()
|
|
|
|
}
|
|
|
|
|
|
|
|
// Start the server
|
|
|
|
client, server := testClientServer(t)
|
|
|
|
defer client.Close()
|
|
|
|
defer server.Close()
|
|
|
|
if err := server.RegisterPostProcessor(p); err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
ppClient := client.PostProcessor()
|
|
|
|
|
|
|
|
// Test Configure
|
|
|
|
config := 42
|
|
|
|
err := ppClient.Configure(config)
|
|
|
|
|
|
|
|
// Test PostProcess
|
|
|
|
a := &packer.MockArtifact{
|
|
|
|
IdValue: "ppTestId",
|
|
|
|
}
|
|
|
|
ui := new(testUi)
|
2019-04-08 13:59:42 -04:00
|
|
|
_, _, _, err = ppClient.PostProcess(topCtx, ui, a)
|
2019-03-27 07:29:09 -04:00
|
|
|
if err == nil {
|
|
|
|
t.Fatalf("should err")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-06-18 16:44:57 -04:00
|
|
|
func TestPostProcessor_Implements(t *testing.T) {
|
|
|
|
var raw interface{}
|
2013-12-10 16:23:07 -05:00
|
|
|
raw = new(postProcessor)
|
2013-06-18 16:44:57 -04:00
|
|
|
if _, ok := raw.(packer.PostProcessor); !ok {
|
|
|
|
t.Fatal("not a postprocessor")
|
|
|
|
}
|
|
|
|
}
|