(ctx context.Context, datagramConn *datagramV2Connection, edgeQUICSession quic.Connection, closeType closeReason, expectedReason string, t *testing.T)
| 780 | } |
| 781 | |
| 782 | func serveSession(ctx context.Context, datagramConn *datagramV2Connection, edgeQUICSession quic.Connection, closeType closeReason, expectedReason string, t *testing.T) { |
| 783 | payload := []byte(t.Name()) |
| 784 | sessionID := uuid.New() |
| 785 | cfdConn, originConn := net.Pipe() |
| 786 | // Registers and run a new session |
| 787 | session, err := datagramConn.sessionManager.RegisterSession(ctx, sessionID, cfdConn) |
| 788 | require.NoError(t, err) |
| 789 | |
| 790 | sessionDone := make(chan struct{}) |
| 791 | go func() { |
| 792 | datagramConn.serveUDPSession(session, time.Millisecond*50) |
| 793 | close(sessionDone) |
| 794 | }() |
| 795 | |
| 796 | // Send a message to the quic session on edge side, it should be deumx to this datagram v2 session |
| 797 | muxedPayload, err := cfdquic.SuffixSessionID(sessionID, payload) |
| 798 | require.NoError(t, err) |
| 799 | muxedPayload, err = cfdquic.SuffixType(muxedPayload, cfdquic.DatagramTypeUDP) |
| 800 | require.NoError(t, err) |
| 801 | |
| 802 | err = edgeQUICSession.SendDatagram(muxedPayload) |
| 803 | require.NoError(t, err) |
| 804 | |
| 805 | readBuffer := make([]byte, len(payload)+1) |
| 806 | n, err := originConn.Read(readBuffer) |
| 807 | require.NoError(t, err) |
| 808 | require.Equal(t, len(payload), n) |
| 809 | require.True(t, bytes.Equal(payload, readBuffer[:n])) |
| 810 | |
| 811 | // Close connection to terminate session |
| 812 | switch closeType { |
| 813 | case closedByOrigin: |
| 814 | _ = originConn.Close() |
| 815 | case closedByRemote: |
| 816 | err = datagramConn.UnregisterUdpSession(ctx, sessionID, expectedReason) |
| 817 | require.NoError(t, err) |
| 818 | case closedByTimeout: |
| 819 | } |
| 820 | |
| 821 | if closeType != closedByRemote { |
| 822 | // Session was not closed by remote, so closeUDPSession should be invoked to unregister from remote |
| 823 | unregisterFromEdgeChan := make(chan struct{}) |
| 824 | sessionRPCServer := &mockSessionRPCServer{ |
| 825 | sessionID: sessionID, |
| 826 | unregisterReason: expectedReason, |
| 827 | calledUnregisterChan: unregisterFromEdgeChan, |
| 828 | } |
| 829 | // nolint: testifylint |
| 830 | go runRPCServer(ctx, edgeQUICSession, sessionRPCServer, nil, t) |
| 831 | |
| 832 | <-unregisterFromEdgeChan |
| 833 | } |
| 834 | |
| 835 | <-sessionDone |
| 836 | } |
| 837 | |
| 838 | type closeReason uint8 |
| 839 |
no test coverage detected