(#6167) - fix and improve test scripts
diff --git a/bin/dev-server.js b/bin/dev-server.js
index b6cbc07..444bc55 100755
--- a/bin/dev-server.js
+++ b/bin/dev-server.js
@@ -24,7 +24,12 @@
 if (process.env.COUCH_HOST) {
   queryParams.couchHost = process.env.COUCH_HOST;
 }
-
+if (process.env.ADAPTER) {
+  queryParams.adapter = process.env.ADAPTER;
+}
+if (process.env.ITERATIONS) {
+  queryParams.iterations = process.env.ITERATIONS;
+}
 if (process.env.NEXT) {
   queryParams.src = '../../packages/node_modules/pouchdb/dist/pouchdb-next.js';
 }
@@ -35,6 +40,7 @@
   rebuildPromise = rebuildPromise.then(buildPouchDB).then(function () {
     console.log('Rebuilt packages/node_modules/pouchdb');
   }).catch(console.error);
+  return rebuildPromise;
 }
 
 function browserifyPromise(src, dest) {
@@ -52,6 +58,7 @@
   }).then(function () {
     console.log('Rebuilt tests/integration/utils-bundle.js');
   }).catch(console.error);
+  return rebuildPromise;
 }
 
 function rebuildPerf() {
@@ -61,6 +68,7 @@
   }).then(function () {
     console.log('Rebuilt tests/performance-bundle.js');
   }).catch(console.error);
+  return rebuildPromise;
 }
 
 function watchAll() {
@@ -84,6 +92,7 @@
     rebuildPerf()
   ]);
 }).then(function () {
+  console.log('Rebuilt PouchDB/test/perf JS bundles');
   filesWritten = true;
   checkReady();
 });
diff --git a/bin/test-browser.js b/bin/test-browser.js
index c22a2e7..db093e0 100755
--- a/bin/test-browser.js
+++ b/bin/test-browser.js
@@ -77,6 +77,12 @@
 if (process.env.COUCH_HOST) {
   qs.couchHost = process.env.COUCH_HOST;
 }
+if (process.env.ADAPTER) {
+  qs.adapter = process.env.ADAPTER;
+}
+if (process.env.ITERATIONS) {
+  qs.iterations = process.env.ITERATIONS;
+}
 if (process.env.NEXT) {
   qs.NEXT = '1';
 }
@@ -125,7 +131,7 @@
 }
 
 function testComplete(result) {
-  console.log(result);
+  console.log('=>', JSON.stringify(result, null, '  '), '<=');
 
   sauceClient.quit().then(function () {
     if (sauceConnectProcess) {
@@ -204,7 +210,7 @@
           clearInterval(interval);
           testComplete(results);
         } else {
-          console.log('=> ', results);
+          console.log(results);
         }
       });
     }, 10 * 1000);
diff --git a/tests/performance/index.js b/tests/performance/index.js
index 13a1447..e19330d 100644
--- a/tests/performance/index.js
+++ b/tests/performance/index.js
@@ -3,9 +3,7 @@
 
 var opts = {};
 
