[Groonga-commit] groonga/gcs [master] Split implementation of runner module and command line runner completely

Back to archive index

YUKI Hiroshi null+****@clear*****
Mon Nov 12 18:29:23 JST 2012


YUKI Hiroshi	2012-11-12 18:29:23 +0900 (Mon, 12 Nov 2012)

  New Revision: 8a4b7b82885040454a31cdf7601b939d6dd85b7a
  https://github.com/groonga/gcs/commit/8a4b7b82885040454a31cdf7601b939d6dd85b7a

  Log:
    Split implementation of runner module and command line runner completely

  Modified files:
    tools/run-scenarios
    tools/scenario-runner.js

  Modified: tools/run-scenarios (+26 -4)
===================================================================
--- tools/run-scenarios    2012-11-12 18:01:00 +0900 (5681c55)
+++ tools/run-scenarios    2012-11-12 18:29:23 +0900 (46a9f40)
@@ -11,6 +11,7 @@ var Client = require(__dirname + '/../lib/client').Client;
 var Runner = require(__dirname + '/scenario-runner').Runner;
 var fs = require('fs');
 var path = require('path');
+var mkdirp = require('mkdirp');
 
 var commandLine = new CLI();
 commandLine
@@ -68,6 +69,22 @@ if (commandLine.options.scenario) {
                          '"--scenarios" option.');
 }
 
