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