func testStreamExecuteError(t *testing.T, conn tabletconn.TabletConn, fake *FakeQueryService) { t.Log("testStreamExecuteError") ctx := context.Background() stream, errFunc, err := conn.StreamExecute(ctx, streamExecuteQuery, streamExecuteBindVars, streamExecuteTransactionID) if err != nil { t.Fatalf("StreamExecute failed: %v", err) } qr, ok := <-stream if !ok { t.Fatalf("StreamExecute failed: cannot read result1") } if len(qr.Rows) == 0 { qr.Rows = nil } if !reflect.DeepEqual(*qr, streamExecuteQueryResult1) { t.Errorf("Unexpected result1 from StreamExecute: got %v wanted %v", qr, streamExecuteQueryResult1) } // signal to the server that the first result has been received close(fake.errorWait) // After 1 result, we expect to get an error (no more results). qr, ok = <-stream if ok { t.Fatalf("StreamExecute channel wasn't closed") } err = errFunc() verifyError(t, err, "StreamExecute") }
func testStreamExecuteError(t *testing.T, conn tabletconn.TabletConn, f *FakeQueryService) { t.Log("testStreamExecuteError") f.HasError = true testErrorHelper(t, f, "StreamExecute", func(ctx context.Context) error { f.ErrorWait = make(chan struct{}) ctx = callerid.NewContext(ctx, TestCallerID, TestVTGateCallerID) stream, err := conn.StreamExecute(ctx, TestTarget, StreamExecuteQuery, StreamExecuteBindVars) if err != nil { t.Fatalf("StreamExecute failed: %v", err) } qr, err := stream.Recv() if err != nil { t.Fatalf("StreamExecute failed: cannot read result1: %v", err) } if len(qr.Rows) == 0 { qr.Rows = nil } if !reflect.DeepEqual(*qr, StreamExecuteQueryResult1) { t.Errorf("Unexpected result1 from StreamExecute: got %v wanted %v", qr, StreamExecuteQueryResult1) } // signal to the server that the first result has been received close(f.ErrorWait) // After 1 result, we expect to get an error (no more results). qr, err = stream.Recv() if err == nil { t.Fatalf("StreamExecute channel wasn't closed") } return err }) f.HasError = false }
func testStreamExecute(t *testing.T, conn tabletconn.TabletConn) { t.Log("testStreamExecute") ctx := context.Background() stream, errFunc, err := conn.StreamExecute(ctx, streamExecuteQuery, streamExecuteBindVars, streamExecuteTransactionID) if err != nil { t.Fatalf("StreamExecute failed: %v", err) } qr, ok := <-stream if !ok { t.Fatalf("StreamExecute failed: cannot read result1") } if len(qr.Rows) == 0 { qr.Rows = nil } if !reflect.DeepEqual(*qr, streamExecuteQueryResult1) { t.Errorf("Unexpected result1 from StreamExecute: got %v wanted %v", qr, streamExecuteQueryResult1) } qr, ok = <-stream if !ok { t.Fatalf("StreamExecute failed: cannot read result2") } if len(qr.Fields) == 0 { qr.Fields = nil } if !reflect.DeepEqual(*qr, streamExecuteQueryResult2) { t.Errorf("Unexpected result2 from StreamExecute: got %v wanted %v", qr, streamExecuteQueryResult2) } qr, ok = <-stream if ok { t.Fatalf("StreamExecute channel wasn't closed") } if err := errFunc(); err != nil { t.Fatalf("StreamExecute errFunc failed: %v", err) } }
func testStreamExecute(t *testing.T, conn tabletconn.TabletConn, f *FakeQueryService) { t.Log("testStreamExecute") ctx := context.Background() ctx = callerid.NewContext(ctx, TestCallerID, TestVTGateCallerID) stream, err := conn.StreamExecute(ctx, TestTarget, StreamExecuteQuery, StreamExecuteBindVars) if err != nil { t.Fatalf("StreamExecute failed: %v", err) } qr, err := stream.Recv() if err != nil { t.Fatalf("StreamExecute failed: cannot read result1: %v", err) } if len(qr.Rows) == 0 { qr.Rows = nil } if !reflect.DeepEqual(*qr, StreamExecuteQueryResult1) { t.Errorf("Unexpected result1 from StreamExecute: got %v wanted %v", qr, StreamExecuteQueryResult1) } qr, err = stream.Recv() if err != nil { t.Fatalf("StreamExecute failed: cannot read result2: %v", err) } if len(qr.Fields) == 0 { qr.Fields = nil } if !reflect.DeepEqual(*qr, StreamExecuteQueryResult2) { t.Errorf("Unexpected result2 from StreamExecute: got %v wanted %v", qr, StreamExecuteQueryResult2) } qr, err = stream.Recv() if err != io.EOF { t.Fatalf("StreamExecute errFunc failed: %v", err) } }
func testStreamExecuteError(t *testing.T, conn tabletconn.TabletConn) { t.Log("testStreamExecuteError") ctx := context.Background() stream, errFunc, err := conn.StreamExecute(ctx, streamExecuteQuery, streamExecuteBindVars, streamExecuteTransactionID) if err != nil { t.Fatalf("StreamExecute failed: %v", err) } qr, ok := <-stream if !ok { t.Fatalf("StreamExecute failed: cannot read result1") } if len(qr.Rows) == 0 { qr.Rows = nil } if !reflect.DeepEqual(*qr, streamExecuteQueryResult1) { t.Errorf("Unexpected result1 from StreamExecute: got %v wanted %v", qr, streamExecuteQueryResult1) } // signal to the server that the first result has been received close(errorWait) // After 1 result, we expect to get an error (no more results). qr, ok = <-stream if ok { t.Fatalf("StreamExecute channel wasn't closed") } err = errFunc() if err == nil { t.Fatalf("StreamExecute was expecting an error, didn't get one") } if !strings.Contains(err.Error(), expectedErrMatch) { t.Errorf("Unexpected error from StreamExecute: got %v, wanted err containing %v", err, expectedErrMatch) } // reset state for the test errorWait = make(chan struct{}) }
func testStreamExecutePanics(t *testing.T, conn tabletconn.TabletConn, fake *FakeQueryService) { t.Log("testStreamExecutePanics") // early panic is before sending the Fields, that is returned // by the StreamExecute call itself, or as the first error // by ErrFunc ctx := context.Background() fake.streamExecutePanicsEarly = true stream, errFunc, err := conn.StreamExecute(ctx, streamExecuteQuery, streamExecuteBindVars, streamExecuteTransactionID) if err != nil { if !strings.Contains(err.Error(), "caught test panic") { t.Fatalf("unexpected panic error: %v", err) } } else { _, ok := <-stream if ok { t.Fatalf("StreamExecute early panic should not return anything") } err = errFunc() if err == nil || !strings.Contains(err.Error(), "caught test panic") { t.Fatalf("unexpected panic error: %v", err) } } // late panic is after sending Fields fake.streamExecutePanicsEarly = false stream, errFunc, err = conn.StreamExecute(ctx, streamExecuteQuery, streamExecuteBindVars, streamExecuteTransactionID) if err != nil { t.Fatalf("StreamExecute failed: %v", err) } qr, ok := <-stream if !ok { t.Fatalf("StreamExecute failed: cannot read result1") } if len(qr.Rows) == 0 { qr.Rows = nil } if !reflect.DeepEqual(*qr, streamExecuteQueryResult1) { t.Errorf("Unexpected result1 from StreamExecute: got %v wanted %v", qr, streamExecuteQueryResult1) } close(panicWait) if _, ok := <-stream; ok { t.Fatalf("StreamExecute returned more results") } if err := errFunc(); err == nil || !strings.Contains(err.Error(), "caught test panic") { t.Fatalf("unexpected panic error: %v", err) } // Make a new panicWait channel, to reset the state to the beginning of the test panicWait = make(chan struct{}) }
func testStreamExecutePanics(t *testing.T, conn tabletconn.TabletConn, f *FakeQueryService) { t.Log("testStreamExecutePanics") // early panic is before sending the Fields, that is returned // by the StreamExecute call itself, or as the first error // by ErrFunc f.StreamExecutePanicsEarly = true testPanicHelper(t, f, "StreamExecute.Early", func(ctx context.Context) error { ctx = callerid.NewContext(ctx, TestCallerID, TestVTGateCallerID) stream, err := conn.StreamExecute(ctx, TestTarget, StreamExecuteQuery, StreamExecuteBindVars) if err != nil { return err } _, err = stream.Recv() return err }) // late panic is after sending Fields f.StreamExecutePanicsEarly = false testPanicHelper(t, f, "StreamExecute.Late", func(ctx context.Context) error { f.PanicWait = make(chan struct{}) ctx = callerid.NewContext(ctx, TestCallerID, TestVTGateCallerID) stream, err := conn.StreamExecute(ctx, TestTarget, StreamExecuteQuery, StreamExecuteBindVars) if err != nil { t.Fatalf("StreamExecute failed: %v", err) } qr, err := stream.Recv() if err != nil { t.Fatalf("StreamExecute failed: cannot read result1: %v", err) } if len(qr.Rows) == 0 { qr.Rows = nil } if !reflect.DeepEqual(*qr, StreamExecuteQueryResult1) { t.Errorf("Unexpected result1 from StreamExecute: got %v wanted %v", qr, StreamExecuteQueryResult1) } close(f.PanicWait) _, err = stream.Recv() return err }) }
func testStreamExecutePanics(t *testing.T, conn tabletconn.TabletConn, fake *FakeQueryService) { // early panic is before sending the Fields, that is returned // by the StreamExecute call itself, or as the first error // by ErrFunc ctx := context.Background() ctx = callerid.NewContext(ctx, testCallerID, testVTGateCallerID) fake.streamExecutePanicsEarly = true stream, err := conn.StreamExecute(ctx, streamExecuteQuery, streamExecuteBindVars, streamExecuteTransactionID) if err != nil { if !strings.Contains(err.Error(), "caught test panic") { t.Fatalf("unexpected panic error: %v", err) } } else { _, err := stream.Recv() if err == nil || !strings.Contains(err.Error(), "caught test panic") { t.Fatalf("unexpected panic error: %v", err) } } // late panic is after sending Fields fake.streamExecutePanicsEarly = false stream, err = conn.StreamExecute(ctx, streamExecuteQuery, streamExecuteBindVars, streamExecuteTransactionID) if err != nil { t.Fatalf("StreamExecute failed: %v", err) } qr, err := stream.Recv() if err != nil { t.Fatalf("StreamExecute failed: cannot read result1: %v", err) } if len(qr.Rows) == 0 { qr.Rows = nil } if !reflect.DeepEqual(*qr, streamExecuteQueryResult1) { t.Errorf("Unexpected result1 from StreamExecute: got %v wanted %v", qr, streamExecuteQueryResult1) } close(fake.panicWait) if _, err := stream.Recv(); err == nil || !strings.Contains(err.Error(), "caught test panic") { t.Fatalf("unexpected panic error: %v", err) } }