70 lines
2.1 KiB
Go
70 lines
2.1 KiB
Go
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)
|
|
}
|
|
}
|