Ctrl K
ComunidadGuías…

internal/mtprotoedge/quick_ack_deadline_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package mtprotoedge

import (
	"context"
	"testing"
	"time"

	"github.com/iamxvbaba/td/bin"
	"github.com/iamxvbaba/td/crypto"
)

type quickAckDeadlineProbe struct {
	requested bool
	deadline  time.Time
	token     uint32
}

func (p *quickAckDeadlineProbe) ConsumeQuickAckRequested() bool {
	if !p.requested {
		return false
	}
	p.requested = false
	return true
}

func (p *quickAckDeadlineProbe) SendQuickAck(ctx context.Context, token uint32) error {
	p.deadline, _ = ctx.Deadline()
	p.token = token
	return nil
}

func (p *quickAckDeadlineProbe) SendQuickAckDeadline(deadline time.Time, token uint32) error {
	p.deadline = deadline
	p.token = token
	return nil
}

func (*quickAckDeadlineProbe) Send(context.Context, *bin.Buffer) error { return nil }
func (*quickAckDeadlineProbe) Recv(context.Context, *bin.Buffer) error { return nil }
func (*quickAckDeadlineProbe) Close() error                            { return nil }

func TestQuickAckUsesServerWriteDeadline(t *testing.T) {
	probe := &quickAckDeadlineProbe{requested: true}
	var key crypto.Key
	authKey := key.WithID()
	before := time.Now()
	if err := sendQuickAckIfRequested(context.Background(), probe, authKey, []byte("plain"), 50*time.Millisecond); err != nil {
		t.Fatalf("send quick ack: %v", err)
	}
	if probe.deadline.IsZero() {
		t.Fatal("quick ack did not receive a write deadline")
	}
	if probe.deadline.Before(before.Add(40*time.Millisecond)) || probe.deadline.After(time.Now().Add(60*time.Millisecond)) {
		t.Fatalf("quick ack deadline = %v, want about server timeout from now", probe.deadline)
	}
}

func TestQuickAckHonorsEarlierCallerDeadline(t *testing.T) {
	probe := &quickAckDeadlineProbe{requested: true}
	ctxDeadline := time.Now().Add(25 * time.Millisecond)
	ctx, cancel := context.WithDeadline(context.Background(), ctxDeadline)
	defer cancel()
	var key crypto.Key
	if err := sendQuickAckIfRequested(ctx, probe, key.WithID(), []byte("plain"), time.Second); err != nil {
		t.Fatalf("send quick ack: %v", err)
	}
	if delta := probe.deadline.Sub(ctxDeadline); delta < -time.Millisecond || delta > time.Millisecond {
		t.Fatalf("quick ack deadline = %v, want caller deadline %v", probe.deadline, ctxDeadline)
	}
}