[Mulgara-svn] r1851 - in projects/SparqlTester/trunk: dist src/org/duraspace/sparql/test

pag at mulgara.org pag at mulgara.org
Thu Nov 19 19:57:03 UTC 2009


Author: pag
Date: 2009-11-19 11:57:01 -0800 (Thu, 19 Nov 2009)
New Revision: 1851

Modified:
   projects/SparqlTester/trunk/dist/sparqltest.jar
   projects/SparqlTester/trunk/src/org/duraspace/sparql/test/DirProcessor.scala
   projects/SparqlTester/trunk/src/org/duraspace/sparql/test/ManifestExecutor.scala
   projects/SparqlTester/trunk/src/org/duraspace/sparql/test/ManifestFinder.scala
   projects/SparqlTester/trunk/src/org/duraspace/sparql/test/NegativeSyntaxTest.scala
   projects/SparqlTester/trunk/src/org/duraspace/sparql/test/PositiveSyntaxTest.scala
   projects/SparqlTester/trunk/src/org/duraspace/sparql/test/QueryEvalTest.scala
   projects/SparqlTester/trunk/src/org/duraspace/sparql/test/TestHarness.scala
   projects/SparqlTester/trunk/src/org/duraspace/sparql/test/TestInstance.scala
Log:
Better reporting of results, and now using a better connection manager that doesn't hang after the first few connections

Modified: projects/SparqlTester/trunk/dist/sparqltest.jar
===================================================================
(Binary files differ)

Modified: projects/SparqlTester/trunk/src/org/duraspace/sparql/test/DirProcessor.scala
===================================================================
--- projects/SparqlTester/trunk/src/org/duraspace/sparql/test/DirProcessor.scala	2009-11-19 12:08:01 UTC (rev 1850)
+++ projects/SparqlTester/trunk/src/org/duraspace/sparql/test/DirProcessor.scala	2009-11-19 19:57:01 UTC (rev 1851)
@@ -19,6 +19,8 @@
 import java.io.File
 import java.io.FileFilter
 
+import scala.collection.mutable.ListBuffer
+
 /**
  * An object for applying an action to files in a directory, recursing down
  * the directories.
@@ -38,13 +40,16 @@
    * Apply a function to all files that this processor represents.
    * @param fn The function to the apply to each file
    */
-  def apply(fn: (File) => Unit) {
+  def apply[T](fn: (File) => T): Seq[T] = {
     // process the files in the current directory
     val files = dir.listFiles(new FileFilter { def accept(path: File) = filter(path) })
-    for (f <- files) fn(f)
+    // use a mutable list buffer because we are iterating over Java arrays
+    val results = new ListBuffer[T]
+    for (f <- files) results += fn(f)
 
     // process each of the subdirectories
     val dirs = dir.listFiles(new FileFilter { def accept(path: File) = path.isDirectory })
-    for (d <- dirs) new DirProcessor(d, filter).apply(fn)
+    for (d <- dirs) results ++ new DirProcessor(d, filter).apply(fn)
+    results
   }
 }

Modified: projects/SparqlTester/trunk/src/org/duraspace/sparql/test/ManifestExecutor.scala
===================================================================
--- projects/SparqlTester/trunk/src/org/duraspace/sparql/test/ManifestExecutor.scala	2009-11-19 12:08:01 UTC (rev 1850)
+++ projects/SparqlTester/trunk/src/org/duraspace/sparql/test/ManifestExecutor.scala	2009-11-19 19:57:01 UTC (rev 1851)
@@ -22,8 +22,15 @@
 
   def this(s: String) = this(new URI(s))
 
-  def execute(m: Manifest) {
+  /**
+   * Run all the tests in a manifest.
+   * @return tuple (Number passed, Number run)
+   */
+  def execute(m: Manifest): (Int, Int) = {
     System.out.println("Executing manifest: " + m.file)
-    for (t <- m.tests) t.run(endpoint)
+    val testList = m.tests
+    val passed = testList.foldLeft(0)((s, test) => s + (if (test.run(endpoint)) 1 else 0))
+    println("Manifest: " + m.file + ", passed " + passed + "/" + testList.size)
+    (passed, testList.size)
   }
 }

