microsoft / microsoft/aspire

Add runtime unit tests for generated TypeScript transport code (trackPromise/flushPendingPromises)

Open
#16,026 2 comments 0 reactions 1 assignee Claimed by @sebastienros View on GitHub
area-polyglot
Dominant language
C#
Stars
6.3k
Forks
991
Avg merge
2d 15h
Merged PRs (30d)
196

Description

## Summary

The TypeScript codegen pipeline (`AtsTypeScriptCodeGenerator`) has strong snapshot-based unit tests that verify the **shape** of generated code (73 tests). However, there are **no runtime unit tests** that execute the generated TypeScript logic — particularly the promise tracking and flushing infrastructure in `transport.ts`.

## What's missing

The following runtime behaviors in `src/Aspire.Hosting.CodeGeneration.TypeScript/Resources/transport.ts` have no direct test coverage:

- **`trackPromise()`** — promises are added to the set and removed on settlement
- **`flushPendingPromises()`** — snapshot-based flush completes without deadlock when new promises are tracked mid-flush (e.g., by the `build()` PromiseImpl constructor)
- **Error propagation** — rejected promises are captured in `_rejectedErrors` and surfaced as `AggregateError` during flush
- **Silent error loss** — promises that reject before flush is called still have their errors collected

## Why this matters

A deadlock bug in `flushPendingPromises()` (a `while` loop re-awaiting a promise tracked during flush) was caught only by code review, not by any test. The fix (snapshot-based single pass) is validated only by:

1. Snapshot tests — verify the generated code text matches, not that it runs correctly
2. E2E tests — `aspire start` would timeout on deadlock, but these are slow, Docker-dependent, and can't test subtle error handling

A targeted TypeScript unit test could deterministically reproduce the deadlock scenario and prevent regressions.

## Suggested approach

Add a test file (e.g., `transport.test.ts`) that:
1. Instantiates the promise tracking logic directly
2. Tests `trackPromise` + `flushPendingPromises` with controlled promise resolution
3. Simulates the deadlock scenario: track a new promise while flush is suspended at `await`
4. Verifies `AggregateError` is thrown when tracked promises reject

## Context

Related PR: #15901 (Auto-resolve promises in TypeScript codegen)

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.