mirror of
https://github.com/OPCFoundation/UA-.NETStandard.git
synced 2026-10-22 09:37:12 +08:00
fix/encoder-stack-depth-json-flake
4 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
9b034f8291 |
Enable nullable reference types centrally; migrate all unset and annotations-only projects (#4700)
# Description Nullable reference types are now enabled once, in `common.props`, and every project in the repository builds warning-clean with them. **Configuration** - `<Nullable>enable</Nullable>` lives in `common.props`. All per-project `<Nullable>` settings are removed: 178 project files (enable, annotations, and the `disable` in the three Aot test projects). - 419 per-file `#nullable enable`/`restore` directives and the 4 `#nullable disable` directives are removed. - Kept on purpose: - The 5 `<auto-generated>` schema files (`UANodeSet.cs`, `UA Type Dictionary.cs`, `OPCBinarySchema.cs`, `SecuredApplication.cs`, `PInvokeHelper.cs`) keep `#nullable enable`. The compiler ignores the project setting in generated code, so the directive is required there. - `tests/Opc.Ua.Interop.LegacyPeer` keeps `disable`. It builds against the 1.5.378 packages and does not import the repository props. - `docs/DeveloperGuide.md` and `.github/copilot-instructions.md` now describe the central setting. **Migration** (the 43 unset and 13 annotations-only projects, roughly 10k diagnostics) - **Production code: annotated at the declarations.** Covers `tools/Opc.Ua.SourceGeneration.Core`, `src/Opc.Ua.Lds.Server` and the LDS sample. - Members, parameters and returns are nullable where null actually flows. - Null-check helpers carry `[NotNullWhen]` (`IsNull`, `IsValidXmlName`, `IsMethodTypeDesign`). - `CoreUtils.Format`, `Utils.Format`, `ITemplateWriter.WriteLine` take `params object?[]`. `Template.AddReplacement` takes `string?` (rendering already skips null replacements). - `IRegisteredServerStore.RegisterAsync` returns `Task<RegistrationEntry?>`: it returns null when a registration is removed. - Dereferences backed by an invariant (for example, the validated model) use `!`, so runtime behaviour is unchanged. - **Behavioural changes in production code** (small, deliberate): - `NodeSetToModelDesign` throws `InvalidOperationException` when the file is not a NodeSet. Before, it threw a NullReferenceException on the next line. - `ModelDesignValidator` starts its lookup tables empty instead of null. A redundant `if (m_nodes == null) return;` guard is gone. - **Test code: minimal annotations.** - `?` on values that can be null, `!` where the test asserts non-null. - `= null!` for fixture members assigned in SetUp. - `TryGetStructure<T>(out T? x)` where the inferred `T?` broke the `IEncodeable` constraint. - A few redundant `== null` checks on structs (`NodeId`, `ArrayOf<T>`) folded into the adjacent `IsNull`/`Count` checks. **Notes for reviewers** - The diff is large (~1,500 files) but almost entirely mechanical: `?`, `!` and directive removal. The non-annotation changes are listed above. - Known follow-up, not done here: `IModelDesign.Namespaces/TargetNamespace/NamespaceUris` stay non-nullable even though the validator returns null before it loads a dictionary. Making them nullable would ripple through every generator call site. ## Related Issues - Fixes #4439 ## Checklist - [ ] I have signed the [CLA](https://opcfoundation.org/license/cla/ContributorLicenseAgreementv1.0.pdf) and read the [CONTRIBUTING](https://github.com/OPCFoundation/UA-.NETStandard/blob/master/CONTRIBUTING.md) doc. - [ ] I have added tests that prove my fix is effective or that my feature works and increased code coverage. - [x] I have added all necessary documentation. - [x] I have verified that my changes do not introduce (new) build or analyzer warnings. - [ ] I ran **all** tests locally using the **UA.slnx** solution against at least .net **framework** and .net **10**, and all passed. - [ ] I fixed **all** failing and flaky tests in the CI pipelines and **all** CodeQL warnings. - [ ] I have addressed **all** PR feedback received. The "no new warnings" box covers net10.0 and net48: full non-incremental builds of `UA.slnx`, `tools/SourceGeneration.slnx`, `tools/MigrationAnalyzer.slnx` and the Aot test projects finished with 0 warnings and 0 errors under the repository's warnings-as-errors settings. net9.0 and net8.0 also had no nullable diagnostics, but they were not rebuilt after the final fixes. Tests have not been run locally yet. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
19dc504c56 |
Release the discovery refusal fixture port before connecting (#4559)
# Description Release the loopback port reservation immediately before the discovery failure attempt in `DiscoveryFailureDoesNotInterruptHealthyClientAsync`. Keeping a TCP socket bound but non-listening does not guarantee prompt connection refusal on Darwin: the macOS CI attempts remain pending until caller cancellation. The test is intended to exercise refusal and healthy-client isolation, not that platform-specific socket state. The change is confined to the fixture. It retains the exact `BadNotConnected` and inner `SocketException` assertions, the real healthy-client `GetEndpoints` readback, the separate caller-cancellation case and the existing timeout. There is no retry, skipped platform or production-code change. The reservation is kept until the last possible moment, immediately before the attempt. As with ordinary released-ephemeral-port fixtures, another local process could claim that port; the original assertions will still fail rather than hide an unexpected outcome. ## Related Issues Fixes #4558. This focused upstream correction is separate from the UaLens delivery in #4462. ## Validation - Windows net10.0: refusal and cancellation tests passed in three consecutive runs. - Windows net48: the same two tests passed. - The formerly failing macOS Sessions lane now passes in [CI run 36396834698](https://github.com/OPCFoundation/UA-.NETStandard/actions/runs/36396834698/job/108845243883). The other test/build checks and coverage pass; CodeQL was still running at the latest check. No maintainer approval or merge is implied. - Existing tests, assertions and CI policy are unchanged. ## Checklist - [ ] CLA prerequisite confirmed by the contributor/service. - [x] Existing exact behavioral regressions retained and run locally. - [x] Added the explanation at the non-obvious fixture boundary. - [x] Targeted builds introduce no compiler/analyzer warnings. - [ ] All UA.slnx tests run locally on .NET Framework and .NET 10. - [ ] New macOS CI and CodeQL checks confirmed successful. - [ ] Maintainer feedback addressed and current approval obtained. The PR was made ready for review through a separate manual action. No automatic merge was performed. Maintainer acceptance is still required before integration into #4462 under the approved closure sequence. |
||
|
|
d2ec51d035 |
Normalize transport connection failures at the client channel boundary (#4549)
## Summary Translate socket and I/O connection failures into `ServiceResultException(BadNotConnected)` at `UaSCUaBinaryClientChannel.ConnectAsync`, so public discovery creation does not leak raw transport exceptions. - Preserve the original exception as `InnerException` for diagnostics. - Keep the existing operation fault, channel shutdown and operation completion paths. - Leave cancellation, existing `ServiceResultException` instances/statuses, and programming errors unchanged. - Do not change the lower-level byte transport contract or reconnect behavior. Fixes #4535 ## Regression Coverage - Deterministic injected HostNotFound, ConnectionRefused, socket timeout and IOException failures assert BadNotConnected, exact inner cause and closed transport/channel. - Separate controls assert caller cancellation and unchanged service/programming exceptions. - Public `DiscoveryClient.CreateAsync` integration uses a bound, non-listening loopback port. It asserts the translated failure and verifies a previously connected discovery client can still retrieve endpoints afterward. A separate public-API cancellation control remains a cancellation. - No live DNS lookup is required in the committed tests; DNS failure is injected deterministically. ## Validation Base `b4136d8e9`, Windows Release: | Focused selection | net10.0 | net48 | | --- | ---: | ---: | | UaSCBinaryClientChannelDeterministicTests + TcpByteTransportTests | 51 passed | 51 passed | | SessionlessInvocationTests | 22 passed | 22 passed | All four selections exited 0, with zero failures/skips. Changed-file whitespace verification, diagnostics and `git diff --check` passed. Before the fix, the seven new deterministic cases produced 4 raw-transport failures / 3 passing controls. The two new public-API cases produced 1 raw SocketException failure / 1 cancellation-control pass with only the production fix reversed. The source fix was restored, rebuilt, and the full focused selections above passed. The complete framework/platform matrix is left to PR CI. No repository guidance, feed configuration, security policy or unrelated consumer workaround was changed. --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> |
||
|
|
7cec2d614d | Move repository files to the consolidated layout |