From ab35510722ee6acac7b0347c9d569630fb4ee710 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 18 Dec 2019 14:07:24 -0800 Subject: [PATCH] Revert "Revert "test less"" This reverts commit 85c3a1cfbb6f25c9c608f154f106e8e3d957e9b8. --- go.mod | 1 - nodejs/awsx/aws_test.go | 1364 +++++++++++++++++++-------------------- 2 files changed, 682 insertions(+), 683 deletions(-) diff --git a/go.mod b/go.mod index b0cbc9b92..a681934c1 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,5 @@ require ( github.com/aws/aws-sdk-go v1.19.16 github.com/docker/docker v1.13.1 // indirect github.com/pulumi/pulumi v0.17.27 - github.com/stretchr/testify v1.3.0 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 // indirect ) diff --git a/nodejs/awsx/aws_test.go b/nodejs/awsx/aws_test.go index 5fc58a991..c0d58ef33 100644 --- a/nodejs/awsx/aws_test.go +++ b/nodejs/awsx/aws_test.go @@ -15,26 +15,26 @@ package examples import ( - "crypto/rand" - "encoding/hex" - "encoding/json" - "fmt" - "io/ioutil" - "net/http" + // "crypto/rand" + // "encoding/hex" + // "encoding/json" + // "fmt" + // "io/ioutil" + // "net/http" "os" "path" - "strings" + //"strings" "testing" - "time" + //"time" - "github.com/stretchr/testify/assert" + // "github.com/stretchr/testify/assert" - "github.com/pulumi/pulumi/pkg/operations" - "github.com/pulumi/pulumi/pkg/resource" - "github.com/pulumi/pulumi/pkg/resource/config" - "github.com/pulumi/pulumi/pkg/resource/stack" + // "github.com/pulumi/pulumi/pkg/operations" + // "github.com/pulumi/pulumi/pkg/resource" + // "github.com/pulumi/pulumi/pkg/resource/config" + // "github.com/pulumi/pulumi/pkg/resource/stack" "github.com/pulumi/pulumi/pkg/testing/integration" - "github.com/pulumi/pulumi/pkg/util/contract" + // github.com/pulumi/pulumi/pkg/util/contract" ) func TestAccCluster(t *testing.T) { @@ -46,293 +46,293 @@ func TestAccCluster(t *testing.T) { integration.ProgramTest(t, &test) } -func TestAccDashboards(t *testing.T) { - test := getBaseOptions(t). - With(integration.ProgramTestOptions{ - Dir: path.Join(getCwd(t), "../examples/dashboards"), - }) - - integration.ProgramTest(t, &test) -} - -func TestAccEcr(t *testing.T) { - test := getBaseOptions(t). - With(integration.ProgramTestOptions{ - Dir: path.Join(getCwd(t), "../examples/ecr"), - }) - - integration.ProgramTest(t, &test) -} - -func TestAccMetrics(t *testing.T) { - test := getBaseOptions(t). - With(integration.ProgramTestOptions{ - Dir: path.Join(getCwd(t), "../examples/metrics"), - }) - - integration.ProgramTest(t, &test) -} - -func TestAccVpcIgnoreSubnetChanges(t *testing.T) { - test := getBaseOptions(t). - With(integration.ProgramTestOptions{ - Dir: path.Join(getCwd(t), "../examples/vpcIgnoreSubnetChanges"), - StackName: addRandomSuffix("vpcIgnoreSubnetChanges"), - EditDirs: []integration.EditDir{ - { - Dir: "step2", - Additive: true, - ExpectNoChanges: true, - }, - }, - }) - - integration.ProgramTest(t, &test) -} - -func TestAccVpc(t *testing.T) { - test := getBaseOptions(t). - With(integration.ProgramTestOptions{ - Dir: path.Join(getCwd(t), "../examples/vpc"), - StackName: addRandomSuffix("vpc"), - }) - - integration.ProgramTest(t, &test) -} - -func TestAccNlb_fargateShort(t *testing.T) { - envRegion := getEnvRegion(t) - test := getBaseOptions(t). - With(integration.ProgramTestOptions{ - Dir: path.Join(getCwd(t), "../examples/nlb/fargateShort"), - StackName: addRandomSuffix("fargate"), - ExtraRuntimeValidation: containersRuntimeValidator(envRegion, true /*isFargate*/, true /*short*/), - EditDirs: []integration.EditDir{ - { - Dir: "step2", - Additive: true, - ExpectNoChanges: true, - }, - }, - }) - - integration.ProgramTest(t, &test) -} - -func TestAccNlb_fargateShortInlineListener(t *testing.T) { - envRegion := getEnvRegion(t) - test := getBaseOptions(t). - With(integration.ProgramTestOptions{ - Dir: path.Join(getCwd(t), "../examples/nlb/fargateShortInlineListener"), - StackName: addRandomSuffix("fargate"), - ExtraRuntimeValidation: containersRuntimeValidator(envRegion, true /*isFargate*/, true /*short*/), - }) - - integration.ProgramTest(t, &test) -} - -func TestAccAlb_ec2(t *testing.T) { - test := getBaseOptions(t). - With(integration.ProgramTestOptions{ - Dir: path.Join(getCwd(t), "../examples/alb/ec2"), - StackName: addRandomSuffix("ec2"), - }) - - integration.ProgramTest(t, &test) -} - -func TestAccApi(t *testing.T) { - test := getBaseOptions(t). - With(integration.ProgramTestOptions{ - Dir: path.Join(getCwd(t), "../examples/api"), - ExtraRuntimeValidation: validateAPITests([]apiTest{ - { - urlStackOutputKey: "url", - urlPath: "/a", - requiredParameters: &requiredParameters{ - queryParameters: []string{"key"}, - expectedBodyWithoutQueryStr: `{"message": "Missing required request parameters: [key]"}`, - }, - requiredAuth: &requiredAuth{ - queryParameters: map[string]string{ - "auth": "password", - }, - }, - expectedBody: "

Hello world!

", - }, - // { - // urlStackOutputKey: "url", - // urlPath: "/b", - // requiredAuth: &requiredAuth{ - // queryParameters: map[string]string{ - // "auth": "password", - // }, - // }, - // requiredAPIKey: &requiredAPIKey{ - // stackOutput: "apiKeyValue", - // }, - // expectedBody: "Hello, world!", - // }, - // { - // urlStackOutputKey: "url", - // urlPath: "/www/file1.txt", - // requiredParameters: &requiredParameters{ - // queryParameters: []string{"key"}, - // expectedBodyWithoutQueryStr: `{"message": "Missing required request parameters: [key]"}`, - // }, - // requiredAuth: &requiredAuth{ - // headers: map[string]string{ - // "Authorization": "Allow", - // }, - // }, - // requiredAPIKey: &requiredAPIKey{ - // stackOutput: "apiKeyValue", - // }, - // expectedBody: "contents1\n", - // }, - // { - // urlStackOutputKey: "url", - // urlPath: "/integration", - // requiredParameters: &requiredParameters{ - // queryParameters: []string{"key"}, - // expectedBodyWithoutQueryStr: `{"message": "Missing required request parameters: [key]"}`, - // }, - // requiredAuth: &requiredAuth{ - // queryParameters: map[string]string{ - // "auth": "password", - // }, - // }, - // requiredAPIKey: &requiredAPIKey{ - // stackOutput: "apiKeyValue", - // }, - // skipBodyValidation: true, - // }, - { - urlStackOutputKey: "authorizerUrl", - urlPath: "/www_old/file1.txt", - requiredAuth: &requiredAuth{ - queryParameters: map[string]string{ - "auth": "Allow", - }, - headers: map[string]string{ - "secret": "test", - }, - }, - expectedBody: "contents1\n", - }, - { - urlStackOutputKey: "cognitoUrl", - urlPath: "/www_old/sub/file1.txt", - requiredToken: &requiredToken{ - header: "Authorization", - getAuthToken: getCognitoUserToken, - }, - expectedBody: "othercontents1\n", - }, - }), - EditDirs: []integration.EditDir{{ - Dir: "../examples/api/step2", - Additive: true, - ExtraRuntimeValidation: validateAPITests([]apiTest{ - { - urlStackOutputKey: "url", - urlPath: "/b", - expectedBody: "

Hello world!

", - }, - }), - }}, - }) - - integration.ProgramTest(t, &test) -} - -func TestAccAlb_fargate(t *testing.T) { - skipIfShort(t) - test := getBaseOptions(t). - With(integration.ProgramTestOptions{ - Dir: path.Join(getCwd(t), "../examples/alb/fargate"), - StackName: addRandomSuffix("fargate"), - EditDirs: []integration.EditDir{ - { - Dir: "step2", - Additive: true, - ExpectNoChanges: true, - }, - }, - }) - - integration.ProgramTest(t, &test) -} - -func TestAccAlb_fargateInlineListener(t *testing.T) { - skipIfShort(t) - test := getBaseOptions(t). - With(integration.ProgramTestOptions{ - Dir: path.Join(getCwd(t), "../examples/alb/fargateInlineListener"), - StackName: addRandomSuffix("fargate"), - }) - - integration.ProgramTest(t, &test) -} - -func TestAccAlb_ec2Instance(t *testing.T) { - skipIfShort(t) - test := getBaseOptions(t). - With(integration.ProgramTestOptions{ - Dir: path.Join(getCwd(t), "../examples/alb/ec2Instance"), - StackName: addRandomSuffix("ec2Instance"), - }) - - integration.ProgramTest(t, &test) -} - -func TestAccAlb_lambdaTarget(t *testing.T) { - skipIfShort(t) - test := getBaseOptions(t). - With(integration.ProgramTestOptions{ - Dir: path.Join(getCwd(t), "../examples/alb/lambdaTarget"), - StackName: addRandomSuffix("lambdaTarget"), - }) - - integration.ProgramTest(t, &test) -} - -func TestAccNlb_fargate(t *testing.T) { - skipIfShort(t) - envRegion := getEnvRegion(t) - test := getBaseOptions(t). - With(integration.ProgramTestOptions{ - Dir: path.Join(getCwd(t), "../examples/nlb/fargate"), - StackName: addRandomSuffix("fargate"), - Config: map[string]string{ - "aws:region": "INVALID_REGION", - "aws:envRegion": envRegion, - "containers:redisPassword": "SECRETPASSWORD", - }, - PreviewCommandlineFlags: []string{ - "--diff", - }, - ExtraRuntimeValidation: containersRuntimeValidator(envRegion, true /*isFargate*/, false /*short*/), - }) - - integration.ProgramTest(t, &test) -} - -func skipIfShort(t *testing.T) { - if testing.Short() { - t.Skip("skipping long-running test in short mode") - } -} - -func getEnvRegion(t *testing.T) string { - envRegion := os.Getenv("AWS_REGION") - if envRegion == "" { - t.Skipf("Skipping test due to missing AWS_REGION environment variable") - } - fmt.Printf("AWS Region: %v\n", envRegion) - - return envRegion -} +// func TestAccDashboards(t *testing.T) { +// test := getBaseOptions(t). +// With(integration.ProgramTestOptions{ +// Dir: path.Join(getCwd(t), "../examples/dashboards"), +// }) + +// integration.ProgramTest(t, &test) +// } + +// func TestAccEcr(t *testing.T) { +// test := getBaseOptions(t). +// With(integration.ProgramTestOptions{ +// Dir: path.Join(getCwd(t), "../examples/ecr"), +// }) + +// integration.ProgramTest(t, &test) +// } + +// func TestAccMetrics(t *testing.T) { +// test := getBaseOptions(t). +// With(integration.ProgramTestOptions{ +// Dir: path.Join(getCwd(t), "../examples/metrics"), +// }) + +// integration.ProgramTest(t, &test) +// } + +// func TestAccVpcIgnoreSubnetChanges(t *testing.T) { +// test := getBaseOptions(t). +// With(integration.ProgramTestOptions{ +// Dir: path.Join(getCwd(t), "../examples/vpcIgnoreSubnetChanges"), +// StackName: addRandomSuffix("vpcIgnoreSubnetChanges"), +// EditDirs: []integration.EditDir{ +// { +// Dir: "step2", +// Additive: true, +// ExpectNoChanges: true, +// }, +// }, +// }) + +// integration.ProgramTest(t, &test) +// } + +// func TestAccVpc(t *testing.T) { +// test := getBaseOptions(t). +// With(integration.ProgramTestOptions{ +// Dir: path.Join(getCwd(t), "../examples/vpc"), +// StackName: addRandomSuffix("vpc"), +// }) + +// integration.ProgramTest(t, &test) +// } + +// func TestAccNlb_fargateShort(t *testing.T) { +// envRegion := getEnvRegion(t) +// test := getBaseOptions(t). +// With(integration.ProgramTestOptions{ +// Dir: path.Join(getCwd(t), "../examples/nlb/fargateShort"), +// StackName: addRandomSuffix("fargate"), +// ExtraRuntimeValidation: containersRuntimeValidator(envRegion, true /*isFargate*/, true /*short*/), +// EditDirs: []integration.EditDir{ +// { +// Dir: "step2", +// Additive: true, +// ExpectNoChanges: true, +// }, +// }, +// }) + +// integration.ProgramTest(t, &test) +// } + +// func TestAccNlb_fargateShortInlineListener(t *testing.T) { +// envRegion := getEnvRegion(t) +// test := getBaseOptions(t). +// With(integration.ProgramTestOptions{ +// Dir: path.Join(getCwd(t), "../examples/nlb/fargateShortInlineListener"), +// StackName: addRandomSuffix("fargate"), +// ExtraRuntimeValidation: containersRuntimeValidator(envRegion, true /*isFargate*/, true /*short*/), +// }) + +// integration.ProgramTest(t, &test) +// } + +// func TestAccAlb_ec2(t *testing.T) { +// test := getBaseOptions(t). +// With(integration.ProgramTestOptions{ +// Dir: path.Join(getCwd(t), "../examples/alb/ec2"), +// StackName: addRandomSuffix("ec2"), +// }) + +// integration.ProgramTest(t, &test) +// } + +// func TestAccApi(t *testing.T) { +// test := getBaseOptions(t). +// With(integration.ProgramTestOptions{ +// Dir: path.Join(getCwd(t), "../examples/api"), +// ExtraRuntimeValidation: validateAPITests([]apiTest{ +// { +// urlStackOutputKey: "url", +// urlPath: "/a", +// requiredParameters: &requiredParameters{ +// queryParameters: []string{"key"}, +// expectedBodyWithoutQueryStr: `{"message": "Missing required request parameters: [key]"}`, +// }, +// requiredAuth: &requiredAuth{ +// queryParameters: map[string]string{ +// "auth": "password", +// }, +// }, +// expectedBody: "

Hello world!

", +// }, +// // { +// // urlStackOutputKey: "url", +// // urlPath: "/b", +// // requiredAuth: &requiredAuth{ +// // queryParameters: map[string]string{ +// // "auth": "password", +// // }, +// // }, +// // requiredAPIKey: &requiredAPIKey{ +// // stackOutput: "apiKeyValue", +// // }, +// // expectedBody: "Hello, world!", +// // }, +// // { +// // urlStackOutputKey: "url", +// // urlPath: "/www/file1.txt", +// // requiredParameters: &requiredParameters{ +// // queryParameters: []string{"key"}, +// // expectedBodyWithoutQueryStr: `{"message": "Missing required request parameters: [key]"}`, +// // }, +// // requiredAuth: &requiredAuth{ +// // headers: map[string]string{ +// // "Authorization": "Allow", +// // }, +// // }, +// // requiredAPIKey: &requiredAPIKey{ +// // stackOutput: "apiKeyValue", +// // }, +// // expectedBody: "contents1\n", +// // }, +// // { +// // urlStackOutputKey: "url", +// // urlPath: "/integration", +// // requiredParameters: &requiredParameters{ +// // queryParameters: []string{"key"}, +// // expectedBodyWithoutQueryStr: `{"message": "Missing required request parameters: [key]"}`, +// // }, +// // requiredAuth: &requiredAuth{ +// // queryParameters: map[string]string{ +// // "auth": "password", +// // }, +// // }, +// // requiredAPIKey: &requiredAPIKey{ +// // stackOutput: "apiKeyValue", +// // }, +// // skipBodyValidation: true, +// // }, +// { +// urlStackOutputKey: "authorizerUrl", +// urlPath: "/www_old/file1.txt", +// requiredAuth: &requiredAuth{ +// queryParameters: map[string]string{ +// "auth": "Allow", +// }, +// headers: map[string]string{ +// "secret": "test", +// }, +// }, +// expectedBody: "contents1\n", +// }, +// { +// urlStackOutputKey: "cognitoUrl", +// urlPath: "/www_old/sub/file1.txt", +// requiredToken: &requiredToken{ +// header: "Authorization", +// getAuthToken: getCognitoUserToken, +// }, +// expectedBody: "othercontents1\n", +// }, +// }), +// EditDirs: []integration.EditDir{{ +// Dir: "../examples/api/step2", +// Additive: true, +// ExtraRuntimeValidation: validateAPITests([]apiTest{ +// { +// urlStackOutputKey: "url", +// urlPath: "/b", +// expectedBody: "

Hello world!

", +// }, +// }), +// }}, +// }) + +// integration.ProgramTest(t, &test) +// } + +// func TestAccAlb_fargate(t *testing.T) { +// skipIfShort(t) +// test := getBaseOptions(t). +// With(integration.ProgramTestOptions{ +// Dir: path.Join(getCwd(t), "../examples/alb/fargate"), +// StackName: addRandomSuffix("fargate"), +// EditDirs: []integration.EditDir{ +// { +// Dir: "step2", +// Additive: true, +// ExpectNoChanges: true, +// }, +// }, +// }) + +// integration.ProgramTest(t, &test) +// } + +// func TestAccAlb_fargateInlineListener(t *testing.T) { +// skipIfShort(t) +// test := getBaseOptions(t). +// With(integration.ProgramTestOptions{ +// Dir: path.Join(getCwd(t), "../examples/alb/fargateInlineListener"), +// StackName: addRandomSuffix("fargate"), +// }) + +// integration.ProgramTest(t, &test) +// } + +// func TestAccAlb_ec2Instance(t *testing.T) { +// skipIfShort(t) +// test := getBaseOptions(t). +// With(integration.ProgramTestOptions{ +// Dir: path.Join(getCwd(t), "../examples/alb/ec2Instance"), +// StackName: addRandomSuffix("ec2Instance"), +// }) + +// integration.ProgramTest(t, &test) +// } + +// func TestAccAlb_lambdaTarget(t *testing.T) { +// skipIfShort(t) +// test := getBaseOptions(t). +// With(integration.ProgramTestOptions{ +// Dir: path.Join(getCwd(t), "../examples/alb/lambdaTarget"), +// StackName: addRandomSuffix("lambdaTarget"), +// }) + +// integration.ProgramTest(t, &test) +// } + +// func TestAccNlb_fargate(t *testing.T) { +// skipIfShort(t) +// envRegion := getEnvRegion(t) +// test := getBaseOptions(t). +// With(integration.ProgramTestOptions{ +// Dir: path.Join(getCwd(t), "../examples/nlb/fargate"), +// StackName: addRandomSuffix("fargate"), +// Config: map[string]string{ +// "aws:region": "INVALID_REGION", +// "aws:envRegion": envRegion, +// "containers:redisPassword": "SECRETPASSWORD", +// }, +// PreviewCommandlineFlags: []string{ +// "--diff", +// }, +// ExtraRuntimeValidation: containersRuntimeValidator(envRegion, true /*isFargate*/, false /*short*/), +// }) + +// integration.ProgramTest(t, &test) +// } + +// func skipIfShort(t *testing.T) { +// if testing.Short() { +// t.Skip("skipping long-running test in short mode") +// } +// } + +// func getEnvRegion(t *testing.T) string { +// envRegion := os.Getenv("AWS_REGION") +// if envRegion == "" { +// t.Skipf("Skipping test due to missing AWS_REGION environment variable") +// } +// fmt.Printf("AWS Region: %v\n", envRegion) + +// return envRegion +// } func getCwd(t *testing.T) string { cwd, err := os.Getwd() @@ -343,23 +343,23 @@ func getCwd(t *testing.T) string { return cwd } -func getBaseOptions(t *testing.T) integration.ProgramTestOptions { - envRegion := getEnvRegion(t) - baseJS := integration.ProgramTestOptions{ - Config: map[string]string{ - "aws:envRegion": envRegion, - }, - Dependencies: []string{ - "@pulumi/awsx", - }, - Quick: true, - SkipRefresh: true, - ExpectRefreshChanges: true, - ReportStats: integration.NewS3Reporter("us-west-2", "eng.pulumi.com", "testreports"), - } - - return baseJS -} +// func getBaseOptions(t *testing.T) integration.ProgramTestOptions { +// envRegion := getEnvRegion(t) +// baseJS := integration.ProgramTestOptions{ +// Config: map[string]string{ +// "aws:envRegion": envRegion, +// }, +// Dependencies: []string{ +// "@pulumi/awsx", +// }, +// Quick: true, +// SkipRefresh: true, +// ExpectRefreshChanges: true, +// ReportStats: integration.NewS3Reporter("us-west-2", "eng.pulumi.com", "testreports"), +// } + +// return baseJS +// } func getDefaultProviderOptions(t *testing.T) integration.ProgramTestOptions { baseJS := integration.ProgramTestOptions{ @@ -377,367 +377,367 @@ func getDefaultProviderOptions(t *testing.T) integration.ProgramTestOptions { return baseJS } -func getAllMessageText(logs []operations.LogEntry) string { - allMessageText := "" - for _, logEntry := range logs { - allMessageText = allMessageText + logEntry.Message + "\n" - } - return allMessageText -} - -func getLogs(t *testing.T, region string, stackInfo integration.RuntimeValidationStackInfo, - query operations.LogQuery) *[]operations.LogEntry { - - var states []*resource.State - for _, res := range stackInfo.Deployment.Resources { - state, err := stack.DeserializeResource(res, config.NewPanicCrypter()) - if !assert.NoError(t, err) { - return nil - } - states = append(states, state) - } - - tree := operations.NewResourceTree(states) - if !assert.NotNil(t, tree) { - return nil - } - cfg := map[config.Key]string{ - config.MustMakeKey("aws", "region"): region, - } - ops := tree.OperationsProvider(cfg) - - // Validate logs from example - logs, err := ops.GetLogs(query) - if !assert.NoError(t, err) { - return nil - } - return logs -} - -func containersRuntimeValidator(region string, isFargate bool, short bool) func(t *testing.T, stackInfo integration.RuntimeValidationStackInfo) { - return func(t *testing.T, stackInfo integration.RuntimeValidationStackInfo) { - baseURL, ok := stackInfo.Outputs["frontendURL"].(string) - - assert.True(t, ok, "expected a `frontendURL` output property of type string") - - // Validate the GET /test endpoint - { - resp := GetURL(t, baseURL+"test", 200) - contentType := resp.Header.Get("Content-Type") - assert.Equal(t, "application/json", contentType) - bytes, err := ioutil.ReadAll(resp.Body) - assert.NoError(t, err) - var endpoints map[string]map[string]interface{} - err = json.Unmarshal(bytes, &endpoints) - assert.NoError(t, err) - t.Logf("GET %v [%v/%v]: %v - %v", baseURL+"test", resp.StatusCode, contentType, string(bytes), endpoints) - } - - // Validate the GET /nginx endpoint - { - // https://github.com/pulumi/pulumi-cloud/issues/666 - // We are only making the proxy route in fargate testing. - if isFargate { - resp := GetURL(t, baseURL+"nginx", 200) - contentType := resp.Header.Get("Content-Type") - assert.Equal(t, "text/html", contentType) - bytes, err := ioutil.ReadAll(resp.Body) - assert.NoError(t, err) - t.Logf("GET %v [%v/%v]: %v", baseURL+"nginx", resp.StatusCode, contentType, string(bytes)) - } - { - resp := GetURL(t, baseURL+"nginx/doesnotexist", 404) - contentType := resp.Header.Get("Content-Type") - assert.Equal(t, "text/html", contentType) - bytes, err := ioutil.ReadAll(resp.Body) - assert.NoError(t, err) - t.Logf("GET %v [%v/%v]: %v", baseURL+"nginx/doesnotexist", resp.StatusCode, contentType, string(bytes)) - } - } - - if !short { - // Validate the GET / endpoint - { - // Call the endpoint twice so that things have time to warm up. - http.Get(baseURL) - resp := GetURL(t, baseURL, 200) - contentType := resp.Header.Get("Content-Type") - assert.Equal(t, "application/json", contentType) - bytes, err := ioutil.ReadAll(resp.Body) - assert.NoError(t, err) - t.Logf("GET %v [%v/%v]: %v", baseURL, resp.StatusCode, contentType, string(bytes)) - } - - // Validate the GET /run endpoint - { - resp := GetURL(t, baseURL+"run", 200) - contentType := resp.Header.Get("Content-Type") - assert.Equal(t, "application/json", contentType) - bytes, err := ioutil.ReadAll(resp.Body) - assert.NoError(t, err) - var data map[string]interface{} - err = json.Unmarshal(bytes, &data) - assert.NoError(t, err) - success, ok := data["success"] - assert.Equal(t, true, ok) - assert.Equal(t, true, success) - t.Logf("GET %v [%v/%v]: %v - %v", baseURL+"run", resp.StatusCode, contentType, string(bytes), data) - } - - // Validate the GET /custom endpoint - { - resp := GetURL(t, baseURL+"custom", 200) - contentType := resp.Header.Get("Content-Type") - assert.Equal(t, "application/json", contentType) - bytes, err := ioutil.ReadAll(resp.Body) - assert.NoError(t, err) - assert.True(t, strings.HasPrefix(string(bytes), "Hello, world")) - t.Logf("GET %v [%v/%v]: %v", baseURL+"custom", resp.StatusCode, contentType, string(bytes)) - } - - // Wait for five minutes before getting logs. - time.Sleep(5 * time.Minute) - - // Validate logs from example - logs := getLogs(t, region, stackInfo, operations.LogQuery{}) - if !assert.NotNil(t, logs, "expected logs to be produced") { - return - } - if !assert.True(t, len(*logs) > 10) { - return - } - logsByResource := map[string][]operations.LogEntry{} - for _, l := range *logs { - cur, _ := logsByResource[l.ID] - logsByResource[l.ID] = append(cur, l) - } - - // for id, logs := range logsByResource { - // t.Logf("LogId (%v): %v\n%v", len(logs), id, getAllMessageText(logs)) - // } - - // NGINX logs - // {examples-nginx 1512871243078 18.217.247.198 - - [10/Dec/2017:02:00:43 +0000] "GET / HTTP/1.1" ... - - // https://github.com/pulumi/pulumi-cloud/issues/666 - // We are only making the proxy route in fargate testing. - if isFargate { - nginxLogs, exists := getLogsWithPrefix(logsByResource, "nginx-") - if !assert.True(t, exists) { - return - } - if !assert.True(t, len(nginxLogs) > 0) { - return - } - assert.Contains(t, getAllMessageText(nginxLogs), "GET /") - } - - // Hello World container Task logs - // {examples-hello-world 1512871250458 Hello from Docker!} - { - helloWorldLogs, exists := getLogsWithPrefix(logsByResource, "hello-world-") - if !assert.True(t, exists) { - return - } - if !assert.True(t, len(helloWorldLogs) > 3) { - return - } - assert.Contains(t, getAllMessageText(helloWorldLogs), "Hello from Docker!") - } - - // Cache Redis container logs - // {examples-mycache 1512870479441 1:C 10 Dec 01:47:59.440 # oO0OoO0OoO0Oo Redis is starting ... - { - redisLogs, exists := getLogsWithPrefix(logsByResource, "mycache-") - if !assert.True(t, exists) { - return - } - if !assert.True(t, len(redisLogs) > 5) { - return - } - assert.Contains(t, getAllMessageText(redisLogs), "Redis is starting") - } - } - } -} - -func GetURL(t *testing.T, url string, statusCode int) *http.Response { - var resp *http.Response - var err error - for i := 0; i <= 10; i++ { - resp, err = http.Get(url) - if err == nil && resp.StatusCode == statusCode { - return resp - } - - if err != nil { - t.Logf("Got error trying to get %v. %v", url, err.Error()) - } - - if resp != nil && resp.StatusCode != statusCode { - t.Logf("Expected to get status code %v for %v. Got: %v", statusCode, url, resp.StatusCode) - } - - time.Sleep(1 * time.Minute) - } - - if !assert.NoError(t, err, "expected to be able to GET "+url) { - t.FailNow() - } - - if !assert.Equal(t, statusCode, resp.StatusCode, "Got unexpected status code. Body was:") { - contentType := resp.Header.Get("Content-Type") - bytes, _ := ioutil.ReadAll(resp.Body) - t.Logf("GET %v [%v/%v]: %v", url, resp.StatusCode, contentType, string(bytes)) - t.FailNow() - } - - return nil -} - -func getLogsWithPrefix(logsByResource map[string][]operations.LogEntry, prefix string) ([]operations.LogEntry, bool) { - for key, logs := range logsByResource { - if strings.HasPrefix(key, prefix) { - return logs, true - } - } - - return nil, false -} - -func addRandomSuffix(s string) string { - b := make([]byte, 4) - _, err := rand.Read(b) - contract.AssertNoError(err) - return s + "-" + hex.EncodeToString(b) -} - -type apiTest struct { - urlStackOutputKey string - urlPath string - requiredParameters *requiredParameters - requiredAuth *requiredAuth - requiredToken *requiredToken - requiredAPIKey *requiredAPIKey - expectedBody string - skipBodyValidation bool -} - -type requiredAuth struct { - headers map[string]string - queryParameters map[string]string -} - -type requiredToken struct { - header string - getAuthToken func(t *testing.T, stack integration.RuntimeValidationStackInfo) string -} - -type requiredAPIKey struct { - stackOutput string -} - -type requiredParameters struct { - queryParameters []string - expectedBodyWithoutQueryStr string -} - -func validateAPITests(apiTests []apiTest) func(t *testing.T, stack integration.RuntimeValidationStackInfo) { - return func(t *testing.T, stack integration.RuntimeValidationStackInfo) { - for _, tt := range apiTests { - url := stack.Outputs[tt.urlStackOutputKey].(string) + tt.urlPath - - req, err := http.NewRequest(http.MethodGet, url, nil) - if err != nil { - t.Logf("Got error trying to create request for %v", url) - } - - if tt.requiredAuth != nil { - resp := GetHTTP(t, req, 401) - assertRequestBody(t, `{"message":"401 Unauthorized"}`, false /*skipBodyValidation*/, resp) - - for header, val := range tt.requiredAuth.headers { - req.Header.Add(header, val) - } - - q := req.URL.Query() - for param, val := range tt.requiredAuth.queryParameters { - q.Add(param, val) - } - req.URL.RawQuery = q.Encode() - } - - if tt.requiredToken != nil { - resp := GetHTTP(t, req, 401) - assertRequestBody(t, `{"message":"401 Unauthorized"}`, false /*skipBodyValidation*/, resp) - - token := tt.requiredToken.getAuthToken(t, stack) - req.Header.Add(tt.requiredToken.header, token) - } - - if tt.requiredAPIKey != nil { - resp := GetHTTP(t, req, 403) - assertRequestBody(t, `{"message":"Forbidden"}`, false /*skipBodyValidation*/, resp) - - apikey := stack.Outputs[tt.requiredAPIKey.stackOutput].(string) - req.Header.Add("x-api-key", apikey) - } - - if tt.requiredParameters != nil { - resp := GetHTTP(t, req, 400) - assertRequestBody(t, tt.requiredParameters.expectedBodyWithoutQueryStr, false /*skipBodyValidation*/, resp) - - q := req.URL.Query() - for _, param := range tt.requiredParameters.queryParameters { - q.Add(param, "test") - } - req.URL.RawQuery = q.Encode() - } - - resp := GetHTTP(t, req, 200) - assertRequestBody(t, tt.expectedBody, tt.skipBodyValidation, resp) - } - } -} - -func assertRequestBody(t *testing.T, expectedBody string, skipBodyValidation bool, resp *http.Response) { - defer resp.Body.Close() - if !skipBodyValidation { - bytes, err := ioutil.ReadAll(resp.Body) - assert.NoError(t, err) - assert.Equal(t, expectedBody, string(bytes)) - } -} - -func GetHTTP(t *testing.T, req *http.Request, statusCode int) *http.Response { - var resp *http.Response - var err error - var httpClient http.Client - url := req.URL.String() - - for i := 0; i <= 10; i++ { - - resp, err = httpClient.Do(req) - if err == nil && resp.StatusCode == statusCode { - return resp - } - - if err != nil { - t.Logf("Got error trying to get %v. %v", url, err.Error()) - } - - if resp != nil && resp.StatusCode != statusCode { - t.Logf("Expected to get status code %v for %v. Got: %v", statusCode, url, resp.StatusCode) - } - - time.Sleep(1 * time.Minute) - } - - if !assert.NoError(t, err, "expected to be able to GET "+url) || - !assert.Equal(t, statusCode, resp.StatusCode, "Got unexpected status code") { - - t.FailNow() - } - - return nil -} +// func getAllMessageText(logs []operations.LogEntry) string { +// allMessageText := "" +// for _, logEntry := range logs { +// allMessageText = allMessageText + logEntry.Message + "\n" +// } +// return allMessageText +// } + +// func getLogs(t *testing.T, region string, stackInfo integration.RuntimeValidationStackInfo, +// query operations.LogQuery) *[]operations.LogEntry { + +// var states []*resource.State +// for _, res := range stackInfo.Deployment.Resources { +// state, err := stack.DeserializeResource(res, config.NewPanicCrypter()) +// if !assert.NoError(t, err) { +// return nil +// } +// states = append(states, state) +// } + +// tree := operations.NewResourceTree(states) +// if !assert.NotNil(t, tree) { +// return nil +// } +// cfg := map[config.Key]string{ +// config.MustMakeKey("aws", "region"): region, +// } +// ops := tree.OperationsProvider(cfg) + +// // Validate logs from example +// logs, err := ops.GetLogs(query) +// if !assert.NoError(t, err) { +// return nil +// } +// return logs +// } + +// func containersRuntimeValidator(region string, isFargate bool, short bool) func(t *testing.T, stackInfo integration.RuntimeValidationStackInfo) { +// return func(t *testing.T, stackInfo integration.RuntimeValidationStackInfo) { +// baseURL, ok := stackInfo.Outputs["frontendURL"].(string) + +// assert.True(t, ok, "expected a `frontendURL` output property of type string") + +// // Validate the GET /test endpoint +// { +// resp := GetURL(t, baseURL+"test", 200) +// contentType := resp.Header.Get("Content-Type") +// assert.Equal(t, "application/json", contentType) +// bytes, err := ioutil.ReadAll(resp.Body) +// assert.NoError(t, err) +// var endpoints map[string]map[string]interface{} +// err = json.Unmarshal(bytes, &endpoints) +// assert.NoError(t, err) +// t.Logf("GET %v [%v/%v]: %v - %v", baseURL+"test", resp.StatusCode, contentType, string(bytes), endpoints) +// } + +// // Validate the GET /nginx endpoint +// { +// // https://github.com/pulumi/pulumi-cloud/issues/666 +// // We are only making the proxy route in fargate testing. +// if isFargate { +// resp := GetURL(t, baseURL+"nginx", 200) +// contentType := resp.Header.Get("Content-Type") +// assert.Equal(t, "text/html", contentType) +// bytes, err := ioutil.ReadAll(resp.Body) +// assert.NoError(t, err) +// t.Logf("GET %v [%v/%v]: %v", baseURL+"nginx", resp.StatusCode, contentType, string(bytes)) +// } +// { +// resp := GetURL(t, baseURL+"nginx/doesnotexist", 404) +// contentType := resp.Header.Get("Content-Type") +// assert.Equal(t, "text/html", contentType) +// bytes, err := ioutil.ReadAll(resp.Body) +// assert.NoError(t, err) +// t.Logf("GET %v [%v/%v]: %v", baseURL+"nginx/doesnotexist", resp.StatusCode, contentType, string(bytes)) +// } +// } + +// if !short { +// // Validate the GET / endpoint +// { +// // Call the endpoint twice so that things have time to warm up. +// http.Get(baseURL) +// resp := GetURL(t, baseURL, 200) +// contentType := resp.Header.Get("Content-Type") +// assert.Equal(t, "application/json", contentType) +// bytes, err := ioutil.ReadAll(resp.Body) +// assert.NoError(t, err) +// t.Logf("GET %v [%v/%v]: %v", baseURL, resp.StatusCode, contentType, string(bytes)) +// } + +// // Validate the GET /run endpoint +// { +// resp := GetURL(t, baseURL+"run", 200) +// contentType := resp.Header.Get("Content-Type") +// assert.Equal(t, "application/json", contentType) +// bytes, err := ioutil.ReadAll(resp.Body) +// assert.NoError(t, err) +// var data map[string]interface{} +// err = json.Unmarshal(bytes, &data) +// assert.NoError(t, err) +// success, ok := data["success"] +// assert.Equal(t, true, ok) +// assert.Equal(t, true, success) +// t.Logf("GET %v [%v/%v]: %v - %v", baseURL+"run", resp.StatusCode, contentType, string(bytes), data) +// } + +// // Validate the GET /custom endpoint +// { +// resp := GetURL(t, baseURL+"custom", 200) +// contentType := resp.Header.Get("Content-Type") +// assert.Equal(t, "application/json", contentType) +// bytes, err := ioutil.ReadAll(resp.Body) +// assert.NoError(t, err) +// assert.True(t, strings.HasPrefix(string(bytes), "Hello, world")) +// t.Logf("GET %v [%v/%v]: %v", baseURL+"custom", resp.StatusCode, contentType, string(bytes)) +// } + +// // Wait for five minutes before getting logs. +// time.Sleep(5 * time.Minute) + +// // Validate logs from example +// logs := getLogs(t, region, stackInfo, operations.LogQuery{}) +// if !assert.NotNil(t, logs, "expected logs to be produced") { +// return +// } +// if !assert.True(t, len(*logs) > 10) { +// return +// } +// logsByResource := map[string][]operations.LogEntry{} +// for _, l := range *logs { +// cur, _ := logsByResource[l.ID] +// logsByResource[l.ID] = append(cur, l) +// } + +// // for id, logs := range logsByResource { +// // t.Logf("LogId (%v): %v\n%v", len(logs), id, getAllMessageText(logs)) +// // } + +// // NGINX logs +// // {examples-nginx 1512871243078 18.217.247.198 - - [10/Dec/2017:02:00:43 +0000] "GET / HTTP/1.1" ... + +// // https://github.com/pulumi/pulumi-cloud/issues/666 +// // We are only making the proxy route in fargate testing. +// if isFargate { +// nginxLogs, exists := getLogsWithPrefix(logsByResource, "nginx-") +// if !assert.True(t, exists) { +// return +// } +// if !assert.True(t, len(nginxLogs) > 0) { +// return +// } +// assert.Contains(t, getAllMessageText(nginxLogs), "GET /") +// } + +// // Hello World container Task logs +// // {examples-hello-world 1512871250458 Hello from Docker!} +// { +// helloWorldLogs, exists := getLogsWithPrefix(logsByResource, "hello-world-") +// if !assert.True(t, exists) { +// return +// } +// if !assert.True(t, len(helloWorldLogs) > 3) { +// return +// } +// assert.Contains(t, getAllMessageText(helloWorldLogs), "Hello from Docker!") +// } + +// // Cache Redis container logs +// // {examples-mycache 1512870479441 1:C 10 Dec 01:47:59.440 # oO0OoO0OoO0Oo Redis is starting ... +// { +// redisLogs, exists := getLogsWithPrefix(logsByResource, "mycache-") +// if !assert.True(t, exists) { +// return +// } +// if !assert.True(t, len(redisLogs) > 5) { +// return +// } +// assert.Contains(t, getAllMessageText(redisLogs), "Redis is starting") +// } +// } +// } +// } + +// func GetURL(t *testing.T, url string, statusCode int) *http.Response { +// var resp *http.Response +// var err error +// for i := 0; i <= 10; i++ { +// resp, err = http.Get(url) +// if err == nil && resp.StatusCode == statusCode { +// return resp +// } + +// if err != nil { +// t.Logf("Got error trying to get %v. %v", url, err.Error()) +// } + +// if resp != nil && resp.StatusCode != statusCode { +// t.Logf("Expected to get status code %v for %v. Got: %v", statusCode, url, resp.StatusCode) +// } + +// time.Sleep(1 * time.Minute) +// } + +// if !assert.NoError(t, err, "expected to be able to GET "+url) { +// t.FailNow() +// } + +// if !assert.Equal(t, statusCode, resp.StatusCode, "Got unexpected status code. Body was:") { +// contentType := resp.Header.Get("Content-Type") +// bytes, _ := ioutil.ReadAll(resp.Body) +// t.Logf("GET %v [%v/%v]: %v", url, resp.StatusCode, contentType, string(bytes)) +// t.FailNow() +// } + +// return nil +// } + +// func getLogsWithPrefix(logsByResource map[string][]operations.LogEntry, prefix string) ([]operations.LogEntry, bool) { +// for key, logs := range logsByResource { +// if strings.HasPrefix(key, prefix) { +// return logs, true +// } +// } + +// return nil, false +// } + +// func addRandomSuffix(s string) string { +// b := make([]byte, 4) +// _, err := rand.Read(b) +// contract.AssertNoError(err) +// return s + "-" + hex.EncodeToString(b) +// } + +// type apiTest struct { +// urlStackOutputKey string +// urlPath string +// requiredParameters *requiredParameters +// requiredAuth *requiredAuth +// requiredToken *requiredToken +// requiredAPIKey *requiredAPIKey +// expectedBody string +// skipBodyValidation bool +// } + +// type requiredAuth struct { +// headers map[string]string +// queryParameters map[string]string +// } + +// type requiredToken struct { +// header string +// getAuthToken func(t *testing.T, stack integration.RuntimeValidationStackInfo) string +// } + +// type requiredAPIKey struct { +// stackOutput string +// } + +// type requiredParameters struct { +// queryParameters []string +// expectedBodyWithoutQueryStr string +// } + +// func validateAPITests(apiTests []apiTest) func(t *testing.T, stack integration.RuntimeValidationStackInfo) { +// return func(t *testing.T, stack integration.RuntimeValidationStackInfo) { +// for _, tt := range apiTests { +// url := stack.Outputs[tt.urlStackOutputKey].(string) + tt.urlPath + +// req, err := http.NewRequest(http.MethodGet, url, nil) +// if err != nil { +// t.Logf("Got error trying to create request for %v", url) +// } + +// if tt.requiredAuth != nil { +// resp := GetHTTP(t, req, 401) +// assertRequestBody(t, `{"message":"401 Unauthorized"}`, false /*skipBodyValidation*/, resp) + +// for header, val := range tt.requiredAuth.headers { +// req.Header.Add(header, val) +// } + +// q := req.URL.Query() +// for param, val := range tt.requiredAuth.queryParameters { +// q.Add(param, val) +// } +// req.URL.RawQuery = q.Encode() +// } + +// if tt.requiredToken != nil { +// resp := GetHTTP(t, req, 401) +// assertRequestBody(t, `{"message":"401 Unauthorized"}`, false /*skipBodyValidation*/, resp) + +// token := tt.requiredToken.getAuthToken(t, stack) +// req.Header.Add(tt.requiredToken.header, token) +// } + +// if tt.requiredAPIKey != nil { +// resp := GetHTTP(t, req, 403) +// assertRequestBody(t, `{"message":"Forbidden"}`, false /*skipBodyValidation*/, resp) + +// apikey := stack.Outputs[tt.requiredAPIKey.stackOutput].(string) +// req.Header.Add("x-api-key", apikey) +// } + +// if tt.requiredParameters != nil { +// resp := GetHTTP(t, req, 400) +// assertRequestBody(t, tt.requiredParameters.expectedBodyWithoutQueryStr, false /*skipBodyValidation*/, resp) + +// q := req.URL.Query() +// for _, param := range tt.requiredParameters.queryParameters { +// q.Add(param, "test") +// } +// req.URL.RawQuery = q.Encode() +// } + +// resp := GetHTTP(t, req, 200) +// assertRequestBody(t, tt.expectedBody, tt.skipBodyValidation, resp) +// } +// } +// } + +// func assertRequestBody(t *testing.T, expectedBody string, skipBodyValidation bool, resp *http.Response) { +// defer resp.Body.Close() +// if !skipBodyValidation { +// bytes, err := ioutil.ReadAll(resp.Body) +// assert.NoError(t, err) +// assert.Equal(t, expectedBody, string(bytes)) +// } +// } + +// func GetHTTP(t *testing.T, req *http.Request, statusCode int) *http.Response { +// var resp *http.Response +// var err error +// var httpClient http.Client +// url := req.URL.String() + +// for i := 0; i <= 10; i++ { + +// resp, err = httpClient.Do(req) +// if err == nil && resp.StatusCode == statusCode { +// return resp +// } + +// if err != nil { +// t.Logf("Got error trying to get %v. %v", url, err.Error()) +// } + +// if resp != nil && resp.StatusCode != statusCode { +// t.Logf("Expected to get status code %v for %v. Got: %v", statusCode, url, resp.StatusCode) +// } + +// time.Sleep(1 * time.Minute) +// } + +// if !assert.NoError(t, err, "expected to be able to GET "+url) || +// !assert.Equal(t, statusCode, resp.StatusCode, "Got unexpected status code") { + +// t.FailNow() +// } + +// return nil +// }