+scenarios = scenarios.forEach(function(file) {
+  var scenarioName = path.basename(file, '.json');
+  var scenario = { name: scenarioName,
+                   path: file };
+
+  var requests = fs.readFileSync(file);
+  scenario.requests = JSON.parse(scenario);
+
+  if (commandLine.options.outputDirectory) {
+    scenario.resultsDir = path.resolve(commandLine.options.outputDirectory,
+                                       scenarioName);
+  }
+
+  return scenario;
+});
+
 var options = {};
 Object.keys(commandLine.options).forEach(function(key) {
   var type = typeof commandLine.options[key];
@@ -84,7 +101,8 @@ var runner = new Runner(options, function(error, event) {
       switch (event.type) {
         case 'scenario:start':
           console.log('');
-          console.log('Scenario file: ' + event.path);
+          console.log('Scenario file: ' + event.scenario.path);
+          mkdirp.sync(event.scenario.resultsDir);
           break;
 
         case 'scenario:finish':
@@ -92,11 +110,14 @@ var runner = new Runner(options, function(error, event) {
           break;
 
         case 'request:start':
-          console.log('  Processing request: ' + event.name);
+          console.log('  Processing request: ' + event.request.name);
           break;
 
-        case 'request:write':
-          console.log('  Wrote ' + event.path);
+        case 'request:finish':
+          var filename = Runner.toSafeName(event.request.name) + '.txt';
+          var resultPath = path.resolve(event.scenario.resultsDir, filename);
+          fs.writeFile(resultPath, request.result);
+          console.log('  Wrote ' + resultPath);
           break;
 
         case 'all:finish':
@@ -111,4 +132,5 @@ var runner = new Runner(options, function(error, event) {
           break;
       }
     });
+
 runner.run(scenarios);

  Modified: tools/scenario-runner.js (+45 -43)
===================================================================
--- tools/scenario-runner.js    2012-11-12 18:01:00 +0900 (5d67598)
+++ tools/scenario-runner.js    2012-11-12 18:29:23 +0900 (ebda6e8)
@@ -1,7 +1,6 @@
 var Client = require(__dirname + '/../lib/client').Client;
 var fs = require('fs');
 var path = require('path');
-var mkdirp = require('mkdirp');
 
 var statusCodeTable = {
   500: 'Inetnal Server Error',
@@ -20,65 +19,60 @@ function Runner(options, callback) {
 }
 Runner.prototype = {
   run: function(scenarios) {
-    this.processScenarios({ scenarios: scenarios });
+    if (!Array.isArray(scenarios))
+      scenarios = [scenarios];
+    this._processScenario({ scenarios: scenarios });
   },
 
-  processScenarios: function(params) {
+  _processScenario: function(params) {
     if (!params.start) params.start = Date.now();
-    var scenarioFile = params.scenarios.shift();
+    var scenario = params.scenarios.shift();
 
-    this.callback(null, { type: 'scenario:start', path: scenarioFile });
-
-    var scenario = fs.readFileSync(scenarioFile);
-    scenario = JSON.parse(scenario);
-
-    var scenarioName = path.basename(scenarioFile, '.json');
-    var resultsDir;
-    if (this.options.outputDirectory) {
-      resultsDir = path.resolve(this.options.outputDirectory,
-                                scenarioName);
-      mkdirp.sync(resultsDir);
-    }
+    if (this.callback)
+      this.callback(null, { type: 'scenario:start',
+                            scenario: scenario });
 
     var self = this;
-    this.processScenario(
-      { name:       scenarioName,
-        requests:   scenario,
-        resultsDir: resultsDir },
+    this._processScenario(
+      scenario,
       function(error) {
         if (params.scenarios.length) {
-          self.processScenarios(params);
+          self._processScenario(params);
         } else {
           var elapsedTime = Date.now() - params.start;
-          self.callback(null, { type: 'all:finish', elapsedTime: elapsedTime });
+          if (self.callback)
+            self.callback(null, { type: 'all:finish',
+                                  elapsedTime: elapsedTime });
         }
       }
     );
   },
 
-  scenarioNameToFileName: function(scenarioName) {
+  toFileName: function(scenarioName) {
     return scenarioName
              .replace(/[^a-zA-Z0-9]+/g, '-')
              .replace(/-$/, '') + '.txt';
   },
 
-  processScenario: function(params, callback) {
-    if (!params.start) params.start = Date.now();
-    if (!params.processed) params.processed = {};
+  _processScenario: function(scenario, callback) {
+    if (!scenario.start) scenario.start = Date.now();
+    if (!scenario.processed) scenario.processed = {};
 
-    var request = params.requests.shift();
+    var request = scenario.requests.shift();
     var results = {};
 
     var self = this;
     function processNext() {
-      if (params.requests.length) {
-        self.processScenario(params, callback);
+      if (scenario.requests.length) {
+        self.processScenario(scenario, callback);
       } else {
-        var elapsedTime = Date.now() - params.start;
-        self.callback(null, { type: 'scenario:finish',
-                              elapsedTime: elapsedTime,
-                              results: results });
-        callback(null);
+        scenario.results = results;
+        var elapsedTime = Date.now() - scenario.start;
+        if (self.callback)
+          self.callback(null, { type: 'scenario:finish',
+                                elapsedTime: elapsedTime,
+                                scenario: scenario });
+        callback(null, results);
       }
     }
 
@@ -87,19 +81,22 @@ Runner.prototype = {
 
     var name = request.name;
     var count = 1;
-    while (name in params.processed) {
+    while (name in scenario.processed) {
       name = request.name + count++;
     }
 
-    this.callback(null, { type: 'request:start', name: name });
+    if (this.callback)
+      this.callback(null, { type: 'request:start',
+                            scenario: scenario,
+                            request: request });
 
-    var filename = this.scenarioNameToFileName(name);
     this.client.rawConfigurationRequest(request.params.Action, request.params, function(error, result) {
       var response = error || result;
 
       var statusCode = response.StatusCode;
       if (!statusCodeTable[statusCode]) {
-        self.callback(null, { type: 'error', statusCode: statusCode });
+        if (self.callback)
+          self.callback(null, { type: 'error', statusCode: statusCode });
         return;
       }
 
@@ -112,14 +109,19 @@ Runner.prototype = {
       output += response.Body.toString();
 
       results[name] = output;
-      if (params.resultsDir) {
-        var resultPath = path.resolve(params.resultsDir, filename);
-        fs.writeFile(resultPath, output);
-        self.callback(null, { type: 'request:write', path: resultPath });
-      }
+      request.result = output;
+      if (self.callback)
+        self.callback(null, { type: 'request:finish',
+                              scenario: scenario,
+                              request: request });
 
       processNext();
     });
   }
 };
+Runner.toSafeName = function(name) {
+  return name
+           .replace(/[^a-zA-Z0-9]+/g, '-')
+           .replace(/-$/, '');
+};
 exports.Runner = Runner;
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index