-var levelAdapter;
 if (typeof process !== 'undefined' && process.env) {
-  levelAdapter = process.env.LEVEL_ADAPTER;
   if (process.env.ADAPTER) {
     opts.adapter = process.env.ADAPTER;
   }
@@ -16,13 +14,22 @@
   function runTestsNow() {
     var reporter = require('./perf.reporter');
     reporter.log('Testing PouchDB version ' + PouchDB.version +
-      ((opts.adapter || levelAdapter) ?
-        (', using adapter: ' + (opts.adapter || levelAdapter)) : '') +
+      (opts.adapter ?
+        (', using adapter: ' + opts.adapter) : '') +
       '\n\n');
 
-    require('./perf.basics')(PouchDB, opts);
-    require('./perf.views')(PouchDB, opts);
-    require('./perf.attachments')(PouchDB, opts);
+    var theAdapterUsed;
+    var count = 0;
+    function checkDone(adapterUsed) {
+      theAdapterUsed = theAdapterUsed || adapterUsed;
+      if (++count === 3) { // number of perf.xxxx.js tests
+        reporter.complete(theAdapterUsed);
+      }
+    }
+
+    require('./perf.basics')(PouchDB, opts, checkDone);
+    require('./perf.views')(PouchDB, opts, checkDone);
+    require('./perf.attachments')(PouchDB, opts, checkDone);
   }
 
   if (typeof process === 'undefined' || process.browser) {
@@ -69,6 +76,8 @@
     // fails in Node 0.11-0.12 due to sqlite3 being incompatible
     PouchDB.plugin(require('../../packages/node_modules/' +
       'pouchdb-adapter-node-websql'));
+    PouchDB.plugin(require('../../packages/node_modules/' +
+      'pouchdb-adapter-memory'));
   }
   runTestSuites(PouchDB);
 }
diff --git a/tests/performance/perf.attachments.js b/tests/performance/perf.attachments.js
index b00c229..307c607 100644
--- a/tests/performance/perf.attachments.js
+++ b/tests/performance/perf.attachments.js
@@ -28,7 +28,7 @@
   }
 }
 
-module.exports = function (PouchDB, opts) {
+module.exports = function (PouchDB, opts, callback) {
 
   require('lie');
   var utils = require('./utils');
@@ -53,6 +53,6 @@
     }
   ];
 
-  utils.runTests(PouchDB, 'views', testCases, opts);
+  utils.runTests(PouchDB, 'views', testCases, opts, callback);
 
 };
diff --git a/tests/performance/perf.basics.js b/tests/performance/perf.basics.js
index a4632c1..46bc2d6 100644
--- a/tests/performance/perf.basics.js
+++ b/tests/performance/perf.basics.js
@@ -1,6 +1,6 @@
 'use strict';
 