Modified: projects/SparqlTester/trunk/src/org/duraspace/sparql/test/ManifestFinder.scala
===================================================================
--- projects/SparqlTester/trunk/src/org/duraspace/sparql/test/ManifestFinder.scala	2009-11-19 12:08:01 UTC (rev 1850)
+++ projects/SparqlTester/trunk/src/org/duraspace/sparql/test/ManifestFinder.scala	2009-11-19 19:57:01 UTC (rev 1851)
@@ -22,14 +22,13 @@
  * This object contains methods to find manifests in a directory tree and run a function on them.
  */
 object ManifestFinder {
-  def run(dir: File, fn: (Manifest) => Unit) {
-    val directory = new DirProcessor(dir, f => f.getName.toLowerCase == "manifest.ttl")
-    directory.apply(f => {
-      val m = new Manifest(f)
-      fn(m)
-    })
+  val ManifestFileName = "manifest.ttl"
+
+  def run(dir: File, fn: (Manifest) => (Int, Int)): Seq[(Int, Int)] = {
+    val directory = new DirProcessor(dir, _.getName.toLowerCase == ManifestFileName)
+    directory.apply(f => fn(new Manifest(f)))
   }
 
-  def run(file: String, fn: (Manifest) => Unit) { run(new File(file), fn) }
+  def run(file: String, fn: (Manifest) => (Int, Int)): Seq[(Int, Int)] = run(new File(file), fn)
 
 }
\ No newline at end of file

Modified: projects/SparqlTester/trunk/src/org/duraspace/sparql/test/NegativeSyntaxTest.scala
===================================================================
--- projects/SparqlTester/trunk/src/org/duraspace/sparql/test/NegativeSyntaxTest.scala	2009-11-19 12:08:01 UTC (rev 1850)
+++ projects/SparqlTester/trunk/src/org/duraspace/sparql/test/NegativeSyntaxTest.scala	2009-11-19 19:57:01 UTC (rev 1851)
@@ -23,11 +23,13 @@
 
 class NegativeSyntaxTest (name: String, queryFile: File, approved: Boolean) extends TestInstance(name, queryFile, approved) {
 
+  private val MinError = 400
+
   override def toString = "NegativeSyntaxTest: \"" + name + "\", file=" + queryFile + ", approved=" + approved
 
   def getURL(endpoint: URI) = endpoint.toString + "?query=" + query
   
   // return true if an error code in the response
-  def handleResponse(response: HttpResponse) = response.getStatusLine.getStatusCode >= 400
+  def handleResponse(response: HttpResponse) = response.getStatusLine.getStatusCode >= MinError
 
 }

Modified: projects/SparqlTester/trunk/src/org/duraspace/sparql/test/PositiveSyntaxTest.scala
===================================================================
--- projects/SparqlTester/trunk/src/org/duraspace/sparql/test/PositiveSyntaxTest.scala	2009-11-19 12:08:01 UTC (rev 1850)
+++ projects/SparqlTester/trunk/src/org/duraspace/sparql/test/PositiveSyntaxTest.scala	2009-11-19 19:57:01 UTC (rev 1851)
@@ -29,6 +29,9 @@
  */
 class PositiveSyntaxTest (name: String, queryFile: File, approved: Boolean) extends TestInstance(name, queryFile, approved) {
 
+  private val MinGood = 200
+  private val MaxGood = 300
+
   override def toString = "PositiveSyntaxTest: \"" + name + "\", file=" + queryFile + ", approved=" + approved
 
   def getURL(endpoint: URI) = endpoint.toString + "?query=" + query
@@ -36,6 +39,6 @@
   // return true if not an error code on the stream
   def handleResponse(response: HttpResponse) = {
     val code = response.getStatusLine.getStatusCode
-    code >= 200 && code < 300
+    code >= MinGood && code < MaxGood
   }
 }

Modified: projects/SparqlTester/trunk/src/org/duraspace/sparql/test/QueryEvalTest.scala
===================================================================
--- projects/SparqlTester/trunk/src/org/duraspace/sparql/test/QueryEvalTest.scala	2009-11-19 12:08:01 UTC (rev 1850)
+++ projects/SparqlTester/trunk/src/org/duraspace/sparql/test/QueryEvalTest.scala	2009-11-19 19:57:01 UTC (rev 1851)
@@ -27,6 +27,9 @@
 class QueryEvalTest(name: String, queryFile: File, val dataFile: File, val resultFile: File, approved: Boolean)
       extends TestInstance(name, queryFile, approved) {
 
+  private val MinGood = 200
+  private val MaxGood = 300
+
   override def toString = "QueryEvalTest: \"" + name + "\", file=" + queryFile + ", approved=" + approved +
                           ", [data=" + dataFileName + ", results=" + resultFile + "]"
 
@@ -41,7 +44,7 @@
   // return true if not an error code on the stream
   def handleResponse(response: HttpResponse) = {
     val code = response.getStatusLine.getStatusCode
-    (code >= 200 && code < 300) && expectedData(response.getEntity.getContent)
+    (code >= MinGood && code < MaxGood) && expectedData(response.getEntity.getContent)
   }
 
   // compare the resulting stream to the data in the expected results file
@@ -50,4 +53,5 @@
     val expectedResults = new SparqlResult(XML.loadFile(resultFile))
     results == expectedResults
   }
+
 }

