You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

440 lines
11 KiB

  1. // Copyright 2017 Google Inc. All Rights Reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package bytestream
  15. import (
  16. "bytes"
  17. "errors"
  18. "fmt"
  19. "io"
  20. "log"
  21. "net"
  22. "testing"
  23. "golang.org/x/net/context"
  24. "google.golang.org/api/transport/bytestream/internal"
  25. "google.golang.org/grpc"
  26. "google.golang.org/grpc/metadata"
  27. pb "google.golang.org/genproto/googleapis/bytestream"
  28. )
  29. const testData = "0123456789"
  30. // A grpcServer is an in-process gRPC server, listening on a system-chosen port on
  31. // the local loopback interface. Servers are for testing only and are not
  32. // intended to be used in production code.
  33. // (Copied from "cloud.google.com/internal/testutil/server_test.go")
  34. //
  35. // To create a server, make a new grpcServer, register your handlers, then call
  36. // Start:
  37. //
  38. // srv, err := NewServer()
  39. // ...
  40. // mypb.RegisterMyServiceServer(srv.Gsrv, &myHandler)
  41. // ....
  42. // srv.Start()
  43. //
  44. // Clients should connect to the server with no security:
  45. //
  46. // conn, err := grpc.Dial(srv.Addr, grpc.WithInsecure())
  47. // ...
  48. type grpcServer struct {
  49. Addr string
  50. l net.Listener
  51. Gsrv *grpc.Server
  52. }
  53. type TestSetup struct {
  54. ctx context.Context
  55. rpcTest *grpcServer
  56. server *internal.Server
  57. client *Client
  58. }
  59. func TestClientRead(t *testing.T) {
  60. testCases := []struct {
  61. name string
  62. input string
  63. resourceName string
  64. extraBufSize int
  65. extraError error
  66. want string
  67. wantErr bool
  68. wantEOF bool
  69. }{
  70. {
  71. name: "test foo",
  72. input: testData,
  73. resourceName: "foo",
  74. want: testData,
  75. }, {
  76. name: "test bar",
  77. input: testData,
  78. resourceName: "bar",
  79. want: testData,
  80. }, {
  81. name: "test bar extraBufSize=1",
  82. input: testData,
  83. resourceName: "bar",
  84. extraBufSize: 1,
  85. want: testData,
  86. wantEOF: true,
  87. }, {
  88. name: "test bar extraBufSize=2",
  89. input: testData,
  90. resourceName: "bar",
  91. extraBufSize: 2,
  92. want: testData,
  93. wantEOF: true,
  94. }, {
  95. name: "empty resource name",
  96. input: testData,
  97. resourceName: "",
  98. extraBufSize: 1,
  99. wantErr: true,
  100. }, {
  101. name: "read after error returns error again",
  102. input: testData,
  103. resourceName: "does not matter",
  104. extraBufSize: 1,
  105. extraError: errors.New("some error"),
  106. wantErr: true,
  107. },
  108. }
  109. for _, tc := range testCases {
  110. bufSize := len(tc.want) + tc.extraBufSize
  111. if bufSize == 0 {
  112. t.Errorf("%s: This is probably wrong. Read returning 0 bytes?", tc.name)
  113. continue
  114. }
  115. setup := newTestSetup(tc.input)
  116. r, err := setup.client.NewReader(setup.ctx, tc.resourceName)
  117. if err != nil {
  118. t.Errorf("%s: NewReader(%q): %v", tc.name, tc.resourceName, err)
  119. continue
  120. }
  121. if tc.extraError != nil {
  122. r.err = tc.extraError
  123. }
  124. buf := make([]byte, bufSize)
  125. gotEOF := false
  126. total := 0
  127. for total < bufSize && err == nil {
  128. var n int
  129. n, err = r.Read(buf[total:])
  130. total += n
  131. }
  132. if err == io.EOF {
  133. gotEOF = true
  134. err = nil
  135. doubleCheckBuf := make([]byte, bufSize)
  136. n2, err2 := r.Read(doubleCheckBuf)
  137. if err2 != io.EOF {
  138. t.Errorf("%s: read and got EOF, double-check: read %d bytes got err=%v", tc.name, n2, err2)
  139. continue
  140. }
  141. }
  142. setup.Close()
  143. if gotErr := err != nil; tc.wantErr != gotErr {
  144. t.Errorf("%s: read %d bytes, got err=%v, wantErr=%t", tc.name, total, err, tc.wantErr)
  145. continue
  146. }
  147. if tc.wantEOF != gotEOF {
  148. t.Errorf("%s: read %d bytes, gotEOF=%t, wantEOF=%t", tc.name, total, gotEOF, tc.wantEOF)
  149. continue
  150. }
  151. if got := string(buf[:total]); got != tc.want {
  152. t.Errorf("%s: read %q, want %q", tc.name, got, tc.want)
  153. continue
  154. }
  155. }
  156. }
  157. func TestClientWrite(t *testing.T) {
  158. testCases := []struct {
  159. name string
  160. resourceName string
  161. maxBufSize int
  162. data string
  163. results []int
  164. wantWriteErr bool
  165. wantCloseErr bool
  166. }{
  167. {
  168. name: "test foo",
  169. resourceName: "foo",
  170. data: testData,
  171. results: []int{len(testData)},
  172. }, {
  173. name: "empty resource name",
  174. resourceName: "",
  175. data: testData,
  176. results: []int{10},
  177. //wantWriteErr: true,
  178. wantCloseErr: true,
  179. }, {
  180. name: "test bar",
  181. resourceName: "bar",
  182. data: testData,
  183. results: []int{len(testData)},
  184. },
  185. }
  186. var setup *TestSetup
  187. tcFor:
  188. for _, tc := range testCases {
  189. if setup != nil {
  190. setup.Close()
  191. }
  192. setup = newTestSetup("")
  193. buf := []byte(tc.data)
  194. var ofs int
  195. w, err := setup.client.NewWriter(setup.ctx, tc.resourceName)
  196. if err != nil {
  197. t.Errorf("%s: NewWriter(): %v", tc.name, err)
  198. continue
  199. }
  200. for i := 0; i < len(tc.results); i++ {
  201. if ofs >= len(tc.data) {
  202. t.Errorf("%s [%d]: Attempting to write more than tc.input: ofs=%d len(buf)=%d",
  203. tc.name, i, ofs, len(tc.data))
  204. continue tcFor
  205. }
  206. n, err := w.Write(buf[ofs:])
  207. ofs += n
  208. if gotErr := err != nil; gotErr != tc.wantWriteErr {
  209. t.Errorf("%s [%d]: Write() got n=%d err=%v, wantWriteErr=%t", tc.name, i, n, err, tc.wantWriteErr)
  210. continue tcFor
  211. } else if tc.wantWriteErr && i+1 < len(tc.results) {
  212. t.Errorf("%s: wantWriteErr and got err after %d results, len(results)=%d is too long.", tc.name, i+1, len(tc.results))
  213. continue tcFor
  214. }
  215. if n != tc.results[i] {
  216. t.Errorf("%s [%d]: Write() wrote %d bytes, want %d bytes", tc.name, i, n, tc.results[i])
  217. continue tcFor
  218. }
  219. }
  220. err = w.Close()
  221. if gotErr := err != nil; gotErr != tc.wantCloseErr {
  222. t.Errorf("%s: Close() got err=%v, wantCloseErr=%t", tc.name, err, tc.wantCloseErr)
  223. continue tcFor
  224. }
  225. }
  226. setup.Close()
  227. }
  228. func TestClientRead_AfterSetupClose(t *testing.T) {
  229. setup := newTestSetup("closed")
  230. setup.Close()
  231. _, err := setup.client.NewReader(setup.ctx, "should fail")
  232. if err == nil {
  233. t.Errorf("NewReader(%q): err=%v", "should fail", err)
  234. }
  235. }
  236. func TestClientWrite_AfterSetupClose(t *testing.T) {
  237. setup := newTestSetup("closed")
  238. setup.Close()
  239. _, err := setup.client.NewWriter(setup.ctx, "should fail")
  240. if err == nil {
  241. t.Fatalf("NewWriter(%q): err=%v", "shoudl fail", err)
  242. }
  243. }
  244. type UnsendableWriteClient struct {
  245. closeAndRecvWriteResponse *pb.WriteResponse
  246. closeAndRecvError error
  247. }
  248. func (w *UnsendableWriteClient) Send(*pb.WriteRequest) error {
  249. if w.closeAndRecvError != nil {
  250. return nil
  251. }
  252. return errors.New("UnsendableWriteClient.Send() fails unless closeAndRecvError is set")
  253. }
  254. func (w *UnsendableWriteClient) CloseAndRecv() (*pb.WriteResponse, error) {
  255. if w.closeAndRecvError == nil {
  256. log.Fatalf("UnsendableWriteClient.Close() when closeAndRecvError == nil.")
  257. }
  258. return w.closeAndRecvWriteResponse, w.closeAndRecvError
  259. }
  260. func (w *UnsendableWriteClient) Context() context.Context {
  261. log.Fatalf("UnsendableWriteClient.Context() should never be called")
  262. return context.Background()
  263. }
  264. func (w *UnsendableWriteClient) CloseSend() error {
  265. return errors.New("UnsendableWriteClient.CloseSend() should never be called")
  266. }
  267. func (w *UnsendableWriteClient) Header() (metadata.MD, error) {
  268. log.Fatalf("UnsendableWriteClient.Header() should never be called")
  269. return metadata.MD{}, nil
  270. }
  271. func (w *UnsendableWriteClient) Trailer() metadata.MD {
  272. log.Fatalf("UnsendableWriteClient.Trailer() should never be called")
  273. return metadata.MD{}
  274. }
  275. func (fake *UnsendableWriteClient) SendMsg(m interface{}) error {
  276. log.Fatalf("UnsendableWriteClient.SendMsg() should never be called")
  277. return nil
  278. }
  279. func (fake *UnsendableWriteClient) RecvMsg(m interface{}) error {
  280. log.Fatalf("UnsendableWriteClient.RecvMsg() should never be called")
  281. return nil
  282. }
  283. func TestClientWrite_WriteFails(t *testing.T) {
  284. setup := newTestSetup("")
  285. w, err := setup.client.NewWriter(setup.ctx, "")
  286. if err != nil {
  287. t.Fatalf("NewWriter(): %v", err)
  288. }
  289. defer setup.Close()
  290. w.writeClient = &UnsendableWriteClient{}
  291. _, err = w.Write([]byte(testData))
  292. if err == nil {
  293. t.Errorf("Write() should fail")
  294. }
  295. }
  296. func TestClientWrite_CloseAndRecvFails(t *testing.T) {
  297. setup := newTestSetup("")
  298. w, err := setup.client.NewWriter(setup.ctx, "CloseAndRecvFails")
  299. if err != nil {
  300. t.Fatalf("NewWriter(): %v", err)
  301. }
  302. defer setup.Close()
  303. n, err := w.Write([]byte(testData))
  304. if err != nil {
  305. t.Errorf("Write() failed: %v", err)
  306. return
  307. }
  308. if n != len(testData) {
  309. t.Errorf("Write() got n=%d, want n=%d", n, len(testData))
  310. return
  311. }
  312. w.writeClient = &UnsendableWriteClient{
  313. closeAndRecvError: errors.New("CloseAndRecv() must fail"),
  314. }
  315. if err = w.Close(); err == nil {
  316. t.Errorf("Close() should fail")
  317. return
  318. }
  319. }
  320. type TestWriteHandler struct {
  321. buf bytes.Buffer // bytes.Buffer implements io.Writer
  322. name string // This service can handle one name only.
  323. }
  324. func (w *TestWriteHandler) GetWriter(ctx context.Context, name string, initOffset int64) (io.Writer, error) {
  325. if w.name == "" {
  326. w.name = name
  327. } else if w.name != name {
  328. return nil, fmt.Errorf("writer already has name=%q, now a new name=%q confuses me", w.name, name)
  329. }
  330. // initOffset is ignored.
  331. return &w.buf, nil
  332. }
  333. func (w *TestWriteHandler) Close(ctx context.Context, name string) error {
  334. w.name = ""
  335. w.buf.Reset()
  336. return nil
  337. }
  338. type TestReadHandler struct {
  339. buf string
  340. name string // This service can handle one name only.
  341. }
  342. // GetWriter() returns an io.ReaderAt to accept reads from the given name.
  343. func (r *TestReadHandler) GetReader(ctx context.Context, name string) (io.ReaderAt, error) {
  344. if r.name == "" {
  345. r.name = name
  346. } else if r.name != name {
  347. return nil, fmt.Errorf("reader already has name=%q, now a new name=%q confuses me", r.name, name)
  348. }
  349. return bytes.NewReader([]byte(r.buf)), nil
  350. }
  351. // Close does nothing.
  352. func (r *TestReadHandler) Close(ctx context.Context, name string) error {
  353. return nil
  354. }
  355. // newGRPCServer creates a new grpcServer. The grpcServer will be listening for gRPC connections
  356. // at the address named by the Addr field, without TLS.
  357. func newGRPCServer() (*grpcServer, error) {
  358. l, err := net.Listen("tcp", "127.0.0.1:0")
  359. if err != nil {
  360. return nil, err
  361. }
  362. s := &grpcServer{
  363. Addr: l.Addr().String(),
  364. l: l,
  365. Gsrv: grpc.NewServer(),
  366. }
  367. return s, nil
  368. }
  369. // Start causes the server to start accepting incoming connections.
  370. // Call Start after registering handlers.
  371. func (s *grpcServer) Start() {
  372. go s.Gsrv.Serve(s.l)
  373. }
  374. // Close shuts down the server.
  375. func (s *grpcServer) Close() {
  376. s.Gsrv.Stop()
  377. s.l.Close()
  378. }
  379. func newTestSetup(input string) *TestSetup {
  380. testSetup := &TestSetup{
  381. ctx: context.Background(),
  382. }
  383. testReadHandler := &TestReadHandler{
  384. buf: input,
  385. }
  386. var err error
  387. if testSetup.rpcTest, err = newGRPCServer(); err != nil {
  388. log.Fatalf("newGRPCServer: %v", err)
  389. }
  390. if testSetup.server, err = internal.NewServer(testSetup.rpcTest.Gsrv, testReadHandler, &TestWriteHandler{}); err != nil {
  391. log.Fatalf("internal.NewServer: %v", err)
  392. }
  393. testSetup.rpcTest.Start()
  394. conn, err := grpc.Dial(testSetup.rpcTest.Addr, grpc.WithInsecure())
  395. if err != nil {
  396. log.Fatalf("grpc.Dial: %v", err)
  397. }
  398. testSetup.client = NewClient(conn, grpc.FailFast(true))
  399. return testSetup
  400. }
  401. func (testSetup *TestSetup) Close() {
  402. testSetup.rpcTest.Close()
  403. }