>>>
void main() {
  return new CancelableOperation.fromFuture(
      () async {
        // Make the underlying suite null so that the engine doesn't start running
        // it immediately.
        engine.suiteSink.add(loadSuite.changeSuite((runnerSuite) {
          engine.pause();
          return runnerSuite;
        }));

        var suite = await loadSuite.suite;
        if (canceled || suite == null) return;

        debugger = new _Debugger(engine, reporter, suite);
        await debugger.run();
      }(), onCancel: () {
    canceled = true;
    // Make sure the load test finishes so the engine can close.
    engine.resume();
    if (debugger != null) debugger.close();
  });
}
<<<
void main() {
  return new CancelableOperation.fromFuture(() async {
    // Make the underlying suite null so that the engine doesn't start running
    // it immediately.
    engine.suiteSink.add(loadSuite.changeSuite((runnerSuite) {
      engine.pause();
      return runnerSuite;
    }));

    var suite = await loadSuite.suite;
    if (canceled || suite == null) return;

    debugger = new _Debugger(engine, reporter, suite);
    await debugger.run();
  }(), onCancel: () {
    canceled = true;
    // Make sure the load test finishes so the engine can close.
    engine.resume();
    if (debugger != null) debugger.close();
  });
}