/* * routing-table-test.js: Tests for the proxying using the ProxyTable object. * * (C) 2010, Charlie Robbins * */ var assert = require('assert'), fs = require('fs'), path = require('path'), async = require('async'), request = require('request'), vows = require('vows'), macros = require('../macros'), helpers = require('../helpers'); var routeFile = path.join(__dirname, 'config.json'); vows.describe(helpers.describe('routing-table')).addBatch({ "With a routing table": { "with latency": macros.http.assertProxiedToRoutes({ latency: 2000, routes: { "icanhaz.com": "127.0.0.1:{PORT}", "latency.com": "127.0.0.1:{PORT}" } }), "addHost() / removeHost()": macros.http.assertDynamicProxy({ hostnameOnly: true, routes: { "static.com": "127.0.0.1:{PORT}", "removed.com": "127.0.0.1:{PORT}" } }, { add: [{ host: 'dynamic1.com', target: '127.0.0.1:' }], drop: ['removed.com'] }), "using RegExp": macros.http.assertProxiedToRoutes({ routes: { "foo.com": "127.0.0.1:{PORT}", "bar.com": "127.0.0.1:{PORT}", "baz.com/taco": "127.0.0.1:{PORT}", "pizza.com/taco/muffins": "127.0.0.1:{PORT}", "blah.com/me": "127.0.0.1:{PORT}/remapped", "bleh.com/remap/this": "127.0.0.1:{PORT}/remap/remapped", "test.com/double/tap": "127.0.0.1:{PORT}/remap" } }), "using hostnameOnly": macros.http.assertProxiedToRoutes({ hostnameOnly: true, routes: { "foo.com": "127.0.0.1:{PORT}", "bar.com": "127.0.0.1:{PORT}" } }), "using pathnameOnly": macros.http.assertProxiedToRoutes({ pathnameOnly: true, routes: { "/foo": "127.0.0.1:{PORT}", "/bar": "127.0.0.1:{PORT}", "/pizza": "127.0.0.1:{PORT}" } }), "using a routing file": macros.http.assertProxiedToRoutes({ filename: routeFile, routes: { "foo.com": "127.0.0.1:{PORT}", "bar.com": "127.0.0.1:{PORT}" } }, { "after the file has been modified": { topic: function () { var config = JSON.parse(fs.readFileSync(routeFile, 'utf8')), protocol = helpers.protocols.proxy, port = helpers.nextPort, that = this; config.router['dynamic.com'] = "127.0.0.1:" + port; fs.writeFileSync(routeFile, JSON.stringify(config)); async.parallel([ function waitForRoutes(next) { that.proxyServer.on('routes', next); }, async.apply( helpers.http.createServer, { port: port, output: 'hello from dynamic.com' } ) ], function () { request({ uri: protocol + '://127.0.0.1:' + that.port, headers: { host: 'dynamic.com' } }, that.callback); }); }, "should receive 'hello from dynamic.com'": function (err, res, body) { assert.equal(body, 'hello from dynamic.com'); } } }) } }).export(module);