blob: 864958a9da0161930b290bf70b11b4108f2c5b7c [file] [log] [blame]
Jens Geyer0e87c462013-06-18 22:25:07 +02001/*
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
20package thrift
21
22import (
23 "io"
24 "net"
25 "strconv"
26 "testing"
27)
28
29const TRANSPORT_BINARY_DATA_SIZE = 4096
30
31var (
Jens Geyer706cb4e2014-03-19 00:37:10 +020032 transport_bdata []byte // test data for writing; same as data
33 transport_header map[string]string
Jens Geyer0e87c462013-06-18 22:25:07 +020034)
35
36func init() {
37 transport_bdata = make([]byte, TRANSPORT_BINARY_DATA_SIZE)
38 for i := 0; i < TRANSPORT_BINARY_DATA_SIZE; i++ {
39 transport_bdata[i] = byte((i + 'a') % 255)
40 }
Jens Geyer706cb4e2014-03-19 00:37:10 +020041 transport_header = map[string]string{"key": "User-Agent",
42 "value": "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36"}
Jens Geyer0e87c462013-06-18 22:25:07 +020043}
44
45func TransportTest(t *testing.T, writeTrans TTransport, readTrans TTransport) {
46 buf := make([]byte, TRANSPORT_BINARY_DATA_SIZE)
47 if !writeTrans.IsOpen() {
48 t.Fatalf("Transport %T not open: %s", writeTrans, writeTrans)
49 }
50 if !readTrans.IsOpen() {
51 t.Fatalf("Transport %T not open: %s", readTrans, readTrans)
52 }
53 _, err := writeTrans.Write(transport_bdata)
54 if err != nil {
55 t.Fatalf("Transport %T cannot write binary data of length %d: %s", writeTrans, len(transport_bdata), err)
56 }
57 err = writeTrans.Flush()
58 if err != nil {
59 t.Fatalf("Transport %T cannot flush write of binary data: %s", writeTrans, err)
60 }
61 n, err := io.ReadFull(readTrans, buf)
62 if err != nil {
63 t.Errorf("Transport %T cannot read binary data of length %d: %s", readTrans, TRANSPORT_BINARY_DATA_SIZE, err)
64 }
65 if n != TRANSPORT_BINARY_DATA_SIZE {
66 t.Errorf("Transport %T read only %d instead of %d bytes of binary data", readTrans, n, TRANSPORT_BINARY_DATA_SIZE)
67 }
68 for k, v := range buf {
69 if v != transport_bdata[k] {
70 t.Fatalf("Transport %T read %d instead of %d for index %d of binary data 2", readTrans, v, transport_bdata[k], k)
71 }
72 }
73 _, err = writeTrans.Write(transport_bdata)
74 if err != nil {
75 t.Fatalf("Transport %T cannot write binary data 2 of length %d: %s", writeTrans, len(transport_bdata), err)
76 }
77 err = writeTrans.Flush()
78 if err != nil {
79 t.Fatalf("Transport %T cannot flush write binary data 2: %s", writeTrans, err)
80 }
81 buf = make([]byte, TRANSPORT_BINARY_DATA_SIZE)
82 read := 1
83 for n = 0; n < TRANSPORT_BINARY_DATA_SIZE && read != 0; {
84 read, err = readTrans.Read(buf[n:])
85 if err != nil {
86 t.Errorf("Transport %T cannot read binary data 2 of total length %d from offset %d: %s", readTrans, TRANSPORT_BINARY_DATA_SIZE, n, err)
87 }
88 n += read
89 }
90 if n != TRANSPORT_BINARY_DATA_SIZE {
91 t.Errorf("Transport %T read only %d instead of %d bytes of binary data 2", readTrans, n, TRANSPORT_BINARY_DATA_SIZE)
92 }
93 for k, v := range buf {
94 if v != transport_bdata[k] {
95 t.Fatalf("Transport %T read %d instead of %d for index %d of binary data 2", readTrans, v, transport_bdata[k], k)
96 }
97 }
98}
99
Jens Geyer706cb4e2014-03-19 00:37:10 +0200100func TransportHeaderTest(t *testing.T, writeTrans TTransport, readTrans TTransport) {
101 buf := make([]byte, TRANSPORT_BINARY_DATA_SIZE)
102 if !writeTrans.IsOpen() {
103 t.Fatalf("Transport %T not open: %s", writeTrans, writeTrans)
104 }
105 if !readTrans.IsOpen() {
106 t.Fatalf("Transport %T not open: %s", readTrans, readTrans)
107 }
108 // Need to assert type of TTransport to THttpClient to expose the Setter
109 httpWPostTrans := writeTrans.(*THttpClient)
110 httpWPostTrans.SetHeader(transport_header["key"], transport_header["value"])
111
112 _, err := writeTrans.Write(transport_bdata)
113 if err != nil {
114 t.Fatalf("Transport %T cannot write binary data of length %d: %s", writeTrans, len(transport_bdata), err)
115 }
116 err = writeTrans.Flush()
117 if err != nil {
118 t.Fatalf("Transport %T cannot flush write of binary data: %s", writeTrans, err)
119 }
120 // Need to assert type of TTransport to THttpClient to expose the Getter
121 httpRPostTrans := readTrans.(*THttpClient)
122 readHeader := httpRPostTrans.GetHeader(transport_header["key"])
123 if err != nil {
124 t.Errorf("Transport %T cannot read HTTP Header Value", httpRPostTrans)
125 }
126
127 if transport_header["value"] != readHeader {
128 t.Errorf("Expected HTTP Header Value %s, got %s", transport_header["value"], readHeader)
129 }
130 n, err := io.ReadFull(readTrans, buf)
131 if err != nil {
132 t.Errorf("Transport %T cannot read binary data of length %d: %s", readTrans, TRANSPORT_BINARY_DATA_SIZE, err)
133 }
134 if n != TRANSPORT_BINARY_DATA_SIZE {
135 t.Errorf("Transport %T read only %d instead of %d bytes of binary data", readTrans, n, TRANSPORT_BINARY_DATA_SIZE)
136 }
137 for k, v := range buf {
138 if v != transport_bdata[k] {
139 t.Fatalf("Transport %T read %d instead of %d for index %d of binary data 2", readTrans, v, transport_bdata[k], k)
140 }
141 }
142}
143
Jens Geyer0e87c462013-06-18 22:25:07 +0200144func CloseTransports(t *testing.T, readTrans TTransport, writeTrans TTransport) {
145 err := readTrans.Close()
146 if err != nil {
147 t.Errorf("Transport %T cannot close read transport: %s", readTrans, err)
148 }
149 if writeTrans != readTrans {
150 err = writeTrans.Close()
151 if err != nil {
152 t.Errorf("Transport %T cannot close write transport: %s", writeTrans, err)
153 }
154 }
155}
156
157func FindAvailableTCPServerPort(startPort int) (net.Addr, error) {
158 for i := startPort; i < 65535; i++ {
159 s := "127.0.0.1:" + strconv.Itoa(i)
160 l, err := net.Listen("tcp", s)
161 if err == nil {
162 l.Close()
163 return net.ResolveTCPAddr("tcp", s)
164 }
165 }
166 return nil, NewTTransportException(UNKNOWN_TRANSPORT_EXCEPTION, "Could not find available server port")
167}
Jens Geyer706cb4e2014-03-19 00:37:10 +0200168
169func valueInSlice(value string, slice []string) bool {
170 for _, v := range slice {
171 if value == v {
172 return true
173 }
174 }
175 return false
176}