@@ -8,6 +8,7 @@ package command
8
8
9
9
import (
10
10
"testing"
11
+ "time"
11
12
12
13
"github.com/mongodb/mongo-go-driver/mongo/readpref"
13
14
"github.com/mongodb/mongo-go-driver/x/network/description"
@@ -17,12 +18,105 @@ import (
17
18
func noerr (t * testing.T , err error ) {
18
19
if err != nil {
19
20
t .Helper ()
20
- t .Errorf ("Unepexted error: %v" , err )
21
+ t .Errorf ("Unexpected error: %v" , err )
21
22
t .FailNow ()
22
23
}
23
24
}
24
25
26
+ var connectDirectOpMsgTests = []struct {
27
+ serverKind description.ServerKind
28
+ suppliedReadPref * readpref.ReadPref
29
+ expectedReadPrefMode readpref.Mode
30
+ }{
31
+ {description .RSSecondary , nil , readpref .PrimaryPreferredMode },
32
+ {description .RSSecondary , readpref .Primary (), readpref .PrimaryPreferredMode },
33
+ {description .RSSecondary , readpref .Secondary (), readpref .SecondaryMode },
34
+ {description .Mongos , readpref .Primary (), readpref .Mode (0 )},
35
+ {description .Mongos , readpref .SecondaryPreferred (), readpref .SecondaryPreferredMode },
36
+ {description .Mongos , readpref .SecondaryPreferred (readpref .WithTags ("a" , "2" )), readpref .SecondaryPreferredMode },
37
+ {description .Mongos , readpref .SecondaryPreferred (readpref .WithMaxStaleness (time .Duration (10 ))), readpref .SecondaryPreferredMode },
38
+ {description .Mongos , readpref .Secondary (), readpref .SecondaryMode },
39
+ }
40
+
41
+ var connectDirectOpQueryTests = []struct {
42
+ serverKind description.ServerKind
43
+ suppliedReadPref * readpref.ReadPref
44
+ expectedReadPrefMode readpref.Mode
45
+ expectedSlaveOkBit wiremessage.QueryFlag
46
+ }{
47
+ {description .Mongos , readpref .Primary (), readpref .Mode (0 ), 0 },
48
+ {description .Mongos , readpref .SecondaryPreferred (), readpref .Mode (0 ), wiremessage .SlaveOK },
49
+ {description .Mongos , readpref .SecondaryPreferred (readpref .WithTags ("a" , "2" )), readpref .SecondaryPreferredMode , wiremessage .SlaveOK },
50
+ {description .Mongos , readpref .SecondaryPreferred (readpref .WithMaxStaleness (time .Duration (10 ))), readpref .SecondaryPreferredMode , wiremessage .SlaveOK },
51
+ {description .Mongos , readpref .Secondary (), readpref .SecondaryMode , wiremessage .SlaveOK },
52
+ }
53
+
25
54
func TestCommandEncode (t * testing.T ) {
55
+ for _ , tt := range connectDirectOpMsgTests {
56
+ t .Run ("connect direct op_msg" , func (t * testing.T ) {
57
+ cmd := & Read {ReadPref : tt .suppliedReadPref }
58
+ wm , err := cmd .Encode (description.SelectedServer {
59
+ Server : description.Server {
60
+ Kind : tt .serverKind ,
61
+ WireVersion : & description.VersionRange {Max : 6 },
62
+ },
63
+ Kind : description .Single ,
64
+ })
65
+ noerr (t , err )
66
+
67
+ msg , ok := wm .(wiremessage.Msg )
68
+ if ! ok {
69
+ t .Fatalf ("Returned wiremessage is not a msg. got %T; want %T" , wm , wiremessage.Msg {})
70
+ }
71
+ res , _ := msg .GetMainDocument ()
72
+ rp , err := res .LookupErr ("$readPreference" , "mode" )
73
+ if tt .expectedReadPrefMode == readpref .Mode (0 ) {
74
+ if err == nil {
75
+ t .Errorf ("Did not expect $readPreference to be set, but it was. got %v" , rp .StringValue ())
76
+ }
77
+ } else {
78
+ if err != nil {
79
+ t .Fatalf ("Expected $readPreference to be set, but it wasn't." )
80
+ }
81
+ if mode , _ := readpref .ModeFromString (rp .StringValue ()); mode != tt .expectedReadPrefMode {
82
+ t .Errorf ("Expected $readPreference to be set to %v, but it wasn't. got %v" , tt .expectedReadPrefMode , mode )
83
+ }
84
+ }
85
+ })
86
+ }
87
+
88
+ for _ , tt := range connectDirectOpQueryTests {
89
+ t .Run ("connect direct op_query" , func (t * testing.T ) {
90
+ cmd := & Read {ReadPref : tt .suppliedReadPref }
91
+ wm , err := cmd .Encode (description.SelectedServer {
92
+ Server : description.Server {Kind : tt .serverKind },
93
+ Kind : description .Single ,
94
+ })
95
+ noerr (t , err )
96
+
97
+ query , ok := wm .(wiremessage.Query )
98
+ if ! ok {
99
+ t .Fatalf ("Returned wiremessage is not a query. got %T; want %T" , wm , wiremessage.Query {})
100
+ }
101
+ if query .Flags & wiremessage .SlaveOK != tt .expectedSlaveOkBit {
102
+ t .Errorf ("slaveOk bit did not have expected value. got %v; want %v" , query .Flags , wiremessage .SlaveOK )
103
+ }
104
+ rp , err := query .Query .LookupErr ("$readPreference" , "mode" )
105
+ if tt .expectedReadPrefMode == readpref .Mode (0 ) {
106
+ if err == nil {
107
+ t .Errorf ("Did not expect $readPreference to be set, but it was. got %v" , rp .StringValue ())
108
+ }
109
+ } else {
110
+ if err != nil {
111
+ t .Fatalf ("Expected $readPreference to be set, but it wasn't." )
112
+ }
113
+ if mode , _ := readpref .ModeFromString (rp .StringValue ()); mode != tt .expectedReadPrefMode {
114
+ t .Errorf ("Expected $readPreference to be set to %v, but it wasn't. got %v" , tt .expectedReadPrefMode , mode )
115
+ }
116
+ }
117
+ })
118
+ }
119
+
26
120
t .Run ("sets slaveOk for non-primary read preference mode" , func (t * testing.T ) {
27
121
cmd := & Read {
28
122
ReadPref : readpref .SecondaryPreferred (),
@@ -31,8 +125,7 @@ func TestCommandEncode(t *testing.T) {
31
125
noerr (t , err )
32
126
query , ok := wm .(wiremessage.Query )
33
127
if ! ok {
34
- t .Errorf ("Returned wiremessage is not a query. got %T; want %T" , wm , wiremessage.Query {})
35
- t .FailNow ()
128
+ t .Fatalf ("Returned wiremessage is not a query. got %T; want %T" , wm , wiremessage.Query {})
36
129
}
37
130
if query .Flags & wiremessage .SlaveOK != wiremessage .SlaveOK {
38
131
t .Errorf ("Expected the slaveOk flag to be set, but it wasn't. got %v; want %v" , query .Flags , wiremessage .SlaveOK )
@@ -44,21 +137,19 @@ func TestCommandEncode(t *testing.T) {
44
137
noerr (t , err )
45
138
query , ok := wm .(wiremessage.Query )
46
139
if ! ok {
47
- t .Errorf ("Returned wiremessage is not a query. got %T; want %T" , wm , wiremessage.Query {})
48
- t .FailNow ()
140
+ t .Fatalf ("Returned wiremessage is not a query. got %T; want %T" , wm , wiremessage.Query {})
49
141
}
50
142
if query .Flags & wiremessage .SlaveOK != wiremessage .SlaveOK {
51
143
t .Errorf ("Expected the slaveOk flag to be set, but it wasn't. got %v; want %v" , query .Flags , wiremessage .SlaveOK )
52
144
}
53
145
})
54
- t .Run ("sets slaveOK for all read commands in direct mode" , func (t * testing.T ) {
146
+ t .Run ("sets slaveOK for all read commands to non-mongos in direct mode" , func (t * testing.T ) {
55
147
cmd := & Read {}
56
148
wm , err := cmd .Encode (description.SelectedServer {Kind : description .Single })
57
149
noerr (t , err )
58
150
query , ok := wm .(wiremessage.Query )
59
151
if ! ok {
60
- t .Errorf ("Returned wiremessage is not a query. got %T; want %T" , wm , wiremessage.Query {})
61
- t .FailNow ()
152
+ t .Fatalf ("Returned wiremessage is not a query. got %T; want %T" , wm , wiremessage.Query {})
62
153
}
63
154
if query .Flags & wiremessage .SlaveOK != wiremessage .SlaveOK {
64
155
t .Errorf ("Expected the slaveOk flag to be set, but it wasn't. got %v; want %v" , query .Flags , wiremessage .SlaveOK )
0 commit comments