Skip to content

Commit a0607b6

Browse files
authored
Merge pull request #173 from browserstack/server_log_specs
[Fix] Server output logs for console.log
2 parents 4e0c194 + 180a8ed commit a0607b6

File tree

2 files changed

+207
-1
lines changed

2 files changed

+207
-1
lines changed

lib/server.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,13 @@ exports.Server = function Server(bsClient, workers, config, callback) {
349349
},
350350
'_log': function logHandler(uri, body, request, response) {
351351
var uuid = getWorkerUuid(request);
352-
var query = body;
352+
var query = null;
353+
try {
354+
query = CircularJSON.parse(body);
355+
} catch (e) {
356+
query = body;
357+
}
358+
353359
logger.trace('[%s] _log', ((uuid && workers[uuid]) || {}).id, query);
354360

355361
var logged = false;
@@ -402,3 +408,5 @@ exports.Server = function Server(bsClient, workers, config, callback) {
402408
});
403409
});
404410
};
411+
412+
exports.logger = logger;

tests/behaviour/server.js

Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
'use strict';
2+
3+
var assert = require('assert'),
4+
sinon = require('sinon'),
5+
path = require('path'),
6+
http = require('http'),
7+
chalk = require('chalk'),
8+
serverPort = 8888,
9+
browserStackRunnerServer = require('../../lib/server.js');
10+
11+
var getBaseConfig = function() {
12+
return {
13+
username: 'BROWSERSTACK_USER',
14+
key: 'BROWSERSTACK_KEY',
15+
test_framework: 'qunit',
16+
test_path: path.resolve(__dirname, 'resources', 'qunit_sample.html'),
17+
build: 'BrowserStack Runner Behaviour Tests',
18+
browsers: [ {
19+
browser: 'firefox',
20+
browser_version: '47.0',
21+
os: 'Windows',
22+
os_version: '7'
23+
} ]
24+
}
25+
};
26+
27+
var requestServer = function(path, requestBody, appendHeaders, callback) {
28+
var headers = {
29+
'Content-Length': Buffer.byteLength(requestBody)
30+
}
31+
var request = http.request({
32+
hostname: 'localhost',
33+
port: serverPort,
34+
path: path,
35+
method: 'POST',
36+
headers: Object.assign(headers, appendHeaders),
37+
}, (res) => {
38+
var responseData = '';
39+
40+
res.on('data', (data) => {
41+
responseData += data.toString();
42+
});
43+
res.on('end', () => {
44+
callback(null, responseData, res.statusCode);
45+
});
46+
}).on('error', (e) => {
47+
callback(e);
48+
});
49+
request.write(requestBody);
50+
request.end();
51+
};
52+
53+
describe('Server Assertions', function() {
54+
describe('Assert logs from the browserstack-runner server', function() {
55+
var sandBox, bsClient, infoLoggerStub, server, reports, workers = {};
56+
57+
beforeEach(function() {
58+
sandBox = sinon.sandbox.create();
59+
bsClient = {
60+
takeScreenshot: sandBox.stub()
61+
},
62+
infoLoggerStub = sandBox.stub(browserStackRunnerServer.logger, 'info');
63+
64+
server = browserStackRunnerServer.Server(bsClient, workers, getBaseConfig(), function(error, reports) {
65+
console.log('Dude!', reports);
66+
});
67+
server.listen(serverPort);
68+
});
69+
70+
afterEach(function() {
71+
sandBox.restore();
72+
server.close();
73+
});
74+
75+
it('logs console.log correctly', function(done) {
76+
var browserString = 'OS X Chrome 54'
77+
requestServer('/_log', '{"arguments":["Random String"]}', {
78+
'x-browser-string': browserString
79+
}, function(error) {
80+
if(error) done(error);
81+
assert.equal(infoLoggerStub.called, true);
82+
assert.equal(infoLoggerStub.callCount, 1);
83+
assert.equal(infoLoggerStub.getCalls()[0].args, '[' + browserString + '] ' + 'Random String');
84+
85+
requestServer('/_log', '{"arguments":["Invalid Random String', {
86+
'x-browser-string': browserString
87+
}, function(error) {
88+
if(error) done(error);
89+
assert.equal(infoLoggerStub.callCount, 2);
90+
assert.equal(infoLoggerStub.getCalls()[1].args, '[' + browserString + '] ' + '{"arguments":["Invalid Random String');
91+
done();
92+
});
93+
});
94+
});
95+
96+
it('logs test errors correctly', function(done) {
97+
var browserUUIDString = 'abcd-efgh-1234-5678',
98+
browserInfoString = 'browserInfo';
99+
100+
workers[browserUUIDString] = {
101+
getTestBrowserInfo: sandBox.stub().returns(browserInfoString),
102+
string: 'workerString'
103+
};
104+
var requestBodyObject = {
105+
test: {
106+
errors: [{
107+
message: "failedTestMessage",
108+
actual: "ActualValue",
109+
expected: "expectedValue",
110+
source: "LongStackTrace"
111+
}],
112+
name:"customTestName",
113+
suiteName:"customSuiteName"
114+
}
115+
};
116+
117+
requestServer('/_progress', JSON.stringify(requestBodyObject), {
118+
'x-worker-uuid': browserUUIDString
119+
}, function(error) {
120+
if(error) done(error);
121+
assert.equal(infoLoggerStub.called, true);
122+
assert.equal(infoLoggerStub.callCount, 1);
123+
assert.equal(infoLoggerStub.getCalls()[0].args.length, 3);
124+
assert.equal(infoLoggerStub.getCalls()[0].args[0], '[%s] ' + chalk.red('Error:'));
125+
assert.equal(infoLoggerStub.getCalls()[0].args[1], browserInfoString);
126+
assert.equal(infoLoggerStub.getCalls()[0].args[2],
127+
'"customTestName" failed, failedTestMessage\n' + chalk.blue('Expected: ') + 'expectedValue' +
128+
'\n' + chalk.blue(' Actual: ') + 'ActualValue' +
129+
'\n' + chalk.blue(' Source: ') + 'LongStackTrace'
130+
);
131+
132+
requestServer('/_progress', '{"arguments":["Invalid Random String', {
133+
'x-worker-uuid': browserUUIDString
134+
}, function(error) {
135+
if(error) done(error);
136+
assert.equal(infoLoggerStub.callCount, 3);
137+
assert.equal(infoLoggerStub.getCalls()[1].args.length, 2);
138+
assert.equal(infoLoggerStub.getCalls()[1].args[0], '[%s] Exception in parsing log');
139+
assert.equal(infoLoggerStub.getCalls()[1].args[1], 'workerString');
140+
141+
assert.equal(infoLoggerStub.getCalls()[2].args.length, 2);
142+
assert.equal(infoLoggerStub.getCalls()[2].args[0], '[%s] Log: undefined');
143+
assert.equal(infoLoggerStub.getCalls()[2].args[1], 'workerString');
144+
done();
145+
});
146+
});
147+
});
148+
149+
it('logs for test reports correctly', function(done) {
150+
var browserUUIDString = 'abcd-efgh-1234-5678',
151+
browserString = 'OS X Chrome 41',
152+
browserInfoString = 'browserInfo';
153+
154+
workers[browserUUIDString] = {
155+
getTestBrowserInfo: sandBox.stub().returns(browserInfoString),
156+
string: 'workerString'
157+
};
158+
var requestBodyObject = {
159+
testCounts: {
160+
total: 1,
161+
passed: 1,
162+
failed: 0,
163+
skipped: 0
164+
},
165+
runtime: '00:01:00',
166+
status: 'passed'
167+
};
168+
169+
requestServer('/_report', JSON.stringify(requestBodyObject), {
170+
'x-worker-uuid': browserUUIDString
171+
}, function(error) {
172+
if(error) done(error);
173+
assert.equal(infoLoggerStub.called, true);
174+
assert.equal(infoLoggerStub.callCount, 1);
175+
assert.equal(infoLoggerStub.getCalls()[0].args.length, 7);
176+
assert.equal(infoLoggerStub.getCalls()[0].args[0], '[%s] ' + chalk['green']('Passed:') + ' %d tests, %d passed, %d failed, %d skipped; ran for %dms');
177+
assert.equal(infoLoggerStub.getCalls()[0].args[1], browserInfoString);
178+
assert.equal(infoLoggerStub.getCalls()[0].args[2], 1);
179+
assert.equal(infoLoggerStub.getCalls()[0].args[3], 1);
180+
assert.equal(infoLoggerStub.getCalls()[0].args[4], 0);
181+
assert.equal(infoLoggerStub.getCalls()[0].args[5], 0);
182+
assert.equal(infoLoggerStub.getCalls()[0].args[6], '00:01:00');
183+
184+
requestServer('/_report', '{"arguments":["Invalid Random String', {
185+
'x-worker-uuid': browserUUIDString,
186+
'x-browser-string': browserString
187+
}, function(error) {
188+
if(error) done(error);
189+
assert.equal(infoLoggerStub.callCount, 2);
190+
assert.equal(infoLoggerStub.getCalls()[1].args.length, 2);
191+
assert.equal(infoLoggerStub.getCalls()[1].args[0], '[%s] Null response from remote Browser');
192+
assert.equal(infoLoggerStub.getCalls()[1].args[1], browserString);
193+
done();
194+
});
195+
});
196+
});
197+
});
198+
});

0 commit comments

Comments
 (0)