mirror of
https://github.com/Luzifer/cloudkeys-go.git
synced 2024-11-15 01:12:44 +00:00
123 lines
3.3 KiB
Go
123 lines
3.3 KiB
Go
|
// +build codegen
|
||
|
|
||
|
package api
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"os"
|
||
|
"text/template"
|
||
|
)
|
||
|
|
||
|
// SmokeTestSuite defines the test suite for smoke tests.
|
||
|
type SmokeTestSuite struct {
|
||
|
Version int `json:"version"`
|
||
|
DefaultRegion string `json:"defaultRegion"`
|
||
|
TestCases []SmokeTestCase `json:"testCases"`
|
||
|
}
|
||
|
|
||
|
// SmokeTestCase provides the definition for a integration smoke test case.
|
||
|
type SmokeTestCase struct {
|
||
|
OpName string `json:"operationName"`
|
||
|
Input map[string]interface{} `json:"input"`
|
||
|
ExpectErr bool `json:"errorExpectedFromService"`
|
||
|
}
|
||
|
|
||
|
// BuildInputShape returns the Go code as a string for initializing the test
|
||
|
// case's input shape.
|
||
|
func (c SmokeTestCase) BuildInputShape(ref *ShapeRef) string {
|
||
|
var b ShapeValueBuilder
|
||
|
return fmt.Sprintf("&%s{\n%s\n}",
|
||
|
b.GoType(ref, true),
|
||
|
b.BuildShape(ref, c.Input, false),
|
||
|
)
|
||
|
}
|
||
|
|
||
|
// AttachSmokeTests attaches the smoke test cases to the API model.
|
||
|
func (a *API) AttachSmokeTests(filename string) {
|
||
|
f, err := os.Open(filename)
|
||
|
if err != nil {
|
||
|
panic(fmt.Sprintf("failed to open smoke tests %s, err: %v", filename, err))
|
||
|
}
|
||
|
defer f.Close()
|
||
|
|
||
|
if err := json.NewDecoder(f).Decode(&a.SmokeTests); err != nil {
|
||
|
panic(fmt.Sprintf("failed to decode smoke tests %s, err: %v", filename, err))
|
||
|
}
|
||
|
|
||
|
if v := a.SmokeTests.Version; v != 1 {
|
||
|
panic(fmt.Sprintf("invalid smoke test version, %d", v))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// APISmokeTestsGoCode returns the Go Code string for the smoke tests.
|
||
|
func (a *API) APISmokeTestsGoCode() string {
|
||
|
w := bytes.NewBuffer(nil)
|
||
|
|
||
|
a.resetImports()
|
||
|
a.AddImport("context")
|
||
|
a.AddImport("testing")
|
||
|
a.AddImport("time")
|
||
|
a.AddSDKImport("aws")
|
||
|
a.AddSDKImport("aws/request")
|
||
|
a.AddSDKImport("aws/awserr")
|
||
|
a.AddSDKImport("aws/request")
|
||
|
a.AddSDKImport("awstesting/integration")
|
||
|
a.AddImport(a.ImportPath())
|
||
|
|
||
|
smokeTests := struct {
|
||
|
API *API
|
||
|
SmokeTestSuite
|
||
|
}{
|
||
|
API: a,
|
||
|
SmokeTestSuite: a.SmokeTests,
|
||
|
}
|
||
|
|
||
|
if err := smokeTestTmpl.Execute(w, smokeTests); err != nil {
|
||
|
panic(fmt.Sprintf("failed to create smoke tests, %v", err))
|
||
|
}
|
||
|
|
||
|
ignoreImports := `
|
||
|
var _ aws.Config
|
||
|
var _ awserr.Error
|
||
|
var _ request.Request
|
||
|
`
|
||
|
|
||
|
return a.importsGoCode() + ignoreImports + w.String()
|
||
|
}
|
||
|
|
||
|
var smokeTestTmpl = template.Must(template.New(`smokeTestTmpl`).Parse(`
|
||
|
{{- range $i, $testCase := $.TestCases }}
|
||
|
{{- $op := index $.API.Operations $testCase.OpName }}
|
||
|
func TestInteg_{{ printf "%02d" $i }}_{{ $op.ExportedName }}(t *testing.T) {
|
||
|
ctx, cancelFn := context.WithTimeout(context.Background(), 5 *time.Second)
|
||
|
defer cancelFn()
|
||
|
|
||
|
sess := integration.SessionWithDefaultRegion("{{ $.DefaultRegion }}")
|
||
|
svc := {{ $.API.PackageName }}.New(sess)
|
||
|
params := {{ $testCase.BuildInputShape $op.InputRef }}
|
||
|
_, err := svc.{{ $op.ExportedName }}WithContext(ctx, params)
|
||
|
{{- if $testCase.ExpectErr }}
|
||
|
if err == nil {
|
||
|
t.Fatalf("expect request to fail")
|
||
|
}
|
||
|
aerr, ok := err.(awserr.RequestFailure)
|
||
|
if !ok {
|
||
|
t.Fatalf("expect awserr, was %T", err)
|
||
|
}
|
||
|
if len(aerr.Code()) == 0 {
|
||
|
t.Errorf("expect non-empty error code")
|
||
|
}
|
||
|
if v := aerr.Code(); v == request.ErrCodeSerialization {
|
||
|
t.Errorf("expect API error code got serialization failure")
|
||
|
}
|
||
|
{{- else }}
|
||
|
if err != nil {
|
||
|
t.Errorf("expect no error, got %v", err)
|
||
|
}
|
||
|
{{- end }}
|
||
|
}
|
||
|
{{- end }}
|
||
|
`))
|