Skip to content

Commit

Permalink
test(providor): test that Happy Eyeballs remembers its past choice (#910
Browse files Browse the repository at this point in the history
)
  • Loading branch information
favonia committed Aug 30, 2024
1 parent 29fe605 commit 11d9705
Showing 1 changed file with 34 additions and 16 deletions.
50 changes: 34 additions & 16 deletions internal/provider/happy_eyeballs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ func TestHappyEyeballs(t *testing.T) {
elapsed time.Duration
prepareMocks func(ppfmt *mocks.MockPP, p *mocks.MockSplitProvider)
}{
"no-alternative": {
"no-alternative": { //nolint:dupl
ip1111, protocol.MethodPrimary, true,
3 * time.Second, 0,
func(ppfmt *mocks.MockPP, p *mocks.MockSplitProvider) {
Expand All @@ -49,11 +49,13 @@ func TestHappyEyeballs(t *testing.T) {
func(_ context.Context, ppfmt pp.PP, _ ipnet.Type, _ protocol.Method) (netip.Addr, bool) {
ppfmt.Infof(pp.EmojiGood, "Got 1.1.1.1!")
return ip1111, true
}).Times(1)
}).Times(2)
ppfmt.EXPECT().Infof(pp.EmojiGood, "Got 1.1.1.1!")
p.EXPECT().HasAlternative(ipNet).Return(false)
ppfmt.EXPECT().Infof(pp.EmojiGood, "Got 1.1.1.1!")
},
},
"primary-instant": {
"primary-instant": { //nolint:dupl
ip1111, protocol.MethodPrimary, true,
3 * time.Second, 0,
func(ppfmt *mocks.MockPP, p *mocks.MockSplitProvider) {
Expand All @@ -62,7 +64,9 @@ func TestHappyEyeballs(t *testing.T) {
func(_ context.Context, ppfmt pp.PP, _ ipnet.Type, _ protocol.Method) (netip.Addr, bool) {
ppfmt.Infof(pp.EmojiGood, "Got 1.1.1.1!")
return ip1111, true
}).Times(1)
}).Times(2)
ppfmt.EXPECT().Infof(pp.EmojiGood, "Got 1.1.1.1!")
p.EXPECT().HasAlternative(ipNet).Return(true)
ppfmt.EXPECT().Infof(pp.EmojiGood, "Got 1.1.1.1!")
},
},
Expand All @@ -81,9 +85,11 @@ func TestHappyEyeballs(t *testing.T) {
func(_ context.Context, ppfmt pp.PP, _ ipnet.Type, _ protocol.Method) (netip.Addr, bool) {
ppfmt.Infof(pp.EmojiGood, "Got 1.0.0.1!")
return ip1001, true
}).Times(1)
}).Times(2)
ppfmt.EXPECT().Infof(pp.EmojiGood, "Got 1.0.0.1!")
ppfmt.EXPECT().Infof(pp.EmojiNow, "The server 1.0.0.1 responded before 1.1.1.1 does and will be used from now on.")
p.EXPECT().HasAlternative(ipNet).Return(true)
ppfmt.EXPECT().Infof(pp.EmojiGood, "Got 1.0.0.1!")
},
},
"primary-delayed/alternative-instant-fails": {
Expand All @@ -96,13 +102,15 @@ func TestHappyEyeballs(t *testing.T) {
ppfmt.Infof(pp.EmojiGood, "Got 1.1.1.1!")
sleepCtx(ctx, time.Second)
return ip1111, true
}).Times(1)
}).Times(2)
p.EXPECT().GetIP(gomock.Any(), gomock.Any(), ipNet, protocol.MethodAlternative).DoAndReturn(
func(_ context.Context, ppfmt pp.PP, _ ipnet.Type, _ protocol.Method) (netip.Addr, bool) {
ppfmt.Noticef(pp.EmojiError, "Can't get 1.0.0.1")
return netip.Addr{}, false
}).Times(1)
ppfmt.EXPECT().Infof(pp.EmojiGood, "Got 1.1.1.1!")
p.EXPECT().HasAlternative(ipNet).Return(true)
ppfmt.EXPECT().Infof(pp.EmojiGood, "Got 1.1.1.1!")
},
},
"primary-delayed/alternative-timeout": {
Expand All @@ -115,14 +123,16 @@ func TestHappyEyeballs(t *testing.T) {
ppfmt.Infof(pp.EmojiGood, "Got 1.1.1.1!")
sleepCtx(ctx, time.Second)
return ip1111, true
}).Times(1)
}).Times(2)
p.EXPECT().GetIP(gomock.Any(), gomock.Any(), ipNet, protocol.MethodAlternative).DoAndReturn(
func(ctx context.Context, ppfmt pp.PP, _ ipnet.Type, _ protocol.Method) (netip.Addr, bool) {
ppfmt.Infof(pp.EmojiGood, "Got 1.0.0.1!")
sleepCtx(ctx, forever)
return ip1001, true
}).Times(1)
ppfmt.EXPECT().Infof(pp.EmojiGood, "Got 1.1.1.1!")
p.EXPECT().HasAlternative(ipNet).Return(true)
ppfmt.EXPECT().Infof(pp.EmojiGood, "Got 1.1.1.1!")
},
},
"primary-instant-fails/alternative-instant": {
Expand All @@ -139,9 +149,11 @@ func TestHappyEyeballs(t *testing.T) {
func(_ context.Context, ppfmt pp.PP, _ ipnet.Type, _ protocol.Method) (netip.Addr, bool) {
ppfmt.Infof(pp.EmojiGood, "Got 1.0.0.1!")
return ip1001, true
}).Times(1)
}).Times(2)
ppfmt.EXPECT().Infof(pp.EmojiGood, "Got 1.0.0.1!")
ppfmt.EXPECT().Infof(pp.EmojiNow, "The server 1.0.0.1 responded before 1.1.1.1 does and will be used from now on.")
p.EXPECT().HasAlternative(ipNet).Return(true)
ppfmt.EXPECT().Infof(pp.EmojiGood, "Got 1.0.0.1!")
},
},
"primary-instant-fails/alternative-instant-fails": {
Expand Down Expand Up @@ -179,9 +191,11 @@ func TestHappyEyeballs(t *testing.T) {
ppfmt.Infof(pp.EmojiGood, "Got 1.0.0.1!")
sleepCtx(ctx, time.Second)
return ip1001, true
}).Times(1)
}).Times(2)
ppfmt.EXPECT().Infof(pp.EmojiGood, "Got 1.0.0.1!")
ppfmt.EXPECT().Infof(pp.EmojiNow, "The server 1.0.0.1 responded before 1.1.1.1 does and will be used from now on.")
p.EXPECT().HasAlternative(ipNet).Return(true)
ppfmt.EXPECT().Infof(pp.EmojiGood, "Got 1.0.0.1!")
},
},
"primary-timeout/alternative-timeout": {
Expand All @@ -191,17 +205,13 @@ func TestHappyEyeballs(t *testing.T) {
func(ppfmt *mocks.MockPP, p *mocks.MockSplitProvider) {
p.EXPECT().HasAlternative(ipNet).Return(true)
p.EXPECT().GetIP(gomock.Any(), gomock.Any(), ipNet, protocol.MethodPrimary).DoAndReturn(
func(ctx context.Context, ppfmt pp.PP, _ ipnet.Type, m protocol.Method) (netip.Addr, bool) {
t.Logf("Called with method = %v", m)

func(ctx context.Context, ppfmt pp.PP, _ ipnet.Type, _ protocol.Method) (netip.Addr, bool) {
ppfmt.Noticef(pp.EmojiError, "Can't get 1.1.1.1")
sleepCtx(ctx, forever)
return netip.Addr{}, false
}).Times(1)
p.EXPECT().GetIP(gomock.Any(), gomock.Any(), ipNet, protocol.MethodAlternative).DoAndReturn(
func(ctx context.Context, ppfmt pp.PP, _ ipnet.Type, m protocol.Method) (netip.Addr, bool) {
t.Logf("Called with method = %v", m)

func(ctx context.Context, ppfmt pp.PP, _ ipnet.Type, _ protocol.Method) (netip.Addr, bool) {
ppfmt.Noticef(pp.EmojiError, "Can't get 1.0.0.1")
sleepCtx(ctx, forever)
return netip.Addr{}, false
Expand All @@ -224,11 +234,19 @@ func TestHappyEyeballs(t *testing.T) {
defer cancel()

startTime := time.Now()
ip, method, ok := provider.NewHappyEyeballs(mockSP).GetIP(ctx, mockPP, ipNet)
p := provider.NewHappyEyeballs(mockSP)
ip, method, ok := p.GetIP(ctx, mockPP, ipNet)
require.Equal(t, tc.ip, ip)
require.Equal(t, tc.method, method)
require.Equal(t, tc.ok, ok)
require.WithinDuration(t, startTime.Add(tc.elapsed), time.Now(), 100*time.Millisecond)

if tc.ok {
ip, method, ok = p.GetIP(ctx, mockPP, ipNet)
require.Equal(t, tc.ip, ip)
require.Equal(t, tc.method, method)
require.Equal(t, tc.ok, ok)
}
})
}
}

0 comments on commit 11d9705

Please sign in to comment.