actually parse hcl blocks

azr_implicit_requried_plugin_2
Adrien Delorme 5 years ago
parent 37e494a6e8
commit df4c5a1314

@ -4,182 +4,71 @@ import (
"testing" "testing"
"github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts" "github.com/hashicorp/go-version"
"github.com/hashicorp/hcl/v2"
"github.com/hashicorp/packer/hcl2template/addrs" "github.com/hashicorp/packer/hcl2template/addrs"
) )
func TestPackerConfig_decodeImplicitRequiredPluginsBlocks(t *testing.T) { func TestPackerConfig_required_plugin_parse(t *testing.T) {
type fields struct { defaultParser := getBasicParser()
PackerConfig
}
type args struct {
block *hcl.Block
}
tests := []struct { tests := []struct {
name string name string
fields fields cfg PackerConfig
args args requirePlugins string
wantDiags bool restOfTemplate string
wantConfig PackerConfig wantDiags bool
wantConfig PackerConfig
}{ }{
{"invalid block", fields{PackerConfig: PackerConfig{}}, args{block: &hcl.Block{}}, false, PackerConfig{}}, // {"empty source labels", PackerConfig{parser: defaultParser}, ``, `source "" "" {}`, false, PackerConfig{}},
{"invalid block name", fields{PackerConfig: PackerConfig{}}, args{block: &hcl.Block{Labels: []string{""}}}, false, PackerConfig{}}, {"add required_plugin", PackerConfig{parser: defaultParser}, `
{"implicitly require amazon plugin through datasource", packer {
fields{PackerConfig: PackerConfig{}}, required_plugins {
args{block: &hcl.Block{Labels: []string{"amazon-ami"}}}, amazon = {
false, source = "github.com/hashicorp/amazon"
PackerConfig{ version = "~> v1.2.3"
Packer: struct { }
VersionConstraints []VersionConstraint }
RequiredPlugins []*RequiredPlugins }
}{ `, ``, false, PackerConfig{
RequiredPlugins: []*RequiredPlugins{ Packer: struct {
{ VersionConstraints []VersionConstraint
RequiredPlugins: map[string]*RequiredPlugin{ RequiredPlugins []*RequiredPlugins
"amazon": { }{
Name: "amazon", RequiredPlugins: []*RequiredPlugins{
Source: "github.com/hashicorp/amazon", {RequiredPlugins: map[string]*RequiredPlugin{
Type: &addrs.Plugin{"github.com", "hashicorp", "amazon"}, "amazon": {
PluginDependencyReason: PluginDependencyImplicit, Name: "amazon",
}, Source: "github.com/hashicorp/amazon",
}, Type: &addrs.Plugin{"github.com", "hashicorp", "amazon"},
}, Requirement: VersionConstraint{
}, Required: mustVersionConstraints(version.NewConstraint("~> v1.2.3")),
},
}},
{"don't replace explicitly imported amazon plugin",
fields{PackerConfig: PackerConfig{
Packer: struct {
VersionConstraints []VersionConstraint
RequiredPlugins []*RequiredPlugins
}{
RequiredPlugins: []*RequiredPlugins{
{
RequiredPlugins: map[string]*RequiredPlugin{
"amazon": {
Name: "amazon",
Source: "github.com/hashicorp/amazon",
Type: &addrs.Plugin{"github.com", "hashicorp", "amazon"},
PluginDependencyReason: PluginDependencyExplicit,
},
},
},
},
},
}},
args{block: &hcl.Block{Labels: []string{"amazon-ami"}}},
false,
PackerConfig{
Packer: struct {
VersionConstraints []VersionConstraint
RequiredPlugins []*RequiredPlugins
}{
RequiredPlugins: []*RequiredPlugins{
{
RequiredPlugins: map[string]*RequiredPlugin{
"amazon": {
Name: "amazon",
Source: "github.com/hashicorp/amazon",
Type: &addrs.Plugin{"github.com", "hashicorp", "amazon"},
PluginDependencyReason: PluginDependencyExplicit,
},
},
},
},
},
}},
{"implict import of a plugin without a dash",
fields{PackerConfig: PackerConfig{}},
args{block: &hcl.Block{Labels: []string{"google"}}},
false,
PackerConfig{
Packer: struct {
VersionConstraints []VersionConstraint
RequiredPlugins []*RequiredPlugins
}{
RequiredPlugins: []*RequiredPlugins{
{
RequiredPlugins: map[string]*RequiredPlugin{
"google": {
Name: "google",
Source: "github.com/hashicorp/google",
Type: &addrs.Plugin{"github.com", "hashicorp", "google"},
PluginDependencyReason: PluginDependencyImplicit,
},
},
},
},
},
}},
{"ignore already imported google plugin",
fields{PackerConfig: PackerConfig{
Packer: struct {
VersionConstraints []VersionConstraint
RequiredPlugins []*RequiredPlugins
}{
RequiredPlugins: []*RequiredPlugins{
{
RequiredPlugins: map[string]*RequiredPlugin{
"google": {
Name: "google",
Source: "github.com/hashicorp/google",
Type: &addrs.Plugin{"github.com", "hashicorp", "google"},
PluginDependencyReason: PluginDependencyExplicit,
},
},
},
},
},
}},
args{block: &hcl.Block{Labels: []string{"google"}}},
false,
PackerConfig{
Packer: struct {
VersionConstraints []VersionConstraint
RequiredPlugins []*RequiredPlugins
}{
RequiredPlugins: []*RequiredPlugins{
{
RequiredPlugins: map[string]*RequiredPlugin{
"google": {
Name: "google",
Source: "github.com/hashicorp/google",
Type: &addrs.Plugin{"github.com", "hashicorp", "google"},
PluginDependencyReason: PluginDependencyExplicit,
},
}, },
PluginDependencyReason: PluginDependencyExplicit,
}, },
}, }},
}, },
}}, },
}},
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
cfg := PackerConfig{ cfg := tt.cfg
Packer: tt.fields.Packer, file, diags := cfg.parser.ParseHCL([]byte(tt.requirePlugins), "required_plugins.pkr.hcl")
Basedir: tt.fields.Basedir, if len(diags) > 0 {
CorePackerVersionString: tt.fields.CorePackerVersionString, t.Fatal(diags)
Cwd: tt.fields.Cwd, }
Sources: tt.fields.Sources, if diags := cfg.decodeRequiredPluginsBlock(file); len(diags) > 0 {
InputVariables: tt.fields.InputVariables, t.Fatal(diags)
LocalVariables: tt.fields.LocalVariables, }
Datasources: tt.fields.Datasources,
LocalBlocks: tt.fields.LocalBlocks, rest, diags := cfg.parser.ParseHCL([]byte(tt.restOfTemplate), "rest.pkr.hcl")
ValidationOptions: tt.fields.ValidationOptions, if len(diags) > 0 {
Builds: tt.fields.Builds, t.Fatal(diags)
parser: tt.fields.parser,
files: tt.fields.files,
except: tt.fields.except,
only: tt.fields.only,
force: tt.fields.force,
debug: tt.fields.debug,
onError: tt.fields.onError,
} }
if gotDiags := cfg.inferImplicitRequiredPluginFromBlocks(tt.args.block); (len(gotDiags) > 0) != tt.wantDiags { if gotDiags := cfg.decodeImplicitRequiredPluginsBlocks(rest); (len(gotDiags) > 0) != tt.wantDiags {
t.Errorf("PackerConfig.inferImplicitRequiredPluginFromBlocks() = %v", gotDiags) t.Fatal(gotDiags)
} }
if diff := cmp.Diff(tt.wantConfig, cfg, cmpopts.IgnoreUnexported(PackerConfig{})); diff != "" { if diff := cmp.Diff(tt.wantConfig, cfg, cmpOpts...); diff != "" {
t.Errorf("PackerConfig.inferImplicitRequiredPluginFromBlocks() unexpected PackerConfig: %v", diff) t.Errorf("PackerConfig.inferImplicitRequiredPluginFromBlocks() unexpected PackerConfig: %v", diff)
} }
}) })

Loading…
Cancel
Save