pulumi/sdk/proto/go/testing/language_grpc.pb.go

186 lines
7.6 KiB
Go
Raw Normal View History

Add matrix testing (#13705) <!--- Thanks so much for your contribution! If this is your first time contributing, please ensure that you have read the [CONTRIBUTING](https://github.com/pulumi/pulumi/blob/master/CONTRIBUTING.md) documentation. --> # Description <!--- Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. --> Adds the first pass of matrix testing. Matrix testing allows us to define tests once in pulumi/pulumi via PCL and then run those tests against each language plugin to verify code generation and runtime correctness. Rather than packing matrix tests and all the associated data and machinery into the CLI itself we define a new Go package at cmd/pulumi-test-lanaguage. This depends on pkg and runs the deployment engine in a unique way for matrix tests but it is running the proper deployment engine with a proper backend (always filestate, using $TEMP). Currently only NodeJS is hooked up to run these tests, and all the code for that currently lives in sdk/nodejs/cmd/pulumi-language-nodejs/language_test.go. I expect we'll move that helper code to sdk/go/common and use it in each language plugin to run the tests in the same way. This first pass includes 3 simple tests: * l1-empty that runs an empty PCL file and checks just a stack is created * l1-output-bool that runs a PCL program that returns two stack outputs of `true` and `false * l2-resource-simple that runs a PCL program creating a simple resource with a single bool property These tests are themselves tested with a mock language runtime. This verifies the behavior of the matrix test framework for both correct and incorrect language hosts (that is some the mock language runtimes purposefully cause errors or compute the wrong result). There are a number of things missing from from the core framework still, but I feel don't block getting this first pass merged and starting to be used. 1. The tests can not currently run in parallel. That is calling RunLanguageTest in parallel will break things. This is due to two separate problems. Firstly is that the SDK snapshot's are not safe to write in parallel (when PULUMI_ACCEPT is true), this should be fairly easy to fix by doing a write to dst-{random} and them atomic move to dst. Secondly is that the deployment engine itself has mutable global state, short term we should probably just lock around that part RunLanguageTest, long term it would be good to clean that up. 2. We need a way to verify "preview" behavior, I think this is probably just a variation of the tests that would call `stack.Preview` and not pass a snapshot to `assert`. 3. stdout, stderr and log messages are returned in bulk at the end of the test. Plus there are a couple of calls to the language runtime that don't correctly thread stdout/stderr to use and so default to the process `os.Stdout/Stderr`. stdout/stderr streaming shows up in a load of other places as well so I'm thinking of a clean way to handle all of them together. Log message streaming we can probably do by just turning RunLanguageTest to a streaming grpc call. ## Checklist - [x] I have run `make tidy` to update any new dependencies - [x] I have run `make lint` to verify my code passes the lint check - [ ] I have formatted my code using `gofumpt` <!--- Please provide details if the checkbox below is to be left unchecked. --> - [x] I have added tests that prove my fix is effective or that my feature works <!--- User-facing changes require a CHANGELOG entry. --> - [x] I have run `make changelog` and committed the `changelog/pending/<file>` documenting my change <!-- If the change(s) in this PR is a modification of an existing call to the Pulumi Cloud, then the service should honor older versions of the CLI where this change would not exist. You must then bump the API version in /pkg/backend/httpstate/client/api.go, as well as add it to the service. --> - [ ] Yes, there are changes in this PR that warrants bumping the Pulumi Cloud API version <!-- @Pulumi employees: If yes, you must submit corresponding changes in the service repo. --> --------- Co-authored-by: Abhinav Gupta <abhinav@pulumi.com>
2023-09-13 15:17:46 +00:00
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.2.0
// - protoc v3.20.1
// source: pulumi/testing/language.proto
package testing
import (
context "context"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
)
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7
// LanguageTestClient is the client API for LanguageTest service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
type LanguageTestClient interface {
// GetLanguageTests returns a list of all the language tests.
GetLanguageTests(ctx context.Context, in *GetLanguageTestsRequest, opts ...grpc.CallOption) (*GetLanguageTestsResponse, error)
// PrepareLanguageTests prepares the engine to run language tests. It sets up a stable artifacts folder
// (which should be .gitignore'd) and fills it with the core SDK artifact.
PrepareLanguageTests(ctx context.Context, in *PrepareLanguageTestsRequest, opts ...grpc.CallOption) (*PrepareLanguageTestsResponse, error)
// RunLanguageTest runs a single test of the language plugin.
RunLanguageTest(ctx context.Context, in *RunLanguageTestRequest, opts ...grpc.CallOption) (*RunLanguageTestResponse, error)
}
type languageTestClient struct {
cc grpc.ClientConnInterface
}
func NewLanguageTestClient(cc grpc.ClientConnInterface) LanguageTestClient {
return &languageTestClient{cc}
}
func (c *languageTestClient) GetLanguageTests(ctx context.Context, in *GetLanguageTestsRequest, opts ...grpc.CallOption) (*GetLanguageTestsResponse, error) {
out := new(GetLanguageTestsResponse)
err := c.cc.Invoke(ctx, "/pulumirpc.testing.LanguageTest/GetLanguageTests", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *languageTestClient) PrepareLanguageTests(ctx context.Context, in *PrepareLanguageTestsRequest, opts ...grpc.CallOption) (*PrepareLanguageTestsResponse, error) {
out := new(PrepareLanguageTestsResponse)
err := c.cc.Invoke(ctx, "/pulumirpc.testing.LanguageTest/PrepareLanguageTests", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *languageTestClient) RunLanguageTest(ctx context.Context, in *RunLanguageTestRequest, opts ...grpc.CallOption) (*RunLanguageTestResponse, error) {
out := new(RunLanguageTestResponse)
err := c.cc.Invoke(ctx, "/pulumirpc.testing.LanguageTest/RunLanguageTest", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// LanguageTestServer is the server API for LanguageTest service.
// All implementations must embed UnimplementedLanguageTestServer
// for forward compatibility
type LanguageTestServer interface {
// GetLanguageTests returns a list of all the language tests.
GetLanguageTests(context.Context, *GetLanguageTestsRequest) (*GetLanguageTestsResponse, error)
// PrepareLanguageTests prepares the engine to run language tests. It sets up a stable artifacts folder
// (which should be .gitignore'd) and fills it with the core SDK artifact.
PrepareLanguageTests(context.Context, *PrepareLanguageTestsRequest) (*PrepareLanguageTestsResponse, error)
// RunLanguageTest runs a single test of the language plugin.
RunLanguageTest(context.Context, *RunLanguageTestRequest) (*RunLanguageTestResponse, error)
mustEmbedUnimplementedLanguageTestServer()
}
// UnimplementedLanguageTestServer must be embedded to have forward compatible implementations.
type UnimplementedLanguageTestServer struct {
}
func (UnimplementedLanguageTestServer) GetLanguageTests(context.Context, *GetLanguageTestsRequest) (*GetLanguageTestsResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetLanguageTests not implemented")
}
func (UnimplementedLanguageTestServer) PrepareLanguageTests(context.Context, *PrepareLanguageTestsRequest) (*PrepareLanguageTestsResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method PrepareLanguageTests not implemented")
}
func (UnimplementedLanguageTestServer) RunLanguageTest(context.Context, *RunLanguageTestRequest) (*RunLanguageTestResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method RunLanguageTest not implemented")
}
func (UnimplementedLanguageTestServer) mustEmbedUnimplementedLanguageTestServer() {}
// UnsafeLanguageTestServer may be embedded to opt out of forward compatibility for this service.
// Use of this interface is not recommended, as added methods to LanguageTestServer will
// result in compilation errors.
type UnsafeLanguageTestServer interface {
mustEmbedUnimplementedLanguageTestServer()
}
func RegisterLanguageTestServer(s grpc.ServiceRegistrar, srv LanguageTestServer) {
s.RegisterService(&LanguageTest_ServiceDesc, srv)
}
func _LanguageTest_GetLanguageTests_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GetLanguageTestsRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(LanguageTestServer).GetLanguageTests(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/pulumirpc.testing.LanguageTest/GetLanguageTests",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(LanguageTestServer).GetLanguageTests(ctx, req.(*GetLanguageTestsRequest))
}
return interceptor(ctx, in, info, handler)
}
func _LanguageTest_PrepareLanguageTests_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(PrepareLanguageTestsRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(LanguageTestServer).PrepareLanguageTests(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/pulumirpc.testing.LanguageTest/PrepareLanguageTests",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(LanguageTestServer).PrepareLanguageTests(ctx, req.(*PrepareLanguageTestsRequest))
}
return interceptor(ctx, in, info, handler)
}
func _LanguageTest_RunLanguageTest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(RunLanguageTestRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(LanguageTestServer).RunLanguageTest(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/pulumirpc.testing.LanguageTest/RunLanguageTest",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(LanguageTestServer).RunLanguageTest(ctx, req.(*RunLanguageTestRequest))
}
return interceptor(ctx, in, info, handler)
}
// LanguageTest_ServiceDesc is the grpc.ServiceDesc for LanguageTest service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
var LanguageTest_ServiceDesc = grpc.ServiceDesc{
ServiceName: "pulumirpc.testing.LanguageTest",
HandlerType: (*LanguageTestServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "GetLanguageTests",
Handler: _LanguageTest_GetLanguageTests_Handler,
},
{
MethodName: "PrepareLanguageTests",
Handler: _LanguageTest_PrepareLanguageTests_Handler,
},
{
MethodName: "RunLanguageTest",
Handler: _LanguageTest_RunLanguageTest_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "pulumi/testing/language.proto",
}