-module.exports = function (PouchDB, opts) {
+module.exports = function (PouchDB, opts, callback) {
 
   var Promise = require('lie');
   var utils = require('./utils');
@@ -61,10 +61,10 @@
     {
       name: 'basic-gets',
       assertions: 1,
-      iterations: 10000,
+      iterations: 1000,
       setup: function (db, callback) {
         var docs = [];
-        for (var i = 0; i < 10000; i++) {
+        for (var i = 0; i < 1000; i++) {
           docs.push({_id : commonUtils.createDocId(i),
             foo : 'bar', baz : 'quux'});
         }
@@ -223,5 +223,5 @@
     }
   ];
 
-  utils.runTests(PouchDB, 'basics', testCases, opts);
+  utils.runTests(PouchDB, 'basics', testCases, opts, callback);
 };
diff --git a/tests/performance/perf.reporter.js b/tests/performance/perf.reporter.js
index ae629a3..0c70dc8 100644
--- a/tests/performance/perf.reporter.js
+++ b/tests/performance/perf.reporter.js
@@ -4,7 +4,9 @@
 var ua = !isNode && new UAParser(navigator.userAgent);
 var marky = require('marky');
 var median = require('median');
-global.results = {};
+global.results = {
+  tests: {}
+};
 
 // fix for Firefox max timing entries capped to 150:
 // https://bugzilla.mozilla.org/show_bug.cgi?id=1331135
@@ -33,15 +35,17 @@
   var key = testCase.name;
   log('Starting test: ' + key + ' with ' + testCase.assertions +
     ' assertions and ' + iter + ' iterations... ');
-  global.results[key] = {
+  global.results.tests[key] = {
     iterations: []
   };
 };
 
 exports.end = function (testCase) {
   var key = testCase.name;
-  var obj = global.results[key];
+  var obj = global.results.tests[key];
   obj.median = median(obj.iterations);
+  obj.numIterations = obj.iterations.length;
+  delete obj.iterations; // keep it simple when reporting
   log('median: ' + obj.median + ' ms\n');
 };
 
@@ -51,13 +55,15 @@
 
 exports.endIteration = function (testCase) {
   var entry = marky.stop(testCase.name);
-  global.results[testCase.name].iterations.push(entry.duration);
+  global.results.tests[testCase.name].iterations.push(entry.duration);
 };
 
-exports.complete = function () {
+exports.complete = function (adapter) {
   global.results.completed = true;
   if (isNode) {
-    global.results.client = {node: process.version};
+    global.results.client = {
+      node: process.version
+    };
   } else {
     global.results.client = {
       browser: ua.getBrowser(),
@@ -68,7 +74,8 @@
       userAgent: navigator.userAgent
     };
   }
-  console.log(global.results);
+  global.results.adapter = adapter;
+  console.log('=>', JSON.stringify(global.results, null, '  '), '<=');
   log('\nTests Complete!\n\n');
 };
 
diff --git a/tests/performance/perf.views.js b/tests/performance/perf.views.js
index 206a710..82c9251 100644
--- a/tests/performance/perf.views.js
+++ b/tests/performance/perf.views.js
@@ -1,6 +1,6 @@
 'use strict';
 
-module.exports = function (PouchDB, opts) {
+module.exports = function (PouchDB, opts, callback) {
 
   var Promise = require('lie');
   var utils = require('./utils');
@@ -173,6 +173,6 @@
     }
   ];
 
-  utils.runTests(PouchDB, 'views', testCases, opts);
+  utils.runTests(PouchDB, 'views', testCases, opts, callback);
 
 };
diff --git a/tests/performance/utils.js b/tests/performance/utils.js
index 481777c..d6665d5 100644
--- a/tests/performance/utils.js
+++ b/tests/performance/utils.js
@@ -19,24 +19,28 @@
   iterations = process.env.ITERATIONS && parseInt(process.env.ITERATIONS, 10);
 }
 
-var levelAdapter = typeof process !== 'undefined' && process.env &&
-    process.env.LEVEL_ADAPTER;
+var adapterUsed;
 
-exports.runTests = function (PouchDB, suiteName, testCases, opts) {
-  testCases.forEach(function (testCase, i) {
-    var testName = testCase.name;
+exports.runTests = function (PouchDB, suiteName, testCases, opts, callback) {
+
+  testCases = testCases.filter(function (testCase) {
     if (grep && suiteName.indexOf(grep) === -1 &&
-        testName.indexOf(grep) === -1) {
-      return;
+      testCase.name.indexOf(grep) === -1) {
+      return false;
     }
-
     var iter = typeof iterations === 'number' ? iterations :
       testCase.iterations;
+    return iter !== 0;
+  });
 
-    if (iter === 0) {
-      return;
-    }
+  if (!testCases.length) {
+    return callback();
+  }
 
+  testCases.forEach(function (testCase, i) {
+    var testName = testCase.name;
+    var iter = typeof iterations === 'number' ? iterations :
+      testCase.iterations;
     test('benchmarking', function (t) {
       var db;
       var setupObj;
@@ -45,10 +49,8 @@
 
       t.test('setup', function (t) {
         opts.size = 3000;
-        if (levelAdapter) {
-          opts.db = require(levelAdapter);
-        }
         db = new PouchDB(localDbName, opts);
+        adapterUsed = db.adapter;
         testCase.setup(db, function (err, res) {
           if (err) {
             t.error(err);
@@ -95,14 +97,11 @@
         testCaseTeardown.then(function () {
           reporter.end(testCase);
           var opts = {adapter : db.adapter};
-          if (levelAdapter) {
-            opts.db = require(levelAdapter);
-          }
           return new PouchDB(localDbName, opts).destroy();
         }).then(function () {
           t.end();
           if (i === testCases.length - 1) {
-            reporter.complete(suiteName);
+            callback(adapterUsed);
           }
         });
       });