packer-cn/packer-plugin-sdk/rpc/post_processor_test.go

140 lines
3.0 KiB
Go

package rpc
import (
"context"
"reflect"
"testing"
"github.com/hashicorp/hcl/v2/hcldec"
packersdk "github.com/hashicorp/packer/packer-plugin-sdk/packer"
)
var testPostProcessorArtifact = new(packersdk.MockArtifact)
type TestPostProcessor struct {
configCalled bool
configVal []interface{}
ppCalled bool
ppArtifact packersdk.Artifact
ppArtifactId string
ppUi packersdk.Ui
postProcessFn func(context.Context) error
}
func (*TestPostProcessor) ConfigSpec() hcldec.ObjectSpec { return nil }
func (pp *TestPostProcessor) Configure(v ...interface{}) error {
pp.configCalled = true
pp.configVal = v
return nil
}
func (pp *TestPostProcessor) PostProcess(ctx context.Context, ui packersdk.Ui, a packersdk.Artifact) (packersdk.Artifact, bool, bool, error) {
pp.ppCalled = true
pp.ppArtifact = a
pp.ppArtifactId = a.Id()
pp.ppUi = ui
if pp.postProcessFn != nil {
return testPostProcessorArtifact, false, false, pp.postProcessFn(ctx)
}
return testPostProcessorArtifact, false, false, nil
}
func TestPostProcessorRPC(t *testing.T) {
// Create the interface to test
p := new(TestPostProcessor)
// Start the server
client, server := testClientServer(t)
defer client.Close()
defer server.Close()
server.RegisterPostProcessor(p)
ppClient := client.PostProcessor()
// Test Configure
config := 42
err := ppClient.Configure(config)
if err != nil {
t.Fatalf("error: %s", err)
}
if !p.configCalled {
t.Fatal("config should be called")
}
expected := []interface{}{int64(42)}
if !reflect.DeepEqual(p.configVal, expected) {
t.Fatalf("unknown config value: %#v", p.configVal)
}
// Test PostProcess
a := &packersdk.MockArtifact{
IdValue: "ppTestId",
}
ui := new(testUi)
artifact, _, _, err := ppClient.PostProcess(context.Background(), ui, a)
if err != nil {
t.Fatalf("err: %s", err)
}
if !p.ppCalled {
t.Fatal("postprocess should be called")
}
if p.ppArtifactId != "ppTestId" {
t.Fatalf("unknown artifact: '%s'", p.ppArtifact.Id())
}
if artifact.Id() != "id" {
t.Fatalf("unknown artifact: %s", artifact.Id())
}
}
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)
if err != nil {
t.Fatalf("error configuring post-processor client: %s", err)
}
// Test PostProcess
a := &packersdk.MockArtifact{
IdValue: "ppTestId",
}
ui := new(testUi)
_, _, _, err = ppClient.PostProcess(topCtx, ui, a)
if err == nil {
t.Fatalf("should err")
}
}
func TestPostProcessor_Implements(t *testing.T) {
var raw interface{}
raw = new(postProcessor)
if _, ok := raw.(packersdk.PostProcessor); !ok {
t.Fatal("not a postprocessor")
}
}