protocol_test.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  1. /*
  2. * Licensed to the Apache Software Foundation (ASF) under one
  3. * or more contributor license agreements. See the NOTICE file
  4. * distributed with this work for additional information
  5. * regarding copyright ownership. The ASF licenses this file
  6. * to you under the Apache License, Version 2.0 (the
  7. * "License"); you may not use this file except in compliance
  8. * with the License. You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing,
  13. * software distributed under the License is distributed on an
  14. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15. * KIND, either express or implied. See the License for the
  16. * specific language governing permissions and limitations
  17. * under the License.
  18. */
  19. package thrift
  20. import (
  21. "bytes"
  22. "io/ioutil"
  23. "math"
  24. "net"
  25. "net/http"
  26. "testing"
  27. )
  28. const PROTOCOL_BINARY_DATA_SIZE = 155
  29. var (
  30. data string // test data for writing
  31. protocol_bdata []byte // test data for writing; same as data
  32. BOOL_VALUES []bool
  33. BYTE_VALUES []byte
  34. INT16_VALUES []int16
  35. INT32_VALUES []int32
  36. INT64_VALUES []int64
  37. DOUBLE_VALUES []float64
  38. STRING_VALUES []string
  39. )
  40. func init() {
  41. protocol_bdata = make([]byte, PROTOCOL_BINARY_DATA_SIZE)
  42. for i := 0; i < PROTOCOL_BINARY_DATA_SIZE; i++ {
  43. protocol_bdata[i] = byte((i + 'a') % 255)
  44. }
  45. data = string(protocol_bdata)
  46. BOOL_VALUES = []bool{false, true, false, false, true}
  47. BYTE_VALUES = []byte{117, 0, 1, 32, 127, 128, 255}
  48. INT16_VALUES = []int16{459, 0, 1, -1, -128, 127, 32767, -32768}
  49. INT32_VALUES = []int32{459, 0, 1, -1, -128, 127, 32767, 2147483647, -2147483535}
  50. INT64_VALUES = []int64{459, 0, 1, -1, -128, 127, 32767, 2147483647, -2147483535, 34359738481, -35184372088719, -9223372036854775808, 9223372036854775807}
  51. DOUBLE_VALUES = []float64{459.3, 0.0, -1.0, 1.0, 0.5, 0.3333, 3.14159, 1.537e-38, 1.673e25, 6.02214179e23, -6.02214179e23, INFINITY.Float64(), NEGATIVE_INFINITY.Float64(), NAN.Float64()}
  52. STRING_VALUES = []string{"", "a", "st[uf]f", "st,u:ff with spaces", "stuff\twith\nescape\\characters'...\"lots{of}fun</xml>"}
  53. }
  54. type HTTPEchoServer struct{}
  55. type HTTPHeaderEchoServer struct{}
  56. func (p *HTTPEchoServer) ServeHTTP(w http.ResponseWriter, req *http.Request) {
  57. buf, err := ioutil.ReadAll(req.Body)
  58. if err != nil {
  59. w.WriteHeader(http.StatusBadRequest)
  60. w.Write(buf)
  61. } else {
  62. w.WriteHeader(http.StatusOK)
  63. w.Write(buf)
  64. }
  65. }
  66. func (p *HTTPHeaderEchoServer) ServeHTTP(w http.ResponseWriter, req *http.Request) {
  67. buf, err := ioutil.ReadAll(req.Body)
  68. if err != nil {
  69. w.WriteHeader(http.StatusBadRequest)
  70. w.Write(buf)
  71. } else {
  72. w.WriteHeader(http.StatusOK)
  73. w.Write(buf)
  74. }
  75. }
  76. func HttpClientSetupForTest(t *testing.T) (net.Listener, net.Addr) {
  77. addr, err := FindAvailableTCPServerPort(40000)
  78. if err != nil {
  79. t.Fatalf("Unable to find available tcp port addr: %s", err)
  80. return nil, addr
  81. }
  82. l, err := net.Listen(addr.Network(), addr.String())
  83. if err != nil {
  84. t.Fatalf("Unable to setup tcp listener on %s: %s", addr.String(), err)
  85. return l, addr
  86. }
  87. go http.Serve(l, &HTTPEchoServer{})
  88. return l, addr
  89. }
  90. func HttpClientSetupForHeaderTest(t *testing.T) (net.Listener, net.Addr) {
  91. addr, err := FindAvailableTCPServerPort(40000)
  92. if err != nil {
  93. t.Fatalf("Unable to find available tcp port addr: %s", err)
  94. return nil, addr
  95. }
  96. l, err := net.Listen(addr.Network(), addr.String())
  97. if err != nil {
  98. t.Fatalf("Unable to setup tcp listener on %s: %s", addr.String(), err)
  99. return l, addr
  100. }
  101. go http.Serve(l, &HTTPHeaderEchoServer{})
  102. return l, addr
  103. }
  104. func ReadWriteProtocolTest(t *testing.T, protocolFactory TProtocolFactory) {
  105. buf := bytes.NewBuffer(make([]byte, 0, 1024))
  106. l, addr := HttpClientSetupForTest(t)
  107. defer l.Close()
  108. transports := []TTransportFactory{
  109. NewTMemoryBufferTransportFactory(1024),
  110. NewStreamTransportFactory(buf, buf, true),
  111. NewTFramedTransportFactory(NewTMemoryBufferTransportFactory(1024)),
  112. NewTHttpPostClientTransportFactory("http://" + addr.String()),
  113. }
  114. for _, tf := range transports {
  115. trans := tf.GetTransport(nil)
  116. p := protocolFactory.GetProtocol(trans)
  117. ReadWriteBool(t, p, trans)
  118. trans.Close()
  119. }
  120. for _, tf := range transports {
  121. trans := tf.GetTransport(nil)
  122. p := protocolFactory.GetProtocol(trans)
  123. ReadWriteByte(t, p, trans)
  124. trans.Close()
  125. }
  126. for _, tf := range transports {
  127. trans := tf.GetTransport(nil)
  128. p := protocolFactory.GetProtocol(trans)
  129. ReadWriteI16(t, p, trans)
  130. trans.Close()
  131. }
  132. for _, tf := range transports {
  133. trans := tf.GetTransport(nil)
  134. p := protocolFactory.GetProtocol(trans)
  135. ReadWriteI32(t, p, trans)
  136. trans.Close()
  137. }
  138. for _, tf := range transports {
  139. trans := tf.GetTransport(nil)
  140. p := protocolFactory.GetProtocol(trans)
  141. ReadWriteI64(t, p, trans)
  142. trans.Close()
  143. }
  144. for _, tf := range transports {
  145. trans := tf.GetTransport(nil)
  146. p := protocolFactory.GetProtocol(trans)
  147. ReadWriteDouble(t, p, trans)
  148. trans.Close()
  149. }
  150. for _, tf := range transports {
  151. trans := tf.GetTransport(nil)
  152. p := protocolFactory.GetProtocol(trans)
  153. ReadWriteString(t, p, trans)
  154. trans.Close()
  155. }
  156. for _, tf := range transports {
  157. trans := tf.GetTransport(nil)
  158. p := protocolFactory.GetProtocol(trans)
  159. ReadWriteBinary(t, p, trans)
  160. trans.Close()
  161. }
  162. for _, tf := range transports {
  163. trans := tf.GetTransport(nil)
  164. p := protocolFactory.GetProtocol(trans)
  165. ReadWriteI64(t, p, trans)
  166. ReadWriteDouble(t, p, trans)
  167. ReadWriteBinary(t, p, trans)
  168. ReadWriteByte(t, p, trans)
  169. trans.Close()
  170. }
  171. }
  172. func ReadWriteBool(t testing.TB, p TProtocol, trans TTransport) {
  173. thetype := TType(BOOL)
  174. thelen := len(BOOL_VALUES)
  175. err := p.WriteListBegin(thetype, thelen)
  176. if err != nil {
  177. t.Errorf("%s: %T %T %q Error writing list begin: %q", "ReadWriteBool", p, trans, err, thetype)
  178. }
  179. for k, v := range BOOL_VALUES {
  180. err = p.WriteBool(v)
  181. if err != nil {
  182. t.Errorf("%s: %T %T %q Error writing bool in list at index %d: %q", "ReadWriteBool", p, trans, err, k, v)
  183. }
  184. }
  185. p.WriteListEnd()
  186. if err != nil {
  187. t.Errorf("%s: %T %T %q Error writing list end: %q", "ReadWriteBool", p, trans, err, BOOL_VALUES)
  188. }
  189. p.Flush()
  190. thetype2, thelen2, err := p.ReadListBegin()
  191. if err != nil {
  192. t.Errorf("%s: %T %T %q Error reading list: %q", "ReadWriteBool", p, trans, err, BOOL_VALUES)
  193. }
  194. _, ok := p.(*TSimpleJSONProtocol)
  195. if !ok {
  196. if thetype != thetype2 {
  197. t.Errorf("%s: %T %T type %s != type %s", "ReadWriteBool", p, trans, thetype, thetype2)
  198. }
  199. if thelen != thelen2 {
  200. t.Errorf("%s: %T %T len %s != len %s", "ReadWriteBool", p, trans, thelen, thelen2)
  201. }
  202. }
  203. for k, v := range BOOL_VALUES {
  204. value, err := p.ReadBool()
  205. if err != nil {
  206. t.Errorf("%s: %T %T %q Error reading bool at index %d: %q", "ReadWriteBool", p, trans, err, k, v)
  207. }
  208. if v != value {
  209. t.Errorf("%s: index %d %q %q %q != %q", "ReadWriteBool", k, p, trans, v, value)
  210. }
  211. }
  212. err = p.ReadListEnd()
  213. if err != nil {
  214. t.Errorf("%s: %T %T Unable to read list end: %q", "ReadWriteBool", p, trans, err)
  215. }
  216. }
  217. func ReadWriteByte(t testing.TB, p TProtocol, trans TTransport) {
  218. thetype := TType(BYTE)
  219. thelen := len(BYTE_VALUES)
  220. err := p.WriteListBegin(thetype, thelen)
  221. if err != nil {
  222. t.Errorf("%s: %T %T %q Error writing list begin: %q", "ReadWriteByte", p, trans, err, thetype)
  223. }
  224. for k, v := range BYTE_VALUES {
  225. err = p.WriteByte(v)
  226. if err != nil {
  227. t.Errorf("%s: %T %T %q Error writing byte in list at index %d: %q", "ReadWriteByte", p, trans, err, k, v)
  228. }
  229. }
  230. err = p.WriteListEnd()
  231. if err != nil {
  232. t.Errorf("%s: %T %T %q Error writing list end: %q", "ReadWriteByte", p, trans, err, BYTE_VALUES)
  233. }
  234. err = p.Flush()
  235. if err != nil {
  236. t.Errorf("%s: %T %T %q Error flushing list of bytes: %q", "ReadWriteByte", p, trans, err, BYTE_VALUES)
  237. }
  238. thetype2, thelen2, err := p.ReadListBegin()
  239. if err != nil {
  240. t.Errorf("%s: %T %T %q Error reading list: %q", "ReadWriteByte", p, trans, err, BYTE_VALUES)
  241. }
  242. _, ok := p.(*TSimpleJSONProtocol)
  243. if !ok {
  244. if thetype != thetype2 {
  245. t.Errorf("%s: %T %T type %s != type %s", "ReadWriteByte", p, trans, thetype, thetype2)
  246. }
  247. if thelen != thelen2 {
  248. t.Errorf("%s: %T %T len %s != len %s", "ReadWriteByte", p, trans, thelen, thelen2)
  249. }
  250. }
  251. for k, v := range BYTE_VALUES {
  252. value, err := p.ReadByte()
  253. if err != nil {
  254. t.Errorf("%s: %T %T %q Error reading byte at index %d: %q", "ReadWriteByte", p, trans, err, k, v)
  255. }
  256. if v != value {
  257. t.Errorf("%s: %T %T %d != %d", "ReadWriteByte", p, trans, v, value)
  258. }
  259. }
  260. err = p.ReadListEnd()
  261. if err != nil {
  262. t.Errorf("%s: %T %T Unable to read list end: %q", "ReadWriteByte", p, trans, err)
  263. }
  264. }
  265. func ReadWriteI16(t testing.TB, p TProtocol, trans TTransport) {
  266. thetype := TType(I16)
  267. thelen := len(INT16_VALUES)
  268. p.WriteListBegin(thetype, thelen)
  269. for _, v := range INT16_VALUES {
  270. p.WriteI16(v)
  271. }
  272. p.WriteListEnd()
  273. p.Flush()
  274. thetype2, thelen2, err := p.ReadListBegin()
  275. if err != nil {
  276. t.Errorf("%s: %T %T %q Error reading list: %q", "ReadWriteI16", p, trans, err, INT16_VALUES)
  277. }
  278. _, ok := p.(*TSimpleJSONProtocol)
  279. if !ok {
  280. if thetype != thetype2 {
  281. t.Errorf("%s: %T %T type %s != type %s", "ReadWriteI16", p, trans, thetype, thetype2)
  282. }
  283. if thelen != thelen2 {
  284. t.Errorf("%s: %T %T len %s != len %s", "ReadWriteI16", p, trans, thelen, thelen2)
  285. }
  286. }
  287. for k, v := range INT16_VALUES {
  288. value, err := p.ReadI16()
  289. if err != nil {
  290. t.Errorf("%s: %T %T %q Error reading int16 at index %d: %q", "ReadWriteI16", p, trans, err, k, v)
  291. }
  292. if v != value {
  293. t.Errorf("%s: %T %T %d != %d", "ReadWriteI16", p, trans, v, value)
  294. }
  295. }
  296. err = p.ReadListEnd()
  297. if err != nil {
  298. t.Errorf("%s: %T %T Unable to read list end: %q", "ReadWriteI16", p, trans, err)
  299. }
  300. }
  301. func ReadWriteI32(t testing.TB, p TProtocol, trans TTransport) {
  302. thetype := TType(I32)
  303. thelen := len(INT32_VALUES)
  304. p.WriteListBegin(thetype, thelen)
  305. for _, v := range INT32_VALUES {
  306. p.WriteI32(v)
  307. }
  308. p.WriteListEnd()
  309. p.Flush()
  310. thetype2, thelen2, err := p.ReadListBegin()
  311. if err != nil {
  312. t.Errorf("%s: %T %T %q Error reading list: %q", "ReadWriteI32", p, trans, err, INT32_VALUES)
  313. }
  314. _, ok := p.(*TSimpleJSONProtocol)
  315. if !ok {
  316. if thetype != thetype2 {
  317. t.Errorf("%s: %T %T type %s != type %s", "ReadWriteI32", p, trans, thetype, thetype2)
  318. }
  319. if thelen != thelen2 {
  320. t.Errorf("%s: %T %T len %s != len %s", "ReadWriteI32", p, trans, thelen, thelen2)
  321. }
  322. }
  323. for k, v := range INT32_VALUES {
  324. value, err := p.ReadI32()
  325. if err != nil {
  326. t.Errorf("%s: %T %T %q Error reading int32 at index %d: %q", "ReadWriteI32", p, trans, err, k, v)
  327. }
  328. if v != value {
  329. t.Errorf("%s: %T %T %d != %d", "ReadWriteI32", p, trans, v, value)
  330. }
  331. }
  332. if err != nil {
  333. t.Errorf("%s: %T %T Unable to read list end: %q", "ReadWriteI32", p, trans, err)
  334. }
  335. }
  336. func ReadWriteI64(t testing.TB, p TProtocol, trans TTransport) {
  337. thetype := TType(I64)
  338. thelen := len(INT64_VALUES)
  339. p.WriteListBegin(thetype, thelen)
  340. for _, v := range INT64_VALUES {
  341. p.WriteI64(v)
  342. }
  343. p.WriteListEnd()
  344. p.Flush()
  345. thetype2, thelen2, err := p.ReadListBegin()
  346. if err != nil {
  347. t.Errorf("%s: %T %T %q Error reading list: %q", "ReadWriteI64", p, trans, err, INT64_VALUES)
  348. }
  349. _, ok := p.(*TSimpleJSONProtocol)
  350. if !ok {
  351. if thetype != thetype2 {
  352. t.Errorf("%s: %T %T type %s != type %s", "ReadWriteI64", p, trans, thetype, thetype2)
  353. }
  354. if thelen != thelen2 {
  355. t.Errorf("%s: %T %T len %s != len %s", "ReadWriteI64", p, trans, thelen, thelen2)
  356. }
  357. }
  358. for k, v := range INT64_VALUES {
  359. value, err := p.ReadI64()
  360. if err != nil {
  361. t.Errorf("%s: %T %T %q Error reading int64 at index %d: %q", "ReadWriteI64", p, trans, err, k, v)
  362. }
  363. if v != value {
  364. t.Errorf("%s: %T %T %q != %q", "ReadWriteI64", p, trans, v, value)
  365. }
  366. }
  367. if err != nil {
  368. t.Errorf("%s: %T %T Unable to read list end: %q", "ReadWriteI64", p, trans, err)
  369. }
  370. }
  371. func ReadWriteDouble(t testing.TB, p TProtocol, trans TTransport) {
  372. thetype := TType(DOUBLE)
  373. thelen := len(DOUBLE_VALUES)
  374. p.WriteListBegin(thetype, thelen)
  375. for _, v := range DOUBLE_VALUES {
  376. p.WriteDouble(v)
  377. }
  378. p.WriteListEnd()
  379. p.Flush()
  380. thetype2, thelen2, err := p.ReadListBegin()
  381. if err != nil {
  382. t.Errorf("%s: %T %T %q Error reading list: %q", "ReadWriteDouble", p, trans, err, DOUBLE_VALUES)
  383. }
  384. if thetype != thetype2 {
  385. t.Errorf("%s: %T %T type %s != type %s", "ReadWriteDouble", p, trans, thetype, thetype2)
  386. }
  387. if thelen != thelen2 {
  388. t.Errorf("%s: %T %T len %s != len %s", "ReadWriteDouble", p, trans, thelen, thelen2)
  389. }
  390. for k, v := range DOUBLE_VALUES {
  391. value, err := p.ReadDouble()
  392. if err != nil {
  393. t.Errorf("%s: %T %T %q Error reading double at index %d: %q", "ReadWriteDouble", p, trans, err, k, v)
  394. }
  395. if math.IsNaN(v) {
  396. if !math.IsNaN(value) {
  397. t.Errorf("%s: %T %T math.IsNaN(%q) != math.IsNaN(%q)", "ReadWriteDouble", p, trans, v, value)
  398. }
  399. } else if v != value {
  400. t.Errorf("%s: %T %T %v != %q", "ReadWriteDouble", p, trans, v, value)
  401. }
  402. }
  403. err = p.ReadListEnd()
  404. if err != nil {
  405. t.Errorf("%s: %T %T Unable to read list end: %q", "ReadWriteDouble", p, trans, err)
  406. }
  407. }
  408. func ReadWriteString(t testing.TB, p TProtocol, trans TTransport) {
  409. thetype := TType(STRING)
  410. thelen := len(STRING_VALUES)
  411. p.WriteListBegin(thetype, thelen)
  412. for _, v := range STRING_VALUES {
  413. p.WriteString(v)
  414. }
  415. p.WriteListEnd()
  416. p.Flush()
  417. thetype2, thelen2, err := p.ReadListBegin()
  418. if err != nil {
  419. t.Errorf("%s: %T %T %q Error reading list: %q", "ReadWriteString", p, trans, err, STRING_VALUES)
  420. }
  421. _, ok := p.(*TSimpleJSONProtocol)
  422. if !ok {
  423. if thetype != thetype2 {
  424. t.Errorf("%s: %T %T type %s != type %s", "ReadWriteString", p, trans, thetype, thetype2)
  425. }
  426. if thelen != thelen2 {
  427. t.Errorf("%s: %T %T len %s != len %s", "ReadWriteString", p, trans, thelen, thelen2)
  428. }
  429. }
  430. for k, v := range STRING_VALUES {
  431. value, err := p.ReadString()
  432. if err != nil {
  433. t.Errorf("%s: %T %T %q Error reading string at index %d: %q", "ReadWriteString", p, trans, err, k, v)
  434. }
  435. if v != value {
  436. t.Errorf("%s: %T %T %d != %d", "ReadWriteString", p, trans, v, value)
  437. }
  438. }
  439. if err != nil {
  440. t.Errorf("%s: %T %T Unable to read list end: %q", "ReadWriteString", p, trans, err)
  441. }
  442. }
  443. func ReadWriteBinary(t testing.TB, p TProtocol, trans TTransport) {
  444. v := protocol_bdata
  445. p.WriteBinary(v)
  446. p.Flush()
  447. value, err := p.ReadBinary()
  448. if err != nil {
  449. t.Errorf("%s: %T %T Unable to read binary: %s", "ReadWriteBinary", p, trans, err.Error())
  450. }
  451. if len(v) != len(value) {
  452. t.Errorf("%s: %T %T len(v) != len(value)... %d != %d", "ReadWriteBinary", p, trans, len(v), len(value))
  453. } else {
  454. for i := 0; i < len(v); i++ {
  455. if v[i] != value[i] {
  456. t.Errorf("%s: %T %T %s != %s", "ReadWriteBinary", p, trans, v, value)
  457. }
  458. }
  459. }
  460. }