MCPcopy
hub / github.com/grpc/grpc-go / TestServerWithMisbehavedClient

Method TestServerWithMisbehavedClient

internal/transport/transport_test.go:1420–1518  ·  view source on GitHub ↗
(t *testing.T)

Source from the content-addressed store, hash-verified

1418}
1419
1420func (s) TestServerWithMisbehavedClient(t *testing.T) {
1421 server := setUpServerOnly(t, 0, &ServerConfig{BufferPool: mem.DefaultBufferPool()}, suspended)
1422 defer server.stop()
1423 // Create a client that can override server stream quota.
1424 mconn, err := net.Dial("tcp", server.lis.Addr().String())
1425 if err != nil {
1426 t.Fatalf("Clent failed to dial:%v", err)
1427 }
1428 defer mconn.Close()
1429 if err := mconn.SetWriteDeadline(time.Now().Add(time.Second * 10)); err != nil {
1430 t.Fatalf("Failed to set write deadline: %v", err)
1431 }
1432 if n, err := mconn.Write(clientPreface); err != nil || n != len(clientPreface) {
1433 t.Fatalf("mconn.Write(clientPreface) = %d, %v, want %d, <nil>", n, err, len(clientPreface))
1434 }
1435 // success chan indicates that reader received a RSTStream from server.
1436 success := make(chan struct{})
1437 var mu sync.Mutex
1438 framer := http2.NewFramer(mconn, mconn)
1439 if err := framer.WriteSettings(); err != nil {
1440 t.Fatalf("Error while writing settings: %v", err)
1441 }
1442 go func() { // Launch a reader for this misbehaving client.
1443 for {
1444 frame, err := framer.ReadFrame()
1445 if err != nil {
1446 return
1447 }
1448 switch frame := frame.(type) {
1449 case *http2.PingFrame:
1450 // Write ping ack back so that server's BDP estimation works right.
1451 mu.Lock()
1452 framer.WritePing(true, frame.Data)
1453 mu.Unlock()
1454 case *http2.RSTStreamFrame:
1455 if frame.Header().StreamID != 1 || http2.ErrCode(frame.ErrCode) != http2.ErrCodeFlowControl {
1456 t.Errorf("RST stream received with streamID: %d and code: %v, want streamID: 1 and code: http2.ErrCodeFlowControl", frame.Header().StreamID, http2.ErrCode(frame.ErrCode))
1457 }
1458 close(success)
1459 return
1460 default:
1461 // Do nothing.
1462 }
1463
1464 }
1465 }()
1466 // Create a stream.
1467 var buf bytes.Buffer
1468 henc := hpack.NewEncoder(&buf)
1469 // TODO(mmukhi): Remove unnecessary fields.
1470 if err := henc.WriteField(hpack.HeaderField{Name: ":method", Value: "POST"}); err != nil {
1471 t.Fatalf("Error while encoding header: %v", err)
1472 }
1473 if err := henc.WriteField(hpack.HeaderField{Name: ":path", Value: "foo"}); err != nil {
1474 t.Fatalf("Error while encoding header: %v", err)
1475 }
1476 if err := henc.WriteField(hpack.HeaderField{Name: ":authority", Value: "localhost"}); err != nil {
1477 t.Fatalf("Error while encoding header: %v", err)

Callers

nothing calls this directly

Calls 15

DefaultBufferPoolFunction · 0.92
setUpServerOnlyFunction · 0.85
NowMethod · 0.80
NewTimerMethod · 0.80
stopMethod · 0.65
StringMethod · 0.65
FatalfMethod · 0.65
CloseMethod · 0.65
AddMethod · 0.65
WriteMethod · 0.65
HeaderMethod · 0.65
ErrorfMethod · 0.65

Tested by

no test coverage detected