Up today, I continue my efforts to write vows.js tests for the SPDY push streams in node-spdy.
It took a bit of doing, but yesterday I was able to describe one part of SPDY server push:
➜ node-spdy git:(post-response-push) vows ./test/response-test.js --specThat vow covers a "normal" server push—pushing resources into browser cache before SPDY responds with the requested resource. I have been experimenting with pushing resources after the response (e.g. secondary web pages that the user is likely to request).
♢ Pushing Additional Resources
A response with a push_stream
✓ should push data on write
✓ OK » 1 honored (0.003s)
I am not terribly happy with my implementation of post-response server push in node-spdy so far (which is part of the reason I am writing vows). For each
Response
, I am adding a post-response callback via a method named setAfterResponsePush()
. Adapting the pre-response push vow, I can write the post-response vow as:'with a push_after_stream': {With that, I have two honored vows:
topic: function (response) {
var callback = this.callback;
response.setAfterResponsePush(function(pusher) {callback(null, pusher)});
response._write();
},
'should push data on write': function (pusher) {
assert.equal(pusher, response);
}
}
➜ node-spdy git:(post-response-push) ✗ vows ./test/response-test.js --specMy API for post-response push may change, but that should just require a change to the topic of my vows.
♢ Pushing Additional Resources
A response with a push_stream
✓ should push data on write
A response with a push_after_stream
✓ should push data on write
✓ OK » 2 honored (0.004s)
Since I am writing vows after the code (I know, I know), I need to verify that the test covers what I actually think is does. So I comment out my
setAfterResponsePush()
call:topic: function (response) {Re-running my vows, I do get a failure:
var callback = this.callback;
// response.setAfterResponsePush(function(pusher) {callback(null, pusher)});
response._write();
}
➜ node-spdy git:(post-response-push) ✗ vows ./test/response-test.js --specCool. So at least my test is covering what I think it is.
♢ Pushing Additional Resources
A response with a push_stream
✓ should push data on write
✗ Errored » callback not fired
in A response with a push_after_stream
in Pushing Additional Resources
in test/response-test.js
✗ Errored » 1 honored ∙ 1 errored ∙ 1 dropped
Last up today, I would like to verify that the the post-response push occurs... well, after the response.
I have no idea how to do something like that without resorting to bad hacks. So that's what I do. I create a global test variable named
last_called
to hold the name of the last called function. If the response is written by the connetion object, then the last_called
will be 'connection.write':connection = {If the post-response callback is called last, the value of
zlib: spdy.createZLib(),
write: function() {last_called = 'connection.write';}
}
last_called
will be 'setAfterResponsePush':topic: function (response) {Wow, do I feel dirty about that, but with the following vow:
var callback = this.callback;
response.setAfterResponsePush(function(pusher) {
last_called = 'setAfterResponsePush';
callback(null, pusher);
});
response._write();
}
'should push _after_ write': function() {It works:
assert.equal(last_called, 'setAfterResponsePush');
}
➜ node-spdy git:(post-response-push) ✗ vows ./test/response-test.js --specThe problem with globals is, of course, that they are global. I have the feeling that it won't take long for this to come back to bite me, but I will defer that until tomorrow.
♢ Pushing Additional Resources
A response with a push_stream
✓ should push data on write
A response with a push_after_stream
✓ should push data on write
✓ should push _after_ write
✓ OK » 3 honored (0.004s)
For now, I am satisfied that I have verified that the post-response push is tested and that the test confirms that the call comes after the response to the original request. If I can think of a better approach than
setPostResponsePush
I may pick this back up tomorrow. I may also put this on the back-burner and begin investigating SPDY alternatives. There is a gaping hole in the SPDY Book in need of filling.Day #61
No comments:
Post a Comment