acs_request_test.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. package requests
  2. import (
  3. "bytes"
  4. "io"
  5. "sort"
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. )
  9. func Test_AcsRequest(t *testing.T) {
  10. r := defaultBaseRequest()
  11. assert.NotNil(t, r)
  12. // query params
  13. query := r.GetQueryParams()
  14. assert.Equal(t, 0, len(query))
  15. r.addQueryParam("key", "value")
  16. assert.Equal(t, 1, len(query))
  17. assert.Equal(t, "value", query["key"])
  18. // form params
  19. form := r.GetFormParams()
  20. assert.Equal(t, 0, len(form))
  21. r.addFormParam("key", "value")
  22. assert.Equal(t, 1, len(form))
  23. assert.Equal(t, "value", form["key"])
  24. // getter/setter for stringtosign
  25. assert.Equal(t, "", r.GetStringToSign())
  26. r.SetStringToSign("s2s")
  27. assert.Equal(t, "s2s", r.GetStringToSign())
  28. // content type
  29. _, contains := r.GetContentType()
  30. assert.False(t, contains)
  31. r.SetContentType("application/json")
  32. ct, contains := r.GetContentType()
  33. assert.Equal(t, "application/json", ct)
  34. assert.True(t, contains)
  35. // default 3 headers & content-type
  36. headers := r.GetHeaders()
  37. assert.Equal(t, 4, len(headers))
  38. r.addHeaderParam("x-key", "x-key-value")
  39. assert.Equal(t, 5, len(headers))
  40. assert.Equal(t, "x-key-value", headers["x-key"])
  41. // GetVersion
  42. assert.Equal(t, "", r.GetVersion())
  43. // GetActionName
  44. assert.Equal(t, "", r.GetActionName())
  45. // GetMethod
  46. assert.Equal(t, "GET", r.GetMethod())
  47. r.Method = "POST"
  48. assert.Equal(t, "POST", r.GetMethod())
  49. // Domain
  50. assert.Equal(t, "", r.GetDomain())
  51. r.SetDomain("ecs.aliyuncs.com")
  52. assert.Equal(t, "ecs.aliyuncs.com", r.GetDomain())
  53. // Region
  54. assert.Equal(t, "", r.GetRegionId())
  55. r.RegionId = "cn-hangzhou"
  56. assert.Equal(t, "cn-hangzhou", r.GetRegionId())
  57. // AcceptFormat
  58. assert.Equal(t, "JSON", r.GetAcceptFormat())
  59. r.AcceptFormat = "XML"
  60. assert.Equal(t, "XML", r.GetAcceptFormat())
  61. // GetLocationServiceCode
  62. assert.Equal(t, "", r.GetLocationServiceCode())
  63. // GetLocationEndpointType
  64. assert.Equal(t, "", r.GetLocationEndpointType())
  65. // GetProduct
  66. assert.Equal(t, "", r.GetProduct())
  67. // GetScheme
  68. assert.Equal(t, "", r.GetScheme())
  69. r.SetScheme("HTTPS")
  70. assert.Equal(t, "HTTPS", r.GetScheme())
  71. // GetPort
  72. assert.Equal(t, "", r.GetPort())
  73. // Content
  74. assert.Equal(t, []byte(nil), r.GetContent())
  75. r.SetContent([]byte("The Content"))
  76. assert.True(t, bytes.Equal([]byte("The Content"), r.GetContent()))
  77. }
  78. type AcsRequestTest struct {
  79. *baseRequest
  80. Ontology AcsRequest
  81. Query string `position:"Query" name:"Query"`
  82. Header string `position:"Header" name:"Header"`
  83. Path string `position:"Path" name:"Path"`
  84. Body string `position:"Body" name:"Body"`
  85. TypeAcs *[]string `position:"type" name:"type" type:"Repeated"`
  86. }
  87. func (r AcsRequestTest) BuildQueries() string {
  88. return ""
  89. }
  90. func (r AcsRequestTest) BuildUrl() string {
  91. return ""
  92. }
  93. func (r AcsRequestTest) GetBodyReader() io.Reader {
  94. return nil
  95. }
  96. func (r AcsRequestTest) GetStyle() string {
  97. return ""
  98. }
  99. func (r AcsRequestTest) addPathParam(key, value string) {
  100. return
  101. }
  102. func Test_AcsRequest_InitParams(t *testing.T) {
  103. r := &AcsRequestTest{
  104. baseRequest: defaultBaseRequest(),
  105. Query: "query value",
  106. Header: "header value",
  107. Path: "path value",
  108. Body: "body value",
  109. }
  110. tmp := []string{r.Query, r.Header}
  111. r.TypeAcs = &tmp
  112. r.addQueryParam("qkey", "qvalue")
  113. InitParams(r)
  114. queries := r.GetQueryParams()
  115. assert.Equal(t, "query value", queries["Query"])
  116. headers := r.GetHeaders()
  117. assert.Equal(t, "header value", headers["Header"])
  118. // TODO: check the body & path
  119. }
  120. // CreateContainerGroupRequest is the request struct for api CreateContainerGroup
  121. type CreateContainerGroupRequest struct {
  122. *RpcRequest
  123. OwnerId Integer `position:"Query" name:"OwnerId"`
  124. ResourceOwnerAccount string `position:"Query" name:"ResourceOwnerAccount"`
  125. ResourceOwnerId Integer `position:"Query" name:"ResourceOwnerId"`
  126. OwnerAccount string `position:"Query" name:"OwnerAccount"`
  127. RegionId string `position:"Query" name:"RegionId"`
  128. ZoneId string `position:"Query" name:"ZoneId"`
  129. SecurityGroupId string `position:"Query" name:"SecurityGroupId"`
  130. VSwitchId string `position:"Query" name:"VSwitchId"`
  131. ContainerGroupName string `position:"Query" name:"ContainerGroupName"`
  132. RestartPolicy string `position:"Query" name:"RestartPolicy"`
  133. Tag *[]CreateContainerGroup_Tag `position:"Query" name:"Tag" type:"Repeated"`
  134. ImageRegistryCredential *[]CreateContainerGroup_ImageRegistryCredential `position:"Query" name:"ImageRegistryCredential" type:"Repeated"`
  135. Container *[]CreateContainerGroup_Container `position:"Query" name:"Container" type:"Repeated"`
  136. Volume *[]CreateContainerGroup_Volume `position:"Query" name:"Volume" type:"Repeated"`
  137. EipInstanceId string `position:"Query" name:"EipInstanceId"`
  138. InitContainer *[]CreateContainerGroup_InitContainer `position:"Query" name:"InitContainer" type:"Repeated"`
  139. Cpu Float `position:"Query" name:"Cpu"`
  140. Memory Float `position:"Query" name:"Memory"`
  141. DnsConfig CreateContainerGroup_DnsConfig `position:"Query" name:"DnsConfig" type:"Struct"`
  142. }
  143. type CreateContainerGroup_Tag struct {
  144. Key string `name:"Key"`
  145. Value string `name:"Value"`
  146. }
  147. type CreateContainerGroup_ImageRegistryCredential struct {
  148. Server string `name:"Server"`
  149. UserName string `name:"UserName"`
  150. Password string `name:"Password"`
  151. }
  152. type CreateContainerGroup_Container struct {
  153. Image string `name:"Image"`
  154. Name string `name:"Name"`
  155. Cpu Float `name:"Cpu"`
  156. Memory Float `name:"Memory"`
  157. WorkingDir string `name:"WorkingDir"`
  158. ImagePullPolicy string `name:"ImagePullPolicy"`
  159. Command []string `name:"Command" type:"Repeated"`
  160. Arg []string `name:"Arg" type:"Repeated"`
  161. VolumeMount *[]CreateContainerGroup_VolumeMount `name:"VolumeMount" type:"Repeated"`
  162. Port *[]CreateContainerGroup_Port `name:"Port" type:"Repeated"`
  163. EnvironmentVar *[]CreateContainerGroup_EnvironmentVar `name:"EnvironmentVar" type:"Repeated"`
  164. ReadinessProbe CreateContainerGroup_ReadinessProbe `name:"ReadinessProbe" type:"Struct"`
  165. LivenessProbe CreateContainerGroup_LivenessProbe `name:"LivenessProbe" type:"Struct"`
  166. SecurityContext CreateContainerGroup_SecurityContext `name:"SecurityContext" type:"Struct"`
  167. }
  168. type CreateContainerGroup_Volume struct {
  169. Name string `name:"Name"`
  170. Type string `name:"Type"`
  171. NFSVolume CreateContainerGroup_NFSVolume `name:"NFSVolume"`
  172. ConfigFileVolume CreateContainerGroup_ConfigFileVolume `name:"ConfigFileVolume"`
  173. }
  174. type CreateContainerGroup_InitContainer struct {
  175. Name string `name:"Name"`
  176. Image string `name:"Image"`
  177. Cpu Float `name:"Cpu"`
  178. Memory Float `name:"Memory"`
  179. WorkingDir string `name:"WorkingDir"`
  180. ImagePullPolicy string `name:"ImagePullPolicy"`
  181. Command []string `name:"Command"`
  182. Arg []string `name:"Arg"`
  183. VolumeMount *[]CreateContainerGroup_VolumeMount `name:"VolumeMount"`
  184. Port *[]CreateContainerGroup_Port `name:"Port"`
  185. EnvironmentVar *[]CreateContainerGroup_EnvironmentVar `name:"EnvironmentVar"`
  186. SecurityContext CreateContainerGroup_SecurityContext `name:"SecurityContext"`
  187. }
  188. type CreateContainerGroup_DnsConfig struct {
  189. NameServer []string `name:"NameServer"`
  190. Search []string `name:"Search"`
  191. Option *[]CreateContainerGroup_Option `name:"Option"`
  192. }
  193. type CreateContainerGroup_VolumeMount struct {
  194. MountPath string `name:"MountPath"`
  195. ReadOnly Boolean `name:"ReadOnly"`
  196. Name string `name:"Name"`
  197. }
  198. type CreateContainerGroup_Port struct {
  199. Protocol string `name:"Protocol"`
  200. Port Integer `name:"Port"`
  201. }
  202. type CreateContainerGroup_EnvironmentVar struct {
  203. Key string `name:"Key"`
  204. Value string `name:"Value"`
  205. }
  206. type CreateContainerGroup_ReadinessProbe struct {
  207. InitialDelaySeconds Integer `name:"InitialDelaySeconds"`
  208. PeriodSeconds Integer `name:"PeriodSeconds"`
  209. SuccessThreshold Integer `name:"SuccessThreshold"`
  210. FailureThreshold Integer `name:"FailureThreshold"`
  211. TimeoutSeconds Integer `name:"TimeoutSeconds"`
  212. HttpGet CreateContainerGroup_HttpGet `name:"HttpGet"`
  213. Exec CreateContainerGroup_Exec `name:"Exec"`
  214. TcpSocket CreateContainerGroup_TcpSocket `name:"TcpSocket"`
  215. }
  216. type CreateContainerGroup_HttpGet struct {
  217. Path string `name:"Path"`
  218. Port Integer `name:"Port"`
  219. Scheme string `name:"Scheme"`
  220. }
  221. type CreateContainerGroup_Exec struct {
  222. Command []string `name:"Command"`
  223. }
  224. type CreateContainerGroup_TcpSocket struct {
  225. Port Integer `name:"Port"`
  226. }
  227. type CreateContainerGroup_LivenessProbe struct {
  228. InitialDelaySeconds Integer `name:"InitialDelaySeconds"`
  229. PeriodSeconds Integer `name:"PeriodSeconds"`
  230. SuccessThreshold Integer `name:"SuccessThreshold"`
  231. FailureThreshold Integer `name:"FailureThreshold"`
  232. TimeoutSeconds Integer `name:"TimeoutSeconds"`
  233. HttpGet CreateContainerGroup_HttpGet `name:"HttpGet"`
  234. Exec CreateContainerGroup_Exec `name:"Exec"`
  235. TcpSocket CreateContainerGroup_TcpSocket `name:"TcpSocket"`
  236. }
  237. type CreateContainerGroup_SecurityContext struct {
  238. ReadOnlyRootFilesystem Boolean `name:"ReadOnlyRootFilesystem"`
  239. RunAsUser Integer `name:"RunAsUser"`
  240. Capability CreateContainerGroup_Capability `name:"Capability"`
  241. }
  242. type CreateContainerGroup_Capability struct {
  243. Add []string `name:"Add"`
  244. }
  245. type CreateContainerGroup_NFSVolume struct {
  246. Server string `name:"Server"`
  247. Path string `name:"Path"`
  248. ReadOnly Boolean `name:"ReadOnly"`
  249. }
  250. type CreateContainerGroup_ConfigFileVolume struct {
  251. ConfigFileToPath *[]CreateContainerGroup_ConfigFileToPath `name:"ConfigFileToPath"`
  252. }
  253. type CreateContainerGroup_ConfigFileToPath struct {
  254. Content string `name:"Content"`
  255. Path string `name:"Path"`
  256. }
  257. type CreateContainerGroup_Option struct {
  258. Name string `name:"Name"`
  259. Value string `name:"Value"`
  260. }
  261. func GetQueryString(r *CreateContainerGroupRequest) string {
  262. queries := r.GetQueryParams()
  263. // To store the keys in slice in sorted order
  264. sortedKeys := make([]string, 0)
  265. for k := range queries {
  266. sortedKeys = append(sortedKeys, k)
  267. }
  268. sort.Strings(sortedKeys)
  269. // To perform the opertion you want
  270. resultBuilder := bytes.Buffer{}
  271. for _, key := range sortedKeys {
  272. resultBuilder.WriteString(key + "=" + queries[key] + "&")
  273. }
  274. return resultBuilder.String()
  275. }
  276. func InitRequest() (r *CreateContainerGroupRequest) {
  277. r = &CreateContainerGroupRequest{
  278. RpcRequest: &RpcRequest{},
  279. }
  280. r.InitWithApiInfo("Eci", "2018-08-08", "CreateContainerGroup", "eci", "openAPI")
  281. return
  282. }
  283. func Test_AcsRequest_InitParams2(t *testing.T) {
  284. r := InitRequest()
  285. InitParams(r)
  286. assert.Equal(t, "", GetQueryString(r))
  287. }
  288. func Test_AcsRequest_InitParams3(t *testing.T) {
  289. r := InitRequest()
  290. r.RegionId = "regionid"
  291. InitParams(r)
  292. assert.Equal(t, "RegionId=regionid&", GetQueryString(r))
  293. }
  294. func Test_AcsRequest_InitParams4(t *testing.T) {
  295. r := InitRequest()
  296. r.RegionId = "regionid"
  297. r.DnsConfig = CreateContainerGroup_DnsConfig{
  298. NameServer: []string{"nameserver1", "nameserver2"},
  299. }
  300. InitParams(r)
  301. assert.Equal(t, "DnsConfig.NameServer.1=nameserver1&DnsConfig.NameServer.2=nameserver2&RegionId=regionid&",
  302. GetQueryString(r))
  303. }
  304. func Test_AcsRequest_InitParams5(t *testing.T) {
  305. r := InitRequest()
  306. r.Container = &[]CreateContainerGroup_Container{
  307. {
  308. Image: "nginx",
  309. Name: "nginx",
  310. Cpu: "1",
  311. Memory: "2",
  312. WorkingDir: "ddd",
  313. },
  314. }
  315. InitParams(r)
  316. assert.Equal(t, "Container.1.Cpu=1&Container.1.Image=nginx&Container.1.Memory=2&Container.1.Name=nginx&Container.1.WorkingDir=ddd&",
  317. GetQueryString(r))
  318. }
  319. // > POST /?AccessKeyId=LTAIgTHQxl9boZTV&Action=CreateContainerGroup&Container.1.Arg=%3C%5B%5Dstring+Value%3E&Container.1.Command=%3C%5B%5Dstring+Value%3E&Container.1.Cpu=1&Container.1.EnvironmentVar=%3C%2A%5B%5Deci.CreateContainerGroup_EnvironmentVar+Value%3E&Container.1.Image=nginx&Container.1.LivenessProbe=%3Ceci.CreateContainerGroup_LivenessProbe+Value%3E&Container.1.Memory=2&Container.1.Name=nginx&Container.1.Port=%3C%2A%5B%5Deci.CreateContainerGroup_Port+Value%3E&Container.1.ReadinessProbe=%3Ceci.CreateContainerGroup_ReadinessProbe+Value%3E&Container.1.SecurityContext=%3Ceci.CreateContainerGroup_SecurityContext+Value%3E&Container.1.VolumeMount=%3C%2A%5B%5Deci.CreateContainerGroup_VolumeMount+Value%3E&Container.1.WorkingDir=ddd&ContainerGroupName=123&Format=JSON&RegionId=cn-shanghai&SecurityGroupId=sg-uf63nb42ltsf0gyadb8s&Signature=wH8RagWmLuOZfQ94khrEZ5yYA9M%3D&SignatureMethod=HMAC-SHA1&SignatureNonce=ec3eca4382884dbbb98c3bd7277e25c5&SignatureType=&SignatureVersion=1.0&Timestamp=2019-01-28T08%3A00%3A04Z&VSwitchId=vsw-uf6ck0dbgl3rg6i0xq8i0&Version=2018-08-08 HTTP/1.1