endReporting function

Future<void> endReporting(
  1. ReporterState state
)

Drains uploads, flushes results and closes the run.

Implementation

Future<void> endReporting(ReporterState state) async {
  final session = state._session;
  final buffer = state._buffer;
  if (state.softDisabled || session == null || buffer == null) return;

  await flushResults(state);
  // Blobs still registered here belong to results nobody reported.
  clearPendingBlobs();

  final left = buffer.pendingCount + session.unsentResults;
  if (left > 0) {
    logError('Tracera: $left result(s) not uploaded — leaving test run open');
  } else if (session.peerHandoff && session.peerFinisher) {
    // This process leaves last by construction, so waiting for the refcount
    // would keep the run open forever — its siblings have no end-of-suite
    // hook to release from.
    discardPeerRun(session.config.projectId, session.config.runTitle);
    await _finishSharedRun(session);
  } else if (session.peerHandoff) {
    // Peer sessions are not owned — finishOwnedRun would no-op.
    await releasePeerRun(
      session.config.projectId,
      session.config.runTitle,
      () => _finishSharedRun(session),
    );
  } else {
    await session.finishOwnedRun();
  }
  printSummary(session);

  if (session.config.requireReport && session.failedReport > 0) {
    failRequired(
      'Tracera: exiting — ${session.failedReport} result(s) could not be '
      'reported (TRACERA_REQUIRE_REPORT)',
    );
  }
}