瀏覽代碼

Merge pull request #1518 from ebramanti-techempower/nvm-nodejs

Koa [#1425] and Node versioning (nvm)
Brittany Mazza 10 年之前
父節點
當前提交
0951cdc250

+ 1 - 0
.travis.yml

@@ -82,6 +82,7 @@ env:
     - "TESTDIR=Java/wildfly-ee7"
     - "TESTDIR=JavaScript/express"
     - "TESTDIR=JavaScript/hapi"
+    - "TESTDIR=JavaScript/koa"
     - "TESTDIR=JavaScript/nodejs"
     - "TESTDIR=JavaScript/ringojs"
     - "TESTDIR=JavaScript/ringojs-convenient"

+ 1 - 1
frameworks/JavaScript/express/app.js

@@ -1,3 +1,3 @@
 #!/bin/bash
 
-fw_depends nodejs
+fw_depends nvm

+ 12 - 14
frameworks/JavaScript/express/setup.sh

@@ -1,20 +1,18 @@
 #!/bin/bash
-export NODE_HOME=${IROOT}/node-v0.10.8-linux-x64
-
 sed -i 's|mongodb://.*/hello_world|mongodb://'"${DBHOST}"'/hello_world|g' app.js
 sed -i 's|localhost|'"${DBHOST}"'|g' app.js
 
-export NODE_HOME=${IROOT}/node-v0.10.8-linux-x64
-export PATH=$PATH:$NODE_HOME/bin
+export NODE_ENV=production
+export NVM_HOME=${IROOT}/nvm
+# Used to avoid nvm's return 2 error.
+# Sourcing this functions if 0 is returned.
+source $NVM_HOME/nvm.sh || 0
+nvm install 0.10.8
+nvm use 0.10.8
 
-${NODE_HOME}/bin/npm install
-${NODE_HOME}/bin/node app &
+# update npm before app init
+npm install -g npm
 
-# !DO NOT REMOVE!
-#
-# It takes `node app` a few seconds to turn on and 
-# then fork. If you remove this sleep, the parent shell 
-# executing this script will be terminated before the 
-# application has time to awaken and be forked, and 
-# express will fail to be started
-sleep 5
+# run app
+npm install
+node app &

+ 1 - 1
frameworks/JavaScript/hapi/app.js

@@ -1,3 +1,3 @@
 #!/bin/bash
 
-fw_depends nodejs
+fw_depends nvm

+ 11 - 14
frameworks/JavaScript/hapi/setup.sh

@@ -1,20 +1,17 @@
 #!/bin/bash
-export NODE_HOME=${IROOT}/node-v0.10.8-linux-x64
-
 sed -i 's|localhost|'"${DBHOST}"'|g' app.js
 
 export NODE_ENV=production
-export NODE_HOME=${IROOT}/node-v0.10.8-linux-x64
-export PATH=$PATH:$NODE_HOME/bin
+export NVM_HOME=${IROOT}/nvm
+# Used to avoid nvm's return 2 error.
+# Sourcing this functions if 0 is returned.
+source $NVM_HOME/nvm.sh || 0
+nvm install 0.10.8
+nvm use 0.10.8
 
-${NODE_HOME}/bin/npm install
-${NODE_HOME}/bin/node app &
+# update npm before app init
+npm install -g npm
 
-# !DO NOT REMOVE!
-#
-# It takes `node app` a few seconds to turn on and 
-# then fork. If you remove this sleep, the parent shell 
-# executing this script will be terminated before the 
-# application has time to awaken and be forked, and 
-# express will fail to be started
-sleep 5
+# run app
+npm install
+node app &

+ 0 - 0
frameworks/JavaScript/koa/README.md


+ 128 - 0
frameworks/JavaScript/koa/app.js

@@ -0,0 +1,128 @@
+var cluster = require('cluster')
+  , numCPUs = require('os').cpus().length;
+
+// Koa Deps
+var koa = require('koa')
+  , route = require('koa-route')
+  , handlebars = require('koa-handlebars')
+  , bodyParser = require('koa-bodyparser')
+  , override = require('koa-override');
+
+// Monk MongoDB Driver Deps
+var monk = require('monk')
+  , wrap = require('co-monk')
+  , db = monk('mongodb://localhost/hello_world')
+  , worlds = wrap(db.get('world'))
+  , fortunes = wrap(db.get('fortune'));
+
+if (cluster.isMaster) {
+  // Fork workers.
+  for (var i = 0; i < numCPUs; i++) {
+    cluster.fork();
+  }
+
+  cluster.on('exit', function(worker, code, signal) {
+    console.log('worker ' + worker.process.pid + ' died');
+  });
+} else {
+  var app = module.exports = koa();
+  app.use(bodyParser());
+  app.use(override());
+  app.use(handlebars({
+    // needed, otherwise missing dir err
+    partialsDir: "views"
+  }));
+
+  // routes
+  app.use(route.get('/json', jsonHandler));
+  app.use(route.get('/db', dbHandler));
+  app.use(route.get('/queries', queriesHandler));
+  app.use(route.get('/fortunes', fortuneHandler));
+  app.use(route.get('/updates', updateHandler));
+  app.use(route.get('/plaintext', textHandler));
+
+  // Helpers
+  function getRandomNumber() {
+    return Math.floor(Math.random()*10000) + 1;
+  };
+
+  function validateParam(param) {
+    var numOfQueries = isNaN(param) ? 1 : param;
+    if (numOfQueries > 500) {
+      numOfQueries = 500;
+    } else if (numOfQueries < 1) {
+      numOfQueries = 1;
+    }
+    return numOfQueries;
+  }
+
+  // Query Helpers
+  function *worldUpdateQuery() {
+    var randomId = getRandomNumber();
+    var randomNumber = getRandomNumber();
+    var result = yield worlds.update(
+      {id: randomId}, 
+      {$set: {randomNumber: randomNumber}}
+    );
+    return {
+      id: randomId,
+      randomNumber: randomNumber
+    }
+  }
+
+  function *worldQuery() {
+    return yield worlds.findOne({id: getRandomNumber()}, '-_id');
+  }
+
+  function *fortunesQuery() {
+    return yield fortunes.find({}, '-_id');
+  }
+
+  // Route handlers
+  function *jsonHandler() {
+    this.body = {
+      message: "Hello, world!"
+    }
+  }
+
+  function *dbHandler() {
+    this.body = yield worldQuery;
+  }
+
+  function *queriesHandler() {
+    var numOfQueries = validateParam(this.query.queries);
+    var queries = [];
+    for (var i = 0; i < numOfQueries; i++) {
+      queries.push(worldQuery);
+    }
+    this.body = yield queries;
+  }
+
+  function *fortuneHandler() {
+    this.set('Server', 'Koa');
+    var fortunes = yield fortunesQuery;
+    fortunes.push({
+      id: 0,
+      message: 'Additional fortune added at request time.'
+    });
+    fortunes.sort(function(a, b) {
+      return a.message < b.message ? -1 : 1;
+    });
+    yield this.render("fortunes", {fortunes: fortunes});
+  }
+
+  function *updateHandler() {
+    var numOfUpdates = validateParam(this.query.queries);
+    var queries = [];
+    for (var i = 0; i < numOfUpdates; i++) {
+      queries.push(worldUpdateQuery);
+    }
+    this.body = yield queries;
+  }
+
+  function *textHandler() {
+    this.body = 'Hello, world!';
+  }
+
+  app.listen(8080);
+}

+ 28 - 0
frameworks/JavaScript/koa/benchmark_config.json

@@ -0,0 +1,28 @@
+{
+  "framework": "koa",
+  "tests": [{
+    "default": {
+      "setup_file": "setup",
+      "json_url": "/json",
+      "db_url": "/db",
+      "query_url": "/queries?queries=",
+      "fortune_url": "/fortunes",
+      "update_url": "/updates?queries=",
+      "plaintext_url": "/plaintext",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Micro",
+      "database": "MongoDB",
+      "framework": "koa",
+      "language": "JavaScript",
+      "orm": "Raw",
+      "platform": "nodejs",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "koa",
+      "notes": "",
+      "versus": "node"
+    }
+  }]
+}

+ 3 - 0
frameworks/JavaScript/koa/install.sh

@@ -0,0 +1,3 @@
+#!/bin/bash
+
+fw_depends nvm

+ 17 - 0
frameworks/JavaScript/koa/package.json

@@ -0,0 +1,17 @@
+{
+  "name": "koa-tfb",
+  "version": "0.0.1",
+  "description": "Koa tests for TechEmpower Framework Benchmarks.",
+  "main": "app.js",
+  "private": true,
+  "dependencies": {
+    "co-monk": "1.0.0",
+    "koa": "0.18.1",
+    "koa-bodyparser": "1.4.1",
+    "koa-handlebars": "0.5.2",
+    "koa-mongo": "0.3.0",
+    "koa-override": "1.0.0",
+    "koa-route": "2.4.0",
+    "monk": "1.0.1"
+  }
+}

+ 17 - 0
frameworks/JavaScript/koa/setup.sh

@@ -0,0 +1,17 @@
+#!/bin/bash
+
+sed -i 's|mongodb://.*/hello_world|mongodb://'"${DBHOST}"'/hello_world|g' app.js
+
+export NVM_HOME=${IROOT}/nvm
+# Used to avoid nvm's return 2 error.
+# Sourcing this functions if 0 is returned.
+source $NVM_HOME/nvm.sh || 0
+nvm install 0.11.16
+nvm use 0.11.16
+
+# update npm before app init
+npm install -g npm
+
+# run app
+npm install
+node --harmony app &

+ 0 - 0
frameworks/JavaScript/koa/source_code


+ 21 - 0
frameworks/JavaScript/koa/views/fortunes.hbs

@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<title>Fortunes</title>
+</head>
+
+<body>
+	<table>
+		<tr>
+			<th>id</th>
+			<th>message</th>
+		</tr>
+{{#fortunes}}
+		<tr>
+			<td>{{id}}</td>
+			<td>{{message}}</td>
+		</tr>
+{{/fortunes}}
+	</table>
+</body>
+</html>

+ 1 - 3
frameworks/JavaScript/nodejs/hello.js

@@ -1,5 +1,3 @@
 #!/bin/bash
 
-export NODE_HOME=${IROOT}/node-v0.10.8-linux-x64
-
-fw_depends nodejs
+fw_depends nvm

+ 11 - 15
frameworks/JavaScript/nodejs/setup.sh

@@ -1,21 +1,17 @@
 #!/bin/bash
-export NODE_HOME=${IROOT}/node-v0.10.8-linux-x64
-
 sed -i 's|localhost|'"${DBHOST}"'|g' hello.js
-sed -i 's|mongodb//.*/hello_world|mongodb//'"${DBHOST}"'/hello_world|g' hello.js
+sed -i 's|mongodb://.*/hello_world|mongodb://'"${DBHOST}"'/hello_world|g' hello.js
 
 export NODE_ENV=production
-export NODE_HOME=${IROOT}/node-v0.10.8-linux-x64
-export PATH=$PATH:$NODE_HOME/bin
+export NVM_HOME=${IROOT}/nvm
+# Used to avoid nvm's return 2 error.
+# Sourcing this functions if 0 is returned.
+source $NVM_HOME/nvm.sh || 0
+nvm install 0.10.8
+nvm use 0.10.8
 
-${NODE_HOME}/bin/npm install
-${NODE_HOME}/bin/node hello.js &
+# update npm before app init
+npm install -g npm
 
-# !DO NOT REMOVE!
-#
-# It takes `node app` a few seconds to turn on and 
-# then fork. If you remove this sleep, the parent shell 
-# executing this script will be terminated before the 
-# application has time to awaken and be forked, and 
-# express will fail to be started
-sleep 5
+npm install
+node hello.js &

+ 0 - 15
toolset/setup/linux/languages/nodejs.sh

@@ -1,15 +0,0 @@
-#!/bin/bash
-
-RETCODE=$(fw_exists ${IROOT}/node-v0.10.8.installed)
-[ ! "$RETCODE" == 0 ] || { return 0; }
-
-fw_get http://nodejs.org/dist/v0.10.8/node-v0.10.8-linux-x64.tar.gz
-fw_untar node-v0.10.8-linux-x64.tar.gz
-
-# Upgrade npm to avoid https://github.com/npm/npm/issues/4984
-export NODE_HOME=${IROOT}/node-v0.10.8-linux-x64
-export PATH=$PATH:$NODE_HOME/bin
-
-${NODE_HOME}/bin/npm install -g npm
-
-touch ${IROOT}/node-v0.10.8.installed

+ 9 - 0
toolset/setup/linux/languages/nvm.sh

@@ -0,0 +1,9 @@
+#!/bin/bash
+
+RETCODE=$(fw_exists ${IROOT}/nvm.installed)
+[ ! "$RETCODE" == 0 ] || { return 0; }
+
+fw_get https://raw.githubusercontent.com/creationix/nvm/v0.24.1/install.sh
+NVM_DIR=$IROOT/nvm bash install.sh
+
+touch ${IROOT}/nvm.installed