Refactor integration tests and add WebDriver mode
This commit is contained in:
parent
e185e15558
commit
cd7c899f3c
|
@ -12,3 +12,5 @@ logs
|
||||||
results
|
results
|
||||||
|
|
||||||
npm-debug.log
|
npm-debug.log
|
||||||
|
node_modules
|
||||||
|
activemq-data
|
||||||
|
|
|
@ -27,6 +27,9 @@
|
||||||
console.log("connected");
|
console.log("connected");
|
||||||
socket.emit("subscribe", push_id);
|
socket.emit("subscribe", push_id);
|
||||||
console.log("subscribed to push_id:", push_id);
|
console.log("subscribed to push_id:", push_id);
|
||||||
|
|
||||||
|
// Used in integration tests:
|
||||||
|
window.messages = [];
|
||||||
});
|
});
|
||||||
socket.on("disconnect", function () {
|
socket.on("disconnect", function () {
|
||||||
console.log("disconnected");
|
console.log("disconnected");
|
||||||
|
@ -35,6 +38,7 @@
|
||||||
console.log("error", error);
|
console.log("error", error);
|
||||||
});
|
});
|
||||||
socket.on("message", function (data) {
|
socket.on("message", function (data) {
|
||||||
|
messages.push(data)
|
||||||
console.log("message:", JSON.stringify(data, null, 2));
|
console.log("message:", JSON.stringify(data, null, 2));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -67,7 +71,7 @@
|
||||||
console._log = console.log;
|
console._log = console.log;
|
||||||
console.log = function() {
|
console.log = function() {
|
||||||
console._log.apply(console, arguments);
|
console._log.apply(console, arguments);
|
||||||
document.getElementById("log").innerText += new Date() + ": " + Array.prototype.join.call(arguments, " ") + "\n";
|
document.getElementById("log").textContent += new Date() + ": " + Array.prototype.join.call(arguments, " ") + "\n";
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,9 @@
|
||||||
"chai-as-promised": "~3.3.1",
|
"chai-as-promised": "~3.3.1",
|
||||||
"q": "~0.9.6",
|
"q": "~0.9.6",
|
||||||
"socket.io-client": "~0.9.16",
|
"socket.io-client": "~0.9.16",
|
||||||
"node-uuid": "~1.4.0"
|
"node-uuid": "~1.4.0",
|
||||||
|
"q-step": "0.0.1",
|
||||||
|
"wd": "0.0.33",
|
||||||
|
"q-proxy": "0.0.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,122 +0,0 @@
|
||||||
|
|
||||||
require("mocha-as-promised")()
|
|
||||||
chai = require "chai"
|
|
||||||
chai.use require "chai-as-promised"
|
|
||||||
{ expect } = chai
|
|
||||||
|
|
||||||
Q = require "q"
|
|
||||||
io = require "socket.io-client"
|
|
||||||
merge = require "deepmerge"
|
|
||||||
uuid = require "node-uuid"
|
|
||||||
|
|
||||||
activepush = require "../index"
|
|
||||||
{ ActivePush } = activepush
|
|
||||||
|
|
||||||
# Delay before checking received messages to ensure all messages get delivered.
|
|
||||||
# Increase this value if tests are failiing non-deterministically.
|
|
||||||
# TODO: better way to detect all messages have been delivered?
|
|
||||||
WAIT_TIME = 200
|
|
||||||
|
|
||||||
config = activepush.config.loadConfiguration "test"
|
|
||||||
# config.logging.level = "DEBUG"
|
|
||||||
|
|
||||||
configureActivePush = (config) ->
|
|
||||||
activepush = new ActivePush(config)
|
|
||||||
activepush.start()
|
|
||||||
|
|
||||||
configureSocketIO = (port, push_id, options = {}) ->
|
|
||||||
deferred = Q.defer()
|
|
||||||
socket = io.connect "http://localhost:#{port}", merge(options, "force new connection": true)
|
|
||||||
# For some reason socket.io-client doesn't respect the "transports" option so we have to set it manually
|
|
||||||
socket.socket.options.transports = options.transports if options.transports?
|
|
||||||
socket.on "connect", ->
|
|
||||||
socket.emit "subscribe", push_id
|
|
||||||
deferred.resolve collectMessages(socket)
|
|
||||||
deferred.promise
|
|
||||||
|
|
||||||
uniqueInbox = ->
|
|
||||||
"/topic/activepush-test-"+uuid.v1()
|
|
||||||
|
|
||||||
# Use unique messages to ensure we don't messages from other tests, etc.
|
|
||||||
uniqueMessage = (prefix="") ->
|
|
||||||
prefix+(if prefix then "-" else "")+uuid.v1()
|
|
||||||
|
|
||||||
# Helper to collect messages into an array
|
|
||||||
collectMessages = (socket) ->
|
|
||||||
messages = []
|
|
||||||
socket.on "message", (message) ->
|
|
||||||
messages.push message
|
|
||||||
messages
|
|
||||||
|
|
||||||
describe "Single ActivePush instance", ->
|
|
||||||
ap = null
|
|
||||||
before ->
|
|
||||||
# Use a unique inbox in case we're running multiple tests using the same ActiveMQ server concurrently etc
|
|
||||||
inbox = uniqueInbox()
|
|
||||||
configureActivePush(merge(config, stomp:inbox:inbox)).then (activePush) ->
|
|
||||||
ap = activePush
|
|
||||||
after ->
|
|
||||||
ap.stop()
|
|
||||||
|
|
||||||
it "should not buffer messages (treat as transient)", ->
|
|
||||||
expected = uniqueMessage("NO")
|
|
||||||
ap.producer.publish "my_push_id", expected
|
|
||||||
configureSocketIO(ap.config.http.port, "my_push_id").then (receivedMessages) ->
|
|
||||||
Q.delay(WAIT_TIME).then ->
|
|
||||||
expect(receivedMessages).to.deep.equal []
|
|
||||||
|
|
||||||
it "should relay the correct messages to a single client", ->
|
|
||||||
expected = uniqueMessage("YES")
|
|
||||||
configureSocketIO(ap.config.http.port, "my_push_id").then (receivedMessages) ->
|
|
||||||
ap.producer.publish "my_push_id", expected
|
|
||||||
ap.producer.publish "other_push_id", uniqueMessage("NO")
|
|
||||||
Q.delay(WAIT_TIME).then ->
|
|
||||||
expect(receivedMessages).to.deep.equal [expected]
|
|
||||||
|
|
||||||
it "should relay the correct messages to multiple clients", (done) ->
|
|
||||||
expected = uniqueMessage("YES")
|
|
||||||
Q.all(for index in [0..1]
|
|
||||||
configureSocketIO(ap.config.http.port, "my_push_id")
|
|
||||||
).then (allReceivedMessages) ->
|
|
||||||
ap.producer.publish "my_push_id", expected
|
|
||||||
ap.producer.publish "other_push_id", uniqueMessage("NO")
|
|
||||||
Q.delay(WAIT_TIME).then ->
|
|
||||||
expect(allReceivedMessages).to.deep.equal [[expected], [expected]]
|
|
||||||
|
|
||||||
it "should relay multiple messages when using XHR transport", ->
|
|
||||||
expected = uniqueMessage("YES")
|
|
||||||
# FIXME: figure out how to get rid of this delay
|
|
||||||
configureSocketIO(ap.config.http.port, "my_push_id", transports: ["xhr-polling"], 'try multiple transports': false).delay(1000).then (receivedMessages) ->
|
|
||||||
ap.producer.publish "my_push_id", expected
|
|
||||||
ap.producer.publish "my_push_id", expected
|
|
||||||
Q.delay(WAIT_TIME).then ->
|
|
||||||
expect(receivedMessages).to.deep.equal [expected, expected]
|
|
||||||
|
|
||||||
describe "Multiple ActivePush instances", ->
|
|
||||||
aps = null
|
|
||||||
before ->
|
|
||||||
# Use a unique inbox in case we're running multiple tests using the same ActiveMQ server concurrently etc
|
|
||||||
inbox = uniqueInbox()
|
|
||||||
Q.all(for index in [0..1]
|
|
||||||
configureActivePush(merge(config,
|
|
||||||
stomp:inbox: inbox
|
|
||||||
http:port: config.http.port + index + 1 # Don't re-use the same port from first test
|
|
||||||
))
|
|
||||||
).then (activePushArr) ->
|
|
||||||
aps = activePushArr
|
|
||||||
after ->
|
|
||||||
Q.all(ap.stop() for ap in aps)
|
|
||||||
|
|
||||||
it "should relay the correct messages to multiple clients", (done) ->
|
|
||||||
Q.all(for ap in aps
|
|
||||||
configureSocketIO(ap.config.http.port, "my_push_id")
|
|
||||||
).then (allReceivedMessages) ->
|
|
||||||
expected = for ap, index in aps
|
|
||||||
msg = uniqueMessage("YES#{index}")
|
|
||||||
ap.producer.publish "my_push_id", msg
|
|
||||||
ap.producer.publish "other_push_id", uniqueMessage("NO")
|
|
||||||
msg
|
|
||||||
Q.delay(WAIT_TIME*2).then ->
|
|
||||||
allReceivedMessages = (messages.sort() for messages in allReceivedMessages)
|
|
||||||
allExpectedMessages = (expected.sort() for messages in allReceivedMessages)
|
|
||||||
expect(allReceivedMessages).to.deep.equal allExpectedMessages
|
|
|
@ -0,0 +1,108 @@
|
||||||
|
|
||||||
|
require("mocha-as-promised")()
|
||||||
|
chai = require "chai"
|
||||||
|
chai.use require "chai-as-promised"
|
||||||
|
{ expect } = chai
|
||||||
|
|
||||||
|
Q = require "q"
|
||||||
|
merge = require "deepmerge"
|
||||||
|
uuid = require "node-uuid"
|
||||||
|
|
||||||
|
activepush = require "../index"
|
||||||
|
{ ActivePush } = activepush
|
||||||
|
|
||||||
|
TIMEOUT = 20000
|
||||||
|
|
||||||
|
createServer = (config) ->
|
||||||
|
new ActivePush(config).start()
|
||||||
|
|
||||||
|
# These tests can be run either using socket.io-client within Node to simulate a browser, or using WebDriver to test real browsers
|
||||||
|
exports.initIntegrationTests = (options) ->
|
||||||
|
{ name, createClient } = options
|
||||||
|
|
||||||
|
config = activepush.config.loadConfiguration "test"
|
||||||
|
# config.logging.level = "DEBUG"
|
||||||
|
|
||||||
|
describe "Single ActivePush instance (#{name})", ->
|
||||||
|
@timeout TIMEOUT
|
||||||
|
|
||||||
|
server = null
|
||||||
|
before ->
|
||||||
|
# Use a unique inbox in case we're running multiple tests using the same ActiveMQ server concurrently etc
|
||||||
|
inbox = uniqueInbox()
|
||||||
|
createServer(merge(config, stomp:inbox:inbox)).then (activePush) ->
|
||||||
|
server = activePush
|
||||||
|
after ->
|
||||||
|
server.stop()
|
||||||
|
|
||||||
|
it "should not buffer messages (treat as transient)", ->
|
||||||
|
expected = uniqueMessage("NO")
|
||||||
|
server.producer.publish "my_push_id", expected
|
||||||
|
createClient(server.config.http.port, "my_push_id").then (getMessages) ->
|
||||||
|
getMessages().then (receivedMessages) ->
|
||||||
|
expect(receivedMessages).to.deep.equal []
|
||||||
|
|
||||||
|
it "should relay the correct messages to a single client", ->
|
||||||
|
expected = uniqueMessage("YES")
|
||||||
|
createClient(server.config.http.port, "my_push_id").then (getMessages) ->
|
||||||
|
server.producer.publish "my_push_id", expected
|
||||||
|
server.producer.publish "other_push_id", uniqueMessage("NO")
|
||||||
|
getMessages().then (receivedMessages) ->
|
||||||
|
expect(receivedMessages).to.deep.equal [expected]
|
||||||
|
|
||||||
|
it "should relay the correct messages to multiple clients", (done) ->
|
||||||
|
expected = uniqueMessage("YES")
|
||||||
|
Q.all(for index in [0..1]
|
||||||
|
createClient(server.config.http.port, "my_push_id")
|
||||||
|
).then (allGetMessages) ->
|
||||||
|
server.producer.publish "my_push_id", expected
|
||||||
|
server.producer.publish "other_push_id", uniqueMessage("NO")
|
||||||
|
Q.all(getMessages() for getMessages in allGetMessages).then (allReceivedMessages) ->
|
||||||
|
expect(allReceivedMessages).to.deep.equal [[expected], [expected]]
|
||||||
|
|
||||||
|
it "should relay multiple messages when using XHR transport", ->
|
||||||
|
expected = uniqueMessage("YES")
|
||||||
|
# FIXME: figure out how to get rid of this delay
|
||||||
|
createClient(server.config.http.port, "my_push_id", transports: ["xhr-polling"], 'try multiple transports': false).delay(1000).then (getMessages) ->
|
||||||
|
server.producer.publish "my_push_id", expected
|
||||||
|
server.producer.publish "my_push_id", expected
|
||||||
|
getMessages().then (receivedMessages) ->
|
||||||
|
expect(receivedMessages).to.deep.equal [expected, expected]
|
||||||
|
|
||||||
|
describe "Multiple ActivePush instances (#{name})", ->
|
||||||
|
@timeout TIMEOUT
|
||||||
|
|
||||||
|
servers = null
|
||||||
|
before ->
|
||||||
|
# Use a unique inbox in case we're running multiple tests using the same ActiveMQ server concurrently etc
|
||||||
|
inbox = uniqueInbox()
|
||||||
|
Q.all(for index in [0..1]
|
||||||
|
createServer(merge(config,
|
||||||
|
stomp:inbox: inbox
|
||||||
|
http:port: config.http.port + index + 1 # Don't re-use the same port from first test
|
||||||
|
))
|
||||||
|
).then (_servers) ->
|
||||||
|
servers = _servers
|
||||||
|
after ->
|
||||||
|
Q.all(server.stop() for server in servers)
|
||||||
|
|
||||||
|
it "should relay the correct messages to multiple clients", (done) ->
|
||||||
|
Q.all(for server in servers
|
||||||
|
createClient(server.config.http.port, "my_push_id")
|
||||||
|
).then (allGetMessages) ->
|
||||||
|
expected = for server, index in servers
|
||||||
|
msg = uniqueMessage("YES#{index}")
|
||||||
|
server.producer.publish "my_push_id", msg
|
||||||
|
server.producer.publish "other_push_id", uniqueMessage("NO")
|
||||||
|
msg
|
||||||
|
Q.all(getMessages() for getMessages in allGetMessages).then (allReceivedMessages) ->
|
||||||
|
allReceivedMessages = (messages.sort() for messages in allReceivedMessages)
|
||||||
|
allExpectedMessages = (expected.sort() for messages in allReceivedMessages)
|
||||||
|
expect(allReceivedMessages).to.deep.equal allExpectedMessages
|
||||||
|
|
||||||
|
uniqueInbox = ->
|
||||||
|
"/topic/activepush-test-"+uuid.v1()
|
||||||
|
|
||||||
|
# Use unique messages to ensure we don't messages from other tests, etc.
|
||||||
|
uniqueMessage = (prefix="") ->
|
||||||
|
prefix+(if prefix then "-" else "")+uuid.v1()
|
|
@ -0,0 +1,31 @@
|
||||||
|
|
||||||
|
Q = require "q"
|
||||||
|
io = require "socket.io-client"
|
||||||
|
merge = require "deepmerge"
|
||||||
|
|
||||||
|
integration = require "./integration-common"
|
||||||
|
|
||||||
|
# HACK: Delay before checking received messages to ensure all messages get delivered.
|
||||||
|
# Increase this value if tests are failiing non-deterministically.
|
||||||
|
# TODO: better way to detect all messages have been delivered?
|
||||||
|
WAIT_TIME = 200
|
||||||
|
|
||||||
|
exports.initIntegrationTests = ->
|
||||||
|
|
||||||
|
integration.initIntegrationTests
|
||||||
|
name: "socket.io"
|
||||||
|
createClient: (port, push_id, options = {}) ->
|
||||||
|
deferred = Q.defer()
|
||||||
|
socket = io.connect "http://localhost:#{port}", merge(options, "force new connection": true)
|
||||||
|
# For some reason socket.io-client doesn't respect the "transports" option so we have to set it manually
|
||||||
|
socket.socket.options.transports = options.transports if options.transports?
|
||||||
|
socket.on "connect", ->
|
||||||
|
socket.emit "subscribe", push_id
|
||||||
|
messages = []
|
||||||
|
socket.on "message", (message) ->
|
||||||
|
messages.push message
|
||||||
|
deferred.resolve ->
|
||||||
|
Q.delay(WAIT_TIME).then -> messages
|
||||||
|
deferred.promise
|
||||||
|
|
||||||
|
exports.initIntegrationTests()
|
|
@ -0,0 +1,50 @@
|
||||||
|
|
||||||
|
Q = require "q"
|
||||||
|
QStep = require "q-step"
|
||||||
|
wd = require "wd"
|
||||||
|
merge = require "deepmerge"
|
||||||
|
|
||||||
|
integration = require "./integration-common"
|
||||||
|
|
||||||
|
# HACK: Delay before checking received messages to ensure all messages get delivered.
|
||||||
|
# Increase this value if tests are failiing non-deterministically.
|
||||||
|
# TODO: better way to detect all messages have been delivered?
|
||||||
|
WAIT_TIME = 500
|
||||||
|
|
||||||
|
DEFAULT_BROWSER =
|
||||||
|
browserName: "firefox"
|
||||||
|
|
||||||
|
LOCAL_CONFIG =
|
||||||
|
host: "localhost"
|
||||||
|
port: 4444
|
||||||
|
|
||||||
|
SAUCE_CONFIG =
|
||||||
|
host: "ondemand.saucelabs.com"
|
||||||
|
port: 80
|
||||||
|
username: process.env["SAUCE_USER"]
|
||||||
|
password: process.env["SAUCE_KEY"]
|
||||||
|
|
||||||
|
DEFAULT_CONFIG = LOCAL_CONFIG
|
||||||
|
|
||||||
|
exports.initIntegrationTests = (config = {}) ->
|
||||||
|
config = merge(DEFAULT_CONFIG, config)
|
||||||
|
|
||||||
|
integration.initIntegrationTests
|
||||||
|
name: "webdriver-#{config.browser.browserName}"
|
||||||
|
createClient: (port, push_id) ->
|
||||||
|
browser = wd.promiseRemote(config.host, config.port, config.username, config.password)
|
||||||
|
QStep(
|
||||||
|
-> browser.init(config.browser)
|
||||||
|
-> browser.get("http://localhost:#{port}/\##{push_id}")
|
||||||
|
-> browser.waitForCondition("!!window.messages", 5000)
|
||||||
|
->
|
||||||
|
->
|
||||||
|
Q.delay(WAIT_TIME).then ->
|
||||||
|
browser.eval("window.messages").then (messages) ->
|
||||||
|
messages
|
||||||
|
.fin ->
|
||||||
|
browser.quit()
|
||||||
|
)
|
||||||
|
|
||||||
|
# exports.initIntegrationTests()
|
||||||
|
exports.initIntegrationTests(browser: browserName: "chrome")
|
Loading…
Reference in New Issue