5151import org .exist .TestUtils ;
5252import org .exist .test .ExistWebServer ;
5353import org .junit .*;
54+ import org .junit .runner .RunWith ;
55+ import org .junit .runners .Parameterized ;
5456import org .xml .sax .SAXException ;
5557import org .xmldb .api .DatabaseManager ;
5658import org .xmldb .api .base .*;
5961import org .xmldb .api .modules .XQueryService ;
6062
6163import java .nio .file .Path ;
64+ import java .util .Arrays ;
6265import java .util .Random ;
6366import java .util .concurrent .ExecutorService ;
6467import java .util .concurrent .Executors ;
6568import java .util .concurrent .TimeUnit ;
6669
67- import static org .junit .Assert .assertEquals ;
68- import static org .junit .Assert .fail ;
70+ import static org .junit .Assert .*;
6971
72+ @ RunWith (Parameterized .class )
7073public class QuerySessionTest {
7174
75+ @ Parameterized .Parameters (name = "{0}" )
76+ public static java .util .Collection <Object []> data () {
77+ return Arrays .asList (new Object [][] {
78+ { "local" , "xmldb:exist://" },
79+ { "remote" , "xmldb:exist://localhost:" + PORT_PLACEHOLDER + "/xmlrpc" }
80+ });
81+ }
82+
83+ @ Parameterized .Parameter
84+ public String apiName ;
85+
86+ @ Parameterized .Parameter (value = 1 )
87+ public String baseUri ;
88+
89+ private boolean storedTestData = false ;
90+
7291 private static final Logger LOG = LogManager .getLogger (QuerySessionTest .class );
7392
7493 @ ClassRule
7594 public final static ExistWebServer existWebServer = new ExistWebServer (true , false , true , true );
95+ private static final String PORT_PLACEHOLDER = "${PORT}" ;
7696
7797 private final static String generateXQ =
7898 "declare function local:random-sequence($length as xs:integer, $G as map(xs:string, item())) {\n "
@@ -101,8 +121,8 @@ public class QuerySessionTest {
101121 "declare variable $n external;" +
102122 "//chapter[@xml:id eq $n]" ;
103123
104- private static String getBaseUri () {
105- return "xmldb:exist://localhost:" + existWebServer .getPort () + "/xmlrpc" ;
124+ private String getBaseUri () {
125+ return baseUri . replace ( PORT_PLACEHOLDER , Integer . toString ( existWebServer .getPort ())) ;
106126 }
107127
108128 private final static int N_THREADS = 10 ;
@@ -111,19 +131,25 @@ private static String getBaseUri() {
111131
112132 private Random random = new Random ();
113133
114- @ Test ( expected = XMLDBException . class )
134+ @ Test
115135 public void manualRelease () throws XMLDBException {
116136 Collection test = DatabaseManager .getCollection (getBaseUri () + "/db/rpctest" , TestUtils .ADMIN_DB_USER , TestUtils .ADMIN_DB_PWD );
117137 XQueryService service = test .getService (XQueryService .class );
118138 ResourceSet result = service .query ("//chapter[@xml:id eq 'chapter1']" );
119- assertEquals ( 1 , result .getSize ());
139+ assertTrue ( result .getSize () > 0 );
120140
121- // clear should release the query result on the server
122- result .clear ();
141+ if (!"local" .equals (apiName )) {
142+ // clear should release the query result on the server
143+ result .clear ();
123144
124- // the result has been cleared already. we should get an exception here
125- Resource members = result .getMembersAsResource ();
126- members .getContent ();
145+ // As the result has been cleared already, we should get an exception below
146+ try {
147+ result .getMembersAsResource ();
148+ fail ("Expected XMLDBException from calling Resource#getMembersAsResource() after ResourceSet#clear() when using the Remote XML:DB API" );
149+ } catch (final XMLDBException e ) {
150+ assertEquals ("Failed to invoke method retrieveAllFirstChunk in class org.exist.xmlrpc.RpcConnection: result set unknown or timed out" , e .getMessage ());
151+ }
152+ }
127153 }
128154
129155 @ Test
@@ -167,42 +193,28 @@ public void run() {
167193 }
168194 }
169195
170- @ BeforeClass
171- public static void startServer () throws ClassNotFoundException , IllegalAccessException , InstantiationException , XMLDBException , SAXException {
172- // initialize XML:DB driver
173- Class <?> cl = Class .forName ("org.exist.xmldb.DatabaseImpl" );
174- Database database = (Database ) cl .newInstance ();
175- DatabaseManager .registerDatabase (database );
176-
177- Collection root = DatabaseManager .getCollection (getBaseUri () + "/db" , TestUtils .ADMIN_DB_USER , TestUtils .ADMIN_DB_PWD );
178-
179- CollectionManagementService mgmt =
180- root .getService (CollectionManagementService .class );
181- Collection test = mgmt .createCollection ("rpctest" );
182-
183- final TestDataGenerator generator = new TestDataGenerator ("xdb" , DOC_COUNT );
184- try {
185- final Path [] files = generator .generate (test , generateXQ );
186- for (int i = 0 ; i < files .length ; i ++) {
187- Resource resource = test .createResource (files [i ].getFileName ().toString (), XMLResource .class );
188- resource .setContent (files [i ].toFile ());
189- test .storeResource (resource );
196+ @ Before
197+ public void storeTestData () throws XMLDBException , SAXException {
198+ if (!storedTestData ) {
199+ // NOTE(AR) we only need to store the test data once!
200+ final Collection root = DatabaseManager .getCollection (getBaseUri () + "/db" , TestUtils .ADMIN_DB_USER , TestUtils .ADMIN_DB_PWD );
201+
202+ final CollectionManagementService mgmt = root .getService (CollectionManagementService .class );
203+ final Collection test = mgmt .createCollection ("rpctest" );
204+
205+ final TestDataGenerator generator = new TestDataGenerator ("xdb" , DOC_COUNT );
206+ try {
207+ final Path [] files = generator .generate (test , generateXQ );
208+ for (int i = 0 ; i < files .length ; i ++) {
209+ final Resource resource = test .createResource (files [i ].getFileName ().toString (), XMLResource .class );
210+ resource .setContent (files [i ].toFile ());
211+ test .storeResource (resource );
212+ }
213+ } finally {
214+ generator .releaseAll ();
190215 }
191- } finally {
192- generator .releaseAll ();
193- }
194- }
195216
196- @ AfterClass
197- public static void stopServer () throws XMLDBException {
198- Collection root = DatabaseManager .getCollection (getBaseUri () + "/db" , TestUtils .ADMIN_DB_USER , TestUtils .ADMIN_DB_PWD );
199- CollectionManagementService mgmt =
200- root .getService (CollectionManagementService .class );
201- mgmt .removeCollection ("rpctest" );
202-
203- Collection config = DatabaseManager .getCollection (getBaseUri () + "/db/system/config/db" , "admin" , "" );
204- mgmt =
205- config .getService (CollectionManagementService .class );
206- mgmt .removeCollection ("rpctest" );
217+ storedTestData = true ;
218+ }
207219 }
208220}
0 commit comments