19
19
*/
20
20
21
21
import com .apple .foundationdb .relational .api .RelationalConnection ;
22
+ import com .apple .foundationdb .relational .api .RelationalPreparedStatement ;
22
23
import com .apple .foundationdb .relational .yamltests .MultiServerConnectionFactory ;
23
24
import com .apple .foundationdb .relational .yamltests .YamlRunner ;
24
25
import org .junit .jupiter .api .Test ;
@@ -42,61 +43,110 @@ void testDefaultPolicy(int initialConnection) throws SQLException {
42
43
MultiServerConnectionFactory classUnderTest = new MultiServerConnectionFactory (
43
44
MultiServerConnectionFactory .ConnectionSelectionPolicy .DEFAULT ,
44
45
initialConnection ,
45
- dummyConnectionFactory (),
46
- List .of (dummyConnectionFactory ()));
47
- assertEquals (initialConnection , classUnderTest .getCurrentConnectionSelector ());
48
- MultiServerConnectionFactory .MultiServerRelationalConnection connection = (MultiServerConnectionFactory .MultiServerRelationalConnection )classUnderTest .getNewConnection (URI .create ("Blah" ));
49
- assertEquals (0 , connection .getCurrentConnectionSelector ());
50
- assertEquals (initialConnection , classUnderTest .getCurrentConnectionSelector ());
46
+ dummyConnectionFactory ("Primary" ),
47
+ List .of (dummyConnectionFactory ("Alternate" )));
48
+
49
+ MultiServerConnectionFactory .MultiServerRelationalConnection connection =
50
+ (MultiServerConnectionFactory .MultiServerRelationalConnection )classUnderTest .getNewConnection (URI .create ("Blah" ));
51
+ assertConnection (connection , "Primary" );
52
+ assertStatement (connection .prepareStatement ("SQL" ), "Primary" );
53
+ assertStatement (connection .prepareStatement ("SQL" ), "Primary" );
54
+
51
55
connection = (MultiServerConnectionFactory .MultiServerRelationalConnection )classUnderTest .getNewConnection (URI .create ("Blah" ));
52
- assertEquals (0 , connection .getCurrentConnectionSelector ());
53
- assertEquals (initialConnection , classUnderTest .getCurrentConnectionSelector ());
56
+ assertConnection (connection , "Primary" );
57
+ assertStatement (connection .prepareStatement ("SQL" ), "Primary" );
58
+ assertStatement (connection .prepareStatement ("SQL" ), "Primary" );
59
+
54
60
connection = (MultiServerConnectionFactory .MultiServerRelationalConnection )classUnderTest .getNewConnection (URI .create ("Blah" ));
55
- assertEquals (0 , connection .getCurrentConnectionSelector ());
56
- assertEquals (initialConnection , classUnderTest .getCurrentConnectionSelector ());
61
+ assertConnection (connection , "Primary" );
62
+ assertStatement (connection .prepareStatement ("SQL" ), "Primary" );
63
+ assertStatement (connection .prepareStatement ("SQL" ), "Primary" );
57
64
}
58
65
59
66
@ ParameterizedTest
60
67
@ CsvSource ({"0" , "1" })
61
68
void testAlternatePolicy (int initialConnection ) throws SQLException {
69
+ final String [] path = new String [] { "Primary" , "Alternate" };
70
+ final String initialConnectionName = path [initialConnection ];
71
+ final String otherConnectionName = path [(initialConnection + 1 ) % 2 ];
72
+
62
73
MultiServerConnectionFactory classUnderTest = new MultiServerConnectionFactory (
63
74
MultiServerConnectionFactory .ConnectionSelectionPolicy .ALTERNATE ,
64
75
initialConnection ,
65
- dummyConnectionFactory (),
66
- List .of (dummyConnectionFactory ()));
67
- assertEquals (initialConnection , classUnderTest .getCurrentConnectionSelector ());
68
- MultiServerConnectionFactory .MultiServerRelationalConnection connection = (MultiServerConnectionFactory .MultiServerRelationalConnection )classUnderTest .getNewConnection (URI .create ("Blah" ));
69
- assertEquals (initialConnection % 2 , connection .getCurrentConnectionSelector ());
70
- assertEquals ((initialConnection + 1 ) % 2 , classUnderTest .getCurrentConnectionSelector ());
76
+ dummyConnectionFactory ("Primary" ),
77
+ List .of (dummyConnectionFactory ("Alternate" )));
78
+
79
+ // First run:
80
+ // - Factory current connection: initial connection
81
+ // - connection current connection: initial connection
82
+ // - statement: initial connection (2 statements)
83
+ MultiServerConnectionFactory .MultiServerRelationalConnection connection =
84
+ (MultiServerConnectionFactory .MultiServerRelationalConnection )classUnderTest .getNewConnection (URI .create ("Blah" ));
85
+ assertConnection (connection , initialConnectionName );
86
+ assertStatement (connection .prepareStatement ("SQL" ), initialConnectionName );
87
+ // next statement
88
+ assertStatement (connection .prepareStatement ("SQL" ), otherConnectionName );
89
+
90
+ // Second run:
91
+ // - Factory current connection: alternate connection
92
+ // - connection current connection: alternate connection
93
+ // - statement: alternate connection (2 statements)
94
+ connection = (MultiServerConnectionFactory .MultiServerRelationalConnection )classUnderTest .getNewConnection (URI .create ("Blah" ));
95
+ assertConnection (connection , otherConnectionName );
96
+ assertStatement (connection .prepareStatement ("SQL" ), otherConnectionName );
97
+ // next statement
98
+ assertStatement (connection .prepareStatement ("SQL" ), initialConnectionName );
99
+
100
+ // Third run:
101
+ // - Factory current connection: initial connection
102
+ // - connection current connection: initial connection
103
+ // - statement: initial connection (1 statement)
71
104
connection = (MultiServerConnectionFactory .MultiServerRelationalConnection )classUnderTest .getNewConnection (URI .create ("Blah" ));
72
- assertEquals ((initialConnection + 1 ) % 2 , connection .getCurrentConnectionSelector ());
73
- assertEquals (initialConnection % 2 , classUnderTest .getCurrentConnectionSelector ());
105
+ assertConnection (connection , initialConnectionName );
106
+ // just one statement for this connection
107
+ assertStatement (connection .prepareStatement ("SQL" ), initialConnectionName );
108
+
109
+ // Fourth run:
110
+ // - Factory current connection: alternate connection
111
+ // - connection current connection: alternate connection
112
+ // - statement: alternate connection (3 statements)
74
113
connection = (MultiServerConnectionFactory .MultiServerRelationalConnection )classUnderTest .getNewConnection (URI .create ("Blah" ));
75
- assertEquals (initialConnection % 2 , connection .getCurrentConnectionSelector ());
76
- assertEquals ((initialConnection + 1 ) % 2 , classUnderTest .getCurrentConnectionSelector ());
114
+ assertConnection (connection , otherConnectionName );
115
+ assertStatement (connection .prepareStatement ("SQL" ), otherConnectionName );
116
+ // next statements
117
+ assertStatement (connection .prepareStatement ("SQL" ), initialConnectionName );
118
+ assertStatement (connection .prepareStatement ("SQL" ), otherConnectionName );
77
119
}
78
120
79
121
@ Test
80
122
void testIllegalInitialConnection () {
81
123
assertThrows (AssertionError .class , () -> new MultiServerConnectionFactory (
82
124
MultiServerConnectionFactory .ConnectionSelectionPolicy .ALTERNATE ,
83
125
-1 ,
84
- dummyConnectionFactory (),
85
- List .of (dummyConnectionFactory ())));
126
+ dummyConnectionFactory ("A" ),
127
+ List .of (dummyConnectionFactory ("B" ))));
86
128
assertThrows (AssertionError .class , () -> new MultiServerConnectionFactory (
87
129
MultiServerConnectionFactory .ConnectionSelectionPolicy .ALTERNATE ,
88
130
7 ,
89
- dummyConnectionFactory (),
90
- List .of (dummyConnectionFactory ())));
131
+ dummyConnectionFactory ("A" ),
132
+ List .of (dummyConnectionFactory ("B" ))));
91
133
}
92
134
93
- YamlRunner .YamlConnectionFactory dummyConnectionFactory () {
135
+ private void assertStatement (final RelationalPreparedStatement statement , final String query ) throws SQLException {
136
+ assertEquals ("name=" + query , ((RelationalConnection )statement .getConnection ()).getPath ().getQuery ());
137
+ }
138
+
139
+ private static void assertConnection (final MultiServerConnectionFactory .MultiServerRelationalConnection connection , final String query ) {
140
+ assertEquals ("name=" + query , connection .getPath ().getQuery ());
141
+ }
142
+
143
+ YamlRunner .YamlConnectionFactory dummyConnectionFactory (@ Nonnull String name ) {
94
144
return new YamlRunner .YamlConnectionFactory () {
95
145
@ Override
96
146
public RelationalConnection getNewConnection (@ Nonnull URI connectPath ) throws SQLException {
97
- final RelationalConnection connection = Mockito . mock ( RelationalConnection . class );
98
- Mockito . when ( connection . unwrap ( RelationalConnection . class )). thenReturn ( connection );
99
- return connection ;
147
+ // Add query string to connection so we can tell where it came from
148
+ URI newPath = URI . create ( connectPath + "?name=" + name );
149
+ return dummyConnection ( newPath ) ;
100
150
}
101
151
102
152
@ Override
@@ -105,4 +155,20 @@ public Set<String> getVersionsUnderTest() {
105
155
}
106
156
};
107
157
}
158
+
159
+ @ Nonnull
160
+ private static RelationalConnection dummyConnection (@ Nonnull URI connectPath ) throws SQLException {
161
+ final RelationalConnection connection = Mockito .mock (RelationalConnection .class );
162
+ Mockito .when (connection .unwrap (RelationalConnection .class )).thenReturn (connection );
163
+ Mockito .when (connection .getPath ()).thenReturn (connectPath );
164
+ final RelationalPreparedStatement statement = dummyPreparedStatement (connection );
165
+ Mockito .when (connection .prepareStatement (Mockito .anyString ())).thenReturn (statement );
166
+ return connection ;
167
+ }
168
+
169
+ private static RelationalPreparedStatement dummyPreparedStatement (final RelationalConnection connection ) throws SQLException {
170
+ final RelationalPreparedStatement statement = Mockito .mock (RelationalPreparedStatement .class );
171
+ Mockito .when (statement .getConnection ()).thenReturn (connection );
172
+ return statement ;
173
+ }
108
174
}
0 commit comments