Skip to content

Commit bdd5d4e

Browse files
committed
ReadPreferences and Tagging
1 parent 922b4ff commit bdd5d4e

1 file changed

Lines changed: 210 additions & 0 deletions

File tree

Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
package com.mongodb;
2+
3+
import java.io.IOException;
4+
import java.util.ArrayList;
5+
import java.util.HashSet;
6+
import java.util.LinkedHashMap;
7+
import java.util.List;
8+
import java.util.Random;
9+
import java.util.Set;
10+
11+
import org.testng.annotations.Test;
12+
13+
import com.mongodb.ReadPreference.*;
14+
import com.mongodb.ReplicaSetStatus.Node;
15+
import com.mongodb.ReplicaSetStatus.ReplicaSet;
16+
import com.mongodb.util.TestCase;
17+
18+
public class ReadPreferenceTest extends TestCase {
19+
public ReadPreferenceTest() throws IOException, MongoException {
20+
cleanupMongo = new Mongo(new MongoURI("mongodb://127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019"));
21+
22+
if (isStandalone(cleanupMongo))
23+
_standalone = true;
24+
25+
cleanupDB = "com_mongodb_unittest_ReadPreferenceTest";
26+
27+
Set<String> names = new HashSet<String>();
28+
names.add("primary");
29+
LinkedHashMap<String, String> tagSet1 = new LinkedHashMap<String, String>();
30+
tagSet1.put("foo", "1");
31+
tagSet1.put("bar", "2");
32+
tagSet1.put("baz", "1");
33+
34+
LinkedHashMap<String, String> tagSet2 = new LinkedHashMap<String, String>();
35+
tagSet2.put("foo", "1");
36+
tagSet2.put("bar", "2");
37+
tagSet2.put("baz", "2");
38+
39+
LinkedHashMap<String, String> tagSet3 = new LinkedHashMap<String, String>();
40+
tagSet3.put("foo", "1");
41+
tagSet3.put("bar", "2");
42+
tagSet3.put("baz", "3");
43+
44+
float acceptableLatencyMS = 15;
45+
float bestPingTime = 50f;
46+
float acceptablePingTime = bestPingTime + (acceptableLatencyMS/2);
47+
float unacceptablePingTime = bestPingTime + acceptableLatencyMS + 1 ;
48+
49+
_primary = new Node(new ServerAddress("127.0.0.1", 27017), names, acceptablePingTime, _isOK, _isMaster, !_isSecondary, tagSet1, Bytes.MAX_OBJECT_SIZE );
50+
51+
names.clear();
52+
names.add("secondary");
53+
_secondary = new Node(new ServerAddress("127.0.0.1", 27018), names, bestPingTime, _isOK, !_isMaster, _isSecondary, tagSet2, Bytes.MAX_OBJECT_SIZE );
54+
55+
names.clear();
56+
names.add("tertiary");
57+
_tertiary = new Node(new ServerAddress("127.0.0.1", 27019), names, unacceptablePingTime, _isOK, !_isMaster, _isSecondary, tagSet3, Bytes.MAX_OBJECT_SIZE );
58+
59+
List<Node> nodeList = new ArrayList<Node>();
60+
nodeList.add(_primary);
61+
nodeList.add(_secondary);
62+
nodeList.add(_tertiary);
63+
64+
if(!_standalone)
65+
_set = new ReplicaSetStatus.ReplicaSet(nodeList, (new Random()), (int)acceptableLatencyMS);
66+
67+
}
68+
69+
@Test
70+
public void testStaticPreferences() {
71+
72+
if( _standalone )
73+
return;
74+
75+
assertTrue(ReadPreference.PRIMARY.toString().equals("ReadPreference.PRIMARY"));
76+
assertTrue(ReadPreference.PRIMARY.toString().equals("ReadPreference.PRIMARY"));
77+
assertTrue(ReadPreference.PRIMARY.getNode(_set).equals(_primary));
78+
assertTrue(ReadPreference.PRIMARY.getNode(_set).master());
79+
80+
assertTrue(ReadPreference.SECONDARY.toString().equals("ReadPreference.SECONDARY"));
81+
assertTrue(!ReadPreference.SECONDARY.getNode(_set).master());
82+
83+
assertTrue((ReadPreference.PRIMARY).toJSON().equals("{ mode: 'primary' }"));
84+
assertTrue((ReadPreference.SECONDARY).toJSON().equals("{ mode: 'secondary' }"));
85+
assertTrue((ReadPreference.SECONDARY_PREFERRED).toJSON().equals("{ mode: 'secondary_preferred' }"));
86+
assertTrue((ReadPreference.PRIMARY_PREFERRED).toJSON().equals("{ mode: 'primary_preferred' }"));
87+
assertTrue((ReadPreference.NEAREST).toJSON().equals("{ mode: 'nearest' }"));
88+
}
89+
90+
@Test
91+
public void testPrimaryReadPrefernce(){
92+
if( _standalone )
93+
return;
94+
95+
ReadPreference primaryRP = new PrimaryReadPreference();
96+
assertTrue(primaryRP.getNode(_set).equals(_primary));
97+
}
98+
99+
@Test
100+
public void testSecondaryReadPrefernce(){
101+
if( _standalone )
102+
return;
103+
104+
ReadPreference secondaryRP = new SecondaryReadPreference();
105+
assertTrue(secondaryRP.toString().equals("ReadPreference.SECONDARY"));
106+
107+
Node candidate = secondaryRP.getNode(_set);
108+
assertTrue(candidate.isOk());
109+
assertTrue(!candidate.master());
110+
111+
// Test SECONDARY mode, with tags
112+
DBObject[] tagArray = { new BasicDBObject("foo", "1"), new BasicDBObject("bar", "2") };
113+
114+
ReadPreference pref = new ReadPreference.SecondaryReadPreference(tagArray);
115+
assertTrue(pref.toString().equals("ReadPreference.SECONDARY"));
116+
117+
candidate = ReadPreference.SECONDARY.getNode(_set);
118+
assertTrue( (candidate.equals(_secondary) || candidate.equals(_tertiary) ) && !candidate.equals(_primary) );
119+
120+
pref = new ReadPreference.SecondaryReadPreference(new BasicDBObject("baz", "1"));
121+
assertTrue(pref.getNode(_set) == null);
122+
123+
pref = new ReadPreference.SecondaryReadPreference(new BasicDBObject("baz", "2"));
124+
assertTrue(pref.getNode(_set).equals(_secondary));
125+
126+
pref = new ReadPreference.SecondaryReadPreference(new BasicDBObject("madeup", "1"));
127+
assertTrue(pref.toJSON().equals("{ mode: 'secondary', tags: [ { 'madeup' : '1' } ] }"));
128+
assertTrue(pref.getNode(_set) == null);
129+
}
130+
131+
@Test
132+
public void testStaticSecondaryMode(){
133+
134+
if( _standalone )
135+
return;
136+
137+
// Test static SECONDARY mode. No tags
138+
Node candidate = ReadPreference.SECONDARY.getNode(_set);
139+
assertTrue( (candidate.equals(_secondary) || candidate.equals(_tertiary) ) && !candidate.equals(_primary) );
140+
141+
// Test SECONDARY mode, with tags
142+
DBObject[] tagArray = { new BasicDBObject("foo", "1"), new BasicDBObject("bar", "2") };
143+
144+
ReadPreference pref = new ReadPreference.SecondaryReadPreference(tagArray);
145+
assertTrue(pref.toString().equals("ReadPreference.SECONDARY"));
146+
147+
candidate = ReadPreference.SECONDARY.getNode(_set);
148+
assertTrue( (candidate.equals(_secondary) || candidate.equals(_tertiary) ) && !candidate.equals(_primary) );
149+
150+
pref = new ReadPreference.SecondaryReadPreference(new BasicDBObject("baz", "1"));
151+
assertTrue(pref.getNode(_set) == null);
152+
153+
pref = new ReadPreference.SecondaryReadPreference(new BasicDBObject("baz", "2"));
154+
assertTrue(pref.getNode(_set).equals(_secondary));
155+
}
156+
157+
@Test
158+
public void testSecondaryPreferredMode(){
159+
160+
if( _standalone )
161+
return;
162+
163+
ReadPreference pref = new ReadPreference.SecondaryPreferredReadPreference(new BasicDBObject("baz", "2"));
164+
assertTrue(pref.getNode(_set).equals(_secondary));
165+
166+
// test that the primary is returned if no secondaries match the tag
167+
pref = new ReadPreference.SecondaryPreferredReadPreference(new BasicDBObject("madeup", "1"));
168+
assertTrue(pref.getNode(_set).equals(_primary));
169+
170+
pref = new ReadPreference.SecondaryPreferredReadPreference();
171+
Node candidate = pref.getNode(_set);
172+
assertTrue((candidate.equals(_secondary) || candidate.equals(_tertiary) ) && !candidate.equals(_primary));
173+
}
174+
175+
@Test
176+
public void testNearestMode(){
177+
if( _standalone )
178+
return;
179+
180+
ReadPreference pref = new ReadPreference.NearestReadPreference();
181+
assertTrue(pref.getNode(_set) != null);
182+
183+
pref = new ReadPreference.NearestReadPreference(new BasicDBObject("baz", "1"));
184+
assertTrue(pref.getNode(_set).equals(_primary));
185+
186+
pref = new ReadPreference.NearestReadPreference(new BasicDBObject("baz", "2"));
187+
assertTrue(pref.getNode(_set).equals(_secondary));
188+
189+
pref = new ReadPreference.NearestReadPreference(new BasicDBObject("madeup", "1"));
190+
assertTrue(pref.toJSON().equals("{ mode: 'nearest', tags: [ { 'madeup' : '1' } ] }"));
191+
assertTrue(pref.getNode(_set) == null);
192+
}
193+
194+
@Test
195+
public void testTaggedPreference(){
196+
if( _standalone )
197+
return;
198+
199+
ReadPreference pref = new ReadPreference.TaggedReadPreference(new BasicDBObject("bar", "2"));
200+
assertTrue(!pref.getNode(_set).master());
201+
}
202+
203+
boolean _isMaster = true;
204+
boolean _isSecondary = true;
205+
boolean _isOK = true;
206+
boolean _standalone = false;
207+
208+
Node _primary, _secondary, _tertiary;
209+
ReplicaSet _set;
210+
}

0 commit comments

Comments
 (0)