1
2
3
4
5
6
7 package readpref
8
9 import (
10 "testing"
11 "time"
12
13 "go.mongodb.org/mongo-driver/internal/assert"
14 "go.mongodb.org/mongo-driver/internal/require"
15 "go.mongodb.org/mongo-driver/tag"
16 )
17
18 func TestPrimary(t *testing.T) {
19 subject := Primary()
20
21 require.Equal(t, PrimaryMode, subject.Mode())
22 _, set := subject.MaxStaleness()
23 require.False(t, set)
24 require.Len(t, subject.TagSets(), 0)
25 }
26
27 func TestPrimaryPreferred(t *testing.T) {
28 subject := PrimaryPreferred()
29
30 require.Equal(t, PrimaryPreferredMode, subject.Mode())
31 _, set := subject.MaxStaleness()
32 require.False(t, set)
33 require.Len(t, subject.TagSets(), 0)
34 }
35
36 func TestPrimaryPreferred_with_options(t *testing.T) {
37 subject := PrimaryPreferred(
38 WithMaxStaleness(time.Duration(10)),
39 WithTags("a", "1", "b", "2"),
40 )
41
42 require.Equal(t, PrimaryPreferredMode, subject.Mode())
43 ms, set := subject.MaxStaleness()
44 require.True(t, set)
45 require.Equal(t, time.Duration(10), ms)
46 require.Equal(t, []tag.Set{{tag.Tag{Name: "a", Value: "1"}, tag.Tag{Name: "b", Value: "2"}}}, subject.TagSets())
47 }
48
49 func TestSecondaryPreferred(t *testing.T) {
50 subject := SecondaryPreferred()
51
52 require.Equal(t, SecondaryPreferredMode, subject.Mode())
53 _, set := subject.MaxStaleness()
54 require.False(t, set)
55 require.Len(t, subject.TagSets(), 0)
56 }
57
58 func TestSecondaryPreferred_with_options(t *testing.T) {
59 subject := SecondaryPreferred(
60 WithMaxStaleness(time.Duration(10)),
61 WithTags("a", "1", "b", "2"),
62 )
63
64 require.Equal(t, SecondaryPreferredMode, subject.Mode())
65 ms, set := subject.MaxStaleness()
66 require.True(t, set)
67 require.Equal(t, time.Duration(10), ms)
68 require.Equal(t, []tag.Set{{tag.Tag{Name: "a", Value: "1"}, tag.Tag{Name: "b", Value: "2"}}}, subject.TagSets())
69 }
70
71 func TestSecondary(t *testing.T) {
72 subject := Secondary()
73
74 require.Equal(t, SecondaryMode, subject.Mode())
75 _, set := subject.MaxStaleness()
76 require.False(t, set)
77 require.Len(t, subject.TagSets(), 0)
78 }
79
80 func TestSecondary_with_options(t *testing.T) {
81 subject := Secondary(
82 WithMaxStaleness(time.Duration(10)),
83 WithTags("a", "1", "b", "2"),
84 )
85
86 require.Equal(t, SecondaryMode, subject.Mode())
87 ms, set := subject.MaxStaleness()
88 require.True(t, set)
89 require.Equal(t, time.Duration(10), ms)
90 require.Equal(t, []tag.Set{{tag.Tag{Name: "a", Value: "1"}, tag.Tag{Name: "b", Value: "2"}}}, subject.TagSets())
91 }
92
93 func TestNearest(t *testing.T) {
94 subject := Nearest()
95
96 require.Equal(t, NearestMode, subject.Mode())
97 _, set := subject.MaxStaleness()
98 require.False(t, set)
99 require.Len(t, subject.TagSets(), 0)
100 }
101
102 func TestNearest_with_options(t *testing.T) {
103 subject := Nearest(
104 WithMaxStaleness(time.Duration(10)),
105 WithTags("a", "1", "b", "2"),
106 )
107
108 require.Equal(t, NearestMode, subject.Mode())
109 ms, set := subject.MaxStaleness()
110 require.True(t, set)
111 require.Equal(t, time.Duration(10), ms)
112 require.Equal(t, []tag.Set{{tag.Tag{Name: "a", Value: "1"}, tag.Tag{Name: "b", Value: "2"}}}, subject.TagSets())
113 }
114
115 func TestHedge(t *testing.T) {
116 t.Run("hedge specified with primary mode errors", func(t *testing.T) {
117 _, err := New(PrimaryMode, WithHedgeEnabled(true))
118 assert.Equal(t, errInvalidReadPreference, err, "expected error %v, got %v", errInvalidReadPreference, err)
119 })
120 t.Run("valid hedge document and mode succeeds", func(t *testing.T) {
121 rp, err := New(SecondaryMode, WithHedgeEnabled(true))
122 assert.Nil(t, err, "expected no error, got %v", err)
123 enabled := rp.HedgeEnabled()
124 assert.NotNil(t, enabled, "expected HedgeEnabled to return a non-nil value, got nil")
125 assert.True(t, *enabled, "expected HedgeEnabled to return true, got false")
126 })
127 }
128
129 func TestReadPref_String(t *testing.T) {
130 t.Run("ReadPref.String() with all options", func(t *testing.T) {
131 readPref := Nearest(
132 WithMaxStaleness(120*time.Second),
133 WithTagSets(tag.Set{{"a", "1"}, {"b", "2"}}, tag.Set{{"q", "5"}, {"r", "6"}}),
134 WithHedgeEnabled(true),
135 )
136 expected := "nearest(maxStaleness=2m0s tagSet=a=1,b=2 tagSet=q=5,r=6 hedgeEnabled=true)"
137 assert.Equal(t, expected, readPref.String(), "expected %q, got %q", expected, readPref.String())
138 })
139 t.Run("ReadPref.String() with one option", func(t *testing.T) {
140 readPref := Secondary(WithTags("a", "1", "b", "2"))
141 expected := "secondary(tagSet=a=1,b=2)"
142 assert.Equal(t, expected, readPref.String(), "expected %q, got %q", expected, readPref.String())
143 })
144 t.Run("ReadPref.String() with no options", func(t *testing.T) {
145 readPref := Primary()
146 expected := "primary"
147 assert.Equal(t, expected, readPref.String(), "expected %q, got %q", expected, readPref.String())
148 })
149 }
150
View as plain text