1// +build codegen
2
3package api
4
5import (
6	"bytes"
7	"fmt"
8	"strings"
9)
10
11// APIEventStreamTestGoCode generates Go code for EventStream operation tests.
12func (a *API) APIEventStreamTestGoCode() string {
13	var buf bytes.Buffer
14
15	a.resetImports()
16	a.AddImport("bytes")
17	a.AddImport("io/ioutil")
18	a.AddImport("net/http")
19	a.AddImport("reflect")
20	a.AddImport("testing")
21	a.AddImport("time")
22	a.AddImport("context")
23	a.AddImport("strings")
24	a.AddImport("sync")
25	a.AddSDKImport("aws")
26	a.AddSDKImport("aws/corehandlers")
27	a.AddSDKImport("aws/request")
28	a.AddSDKImport("aws/awserr")
29	a.AddSDKImport("awstesting/unit")
30	a.AddSDKImport("private/protocol")
31	a.AddSDKImport("private/protocol/", a.ProtocolPackage())
32	a.AddSDKImport("private/protocol/eventstream")
33	a.AddSDKImport("private/protocol/eventstream/eventstreamapi")
34	a.AddSDKImport("private/protocol/eventstream/eventstreamtest")
35
36	unused := `
37	var _ time.Time
38	var _ awserr.Error
39	var _ context.Context
40	var _ sync.WaitGroup
41	var _ strings.Reader
42	`
43
44	if err := eventStreamReaderTestTmpl.Execute(&buf, a); err != nil {
45		panic(err)
46	}
47
48	if err := eventStreamWriterTestTmpl.Execute(&buf, a); err != nil {
49		panic(err)
50	}
51
52	return a.importsGoCode() + unused + strings.TrimSpace(buf.String())
53}
54
55func templateMap(args ...interface{}) map[string]interface{} {
56	if len(args)%2 != 0 {
57		panic(fmt.Sprintf("invalid map call, non-even args %v", args))
58	}
59
60	m := map[string]interface{}{}
61	for i := 0; i < len(args); i += 2 {
62		k, ok := args[i].(string)
63		if !ok {
64			panic(fmt.Sprintf("invalid map call, arg is not string, %T, %v", args[i], args[i]))
65		}
66		m[k] = args[i+1]
67	}
68
69	return m
70}
71
72func valueForType(s *Shape, visited []string) string {
73	for _, v := range visited {
74		if v == s.ShapeName {
75			return "nil"
76		}
77	}
78
79	visited = append(visited, s.ShapeName)
80
81	switch s.Type {
82	case "blob":
83		return `[]byte("blob value goes here")`
84	case "string":
85		return `aws.String("string value goes here")`
86	case "boolean":
87		return `aws.Bool(true)`
88	case "byte":
89		return `aws.Int64(1)`
90	case "short":
91		return `aws.Int64(12)`
92	case "integer":
93		return `aws.Int64(123)`
94	case "long":
95		return `aws.Int64(1234)`
96	case "float":
97		return `aws.Float64(123.4)`
98	case "double":
99		return `aws.Float64(123.45)`
100	case "timestamp":
101		return `aws.Time(time.Unix(1396594860, 0).UTC())`
102	case "structure":
103		w := bytes.NewBuffer(nil)
104		fmt.Fprintf(w, "&%s{\n", s.ShapeName)
105		if s.Exception {
106			fmt.Fprintf(w, `RespMetadata: protocol.ResponseMetadata{
107	StatusCode: 200,
108},
109`)
110		}
111		for _, refName := range s.MemberNames() {
112			fmt.Fprintf(w, "%s: %s,\n", refName, valueForType(s.MemberRefs[refName].Shape, visited))
113		}
114		fmt.Fprintf(w, "}")
115		return w.String()
116	case "list":
117		w := bytes.NewBuffer(nil)
118		fmt.Fprintf(w, "%s{\n", s.GoType())
119		for i := 0; i < 3; i++ {
120			fmt.Fprintf(w, "%s,\n", valueForType(s.MemberRef.Shape, visited))
121		}
122		fmt.Fprintf(w, "}")
123		return w.String()
124
125	case "map":
126		w := bytes.NewBuffer(nil)
127		fmt.Fprintf(w, "%s{\n", s.GoType())
128		for _, k := range []string{"a", "b", "c"} {
129			fmt.Fprintf(w, "%q: %s,\n", k, valueForType(s.ValueRef.Shape, visited))
130		}
131		fmt.Fprintf(w, "}")
132		return w.String()
133
134	default:
135		panic(fmt.Sprintf("valueForType does not support %s, %s", s.ShapeName, s.Type))
136	}
137}
138