refactor(sessionresolver): adapt to changing network conditions (#238)
* feat(sessionresolver): try many and use what works * fix(sessionresolver): make sure we can use quic * fix: the config struct is unnecessary * fix: make kvstore optional * feat: write simple integration test * feat: start adding tests * feat: continue writing tests * fix(sessionresolver): add more unit tests * fix(sessionresolver): finish adding tests * refactor(sessionresolver): changes after code review
This commit is contained in:
parent
12e1164940
commit
034db78f94
19 changed files with 1260 additions and 66 deletions
|
|
@ -0,0 +1,80 @@
|
|||
package sessionresolver
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"io"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
)
|
||||
|
||||
type FakeResolver struct {
|
||||
Closed bool
|
||||
Data []string
|
||||
Err error
|
||||
Sleep time.Duration
|
||||
}
|
||||
|
||||
func (r *FakeResolver) LookupHost(ctx context.Context, hostname string) ([]string, error) {
|
||||
select {
|
||||
case <-time.After(r.Sleep):
|
||||
return r.Data, r.Err
|
||||
case <-ctx.Done():
|
||||
return nil, ctx.Err()
|
||||
}
|
||||
}
|
||||
|
||||
func (r *FakeResolver) CloseIdleConnections() {
|
||||
r.Closed = true
|
||||
}
|
||||
|
||||
func TestTimeLimitedLookupSuccess(t *testing.T) {
|
||||
reso := &Resolver{}
|
||||
re := &FakeResolver{
|
||||
Data: []string{"8.8.8.8", "8.8.4.4"},
|
||||
}
|
||||
ctx := context.Background()
|
||||
out, err := reso.timeLimitedLookup(ctx, re, "dns.google")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if diff := cmp.Diff(re.Data, out); diff != "" {
|
||||
t.Fatal(diff)
|
||||
}
|
||||
}
|
||||
|
||||
func TestTimeLimitedLookupFailure(t *testing.T) {
|
||||
reso := &Resolver{}
|
||||
re := &FakeResolver{
|
||||
Err: io.EOF,
|
||||
}
|
||||
ctx := context.Background()
|
||||
out, err := reso.timeLimitedLookup(ctx, re, "dns.google")
|
||||
if !errors.Is(err, re.Err) {
|
||||
t.Fatal("not the error we expected", err)
|
||||
}
|
||||
if out != nil {
|
||||
t.Fatal("expected nil here")
|
||||
}
|
||||
}
|
||||
|
||||
func TestTimeLimitedLookupWillTimeout(t *testing.T) {
|
||||
if testing.Short() {
|
||||
t.Skip("skipping test in short mode")
|
||||
}
|
||||
reso := &Resolver{}
|
||||
re := &FakeResolver{
|
||||
Err: io.EOF,
|
||||
Sleep: 20 * time.Second,
|
||||
}
|
||||
ctx := context.Background()
|
||||
out, err := reso.timeLimitedLookup(ctx, re, "dns.google")
|
||||
if !errors.Is(err, context.DeadlineExceeded) {
|
||||
t.Fatal("not the error we expected", err)
|
||||
}
|
||||
if out != nil {
|
||||
t.Fatal("expected nil here")
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue