(t *testing.T, version uint8, sessionToPayloads []*packet.Session, packets []packet.ICMP)
| 114 | } |
| 115 | |
| 116 | func testDatagram(t *testing.T, version uint8, sessionToPayloads []*packet.Session, packets []packet.ICMP) { |
| 117 | quicConfig := &quic.Config{ |
| 118 | KeepAlivePeriod: 5 * time.Millisecond, |
| 119 | EnableDatagrams: true, |
| 120 | } |
| 121 | quicListener := newQUICListener(t, quicConfig) |
| 122 | defer quicListener.Close() |
| 123 | |
| 124 | logger := zerolog.Nop() |
| 125 | |
| 126 | tracingIdentity, err := tracing.NewIdentity("ec31ad8a01fde11fdcabe2efdce36873:52726f6cabc144f5:0:1") |
| 127 | require.NoError(t, err) |
| 128 | serializedTracingID, err := tracingIdentity.MarshalBinary() |
| 129 | require.NoError(t, err) |
| 130 | tracingSpan := &TracingSpanPacket{ |
| 131 | Spans: []byte("tracing"), |
| 132 | TracingIdentity: serializedTracingID, |
| 133 | } |
| 134 | |
| 135 | errGroup, ctx := errgroup.WithContext(context.Background()) |
| 136 | // Run edge side of datagram muxer |
| 137 | errGroup.Go(func() error { |
| 138 | // Accept quic connection |
| 139 | quicSession, err := quicListener.Accept(ctx) |
| 140 | if err != nil { |
| 141 | return err |
| 142 | } |
| 143 | |
| 144 | sessionDemuxChan := make(chan *packet.Session, 16) |
| 145 | |
| 146 | switch version { |
| 147 | case 1: |
| 148 | muxer := NewDatagramMuxer(quicSession, &logger, sessionDemuxChan) |
| 149 | muxer.ServeReceive(ctx) |
| 150 | case 2: |
| 151 | muxer := NewDatagramMuxerV2(quicSession, &logger, sessionDemuxChan) |
| 152 | muxer.ServeReceive(ctx) |
| 153 | |
| 154 | for _, pk := range packets { |
| 155 | received, err := muxer.ReceivePacket(ctx) |
| 156 | require.NoError(t, err) |
| 157 | validateIPPacket(t, received, &pk) |
| 158 | received, err = muxer.ReceivePacket(ctx) |
| 159 | require.NoError(t, err) |
| 160 | validateIPPacketWithTracing(t, received, &pk, serializedTracingID) |
| 161 | } |
| 162 | received, err := muxer.ReceivePacket(ctx) |
| 163 | require.NoError(t, err) |
| 164 | validateTracingSpans(t, received, tracingSpan) |
| 165 | default: |
| 166 | return fmt.Errorf("unknown datagram version %d", version) |
| 167 | } |
| 168 | |
| 169 | for _, expectedPayload := range sessionToPayloads { |
| 170 | actualPayload := <-sessionDemuxChan |
| 171 | require.Equal(t, expectedPayload, actualPayload) |
| 172 | } |
| 173 | return nil |
no test coverage detected