Describe the bug
Three bugs discovered during silent update end-to-end testing:
1. Manifest identity fields blocked by non-empty defaults (critical)
AppMetadataDiscoverer.Discover() only fills empty fields from generalupdate.manifest.json. But UpdateConfiguration has non-empty defaults for critical identity fields:
MainAppName defaults to "Client"
UpdateAppName defaults to "Update.exe"
ClientVersion defaults to "1.0.0.0"
These defaults block manifest overrides, causing:
- Endless update loop:
WriteBackClientVersion writes "2.0.0.0" to manifest after upgrade. On restart, Discover() skips ClientVersion (not empty, default "1.0.0.0" present), so the client re-checks with "1.0.0.0" → finds v2.0.0.0 again → downloads again → infinite loop.
- Can't find main app: Manifest says
"ClientTest.exe" but default "Client" takes precedence.
- Can't launch upgrade: Manifest says
"UpgradeTest.exe" but default "Update.exe" takes precedence.
2. ProcessExit doesn't fire in console apps
AppDomain.ProcessExit does not fire reliably when a console app is terminated via Ctrl+C. The silent update orchestrator registers OnProcessExit to launch the upgrade process, but the handler is never called.
3. Missing /Upgrade/Report server route
The server registers /Update/Report but not /Upgrade/Report, while /Upgrade/Verification and /Update/Verification both exist. This causes 404 errors during status reporting.
To Reproduce
- Start the sample server
- Run ClientTest with
.SetOption(Option.Silent, true)
- Wait for update to be prepared
- Press Ctrl+C to exit
- Observe that UpgradeTest.exe is never launched
- Manually restart → observe endless update loop
Expected behavior
- Manifest values for identity fields should always take precedence over code defaults
- Upgrade process should launch reliably when process exits
- Server should respond to both
/Upgrade/Report and /Update/Report
Fix
See PR #483
Describe the bug
Three bugs discovered during silent update end-to-end testing:
1. Manifest identity fields blocked by non-empty defaults (critical)
AppMetadataDiscoverer.Discover()only fills empty fields fromgeneralupdate.manifest.json. ButUpdateConfigurationhas non-empty defaults for critical identity fields:MainAppNamedefaults to"Client"UpdateAppNamedefaults to"Update.exe"ClientVersiondefaults to"1.0.0.0"These defaults block manifest overrides, causing:
WriteBackClientVersionwrites"2.0.0.0"to manifest after upgrade. On restart,Discover()skipsClientVersion(not empty, default"1.0.0.0"present), so the client re-checks with"1.0.0.0"→ finds v2.0.0.0 again → downloads again → infinite loop."ClientTest.exe"but default"Client"takes precedence."UpgradeTest.exe"but default"Update.exe"takes precedence.2. ProcessExit doesn't fire in console apps
AppDomain.ProcessExitdoes not fire reliably when a console app is terminated via Ctrl+C. The silent update orchestrator registersOnProcessExitto launch the upgrade process, but the handler is never called.3. Missing /Upgrade/Report server route
The server registers
/Update/Reportbut not/Upgrade/Report, while/Upgrade/Verificationand/Update/Verificationboth exist. This causes 404 errors during status reporting.To Reproduce
.SetOption(Option.Silent, true)Expected behavior
/Upgrade/Reportand/Update/ReportFix
See PR #483