github.com/pulumi/terraform@v1.4.0/pkg/configs/experiments_test.go (about) 1 package configs 2 3 import ( 4 "testing" 5 6 "github.com/google/go-cmp/cmp" 7 "github.com/hashicorp/hcl/v2" 8 9 "github.com/pulumi/terraform/pkg/experiments" 10 ) 11 12 func TestExperimentsConfig(t *testing.T) { 13 // The experiment registrations are global, so we need to do some special 14 // patching in order to get a predictable set for our tests. 15 current := experiments.Experiment("current") 16 concluded := experiments.Experiment("concluded") 17 currentExperiments := experiments.NewSet(current) 18 concludedExperiments := map[experiments.Experiment]string{ 19 concluded: "Reticulate your splines.", 20 } 21 defer experiments.OverrideForTesting(t, currentExperiments, concludedExperiments)() 22 23 t.Run("current", func(t *testing.T) { 24 parser := NewParser(nil) 25 parser.AllowLanguageExperiments(true) 26 mod, diags := parser.LoadConfigDir("testdata/experiments/current") 27 if got, want := len(diags), 1; got != want { 28 t.Fatalf("wrong number of diagnostics %d; want %d", got, want) 29 } 30 got := diags[0] 31 want := &hcl.Diagnostic{ 32 Severity: hcl.DiagWarning, 33 Summary: `Experimental feature "current" is active`, 34 Detail: "Experimental features are available only in alpha releases of Terraform and are subject to breaking changes or total removal in later versions, based on feedback. We recommend against using experimental features in production.\n\nIf you have feedback on the design of this feature, please open a GitHub issue to discuss it.", 35 Subject: &hcl.Range{ 36 Filename: "testdata/experiments/current/current_experiment.tf", 37 Start: hcl.Pos{Line: 2, Column: 18, Byte: 29}, 38 End: hcl.Pos{Line: 2, Column: 25, Byte: 36}, 39 }, 40 } 41 if diff := cmp.Diff(want, got); diff != "" { 42 t.Errorf("wrong warning\n%s", diff) 43 } 44 if got, want := len(mod.ActiveExperiments), 1; got != want { 45 t.Errorf("wrong number of experiments %d; want %d", got, want) 46 } 47 if !mod.ActiveExperiments.Has(current) { 48 t.Errorf("module does not indicate current experiment as active") 49 } 50 }) 51 t.Run("concluded", func(t *testing.T) { 52 parser := NewParser(nil) 53 parser.AllowLanguageExperiments(true) 54 _, diags := parser.LoadConfigDir("testdata/experiments/concluded") 55 if got, want := len(diags), 1; got != want { 56 t.Fatalf("wrong number of diagnostics %d; want %d", got, want) 57 } 58 got := diags[0] 59 want := &hcl.Diagnostic{ 60 Severity: hcl.DiagError, 61 Summary: `Experiment has concluded`, 62 Detail: `Experiment "concluded" is no longer available. Reticulate your splines.`, 63 Subject: &hcl.Range{ 64 Filename: "testdata/experiments/concluded/concluded_experiment.tf", 65 Start: hcl.Pos{Line: 2, Column: 18, Byte: 29}, 66 End: hcl.Pos{Line: 2, Column: 27, Byte: 38}, 67 }, 68 } 69 if diff := cmp.Diff(want, got); diff != "" { 70 t.Errorf("wrong error\n%s", diff) 71 } 72 }) 73 t.Run("concluded", func(t *testing.T) { 74 parser := NewParser(nil) 75 parser.AllowLanguageExperiments(true) 76 _, diags := parser.LoadConfigDir("testdata/experiments/unknown") 77 if got, want := len(diags), 1; got != want { 78 t.Fatalf("wrong number of diagnostics %d; want %d", got, want) 79 } 80 got := diags[0] 81 want := &hcl.Diagnostic{ 82 Severity: hcl.DiagError, 83 Summary: `Unknown experiment keyword`, 84 Detail: `There is no current experiment with the keyword "unknown".`, 85 Subject: &hcl.Range{ 86 Filename: "testdata/experiments/unknown/unknown_experiment.tf", 87 Start: hcl.Pos{Line: 2, Column: 18, Byte: 29}, 88 End: hcl.Pos{Line: 2, Column: 25, Byte: 36}, 89 }, 90 } 91 if diff := cmp.Diff(want, got); diff != "" { 92 t.Errorf("wrong error\n%s", diff) 93 } 94 }) 95 t.Run("invalid", func(t *testing.T) { 96 parser := NewParser(nil) 97 parser.AllowLanguageExperiments(true) 98 _, diags := parser.LoadConfigDir("testdata/experiments/invalid") 99 if got, want := len(diags), 1; got != want { 100 t.Fatalf("wrong number of diagnostics %d; want %d", got, want) 101 } 102 got := diags[0] 103 want := &hcl.Diagnostic{ 104 Severity: hcl.DiagError, 105 Summary: `Invalid expression`, 106 Detail: `A static list expression is required.`, 107 Subject: &hcl.Range{ 108 Filename: "testdata/experiments/invalid/invalid_experiments.tf", 109 Start: hcl.Pos{Line: 2, Column: 17, Byte: 28}, 110 End: hcl.Pos{Line: 2, Column: 24, Byte: 35}, 111 }, 112 } 113 if diff := cmp.Diff(want, got); diff != "" { 114 t.Errorf("wrong error\n%s", diff) 115 } 116 }) 117 t.Run("disallowed", func(t *testing.T) { 118 parser := NewParser(nil) 119 parser.AllowLanguageExperiments(false) // The default situation for release builds 120 _, diags := parser.LoadConfigDir("testdata/experiments/current") 121 if got, want := len(diags), 1; got != want { 122 t.Fatalf("wrong number of diagnostics %d; want %d", got, want) 123 } 124 got := diags[0] 125 want := &hcl.Diagnostic{ 126 Severity: hcl.DiagError, 127 Summary: `Module uses experimental features`, 128 Detail: `Experimental features are intended only for gathering early feedback on new language designs, and so are available only in alpha releases of Terraform.`, 129 Subject: &hcl.Range{ 130 Filename: "testdata/experiments/current/current_experiment.tf", 131 Start: hcl.Pos{Line: 2, Column: 3, Byte: 14}, 132 End: hcl.Pos{Line: 2, Column: 14, Byte: 25}, 133 }, 134 } 135 if diff := cmp.Diff(want, got); diff != "" { 136 t.Errorf("wrong error\n%s", diff) 137 } 138 }) 139 }