Modified: projects/SparqlTester/trunk/src/org/duraspace/sparql/test/TestHarness.scala
===================================================================
--- projects/SparqlTester/trunk/src/org/duraspace/sparql/test/TestHarness.scala	2009-11-19 12:08:01 UTC (rev 1850)
+++ projects/SparqlTester/trunk/src/org/duraspace/sparql/test/TestHarness.scala	2009-11-19 19:57:01 UTC (rev 1851)
@@ -21,7 +21,7 @@
 import org.duraspace.rdf.parser.ParseException
 
 object TestHarness {
-  val endpoint = "http://localhost:8080/sparql/"
+  val DefaultEndpoint = "http://localhost:8080/sparql/"
 
   def main(args : Array[String]) : Unit = {
     if (args.size == 0) {
@@ -29,9 +29,15 @@
       return
     }
 
+    val endpoint = if (args.size == 2) args(1) else DefaultEndpoint
+
     val executor = new ManifestExecutor(endpoint)
     try {
-      ManifestFinder.run(args(0), executor.execute(_))
+      val resultList = ManifestFinder.run(args(0), executor.execute(_))
+      val result = resultList.foldLeft((0, 0)) {
+        (acc, tuple) => (acc._1 + tuple._1, acc._2 + tuple._2)
+      }
+      println("Total: " + result._1 + "/" + result._2)
     } catch {
       case e: ParseException => System.err.println("Error reading file")
                                 e.printStackTrace()

Modified: projects/SparqlTester/trunk/src/org/duraspace/sparql/test/TestInstance.scala
===================================================================
--- projects/SparqlTester/trunk/src/org/duraspace/sparql/test/TestInstance.scala	2009-11-19 12:08:01 UTC (rev 1850)
+++ projects/SparqlTester/trunk/src/org/duraspace/sparql/test/TestInstance.scala	2009-11-19 19:57:01 UTC (rev 1851)
@@ -17,6 +17,7 @@
 package org.duraspace.sparql.test
 
 import java.io.BufferedReader
+import java.io.InputStream
 import java.io.InputStreamReader
 import java.io.IOException
 import java.io.File
@@ -25,12 +26,24 @@
 import java.net.URI
 import java.net.URLEncoder
 
+import org.apache.http.HttpHost
 import org.apache.http.HttpResponse
+import org.apache.http.conn.ClientConnectionManager
+import org.apache.http.conn.params.ConnManagerParams
+import org.apache.http.conn.params.ConnPerRouteBean
+import org.apache.http.conn.routing.HttpRoute
+import org.apache.http.conn.scheme.PlainSocketFactory
+import org.apache.http.conn.scheme.Scheme
+import org.apache.http.conn.scheme.SchemeRegistry
+import org.apache.http.conn.ssl.SSLSocketFactory
 import org.apache.http.client.ClientProtocolException
-import org.apache.http.impl.client.DefaultHttpClient
 import org.apache.http.client.methods.HttpGet
 import org.apache.http.client.methods.HttpUriRequest
+import org.apache.http.params.BasicHttpParams
 import org.apache.http.params.CoreProtocolPNames
+import org.apache.http.params.CoreConnectionPNames
+import org.apache.http.impl.client.DefaultHttpClient
+import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager
 
 import TestInstance._
 
@@ -38,21 +51,29 @@
 
   def run(endpoint: URI): Boolean = {
     print(name + ": ")
-    val client = new DefaultHttpClient()
+    val client = getHttpClient
     val url = getURL(endpoint)
     // println("Accessing: " + url)
     val get = new HttpGet(url)
 
-    client.getParams.setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false)
 
     try {
-      val result = handleResponse(client.execute(get))
+      val resp = client.execute(get)
+      val result = handleResponse(resp)
+      val entity = resp.getEntity
+      if (entity != null) entity.consumeContent
       if (result) println("PASSED") else println("FAILED")
       result
     } catch {
-      case e: ClientProtocolException => throw new Exception("Error in protocol: " + e.getMessage())
-      case e: IOException => throw new Exception("Error executing GET: " + e.getMessage())
-      case t: Throwable => throw new Exception("Unexpected exception", t)
+      case e: ClientProtocolException => throw new Exception("Error in protocol: " + e.getMessage, e)
+      case e: IOException => {
+        println("\nError executing GET: " + e.getMessage)
+        false
+      }
+      case t: Throwable => {
+        println("\nError in response: " + t.getMessage)
+        false
+      }
     }
   }
 
@@ -64,20 +85,56 @@
   
 }
 
+
 object TestInstance {
   val UTF8 = "UTF-8"
   private val BufferSize = 1024
 
-  def readFile(file: File): String = {
+  def readFile(file: File) = read(new FileReader(file))
+
+  def readStream(content: InputStream) = try {
+    read(new InputStreamReader(content))
+  } finally {
+    content.close
+  }
+
+  def read(r: Reader) = {
     val buffer = new Array[Char](BufferSize)
     val result = new StringBuilder
-    val reader = new FileReader(file)
 
-    var length = reader.read(buffer)
+    var length = r.read(buffer)
     while (length >= 0) {
       result.append(buffer, 0, length)
-      length = reader.read(buffer)
+      length = r.read(buffer)
     }
     result.toString
   }
+
+  def getHttpClient = {
+    val params = new BasicHttpParams
+    params.setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false)
+    params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 5000)
+    new DefaultHttpClient(getConnectionManager, params)
+  }
+
+  var cm: ClientConnectionManager = null
+  
+  def getConnectionManager = {
+    if (cm == null) {
+      val params = new BasicHttpParams()
+      ConnManagerParams.setMaxTotalConnections(params, 200)
+      val connPerRoute = new ConnPerRouteBean(20)
+      val localhost = new HttpHost("locahost", 80)
+      connPerRoute.setMaxForRoute(new HttpRoute(localhost), 50)
+      ConnManagerParams.setMaxConnectionsPerRoute(params, connPerRoute)
+      val schemeRegistry = new SchemeRegistry()
+      schemeRegistry.register(
+          new Scheme("http", PlainSocketFactory.getSocketFactory(), 80))
+      schemeRegistry.register(
+          new Scheme("https", SSLSocketFactory.getSocketFactory(), 443))
+  
+      cm = new ThreadSafeClientConnManager(params, schemeRegistry)
+    }
+    cm
+  }
 }
\ No newline at end of file




More information about the Mulgara-svn mailing list