Filter Jasmine frames from stack traces

[Finishes #2644992]
This commit is contained in:
Steve Gravrock
2017-11-08 22:44:29 -08:00
parent 59ad217954
commit 5906a2c05c
8 changed files with 557 additions and 10 deletions

View File

@@ -54,6 +54,65 @@ describe("ExceptionFormatter", function() {
expect(new jasmineUnderTest.ExceptionFormatter().stack(error)).toMatch(/ExceptionFormatterSpec\.js.*\d+/)
});
it("filters Jasmine stack frames from V8 style traces", function() {
var error = {
stack: 'Error: nope\n' +
' at fn1 (http://localhost:8888/__spec__/core/UtilSpec.js:115:19)\n' +
' at fn2 (http://localhost:8888/__jasmine__/jasmine.js:4320:20)\n' +
' at fn3 (http://localhost:8888/__jasmine__/jasmine.js:4320:20)\n' +
' at fn4 (http://localhost:8888/__spec__/core/UtilSpec.js:110:19)\n'
};
var subject = new jasmineUnderTest.ExceptionFormatter({
jasmineFile: 'http://localhost:8888/__jasmine__/jasmine.js'
});
var result = subject.stack(error);
expect(result).toEqual('Error: nope\n' +
' at fn1 (http://localhost:8888/__spec__/core/UtilSpec.js:115:19)\n' +
' at <Jasmine>\n' +
' at fn4 (http://localhost:8888/__spec__/core/UtilSpec.js:110:19)'
);
});
it("filters Jamine stack frames from Webkit style traces", function() {
var error = {
stack: 'http://localhost:8888/__spec__/core/UtilSpec.js:115:28\n' +
'fn1@http://localhost:8888/__jasmine__/jasmine.js:4320:27\n' +
'fn2@http://localhost:8888/__jasmine__/jasmine.js:4320:27\n' +
'http://localhost:8888/__spec__/core/UtilSpec.js:115:28'
};
var subject = new jasmineUnderTest.ExceptionFormatter({
jasmineFile: 'http://localhost:8888/__jasmine__/jasmine.js'
});
var result = subject.stack(error);
expect(result).toEqual(
'http://localhost:8888/__spec__/core/UtilSpec.js:115:28\n' +
'<Jasmine>\n' +
'http://localhost:8888/__spec__/core/UtilSpec.js:115:28'
);
});
it("filters Jasmine stack frames in this environment", function() {
var error, i;
try { throw new Error("an error"); } catch(e) { error = e; }
var subject = new jasmineUnderTest.ExceptionFormatter({
jasmineFile: jasmine.util.jasmineFile()
});
var result = subject.stack(error);
var lines = result.split('\n');
if (lines[0].match(/an error/)) {
lines.shift();
}
expect(lines[0]).toMatch(/ExceptionFormatterSpec.js/);
expect(lines[1]).toMatch(/<Jasmine>/);
// Node has some number of additional frames below Jasmine.
for (i = 2; i < lines.length; i++) {
expect(lines[i]).not.toMatch(/jasmine.js/);
}
});
it("returns null if no Error provided", function() {
expect(new jasmineUnderTest.ExceptionFormatter().stack()).toBeNull();
});

166
spec/core/StackTraceSpec.js Normal file
View File

@@ -0,0 +1,166 @@
describe("StackTrace", function() {
it("understands Chrome/IE/Edge style traces", function() {
var raw =
'Error: nope\n' +
' at UserContext.<anonymous> (http://localhost:8888/__spec__/core/UtilSpec.js:115:19)\n' +
' at QueueRunner.run (http://localhost:8888/__jasmine__/jasmine.js:4320:20)';
var result = new jasmineUnderTest.StackTrace(raw);
expect(result.message).toEqual('Error: nope');
expect(result.style).toEqual('v8');
expect(result.frames).toEqual([
{
raw: ' at UserContext.<anonymous> (http://localhost:8888/__spec__/core/UtilSpec.js:115:19)',
func: 'UserContext.<anonymous>',
file: 'http://localhost:8888/__spec__/core/UtilSpec.js',
line: 115
},
{
raw: ' at QueueRunner.run (http://localhost:8888/__jasmine__/jasmine.js:4320:20)',
func: 'QueueRunner.run',
file: 'http://localhost:8888/__jasmine__/jasmine.js',
line: 4320
}
]);
});
it("understands Node style traces", function() {
var raw = 'Error\n' +
' at /somewhere/jasmine/lib/jasmine-core/jasmine.js:4255:9\n' +
' at QueueRunner.complete [as onComplete] (/somewhere/jasmine/lib/jasmine-core/jasmine.js:579:9)\n' +
' at Immediate.<anonymous> (/somewhere/jasmine/lib/jasmine-core/jasmine.js:4314:12)\n' +
' at runCallback (timers.js:672:20)';
var result = new jasmineUnderTest.StackTrace(raw);
expect(result.message).toEqual('Error');
expect(result.style).toEqual('v8');
expect(result.frames).toEqual([
{
raw: ' at /somewhere/jasmine/lib/jasmine-core/jasmine.js:4255:9',
func: undefined,
file: '/somewhere/jasmine/lib/jasmine-core/jasmine.js',
line: 4255
},
{
raw: ' at QueueRunner.complete [as onComplete] (/somewhere/jasmine/lib/jasmine-core/jasmine.js:579:9)',
func: 'QueueRunner.complete [as onComplete]',
file: '/somewhere/jasmine/lib/jasmine-core/jasmine.js',
line: 579
},
{
raw: ' at Immediate.<anonymous> (/somewhere/jasmine/lib/jasmine-core/jasmine.js:4314:12)',
func: 'Immediate.<anonymous>',
file: '/somewhere/jasmine/lib/jasmine-core/jasmine.js',
line: 4314
},
{
raw: ' at runCallback (timers.js:672:20)',
func: 'runCallback',
file: 'timers.js',
line: 672
}
]);
});
it("understands Safari/Firefox/Phantom-OS X style traces", function() {
var raw =
'http://localhost:8888/__spec__/core/UtilSpec.js:115:28\n' +
'run@http://localhost:8888/__jasmine__/jasmine.js:4320:27';
var result = new jasmineUnderTest.StackTrace(raw);
expect(result.message).toBeFalsy();
expect(result.style).toEqual('webkit');
expect(result.frames).toEqual([
{
raw: 'http://localhost:8888/__spec__/core/UtilSpec.js:115:28',
func: undefined,
file: 'http://localhost:8888/__spec__/core/UtilSpec.js',
line: 115
},
{
raw: 'run@http://localhost:8888/__jasmine__/jasmine.js:4320:27',
func: 'run',
file: 'http://localhost:8888/__jasmine__/jasmine.js',
line: 4320
}
]);
});
it("does not mistake gibberish for Safari/Firefox/Phantom-OS X style traces", function() {
var raw = 'randomcharsnotincludingwhitespace';
var result = new jasmineUnderTest.StackTrace(raw);
expect(result.style).toBeNull();
expect(result.frames).toEqual([
{ raw: raw }
]);
});
it("understands Phantom-Linux style traces", function() {
var raw =
' at UserContext.<anonymous> (http://localhost:8888/__spec__/core/UtilSpec.js:115:19)\n' +
' at QueueRunner.run (http://localhost:8888/__jasmine__/jasmine.js:4320:20)';
var result = new jasmineUnderTest.StackTrace(raw);
expect(result.message).toBeFalsy();
expect(result.style).toEqual('v8');
expect(result.frames).toEqual([
{
raw: ' at UserContext.<anonymous> (http://localhost:8888/__spec__/core/UtilSpec.js:115:19)',
func: 'UserContext.<anonymous>',
file: 'http://localhost:8888/__spec__/core/UtilSpec.js',
line: 115
},
{
raw: ' at QueueRunner.run (http://localhost:8888/__jasmine__/jasmine.js:4320:20)',
func: 'QueueRunner.run',
file: 'http://localhost:8888/__jasmine__/jasmine.js',
line: 4320
}
]);
});
it("ignores blank lines", function() {
var raw =
' at UserContext.<anonymous> (http://localhost:8888/__spec__/core/UtilSpec.js:115:19)\n';
var result = new jasmineUnderTest.StackTrace(raw);
expect(result.frames).toEqual([
{
raw: ' at UserContext.<anonymous> (http://localhost:8888/__spec__/core/UtilSpec.js:115:19)',
func: 'UserContext.<anonymous>',
file: 'http://localhost:8888/__spec__/core/UtilSpec.js',
line: 115
}
]);
});
it("omits properties except 'raw' for frames that are not understood", function() {
var raw =
' at UserContext.<anonymous> (http://localhost:8888/__spec__/core/UtilSpec.js:115:19)\n' +
' but this is quite unexpected\n' +
' at QueueRunner.run (http://localhost:8888/__jasmine__/jasmine.js:4320:20)';
var result = new jasmineUnderTest.StackTrace(raw);
expect(result.style).toEqual('v8');
expect(result.frames).toEqual([
{
raw: ' at UserContext.<anonymous> (http://localhost:8888/__spec__/core/UtilSpec.js:115:19)',
func: 'UserContext.<anonymous>',
file: 'http://localhost:8888/__spec__/core/UtilSpec.js',
line: 115
},
{
raw: ' but this is quite unexpected'
},
{
raw: ' at QueueRunner.run (http://localhost:8888/__jasmine__/jasmine.js:4320:20)',
func: 'QueueRunner.run',
file: 'http://localhost:8888/__jasmine__/jasmine.js',
line: 4320
}
]);
});
});

View File

@@ -91,6 +91,13 @@ describe("jasmineUnderTest.util", function() {
expect(jasmineUnderTest.util.objectDifference(a, b)).toEqual({x: 1});
expect(jasmineUnderTest.util.objectDifference(b, a)).toEqual({y: 2});
})
})
});
});
describe("jasmineFile", function() {
it("returns the file containing jasmine.util", function() {
expect(jasmineUnderTest.util.jasmineFile()).toMatch(/util.js$/);
expect(jasmine.util.jasmineFile()).toMatch(/jasmine.js$/);
});
});
});