driver: properly clone stack traces from error objects, and never display long state traces on backend errors

This commit is contained in:
Brian Mann
2017-08-28 19:09:35 -04:00
parent bea7f9dab6
commit 7447d36fbb
5 changed files with 60 additions and 14 deletions
@@ -2,5 +2,4 @@ Promise = require("bluebird")
Promise.config({
cancellation: true
longStackTraces: true
})
+16 -9
View File
@@ -102,15 +102,15 @@ class $Cypress
## slice up the behavior
config.isInteractive = !config.isTextTerminal
if not config.isInteractive
## disable long stack traces when
## we are running headlessly for
## performance since users cannot
## interact with the stack traces
## anyway
Promise.config({
longStackTraces: false
})
## enable long stack traces when
## we not are running headlessly
## for debuggability but disable
## them when running headlessly for
## performance since users cannot
## interact with the stack traces
Promise.config({
longStackTraces: config.isInteractive
})
{environmentVariables, remote} = config
@@ -359,7 +359,14 @@ class $Cypress
new Promise (resolve, reject) =>
fn = (reply) ->
if e = reply.error
## clone the error object
## and set stack cleaned
## to prevent bluebird from
## attaching long stace traces
## which otherwise make this err
## unusably long
err = $utils.cloneErr(e)
err.__stackCleaned__ = true
err.backend = true
reject(err)
else
+5 -4
View File
@@ -54,11 +54,12 @@ module.exports = {
return err
cloneErr: (err) ->
err2 = new Error(err.message)
err2.name = err.name
cloneErr: (obj) ->
err2 = new Error(obj.message)
err2.name = obj.name
err2.stack = obj.stack
for own prop, val of err
for own prop, val of obj
if not err2[prop]
err2[prop] = val
@@ -0,0 +1,22 @@
describe "driver/src/cypress/index", ->
beforeEach ->
@Cypress = Cypress.$Cypress.create({})
context "#backend", ->
it "sets __stackCleaned__ on errors", (done) ->
cy.stub(@Cypress, "emit")
.withArgs("backend:request")
.yieldsAsync({
error: {
name: "Error"
message: "msg"
stack: "stack"
}
})
@Cypress.backend("foo")
.catch (err) ->
expect(err.backend).to.be.true
expect(err.stack).not.to.include("From previous event")
done()
@@ -1,6 +1,23 @@
_ = Cypress._
$utils = Cypress.utils
describe "driver/src/cypress/utils", ->
context ".cloneErr", ->
it "copies properies, message, stack", ->
obj = {
stack: "stack"
message: "message"
name: "Foo"
code: 123
}
err = $utils.cloneErr(obj)
expect(err).to.be.instanceof(top.Error)
for key, val of obj
expect(err[key], "key: #{key}").to.eq(obj[key])
context ".appendErrMsg", ->
it "appends error message", ->
err = new Error("foo")