package notify import ( "context" "net" "testing" "time" ) func TestNegotiateRecordStreamOpenMetadataEnablesBatchAck(t *testing.T) { reqMetadata, respMetadata := negotiateRecordStreamOpenMetadata(StreamRecordChannel, StreamMetadata{ recordStreamMetadataCapBatchAckKey: recordStreamMetadataEnabledValue, }) if !recordStreamUseBatchAck(reqMetadata) { t.Fatal("request metadata should enable batch ack") } if !recordStreamUseBatchAck(respMetadata) { t.Fatal("response metadata should enable batch ack") } } func TestNegotiateRecordStreamOpenMetadataKeepsFallbackWithoutCapability(t *testing.T) { reqMetadata, respMetadata := negotiateRecordStreamOpenMetadata(StreamRecordChannel, nil) if recordStreamUseBatchAck(reqMetadata) { t.Fatalf("request metadata should keep fallback mode: %+v", reqMetadata) } if recordStreamUseBatchAck(respMetadata) { t.Fatalf("response metadata should keep fallback mode: %+v", respMetadata) } } func TestOpenRecordStreamNegotiatesBatchAck(t *testing.T) { server := NewServer().(*ServerCommon) secret := []byte("0123456789abcdef0123456789abcdef") server = newRunningPeerAttachServerForTest(t, func(server *ServerCommon) { server.SetSecretKey(secret) }) acceptedCh := make(chan RecordAcceptInfo, 1) server.SetRecordStreamHandler(func(info RecordAcceptInfo) error { acceptedCh <- info return nil }) client := NewClient().(*ClientCommon) client.SetSecretKey(secret) left, right := net.Pipe() defer right.Close() bootstrapPeerAttachConnForTest(t, server, right) if err := client.ConnectByConn(left); err != nil { t.Fatalf("client ConnectByConn failed: %v", err) } defer func() { client.setByeFromServer(true) _ = client.Stop() }() record, err := client.OpenRecordStream(context.Background(), RecordOpenOptions{}) if err != nil { t.Fatalf("OpenRecordStream failed: %v", err) } defer func() { _ = record.Close() }() if !recordStreamUseBatchAck(record.Metadata()) { t.Fatalf("client record stream metadata should negotiate batch ack: %+v", record.Metadata()) } select { case accepted := <-acceptedCh: if !recordStreamUseBatchAck(accepted.Metadata) { t.Fatalf("accepted record metadata should negotiate batch ack: %+v", accepted.Metadata) } case <-time.After(2 * time.Second): t.Fatal("timed out waiting accepted record stream") } }