-
Notifications
You must be signed in to change notification settings - Fork 1.1k
/
test.go
142 lines (126 loc) 路 4.32 KB
/
test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package dotnet
import (
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/pulumi/pulumi/pkg/v3/codegen"
"github.com/pulumi/pulumi/pkg/v3/codegen/testing/test"
"github.com/pulumi/pulumi/pkg/v3/testing/integration"
"github.com/pulumi/pulumi/sdk/v3/go/common/util/executable"
)
func Check(t *testing.T, path string, dependencies codegen.StringSet, pulumiSDKPath string) {
var err error
dir := filepath.Dir(path)
ex, err := executable.FindExecutable("dotnet")
require.NoError(t, err, "Failed to find dotnet executable")
// We create a new cs-project each time the test is run.
projectFile := filepath.Join(dir, filepath.Base(dir)+".csproj")
programFile := filepath.Join(dir, "Program.cs")
if err = os.Remove(projectFile); !os.IsNotExist(err) {
require.NoError(t, err)
}
if err = os.Remove(programFile); !os.IsNotExist(err) {
require.NoError(t, err)
}
err = integration.RunCommand(t, "create dotnet project",
[]string{ex, "new", "console", "-f", "net6.0"}, dir, &integration.ProgramTestOptions{})
require.NoError(t, err, "Failed to create C# project")
// Remove Program.cs again generated from "dotnet new console"
// because the generated C# program already has an entry point
if err = os.Remove(programFile); !os.IsNotExist(err) {
require.NoError(t, err)
}
// Add dependencies
pkgs := dotnetDependencies(dependencies)
if len(pkgs) != 0 {
for _, pkg := range pkgs {
pkg.install(t, ex, dir)
}
dep{"Pulumi", test.PulumiDotnetSDKVersion}.install(t, ex, dir)
} else {
// We would like this regardless of other dependencies, but dotnet
// packages do not play well with package references.
if pulumiSDKPath != "" {
err = integration.RunCommand(t, "add sdk ref",
[]string{ex, "add", "reference", pulumiSDKPath},
dir, &integration.ProgramTestOptions{})
require.NoError(t, err, "Failed to dotnet sdk package reference")
} else {
dep{"Pulumi", test.PulumiDotnetSDKVersion}.install(t, ex, dir)
}
}
// Clean up build result
defer func() {
err = os.RemoveAll(filepath.Join(dir, "bin"))
assert.NoError(t, err, "Failed to remove bin result")
err = os.RemoveAll(filepath.Join(dir, "obj"))
assert.NoError(t, err, "Failed to remove obj result")
}()
TypeCheck(t, path, dependencies, pulumiSDKPath)
}
func TypeCheck(t *testing.T, path string, dependencies codegen.StringSet, pulumiSDKPath string) {
var err error
dir := filepath.Dir(path)
ex, err := executable.FindExecutable("dotnet")
require.NoError(t, err)
err = integration.RunCommand(t, "dotnet build",
[]string{ex, "build", "--nologo"}, dir, &integration.ProgramTestOptions{})
require.NoError(t, err, "Failed to build dotnet project")
}
type dep struct {
Name string
Version string
}
func (pkg dep) install(t *testing.T, ex, dir string) {
args := []string{ex, "add", "package", pkg.Name}
if pkg.Version != "" {
args = append(args, "--version", pkg.Version)
}
err := integration.RunCommand(t, "Add package",
args, dir, &integration.ProgramTestOptions{})
require.NoError(t, err, "Failed to add dependency %q %q", pkg.Name, pkg.Version)
}
// Converts from the hcl2 dependency format to the dotnet format.
//
// Example:
//
// "aws" => {"Pulumi.Aws", 4.21.1}
// "azure" => {"Pulumi.Azure", 4.21.1}
func dotnetDependencies(deps codegen.StringSet) []dep {
result := make([]dep, len(deps))
for i, d := range deps.SortedValues() {
switch d {
case "aws":
result[i] = dep{"Pulumi.Aws", test.AwsSchema}
case "azure-native":
result[i] = dep{"Pulumi.AzureNative", test.AzureNativeSchema}
case "azure":
// TODO: update constant in test.AzureSchema to v5.x
// because it has output-versioned function invokes
result[i] = dep{"Pulumi.Azure", "5.12.0"}
case "kubernetes":
result[i] = dep{"Pulumi.Kubernetes", test.KubernetesSchema}
case "random":
result[i] = dep{"Pulumi.Random", test.RandomSchema}
default:
result[i] = dep{"Pulumi." + Title(d), ""}
}
}
return result
}
func GenerateProgramBatchTest(t *testing.T, testCases []test.ProgramTest) {
test.TestProgramCodegen(t,
test.ProgramCodegenOptions{
Language: "dotnet",
Extension: "cs",
OutputFile: "Program.cs",
Check: func(t *testing.T, path string, dependencies codegen.StringSet) {
Check(t, path, dependencies, "")
},
GenProgram: GenerateProgram,
TestCases: testCases,
},
)
}