Skip to content

Instantly share code, notes, and snippets.

@mkoslacz
Last active July 1, 2017 12:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mkoslacz/d8fc4db9ff30f25259e65ea8c855e0f1 to your computer and use it in GitHub Desktop.
Save mkoslacz/d8fc4db9ff30f25259e65ea8c855e0f1 to your computer and use it in GitHub Desktop.
Traceur causing StackOverflowError on too complex CompositeException
@RunWith(AndroidJUnit4::class)
class TraceurStackOverflowTest {
@Test
fun errorReportedCorrectlyWithoutTraceur() {
Traceur.disableLogging()
var i = 1
Observable.just(1)
.doOnNext { throw Exception("source exception") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.subscribe(
{ print("onNext: $it") },
{
// it has to be Log.e NOT printstacktrace!
Log.e("error", "", it.stripCompositeException()) // tracuer logging disabled, reports error correctly
},
{ print("onComplete") })
}
@Test
fun errorReportingCausesStackOverflowErrorWithTraceur() {
Traceur.enableLogging()
var i = 1
Observable.just(1)
.doOnNext { throw Exception("source exception") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.doOnError { throw Exception("in chain exception ${i++}") }
.subscribe(
{ print("onNext: $it") },
{
// it has to be Log.e NOT printstacktrace!
Log.e("error", "", it.stripCompositeException()) // tracuer logging enabled, process crashes on older apis (ie. 17 in my case)
},
{ print("onComplete") })
}
// workaround method I use to avoid stackOverflowError when reporting errors from some external components
private fun Throwable.stripCompositeException(): Throwable {
var exception = this
if ((this is CompositeException) && (this.exceptions.size > 5)) {
exception = CompositeException(this.exceptions.subList(0, 5))
}
return exception
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment