Enable DnsResolver tests on all Unix platforms - #132216

Merged
rzikm merged 2 commits into
dotnet:mainfrom
rzikm:dns-resolver-unix
Aug 14, 2026
Merged

Enable DnsResolver tests on all Unix platforms#132216
rzikm merged 2 commits into
dotnet:mainfrom
rzikm:dns-resolver-unix

Conversation

@rzikm

Copy link
Copy Markdown
Member

Follow-up to #129846, which added DnsResolver with a managed stub resolver implementation.

That implementation is compiled through the shared -unix target framework, which is a catch-all for every Unix-family TargetOS that has no explicit entry in TargetFrameworks. System.Net.NameResolution lists only windows;unix;browser;wasi, so macOS, the BSDs, illumos, Haiku, iOS, tvOS, MacCatalyst and Android already compile the same managed resolver as Linux — no per-platform PAL work is needed to support them. The tests were the only thing still gated to Windows.

Test gating

  • DnsResolverTest: the network tests move from IsWindows to "everywhere the resolver is implemented" (that is, everything except Android, Browser and WASI). Three tests that exercise genuinely DnsQueryEx-specific behavior stay Windows-only, and two Unix counterparts were added for the constructor-validation ones — the managed resolver talks to each server endpoint directly, so it accepts non-standard ports and mixed IPv4/IPv6 server lists that DnsQueryEx rejects.
  • DnsResolverLoopbackTest: drops IsNotMobile. These tests pass an explicit Servers list and talk to an in-process loopback server, so they never touch the system resolver configuration and can run on Android and Apple mobile.
  • DnsResolver_PreCanceledToken_ReturnsCanceled now asserts ThrowsAnyAsync<OperationCanceledException>. The managed PAL cancels via CancellationToken.ThrowIfCancellationRequested(), which produces a plain OperationCanceledException, whereas the Windows PAL produces a TaskCanceledException.

Android

Android is the one Unix platform that cannot use the system-configured servers. There is no accessible /etc/resolv.conf, and IPInterfaceProperties.DnsAddresses throws PlatformNotSupportedException there for the same reason, so ResolvConf.GetNameServers() comes back empty and GetServers() falls back to 127.0.0.1:53 — every query would silently time out against an unreachable address.

Rather than fail that way, DnsResolverPal.Managed.ValidateServers now rejects the configuration up front with PlatformNotSupportedException, and the affected surface is annotated:

  • the parameterless DnsResolver() constructor
  • all 18 Dns.Resolve* statics, which route through it

DnsResolver(DnsResolverOptions) with an explicit Servers list keeps working on Android, which is why the annotation cannot go on the type. Tracked by #132212.

Browser and WASI

DnsResolver is unsupported on both — they compile DnsResolverPal.Unsupported.cs (and on Browser the whole assembly is a generated PNSE stub). Browser needs no per-member attribute because Directory.Build.props already sets UnsupportedOSPlatforms=browser, which emits an assembly-level attribute; WASI was not covered by anything, so [UnsupportedOSPlatform("wasi")] is applied to the DnsResolver type and the Dns.Resolve* statics, following the Zstandard* precedent in System.IO.Compression.

Reusing the managed resolver on WASI is possible in principle — WASI does have TCP and UDP sockets — but it has no resolver configuration to read and no threads, so the synchronous query path (which blocks on IAsyncResult.AsyncWaitHandle.WaitOne and blocking Socket.Send/Receive) would deadlock the only thread. Tracked by #132215.

A new test asserts the PlatformNotSupportedException contract on each of Android, Browser and WASI. The argument-validation tests were switched to a resolver built with an explicit (never-contacted) server so that they keep running on Android instead of being skipped there.

API

No new API surface. The only ref/ changes are [UnsupportedOSPlatform] attributes on API already approved and merged in #129846.

Validation

Built and tested on Linux x64: System.Net.NameResolution.Functional.Tests — 201 total, 0 failed, 6 skipped. The library builds clean (0 warnings) across all five target frameworks, including -browser and -wasi, and cross-compiles clean for TargetOS=android, osx and maccatalyst.

The mobile, macOS, Browser and WASI legs could not be exercised locally, so CI is the first execution there.

Note

This pull request was authored with GitHub Copilot.

The managed stub resolver added for Linux is already compiled for every
Unix-family target through the shared `-unix` target framework, so macOS,
the BSDs, iOS, tvOS and MacCatalyst all get a working DnsResolver without
any additional platform work. The tests, however, were still gated to
Windows only, and the loopback tests were excluded from mobile.
Widen the gating so the network tests run everywhere the resolver is
implemented and the loopback tests run on mobile as well, keeping the
handful of genuinely DnsQueryEx-specific tests on Windows and adding Unix
counterparts for them. The managed PAL surfaces cancellation as a plain
OperationCanceledException rather than TaskCanceledException, so the
pre-canceled token test now accepts any OperationCanceledException.
Android is the one Unix platform that cannot participate: it exposes no
readable resolver configuration (no accessible /etc/resolv.conf, and
IPInterfaceProperties.DnsAddresses throws PlatformNotSupportedException
for the same reason), so a resolver using the system-configured servers
would silently query an unreachable fallback address. Reject that up
front with PlatformNotSupportedException and annotate the affected
surface -- the parameterless DnsResolver constructor and the Dns.Resolve*
statics -- with [UnsupportedOSPlatform("android")].
DnsResolver is likewise unsupported on WASI, which is annotated too.
Browser needs no per-member attribute because the assembly already
carries an assembly-level [UnsupportedOSPlatform("browser")].
Follow-ups tracked by dotnet#132212 (Android) and dotnet#132215 (WASI).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI lite review requested due to automatic review settings August 12, 2026 16:13
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @karelz, @dotnet/ncl
See info in area-owners.md if you want to be subscribed.

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Expands System.Net.NameResolution’s DnsResolver functional test coverage beyond Windows by removing overly strict platform gating, while clarifying and enforcing the unsupported/PNSE contract on platforms where the default (system-server) resolver path cannot work.

Changes:

  • Enable DnsResolverTest network coverage on non-Android Unix platforms (and keep Browser/WASI excluded), while preserving Windows-only DnsQueryEx-specific behaviors.
  • Enable DnsResolverLoopbackTest on mobile platforms by relying on explicit loopback servers (no system resolver configuration dependency).
  • Enforce and document platform support contracts: throw early on Android when system DNS servers can’t be discovered, and annotate APIs as unsupported on Android (default constructor + Dns.Resolve*) and WASI (DnsResolver / Dns.Resolve*).

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.csBroadens test gating to run on Unix platforms where DnsResolver is implemented; adds explicit unsupported-platform and Android contract tests.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverLoopbackTest.csRemoves IsNotMobile gating so loopback-based deterministic resolver tests run on mobile where applicable.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Unsupported.csAdds clarifying comment about Browser/WASI lack of implementation and tracking issue.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Managed.csRejects Android default (system-server) configuration up front with a clear PlatformNotSupportedException.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolver.csAnnotates DnsResolver as unsupported on WASI; marks parameterless ctor unsupported on Android and documents PNSE behavior.
src/libraries/System.Net.NameResolution/src/System/Net/Dns.Resolve.csAnnotates Dns.Resolve* statics as unsupported on Android/WASI and documents PNSE contract.
src/libraries/System.Net.NameResolution/src/Resources/Strings.resxAdds a dedicated SR message for “system-configured DNS servers cannot be determined”.
src/libraries/System.Net.NameResolution/ref/System.Net.NameResolution.csUpdates public contract with [UnsupportedOSPlatform] attributes consistent with implementation.

GetServers falls back to 127.0.0.1:53 when no explicit servers are
configured and /etc/resolv.conf yields none. Record why: resolv.conf(5)
specifies that a missing file or one without nameserver entries means the
name server on the local machine is queried, so this keeps DnsResolver
consistent with getaddrinfo on the same host.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings August 13, 2026 07:37
@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated no new comments.

Suppressed comments (1)

src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.cs:56

  • The Android-specific PNSE contract is only asserted for the synchronous Dns.ResolveAddresses path. Since the change also affects the async static APIs (they route through the same default resolver), add an assertion that ResolveAddressesAsync throws PlatformNotSupportedException as well to prevent regressions specific to the async entry point.
 // Android exposes no readable resolver configuration, so a resolver that would
// have to use the system-configured servers cannot be created.
Assert.Throws<PlatformNotSupportedException>(() => new DnsResolver());
Assert.Throws<PlatformNotSupportedException>(() => Dns.ResolveAddresses(TestHost));
}

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

@rzikm

Copy link
Copy Markdown
MemberAuthor

/ba-g no NameResolution tests failed on the CI, other failures are unrelated.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rzikm@cincuranet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Enable DnsResolver tests on all Unix platforms - #132216

Merged
rzikm merged 2 commits into
dotnet:mainfrom
rzikm:dns-resolver-unix
Aug 14, 2026
Merged

Enable DnsResolver tests on all Unix platforms#132216
rzikm merged 2 commits into
dotnet:mainfrom
rzikm:dns-resolver-unix

Conversation

@rzikm

Copy link
Copy Markdown
Member

Follow-up to #129846, which added DnsResolver with a managed stub resolver implementation.

That implementation is compiled through the shared -unix target framework, which is a catch-all for every Unix-family TargetOS that has no explicit entry in TargetFrameworks. System.Net.NameResolution lists only windows;unix;browser;wasi, so macOS, the BSDs, illumos, Haiku, iOS, tvOS, MacCatalyst and Android already compile the same managed resolver as Linux — no per-platform PAL work is needed to support them. The tests were the only thing still gated to Windows.

Test gating

  • DnsResolverTest: the network tests move from IsWindows to "everywhere the resolver is implemented" (that is, everything except Android, Browser and WASI). Three tests that exercise genuinely DnsQueryEx-specific behavior stay Windows-only, and two Unix counterparts were added for the constructor-validation ones — the managed resolver talks to each server endpoint directly, so it accepts non-standard ports and mixed IPv4/IPv6 server lists that DnsQueryEx rejects.
  • DnsResolverLoopbackTest: drops IsNotMobile. These tests pass an explicit Servers list and talk to an in-process loopback server, so they never touch the system resolver configuration and can run on Android and Apple mobile.
  • DnsResolver_PreCanceledToken_ReturnsCanceled now asserts ThrowsAnyAsync<OperationCanceledException>. The managed PAL cancels via CancellationToken.ThrowIfCancellationRequested(), which produces a plain OperationCanceledException, whereas the Windows PAL produces a TaskCanceledException.

Android

Android is the one Unix platform that cannot use the system-configured servers. There is no accessible /etc/resolv.conf, and IPInterfaceProperties.DnsAddresses throws PlatformNotSupportedException there for the same reason, so ResolvConf.GetNameServers() comes back empty and GetServers() falls back to 127.0.0.1:53 — every query would silently time out against an unreachable address.

Rather than fail that way, DnsResolverPal.Managed.ValidateServers now rejects the configuration up front with PlatformNotSupportedException, and the affected surface is annotated:

  • the parameterless DnsResolver() constructor
  • all 18 Dns.Resolve* statics, which route through it

DnsResolver(DnsResolverOptions) with an explicit Servers list keeps working on Android, which is why the annotation cannot go on the type. Tracked by #132212.

Browser and WASI

DnsResolver is unsupported on both — they compile DnsResolverPal.Unsupported.cs (and on Browser the whole assembly is a generated PNSE stub). Browser needs no per-member attribute because Directory.Build.props already sets UnsupportedOSPlatforms=browser, which emits an assembly-level attribute; WASI was not covered by anything, so [UnsupportedOSPlatform("wasi")] is applied to the DnsResolver type and the Dns.Resolve* statics, following the Zstandard* precedent in System.IO.Compression.

Reusing the managed resolver on WASI is possible in principle — WASI does have TCP and UDP sockets — but it has no resolver configuration to read and no threads, so the synchronous query path (which blocks on IAsyncResult.AsyncWaitHandle.WaitOne and blocking Socket.Send/Receive) would deadlock the only thread. Tracked by #132215.

A new test asserts the PlatformNotSupportedException contract on each of Android, Browser and WASI. The argument-validation tests were switched to a resolver built with an explicit (never-contacted) server so that they keep running on Android instead of being skipped there.

API

No new API surface. The only ref/ changes are [UnsupportedOSPlatform] attributes on API already approved and merged in #129846.

Validation

Built and tested on Linux x64: System.Net.NameResolution.Functional.Tests — 201 total, 0 failed, 6 skipped. The library builds clean (0 warnings) across all five target frameworks, including -browser and -wasi, and cross-compiles clean for TargetOS=android, osx and maccatalyst.

The mobile, macOS, Browser and WASI legs could not be exercised locally, so CI is the first execution there.

Note

This pull request was authored with GitHub Copilot.

The managed stub resolver added for Linux is already compiled for every
Unix-family target through the shared `-unix` target framework, so macOS,
the BSDs, iOS, tvOS and MacCatalyst all get a working DnsResolver without
any additional platform work. The tests, however, were still gated to
Windows only, and the loopback tests were excluded from mobile.
Widen the gating so the network tests run everywhere the resolver is
implemented and the loopback tests run on mobile as well, keeping the
handful of genuinely DnsQueryEx-specific tests on Windows and adding Unix
counterparts for them. The managed PAL surfaces cancellation as a plain
OperationCanceledException rather than TaskCanceledException, so the
pre-canceled token test now accepts any OperationCanceledException.
Android is the one Unix platform that cannot participate: it exposes no
readable resolver configuration (no accessible /etc/resolv.conf, and
IPInterfaceProperties.DnsAddresses throws PlatformNotSupportedException
for the same reason), so a resolver using the system-configured servers
would silently query an unreachable fallback address. Reject that up
front with PlatformNotSupportedException and annotate the affected
surface -- the parameterless DnsResolver constructor and the Dns.Resolve*
statics -- with [UnsupportedOSPlatform("android")].
DnsResolver is likewise unsupported on WASI, which is annotated too.
Browser needs no per-member attribute because the assembly already
carries an assembly-level [UnsupportedOSPlatform("browser")].
Follow-ups tracked by dotnet#132212 (Android) and dotnet#132215 (WASI).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI lite review requested due to automatic review settings August 12, 2026 16:13
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @karelz, @dotnet/ncl
See info in area-owners.md if you want to be subscribed.

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Expands System.Net.NameResolution’s DnsResolver functional test coverage beyond Windows by removing overly strict platform gating, while clarifying and enforcing the unsupported/PNSE contract on platforms where the default (system-server) resolver path cannot work.

Changes:

  • Enable DnsResolverTest network coverage on non-Android Unix platforms (and keep Browser/WASI excluded), while preserving Windows-only DnsQueryEx-specific behaviors.
  • Enable DnsResolverLoopbackTest on mobile platforms by relying on explicit loopback servers (no system resolver configuration dependency).
  • Enforce and document platform support contracts: throw early on Android when system DNS servers can’t be discovered, and annotate APIs as unsupported on Android (default constructor + Dns.Resolve*) and WASI (DnsResolver / Dns.Resolve*).

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.csBroadens test gating to run on Unix platforms where DnsResolver is implemented; adds explicit unsupported-platform and Android contract tests.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverLoopbackTest.csRemoves IsNotMobile gating so loopback-based deterministic resolver tests run on mobile where applicable.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Unsupported.csAdds clarifying comment about Browser/WASI lack of implementation and tracking issue.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Managed.csRejects Android default (system-server) configuration up front with a clear PlatformNotSupportedException.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolver.csAnnotates DnsResolver as unsupported on WASI; marks parameterless ctor unsupported on Android and documents PNSE behavior.
src/libraries/System.Net.NameResolution/src/System/Net/Dns.Resolve.csAnnotates Dns.Resolve* statics as unsupported on Android/WASI and documents PNSE contract.
src/libraries/System.Net.NameResolution/src/Resources/Strings.resxAdds a dedicated SR message for “system-configured DNS servers cannot be determined”.
src/libraries/System.Net.NameResolution/ref/System.Net.NameResolution.csUpdates public contract with [UnsupportedOSPlatform] attributes consistent with implementation.

GetServers falls back to 127.0.0.1:53 when no explicit servers are
configured and /etc/resolv.conf yields none. Record why: resolv.conf(5)
specifies that a missing file or one without nameserver entries means the
name server on the local machine is queried, so this keeps DnsResolver
consistent with getaddrinfo on the same host.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings August 13, 2026 07:37
@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated no new comments.

Suppressed comments (1)

src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.cs:56

  • The Android-specific PNSE contract is only asserted for the synchronous Dns.ResolveAddresses path. Since the change also affects the async static APIs (they route through the same default resolver), add an assertion that ResolveAddressesAsync throws PlatformNotSupportedException as well to prevent regressions specific to the async entry point.
 // Android exposes no readable resolver configuration, so a resolver that would
// have to use the system-configured servers cannot be created.
Assert.Throws<PlatformNotSupportedException>(() => new DnsResolver());
Assert.Throws<PlatformNotSupportedException>(() => Dns.ResolveAddresses(TestHost));
}

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

@rzikm

Copy link
Copy Markdown
MemberAuthor

/ba-g no NameResolution tests failed on the CI, other failures are unrelated.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rzikm@cincuranet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Enable DnsResolver tests on all Unix platforms - #132216

Merged
rzikm merged 2 commits into
dotnet:mainfrom
rzikm:dns-resolver-unix
Aug 14, 2026
Merged

Enable DnsResolver tests on all Unix platforms#132216
rzikm merged 2 commits into
dotnet:mainfrom
rzikm:dns-resolver-unix

Conversation

@rzikm

Copy link
Copy Markdown
Member

Follow-up to #129846, which added DnsResolver with a managed stub resolver implementation.

That implementation is compiled through the shared -unix target framework, which is a catch-all for every Unix-family TargetOS that has no explicit entry in TargetFrameworks. System.Net.NameResolution lists only windows;unix;browser;wasi, so macOS, the BSDs, illumos, Haiku, iOS, tvOS, MacCatalyst and Android already compile the same managed resolver as Linux — no per-platform PAL work is needed to support them. The tests were the only thing still gated to Windows.

Test gating

  • DnsResolverTest: the network tests move from IsWindows to "everywhere the resolver is implemented" (that is, everything except Android, Browser and WASI). Three tests that exercise genuinely DnsQueryEx-specific behavior stay Windows-only, and two Unix counterparts were added for the constructor-validation ones — the managed resolver talks to each server endpoint directly, so it accepts non-standard ports and mixed IPv4/IPv6 server lists that DnsQueryEx rejects.
  • DnsResolverLoopbackTest: drops IsNotMobile. These tests pass an explicit Servers list and talk to an in-process loopback server, so they never touch the system resolver configuration and can run on Android and Apple mobile.
  • DnsResolver_PreCanceledToken_ReturnsCanceled now asserts ThrowsAnyAsync<OperationCanceledException>. The managed PAL cancels via CancellationToken.ThrowIfCancellationRequested(), which produces a plain OperationCanceledException, whereas the Windows PAL produces a TaskCanceledException.

Android

Android is the one Unix platform that cannot use the system-configured servers. There is no accessible /etc/resolv.conf, and IPInterfaceProperties.DnsAddresses throws PlatformNotSupportedException there for the same reason, so ResolvConf.GetNameServers() comes back empty and GetServers() falls back to 127.0.0.1:53 — every query would silently time out against an unreachable address.

Rather than fail that way, DnsResolverPal.Managed.ValidateServers now rejects the configuration up front with PlatformNotSupportedException, and the affected surface is annotated:

  • the parameterless DnsResolver() constructor
  • all 18 Dns.Resolve* statics, which route through it

DnsResolver(DnsResolverOptions) with an explicit Servers list keeps working on Android, which is why the annotation cannot go on the type. Tracked by #132212.

Browser and WASI

DnsResolver is unsupported on both — they compile DnsResolverPal.Unsupported.cs (and on Browser the whole assembly is a generated PNSE stub). Browser needs no per-member attribute because Directory.Build.props already sets UnsupportedOSPlatforms=browser, which emits an assembly-level attribute; WASI was not covered by anything, so [UnsupportedOSPlatform("wasi")] is applied to the DnsResolver type and the Dns.Resolve* statics, following the Zstandard* precedent in System.IO.Compression.

Reusing the managed resolver on WASI is possible in principle — WASI does have TCP and UDP sockets — but it has no resolver configuration to read and no threads, so the synchronous query path (which blocks on IAsyncResult.AsyncWaitHandle.WaitOne and blocking Socket.Send/Receive) would deadlock the only thread. Tracked by #132215.

A new test asserts the PlatformNotSupportedException contract on each of Android, Browser and WASI. The argument-validation tests were switched to a resolver built with an explicit (never-contacted) server so that they keep running on Android instead of being skipped there.

API

No new API surface. The only ref/ changes are [UnsupportedOSPlatform] attributes on API already approved and merged in #129846.

Validation

Built and tested on Linux x64: System.Net.NameResolution.Functional.Tests — 201 total, 0 failed, 6 skipped. The library builds clean (0 warnings) across all five target frameworks, including -browser and -wasi, and cross-compiles clean for TargetOS=android, osx and maccatalyst.

The mobile, macOS, Browser and WASI legs could not be exercised locally, so CI is the first execution there.

Note

This pull request was authored with GitHub Copilot.

The managed stub resolver added for Linux is already compiled for every
Unix-family target through the shared `-unix` target framework, so macOS,
the BSDs, iOS, tvOS and MacCatalyst all get a working DnsResolver without
any additional platform work. The tests, however, were still gated to
Windows only, and the loopback tests were excluded from mobile.
Widen the gating so the network tests run everywhere the resolver is
implemented and the loopback tests run on mobile as well, keeping the
handful of genuinely DnsQueryEx-specific tests on Windows and adding Unix
counterparts for them. The managed PAL surfaces cancellation as a plain
OperationCanceledException rather than TaskCanceledException, so the
pre-canceled token test now accepts any OperationCanceledException.
Android is the one Unix platform that cannot participate: it exposes no
readable resolver configuration (no accessible /etc/resolv.conf, and
IPInterfaceProperties.DnsAddresses throws PlatformNotSupportedException
for the same reason), so a resolver using the system-configured servers
would silently query an unreachable fallback address. Reject that up
front with PlatformNotSupportedException and annotate the affected
surface -- the parameterless DnsResolver constructor and the Dns.Resolve*
statics -- with [UnsupportedOSPlatform("android")].
DnsResolver is likewise unsupported on WASI, which is annotated too.
Browser needs no per-member attribute because the assembly already
carries an assembly-level [UnsupportedOSPlatform("browser")].
Follow-ups tracked by dotnet#132212 (Android) and dotnet#132215 (WASI).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI lite review requested due to automatic review settings August 12, 2026 16:13
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @karelz, @dotnet/ncl
See info in area-owners.md if you want to be subscribed.

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Expands System.Net.NameResolution’s DnsResolver functional test coverage beyond Windows by removing overly strict platform gating, while clarifying and enforcing the unsupported/PNSE contract on platforms where the default (system-server) resolver path cannot work.

Changes:

  • Enable DnsResolverTest network coverage on non-Android Unix platforms (and keep Browser/WASI excluded), while preserving Windows-only DnsQueryEx-specific behaviors.
  • Enable DnsResolverLoopbackTest on mobile platforms by relying on explicit loopback servers (no system resolver configuration dependency).
  • Enforce and document platform support contracts: throw early on Android when system DNS servers can’t be discovered, and annotate APIs as unsupported on Android (default constructor + Dns.Resolve*) and WASI (DnsResolver / Dns.Resolve*).

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.csBroadens test gating to run on Unix platforms where DnsResolver is implemented; adds explicit unsupported-platform and Android contract tests.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverLoopbackTest.csRemoves IsNotMobile gating so loopback-based deterministic resolver tests run on mobile where applicable.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Unsupported.csAdds clarifying comment about Browser/WASI lack of implementation and tracking issue.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Managed.csRejects Android default (system-server) configuration up front with a clear PlatformNotSupportedException.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolver.csAnnotates DnsResolver as unsupported on WASI; marks parameterless ctor unsupported on Android and documents PNSE behavior.
src/libraries/System.Net.NameResolution/src/System/Net/Dns.Resolve.csAnnotates Dns.Resolve* statics as unsupported on Android/WASI and documents PNSE contract.
src/libraries/System.Net.NameResolution/src/Resources/Strings.resxAdds a dedicated SR message for “system-configured DNS servers cannot be determined”.
src/libraries/System.Net.NameResolution/ref/System.Net.NameResolution.csUpdates public contract with [UnsupportedOSPlatform] attributes consistent with implementation.

GetServers falls back to 127.0.0.1:53 when no explicit servers are
configured and /etc/resolv.conf yields none. Record why: resolv.conf(5)
specifies that a missing file or one without nameserver entries means the
name server on the local machine is queried, so this keeps DnsResolver
consistent with getaddrinfo on the same host.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings August 13, 2026 07:37
@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated no new comments.

Suppressed comments (1)

src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.cs:56

  • The Android-specific PNSE contract is only asserted for the synchronous Dns.ResolveAddresses path. Since the change also affects the async static APIs (they route through the same default resolver), add an assertion that ResolveAddressesAsync throws PlatformNotSupportedException as well to prevent regressions specific to the async entry point.
 // Android exposes no readable resolver configuration, so a resolver that would
// have to use the system-configured servers cannot be created.
Assert.Throws<PlatformNotSupportedException>(() => new DnsResolver());
Assert.Throws<PlatformNotSupportedException>(() => Dns.ResolveAddresses(TestHost));
}

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

@rzikm

Copy link
Copy Markdown
MemberAuthor

/ba-g no NameResolution tests failed on the CI, other failures are unrelated.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rzikm@cincuranet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Enable DnsResolver tests on all Unix platforms - #132216

Merged
rzikm merged 2 commits into
dotnet:mainfrom
rzikm:dns-resolver-unix
Aug 14, 2026
Merged

Enable DnsResolver tests on all Unix platforms#132216
rzikm merged 2 commits into
dotnet:mainfrom
rzikm:dns-resolver-unix

Conversation

@rzikm

Copy link
Copy Markdown
Member

Follow-up to #129846, which added DnsResolver with a managed stub resolver implementation.

That implementation is compiled through the shared -unix target framework, which is a catch-all for every Unix-family TargetOS that has no explicit entry in TargetFrameworks. System.Net.NameResolution lists only windows;unix;browser;wasi, so macOS, the BSDs, illumos, Haiku, iOS, tvOS, MacCatalyst and Android already compile the same managed resolver as Linux — no per-platform PAL work is needed to support them. The tests were the only thing still gated to Windows.

Test gating

  • DnsResolverTest: the network tests move from IsWindows to "everywhere the resolver is implemented" (that is, everything except Android, Browser and WASI). Three tests that exercise genuinely DnsQueryEx-specific behavior stay Windows-only, and two Unix counterparts were added for the constructor-validation ones — the managed resolver talks to each server endpoint directly, so it accepts non-standard ports and mixed IPv4/IPv6 server lists that DnsQueryEx rejects.
  • DnsResolverLoopbackTest: drops IsNotMobile. These tests pass an explicit Servers list and talk to an in-process loopback server, so they never touch the system resolver configuration and can run on Android and Apple mobile.
  • DnsResolver_PreCanceledToken_ReturnsCanceled now asserts ThrowsAnyAsync<OperationCanceledException>. The managed PAL cancels via CancellationToken.ThrowIfCancellationRequested(), which produces a plain OperationCanceledException, whereas the Windows PAL produces a TaskCanceledException.

Android

Android is the one Unix platform that cannot use the system-configured servers. There is no accessible /etc/resolv.conf, and IPInterfaceProperties.DnsAddresses throws PlatformNotSupportedException there for the same reason, so ResolvConf.GetNameServers() comes back empty and GetServers() falls back to 127.0.0.1:53 — every query would silently time out against an unreachable address.

Rather than fail that way, DnsResolverPal.Managed.ValidateServers now rejects the configuration up front with PlatformNotSupportedException, and the affected surface is annotated:

  • the parameterless DnsResolver() constructor
  • all 18 Dns.Resolve* statics, which route through it

DnsResolver(DnsResolverOptions) with an explicit Servers list keeps working on Android, which is why the annotation cannot go on the type. Tracked by #132212.

Browser and WASI

DnsResolver is unsupported on both — they compile DnsResolverPal.Unsupported.cs (and on Browser the whole assembly is a generated PNSE stub). Browser needs no per-member attribute because Directory.Build.props already sets UnsupportedOSPlatforms=browser, which emits an assembly-level attribute; WASI was not covered by anything, so [UnsupportedOSPlatform("wasi")] is applied to the DnsResolver type and the Dns.Resolve* statics, following the Zstandard* precedent in System.IO.Compression.

Reusing the managed resolver on WASI is possible in principle — WASI does have TCP and UDP sockets — but it has no resolver configuration to read and no threads, so the synchronous query path (which blocks on IAsyncResult.AsyncWaitHandle.WaitOne and blocking Socket.Send/Receive) would deadlock the only thread. Tracked by #132215.

A new test asserts the PlatformNotSupportedException contract on each of Android, Browser and WASI. The argument-validation tests were switched to a resolver built with an explicit (never-contacted) server so that they keep running on Android instead of being skipped there.

API

No new API surface. The only ref/ changes are [UnsupportedOSPlatform] attributes on API already approved and merged in #129846.

Validation

Built and tested on Linux x64: System.Net.NameResolution.Functional.Tests — 201 total, 0 failed, 6 skipped. The library builds clean (0 warnings) across all five target frameworks, including -browser and -wasi, and cross-compiles clean for TargetOS=android, osx and maccatalyst.

The mobile, macOS, Browser and WASI legs could not be exercised locally, so CI is the first execution there.

Note

This pull request was authored with GitHub Copilot.

The managed stub resolver added for Linux is already compiled for every
Unix-family target through the shared `-unix` target framework, so macOS,
the BSDs, iOS, tvOS and MacCatalyst all get a working DnsResolver without
any additional platform work. The tests, however, were still gated to
Windows only, and the loopback tests were excluded from mobile.
Widen the gating so the network tests run everywhere the resolver is
implemented and the loopback tests run on mobile as well, keeping the
handful of genuinely DnsQueryEx-specific tests on Windows and adding Unix
counterparts for them. The managed PAL surfaces cancellation as a plain
OperationCanceledException rather than TaskCanceledException, so the
pre-canceled token test now accepts any OperationCanceledException.
Android is the one Unix platform that cannot participate: it exposes no
readable resolver configuration (no accessible /etc/resolv.conf, and
IPInterfaceProperties.DnsAddresses throws PlatformNotSupportedException
for the same reason), so a resolver using the system-configured servers
would silently query an unreachable fallback address. Reject that up
front with PlatformNotSupportedException and annotate the affected
surface -- the parameterless DnsResolver constructor and the Dns.Resolve*
statics -- with [UnsupportedOSPlatform("android")].
DnsResolver is likewise unsupported on WASI, which is annotated too.
Browser needs no per-member attribute because the assembly already
carries an assembly-level [UnsupportedOSPlatform("browser")].
Follow-ups tracked by dotnet#132212 (Android) and dotnet#132215 (WASI).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI lite review requested due to automatic review settings August 12, 2026 16:13
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @karelz, @dotnet/ncl
See info in area-owners.md if you want to be subscribed.

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Expands System.Net.NameResolution’s DnsResolver functional test coverage beyond Windows by removing overly strict platform gating, while clarifying and enforcing the unsupported/PNSE contract on platforms where the default (system-server) resolver path cannot work.

Changes:

  • Enable DnsResolverTest network coverage on non-Android Unix platforms (and keep Browser/WASI excluded), while preserving Windows-only DnsQueryEx-specific behaviors.
  • Enable DnsResolverLoopbackTest on mobile platforms by relying on explicit loopback servers (no system resolver configuration dependency).
  • Enforce and document platform support contracts: throw early on Android when system DNS servers can’t be discovered, and annotate APIs as unsupported on Android (default constructor + Dns.Resolve*) and WASI (DnsResolver / Dns.Resolve*).

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.csBroadens test gating to run on Unix platforms where DnsResolver is implemented; adds explicit unsupported-platform and Android contract tests.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverLoopbackTest.csRemoves IsNotMobile gating so loopback-based deterministic resolver tests run on mobile where applicable.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Unsupported.csAdds clarifying comment about Browser/WASI lack of implementation and tracking issue.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Managed.csRejects Android default (system-server) configuration up front with a clear PlatformNotSupportedException.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolver.csAnnotates DnsResolver as unsupported on WASI; marks parameterless ctor unsupported on Android and documents PNSE behavior.
src/libraries/System.Net.NameResolution/src/System/Net/Dns.Resolve.csAnnotates Dns.Resolve* statics as unsupported on Android/WASI and documents PNSE contract.
src/libraries/System.Net.NameResolution/src/Resources/Strings.resxAdds a dedicated SR message for “system-configured DNS servers cannot be determined”.
src/libraries/System.Net.NameResolution/ref/System.Net.NameResolution.csUpdates public contract with [UnsupportedOSPlatform] attributes consistent with implementation.

GetServers falls back to 127.0.0.1:53 when no explicit servers are
configured and /etc/resolv.conf yields none. Record why: resolv.conf(5)
specifies that a missing file or one without nameserver entries means the
name server on the local machine is queried, so this keeps DnsResolver
consistent with getaddrinfo on the same host.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings August 13, 2026 07:37
@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated no new comments.

Suppressed comments (1)

src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.cs:56

  • The Android-specific PNSE contract is only asserted for the synchronous Dns.ResolveAddresses path. Since the change also affects the async static APIs (they route through the same default resolver), add an assertion that ResolveAddressesAsync throws PlatformNotSupportedException as well to prevent regressions specific to the async entry point.
 // Android exposes no readable resolver configuration, so a resolver that would
// have to use the system-configured servers cannot be created.
Assert.Throws<PlatformNotSupportedException>(() => new DnsResolver());
Assert.Throws<PlatformNotSupportedException>(() => Dns.ResolveAddresses(TestHost));
}

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

@rzikm

Copy link
Copy Markdown
MemberAuthor

/ba-g no NameResolution tests failed on the CI, other failures are unrelated.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rzikm@cincuranet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Enable DnsResolver tests on all Unix platforms - #132216

Merged
rzikm merged 2 commits into
dotnet:mainfrom
rzikm:dns-resolver-unix
Aug 14, 2026
Merged

Enable DnsResolver tests on all Unix platforms#132216
rzikm merged 2 commits into
dotnet:mainfrom
rzikm:dns-resolver-unix

Conversation

@rzikm

Copy link
Copy Markdown
Member

Follow-up to #129846, which added DnsResolver with a managed stub resolver implementation.

That implementation is compiled through the shared -unix target framework, which is a catch-all for every Unix-family TargetOS that has no explicit entry in TargetFrameworks. System.Net.NameResolution lists only windows;unix;browser;wasi, so macOS, the BSDs, illumos, Haiku, iOS, tvOS, MacCatalyst and Android already compile the same managed resolver as Linux — no per-platform PAL work is needed to support them. The tests were the only thing still gated to Windows.

Test gating

  • DnsResolverTest: the network tests move from IsWindows to "everywhere the resolver is implemented" (that is, everything except Android, Browser and WASI). Three tests that exercise genuinely DnsQueryEx-specific behavior stay Windows-only, and two Unix counterparts were added for the constructor-validation ones — the managed resolver talks to each server endpoint directly, so it accepts non-standard ports and mixed IPv4/IPv6 server lists that DnsQueryEx rejects.
  • DnsResolverLoopbackTest: drops IsNotMobile. These tests pass an explicit Servers list and talk to an in-process loopback server, so they never touch the system resolver configuration and can run on Android and Apple mobile.
  • DnsResolver_PreCanceledToken_ReturnsCanceled now asserts ThrowsAnyAsync<OperationCanceledException>. The managed PAL cancels via CancellationToken.ThrowIfCancellationRequested(), which produces a plain OperationCanceledException, whereas the Windows PAL produces a TaskCanceledException.

Android

Android is the one Unix platform that cannot use the system-configured servers. There is no accessible /etc/resolv.conf, and IPInterfaceProperties.DnsAddresses throws PlatformNotSupportedException there for the same reason, so ResolvConf.GetNameServers() comes back empty and GetServers() falls back to 127.0.0.1:53 — every query would silently time out against an unreachable address.

Rather than fail that way, DnsResolverPal.Managed.ValidateServers now rejects the configuration up front with PlatformNotSupportedException, and the affected surface is annotated:

  • the parameterless DnsResolver() constructor
  • all 18 Dns.Resolve* statics, which route through it

DnsResolver(DnsResolverOptions) with an explicit Servers list keeps working on Android, which is why the annotation cannot go on the type. Tracked by #132212.

Browser and WASI

DnsResolver is unsupported on both — they compile DnsResolverPal.Unsupported.cs (and on Browser the whole assembly is a generated PNSE stub). Browser needs no per-member attribute because Directory.Build.props already sets UnsupportedOSPlatforms=browser, which emits an assembly-level attribute; WASI was not covered by anything, so [UnsupportedOSPlatform("wasi")] is applied to the DnsResolver type and the Dns.Resolve* statics, following the Zstandard* precedent in System.IO.Compression.

Reusing the managed resolver on WASI is possible in principle — WASI does have TCP and UDP sockets — but it has no resolver configuration to read and no threads, so the synchronous query path (which blocks on IAsyncResult.AsyncWaitHandle.WaitOne and blocking Socket.Send/Receive) would deadlock the only thread. Tracked by #132215.

A new test asserts the PlatformNotSupportedException contract on each of Android, Browser and WASI. The argument-validation tests were switched to a resolver built with an explicit (never-contacted) server so that they keep running on Android instead of being skipped there.

API

No new API surface. The only ref/ changes are [UnsupportedOSPlatform] attributes on API already approved and merged in #129846.

Validation

Built and tested on Linux x64: System.Net.NameResolution.Functional.Tests — 201 total, 0 failed, 6 skipped. The library builds clean (0 warnings) across all five target frameworks, including -browser and -wasi, and cross-compiles clean for TargetOS=android, osx and maccatalyst.

The mobile, macOS, Browser and WASI legs could not be exercised locally, so CI is the first execution there.

Note

This pull request was authored with GitHub Copilot.

The managed stub resolver added for Linux is already compiled for every
Unix-family target through the shared `-unix` target framework, so macOS,
the BSDs, iOS, tvOS and MacCatalyst all get a working DnsResolver without
any additional platform work. The tests, however, were still gated to
Windows only, and the loopback tests were excluded from mobile.
Widen the gating so the network tests run everywhere the resolver is
implemented and the loopback tests run on mobile as well, keeping the
handful of genuinely DnsQueryEx-specific tests on Windows and adding Unix
counterparts for them. The managed PAL surfaces cancellation as a plain
OperationCanceledException rather than TaskCanceledException, so the
pre-canceled token test now accepts any OperationCanceledException.
Android is the one Unix platform that cannot participate: it exposes no
readable resolver configuration (no accessible /etc/resolv.conf, and
IPInterfaceProperties.DnsAddresses throws PlatformNotSupportedException
for the same reason), so a resolver using the system-configured servers
would silently query an unreachable fallback address. Reject that up
front with PlatformNotSupportedException and annotate the affected
surface -- the parameterless DnsResolver constructor and the Dns.Resolve*
statics -- with [UnsupportedOSPlatform("android")].
DnsResolver is likewise unsupported on WASI, which is annotated too.
Browser needs no per-member attribute because the assembly already
carries an assembly-level [UnsupportedOSPlatform("browser")].
Follow-ups tracked by dotnet#132212 (Android) and dotnet#132215 (WASI).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI lite review requested due to automatic review settings August 12, 2026 16:13
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @karelz, @dotnet/ncl
See info in area-owners.md if you want to be subscribed.

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Expands System.Net.NameResolution’s DnsResolver functional test coverage beyond Windows by removing overly strict platform gating, while clarifying and enforcing the unsupported/PNSE contract on platforms where the default (system-server) resolver path cannot work.

Changes:

  • Enable DnsResolverTest network coverage on non-Android Unix platforms (and keep Browser/WASI excluded), while preserving Windows-only DnsQueryEx-specific behaviors.
  • Enable DnsResolverLoopbackTest on mobile platforms by relying on explicit loopback servers (no system resolver configuration dependency).
  • Enforce and document platform support contracts: throw early on Android when system DNS servers can’t be discovered, and annotate APIs as unsupported on Android (default constructor + Dns.Resolve*) and WASI (DnsResolver / Dns.Resolve*).

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.csBroadens test gating to run on Unix platforms where DnsResolver is implemented; adds explicit unsupported-platform and Android contract tests.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverLoopbackTest.csRemoves IsNotMobile gating so loopback-based deterministic resolver tests run on mobile where applicable.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Unsupported.csAdds clarifying comment about Browser/WASI lack of implementation and tracking issue.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Managed.csRejects Android default (system-server) configuration up front with a clear PlatformNotSupportedException.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolver.csAnnotates DnsResolver as unsupported on WASI; marks parameterless ctor unsupported on Android and documents PNSE behavior.
src/libraries/System.Net.NameResolution/src/System/Net/Dns.Resolve.csAnnotates Dns.Resolve* statics as unsupported on Android/WASI and documents PNSE contract.
src/libraries/System.Net.NameResolution/src/Resources/Strings.resxAdds a dedicated SR message for “system-configured DNS servers cannot be determined”.
src/libraries/System.Net.NameResolution/ref/System.Net.NameResolution.csUpdates public contract with [UnsupportedOSPlatform] attributes consistent with implementation.

GetServers falls back to 127.0.0.1:53 when no explicit servers are
configured and /etc/resolv.conf yields none. Record why: resolv.conf(5)
specifies that a missing file or one without nameserver entries means the
name server on the local machine is queried, so this keeps DnsResolver
consistent with getaddrinfo on the same host.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings August 13, 2026 07:37
@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated no new comments.

Suppressed comments (1)

src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.cs:56

  • The Android-specific PNSE contract is only asserted for the synchronous Dns.ResolveAddresses path. Since the change also affects the async static APIs (they route through the same default resolver), add an assertion that ResolveAddressesAsync throws PlatformNotSupportedException as well to prevent regressions specific to the async entry point.
 // Android exposes no readable resolver configuration, so a resolver that would
// have to use the system-configured servers cannot be created.
Assert.Throws<PlatformNotSupportedException>(() => new DnsResolver());
Assert.Throws<PlatformNotSupportedException>(() => Dns.ResolveAddresses(TestHost));
}

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

@rzikm

Copy link
Copy Markdown
MemberAuthor

/ba-g no NameResolution tests failed on the CI, other failures are unrelated.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rzikm@cincuranet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Enable DnsResolver tests on all Unix platforms - #132216

Merged
rzikm merged 2 commits into
dotnet:mainfrom
rzikm:dns-resolver-unix
Aug 14, 2026
Merged

Enable DnsResolver tests on all Unix platforms#132216
rzikm merged 2 commits into
dotnet:mainfrom
rzikm:dns-resolver-unix

Conversation

@rzikm

Copy link
Copy Markdown
Member

Follow-up to #129846, which added DnsResolver with a managed stub resolver implementation.

That implementation is compiled through the shared -unix target framework, which is a catch-all for every Unix-family TargetOS that has no explicit entry in TargetFrameworks. System.Net.NameResolution lists only windows;unix;browser;wasi, so macOS, the BSDs, illumos, Haiku, iOS, tvOS, MacCatalyst and Android already compile the same managed resolver as Linux — no per-platform PAL work is needed to support them. The tests were the only thing still gated to Windows.

Test gating

  • DnsResolverTest: the network tests move from IsWindows to "everywhere the resolver is implemented" (that is, everything except Android, Browser and WASI). Three tests that exercise genuinely DnsQueryEx-specific behavior stay Windows-only, and two Unix counterparts were added for the constructor-validation ones — the managed resolver talks to each server endpoint directly, so it accepts non-standard ports and mixed IPv4/IPv6 server lists that DnsQueryEx rejects.
  • DnsResolverLoopbackTest: drops IsNotMobile. These tests pass an explicit Servers list and talk to an in-process loopback server, so they never touch the system resolver configuration and can run on Android and Apple mobile.
  • DnsResolver_PreCanceledToken_ReturnsCanceled now asserts ThrowsAnyAsync<OperationCanceledException>. The managed PAL cancels via CancellationToken.ThrowIfCancellationRequested(), which produces a plain OperationCanceledException, whereas the Windows PAL produces a TaskCanceledException.

Android

Android is the one Unix platform that cannot use the system-configured servers. There is no accessible /etc/resolv.conf, and IPInterfaceProperties.DnsAddresses throws PlatformNotSupportedException there for the same reason, so ResolvConf.GetNameServers() comes back empty and GetServers() falls back to 127.0.0.1:53 — every query would silently time out against an unreachable address.

Rather than fail that way, DnsResolverPal.Managed.ValidateServers now rejects the configuration up front with PlatformNotSupportedException, and the affected surface is annotated:

  • the parameterless DnsResolver() constructor
  • all 18 Dns.Resolve* statics, which route through it

DnsResolver(DnsResolverOptions) with an explicit Servers list keeps working on Android, which is why the annotation cannot go on the type. Tracked by #132212.

Browser and WASI

DnsResolver is unsupported on both — they compile DnsResolverPal.Unsupported.cs (and on Browser the whole assembly is a generated PNSE stub). Browser needs no per-member attribute because Directory.Build.props already sets UnsupportedOSPlatforms=browser, which emits an assembly-level attribute; WASI was not covered by anything, so [UnsupportedOSPlatform("wasi")] is applied to the DnsResolver type and the Dns.Resolve* statics, following the Zstandard* precedent in System.IO.Compression.

Reusing the managed resolver on WASI is possible in principle — WASI does have TCP and UDP sockets — but it has no resolver configuration to read and no threads, so the synchronous query path (which blocks on IAsyncResult.AsyncWaitHandle.WaitOne and blocking Socket.Send/Receive) would deadlock the only thread. Tracked by #132215.

A new test asserts the PlatformNotSupportedException contract on each of Android, Browser and WASI. The argument-validation tests were switched to a resolver built with an explicit (never-contacted) server so that they keep running on Android instead of being skipped there.

API

No new API surface. The only ref/ changes are [UnsupportedOSPlatform] attributes on API already approved and merged in #129846.

Validation

Built and tested on Linux x64: System.Net.NameResolution.Functional.Tests — 201 total, 0 failed, 6 skipped. The library builds clean (0 warnings) across all five target frameworks, including -browser and -wasi, and cross-compiles clean for TargetOS=android, osx and maccatalyst.

The mobile, macOS, Browser and WASI legs could not be exercised locally, so CI is the first execution there.

Note

This pull request was authored with GitHub Copilot.

The managed stub resolver added for Linux is already compiled for every
Unix-family target through the shared `-unix` target framework, so macOS,
the BSDs, iOS, tvOS and MacCatalyst all get a working DnsResolver without
any additional platform work. The tests, however, were still gated to
Windows only, and the loopback tests were excluded from mobile.
Widen the gating so the network tests run everywhere the resolver is
implemented and the loopback tests run on mobile as well, keeping the
handful of genuinely DnsQueryEx-specific tests on Windows and adding Unix
counterparts for them. The managed PAL surfaces cancellation as a plain
OperationCanceledException rather than TaskCanceledException, so the
pre-canceled token test now accepts any OperationCanceledException.
Android is the one Unix platform that cannot participate: it exposes no
readable resolver configuration (no accessible /etc/resolv.conf, and
IPInterfaceProperties.DnsAddresses throws PlatformNotSupportedException
for the same reason), so a resolver using the system-configured servers
would silently query an unreachable fallback address. Reject that up
front with PlatformNotSupportedException and annotate the affected
surface -- the parameterless DnsResolver constructor and the Dns.Resolve*
statics -- with [UnsupportedOSPlatform("android")].
DnsResolver is likewise unsupported on WASI, which is annotated too.
Browser needs no per-member attribute because the assembly already
carries an assembly-level [UnsupportedOSPlatform("browser")].
Follow-ups tracked by dotnet#132212 (Android) and dotnet#132215 (WASI).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI lite review requested due to automatic review settings August 12, 2026 16:13
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @karelz, @dotnet/ncl
See info in area-owners.md if you want to be subscribed.

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Expands System.Net.NameResolution’s DnsResolver functional test coverage beyond Windows by removing overly strict platform gating, while clarifying and enforcing the unsupported/PNSE contract on platforms where the default (system-server) resolver path cannot work.

Changes:

  • Enable DnsResolverTest network coverage on non-Android Unix platforms (and keep Browser/WASI excluded), while preserving Windows-only DnsQueryEx-specific behaviors.
  • Enable DnsResolverLoopbackTest on mobile platforms by relying on explicit loopback servers (no system resolver configuration dependency).
  • Enforce and document platform support contracts: throw early on Android when system DNS servers can’t be discovered, and annotate APIs as unsupported on Android (default constructor + Dns.Resolve*) and WASI (DnsResolver / Dns.Resolve*).

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.csBroadens test gating to run on Unix platforms where DnsResolver is implemented; adds explicit unsupported-platform and Android contract tests.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverLoopbackTest.csRemoves IsNotMobile gating so loopback-based deterministic resolver tests run on mobile where applicable.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Unsupported.csAdds clarifying comment about Browser/WASI lack of implementation and tracking issue.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Managed.csRejects Android default (system-server) configuration up front with a clear PlatformNotSupportedException.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolver.csAnnotates DnsResolver as unsupported on WASI; marks parameterless ctor unsupported on Android and documents PNSE behavior.
src/libraries/System.Net.NameResolution/src/System/Net/Dns.Resolve.csAnnotates Dns.Resolve* statics as unsupported on Android/WASI and documents PNSE contract.
src/libraries/System.Net.NameResolution/src/Resources/Strings.resxAdds a dedicated SR message for “system-configured DNS servers cannot be determined”.
src/libraries/System.Net.NameResolution/ref/System.Net.NameResolution.csUpdates public contract with [UnsupportedOSPlatform] attributes consistent with implementation.

GetServers falls back to 127.0.0.1:53 when no explicit servers are
configured and /etc/resolv.conf yields none. Record why: resolv.conf(5)
specifies that a missing file or one without nameserver entries means the
name server on the local machine is queried, so this keeps DnsResolver
consistent with getaddrinfo on the same host.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings August 13, 2026 07:37
@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated no new comments.

Suppressed comments (1)

src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.cs:56

  • The Android-specific PNSE contract is only asserted for the synchronous Dns.ResolveAddresses path. Since the change also affects the async static APIs (they route through the same default resolver), add an assertion that ResolveAddressesAsync throws PlatformNotSupportedException as well to prevent regressions specific to the async entry point.
 // Android exposes no readable resolver configuration, so a resolver that would
// have to use the system-configured servers cannot be created.
Assert.Throws<PlatformNotSupportedException>(() => new DnsResolver());
Assert.Throws<PlatformNotSupportedException>(() => Dns.ResolveAddresses(TestHost));
}

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

@rzikm

Copy link
Copy Markdown
MemberAuthor

/ba-g no NameResolution tests failed on the CI, other failures are unrelated.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rzikm@cincuranet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Enable DnsResolver tests on all Unix platforms - #132216

Merged
rzikm merged 2 commits into
dotnet:mainfrom
rzikm:dns-resolver-unix
Aug 14, 2026
Merged

Enable DnsResolver tests on all Unix platforms#132216
rzikm merged 2 commits into
dotnet:mainfrom
rzikm:dns-resolver-unix

Conversation

@rzikm

Copy link
Copy Markdown
Member

Follow-up to #129846, which added DnsResolver with a managed stub resolver implementation.

That implementation is compiled through the shared -unix target framework, which is a catch-all for every Unix-family TargetOS that has no explicit entry in TargetFrameworks. System.Net.NameResolution lists only windows;unix;browser;wasi, so macOS, the BSDs, illumos, Haiku, iOS, tvOS, MacCatalyst and Android already compile the same managed resolver as Linux — no per-platform PAL work is needed to support them. The tests were the only thing still gated to Windows.

Test gating

  • DnsResolverTest: the network tests move from IsWindows to "everywhere the resolver is implemented" (that is, everything except Android, Browser and WASI). Three tests that exercise genuinely DnsQueryEx-specific behavior stay Windows-only, and two Unix counterparts were added for the constructor-validation ones — the managed resolver talks to each server endpoint directly, so it accepts non-standard ports and mixed IPv4/IPv6 server lists that DnsQueryEx rejects.
  • DnsResolverLoopbackTest: drops IsNotMobile. These tests pass an explicit Servers list and talk to an in-process loopback server, so they never touch the system resolver configuration and can run on Android and Apple mobile.
  • DnsResolver_PreCanceledToken_ReturnsCanceled now asserts ThrowsAnyAsync<OperationCanceledException>. The managed PAL cancels via CancellationToken.ThrowIfCancellationRequested(), which produces a plain OperationCanceledException, whereas the Windows PAL produces a TaskCanceledException.

Android

Android is the one Unix platform that cannot use the system-configured servers. There is no accessible /etc/resolv.conf, and IPInterfaceProperties.DnsAddresses throws PlatformNotSupportedException there for the same reason, so ResolvConf.GetNameServers() comes back empty and GetServers() falls back to 127.0.0.1:53 — every query would silently time out against an unreachable address.

Rather than fail that way, DnsResolverPal.Managed.ValidateServers now rejects the configuration up front with PlatformNotSupportedException, and the affected surface is annotated:

  • the parameterless DnsResolver() constructor
  • all 18 Dns.Resolve* statics, which route through it

DnsResolver(DnsResolverOptions) with an explicit Servers list keeps working on Android, which is why the annotation cannot go on the type. Tracked by #132212.

Browser and WASI

DnsResolver is unsupported on both — they compile DnsResolverPal.Unsupported.cs (and on Browser the whole assembly is a generated PNSE stub). Browser needs no per-member attribute because Directory.Build.props already sets UnsupportedOSPlatforms=browser, which emits an assembly-level attribute; WASI was not covered by anything, so [UnsupportedOSPlatform("wasi")] is applied to the DnsResolver type and the Dns.Resolve* statics, following the Zstandard* precedent in System.IO.Compression.

Reusing the managed resolver on WASI is possible in principle — WASI does have TCP and UDP sockets — but it has no resolver configuration to read and no threads, so the synchronous query path (which blocks on IAsyncResult.AsyncWaitHandle.WaitOne and blocking Socket.Send/Receive) would deadlock the only thread. Tracked by #132215.

A new test asserts the PlatformNotSupportedException contract on each of Android, Browser and WASI. The argument-validation tests were switched to a resolver built with an explicit (never-contacted) server so that they keep running on Android instead of being skipped there.

API

No new API surface. The only ref/ changes are [UnsupportedOSPlatform] attributes on API already approved and merged in #129846.

Validation

Built and tested on Linux x64: System.Net.NameResolution.Functional.Tests — 201 total, 0 failed, 6 skipped. The library builds clean (0 warnings) across all five target frameworks, including -browser and -wasi, and cross-compiles clean for TargetOS=android, osx and maccatalyst.

The mobile, macOS, Browser and WASI legs could not be exercised locally, so CI is the first execution there.

Note

This pull request was authored with GitHub Copilot.

The managed stub resolver added for Linux is already compiled for every
Unix-family target through the shared `-unix` target framework, so macOS,
the BSDs, iOS, tvOS and MacCatalyst all get a working DnsResolver without
any additional platform work. The tests, however, were still gated to
Windows only, and the loopback tests were excluded from mobile.
Widen the gating so the network tests run everywhere the resolver is
implemented and the loopback tests run on mobile as well, keeping the
handful of genuinely DnsQueryEx-specific tests on Windows and adding Unix
counterparts for them. The managed PAL surfaces cancellation as a plain
OperationCanceledException rather than TaskCanceledException, so the
pre-canceled token test now accepts any OperationCanceledException.
Android is the one Unix platform that cannot participate: it exposes no
readable resolver configuration (no accessible /etc/resolv.conf, and
IPInterfaceProperties.DnsAddresses throws PlatformNotSupportedException
for the same reason), so a resolver using the system-configured servers
would silently query an unreachable fallback address. Reject that up
front with PlatformNotSupportedException and annotate the affected
surface -- the parameterless DnsResolver constructor and the Dns.Resolve*
statics -- with [UnsupportedOSPlatform("android")].
DnsResolver is likewise unsupported on WASI, which is annotated too.
Browser needs no per-member attribute because the assembly already
carries an assembly-level [UnsupportedOSPlatform("browser")].
Follow-ups tracked by dotnet#132212 (Android) and dotnet#132215 (WASI).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI lite review requested due to automatic review settings August 12, 2026 16:13
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @karelz, @dotnet/ncl
See info in area-owners.md if you want to be subscribed.

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Expands System.Net.NameResolution’s DnsResolver functional test coverage beyond Windows by removing overly strict platform gating, while clarifying and enforcing the unsupported/PNSE contract on platforms where the default (system-server) resolver path cannot work.

Changes:

  • Enable DnsResolverTest network coverage on non-Android Unix platforms (and keep Browser/WASI excluded), while preserving Windows-only DnsQueryEx-specific behaviors.
  • Enable DnsResolverLoopbackTest on mobile platforms by relying on explicit loopback servers (no system resolver configuration dependency).
  • Enforce and document platform support contracts: throw early on Android when system DNS servers can’t be discovered, and annotate APIs as unsupported on Android (default constructor + Dns.Resolve*) and WASI (DnsResolver / Dns.Resolve*).

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.csBroadens test gating to run on Unix platforms where DnsResolver is implemented; adds explicit unsupported-platform and Android contract tests.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverLoopbackTest.csRemoves IsNotMobile gating so loopback-based deterministic resolver tests run on mobile where applicable.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Unsupported.csAdds clarifying comment about Browser/WASI lack of implementation and tracking issue.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Managed.csRejects Android default (system-server) configuration up front with a clear PlatformNotSupportedException.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolver.csAnnotates DnsResolver as unsupported on WASI; marks parameterless ctor unsupported on Android and documents PNSE behavior.
src/libraries/System.Net.NameResolution/src/System/Net/Dns.Resolve.csAnnotates Dns.Resolve* statics as unsupported on Android/WASI and documents PNSE contract.
src/libraries/System.Net.NameResolution/src/Resources/Strings.resxAdds a dedicated SR message for “system-configured DNS servers cannot be determined”.
src/libraries/System.Net.NameResolution/ref/System.Net.NameResolution.csUpdates public contract with [UnsupportedOSPlatform] attributes consistent with implementation.

GetServers falls back to 127.0.0.1:53 when no explicit servers are
configured and /etc/resolv.conf yields none. Record why: resolv.conf(5)
specifies that a missing file or one without nameserver entries means the
name server on the local machine is queried, so this keeps DnsResolver
consistent with getaddrinfo on the same host.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings August 13, 2026 07:37
@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated no new comments.

Suppressed comments (1)

src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.cs:56

  • The Android-specific PNSE contract is only asserted for the synchronous Dns.ResolveAddresses path. Since the change also affects the async static APIs (they route through the same default resolver), add an assertion that ResolveAddressesAsync throws PlatformNotSupportedException as well to prevent regressions specific to the async entry point.
 // Android exposes no readable resolver configuration, so a resolver that would
// have to use the system-configured servers cannot be created.
Assert.Throws<PlatformNotSupportedException>(() => new DnsResolver());
Assert.Throws<PlatformNotSupportedException>(() => Dns.ResolveAddresses(TestHost));
}

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

@rzikm

Copy link
Copy Markdown
MemberAuthor

/ba-g no NameResolution tests failed on the CI, other failures are unrelated.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rzikm@cincuranet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Enable DnsResolver tests on all Unix platforms - #132216

Merged
rzikm merged 2 commits into
dotnet:mainfrom
rzikm:dns-resolver-unix
Aug 14, 2026
Merged

Enable DnsResolver tests on all Unix platforms#132216
rzikm merged 2 commits into
dotnet:mainfrom
rzikm:dns-resolver-unix

Conversation

@rzikm

Copy link
Copy Markdown
Member

Follow-up to #129846, which added DnsResolver with a managed stub resolver implementation.

That implementation is compiled through the shared -unix target framework, which is a catch-all for every Unix-family TargetOS that has no explicit entry in TargetFrameworks. System.Net.NameResolution lists only windows;unix;browser;wasi, so macOS, the BSDs, illumos, Haiku, iOS, tvOS, MacCatalyst and Android already compile the same managed resolver as Linux — no per-platform PAL work is needed to support them. The tests were the only thing still gated to Windows.

Test gating

  • DnsResolverTest: the network tests move from IsWindows to "everywhere the resolver is implemented" (that is, everything except Android, Browser and WASI). Three tests that exercise genuinely DnsQueryEx-specific behavior stay Windows-only, and two Unix counterparts were added for the constructor-validation ones — the managed resolver talks to each server endpoint directly, so it accepts non-standard ports and mixed IPv4/IPv6 server lists that DnsQueryEx rejects.
  • DnsResolverLoopbackTest: drops IsNotMobile. These tests pass an explicit Servers list and talk to an in-process loopback server, so they never touch the system resolver configuration and can run on Android and Apple mobile.
  • DnsResolver_PreCanceledToken_ReturnsCanceled now asserts ThrowsAnyAsync<OperationCanceledException>. The managed PAL cancels via CancellationToken.ThrowIfCancellationRequested(), which produces a plain OperationCanceledException, whereas the Windows PAL produces a TaskCanceledException.

Android

Android is the one Unix platform that cannot use the system-configured servers. There is no accessible /etc/resolv.conf, and IPInterfaceProperties.DnsAddresses throws PlatformNotSupportedException there for the same reason, so ResolvConf.GetNameServers() comes back empty and GetServers() falls back to 127.0.0.1:53 — every query would silently time out against an unreachable address.

Rather than fail that way, DnsResolverPal.Managed.ValidateServers now rejects the configuration up front with PlatformNotSupportedException, and the affected surface is annotated:

  • the parameterless DnsResolver() constructor
  • all 18 Dns.Resolve* statics, which route through it

DnsResolver(DnsResolverOptions) with an explicit Servers list keeps working on Android, which is why the annotation cannot go on the type. Tracked by #132212.

Browser and WASI

DnsResolver is unsupported on both — they compile DnsResolverPal.Unsupported.cs (and on Browser the whole assembly is a generated PNSE stub). Browser needs no per-member attribute because Directory.Build.props already sets UnsupportedOSPlatforms=browser, which emits an assembly-level attribute; WASI was not covered by anything, so [UnsupportedOSPlatform("wasi")] is applied to the DnsResolver type and the Dns.Resolve* statics, following the Zstandard* precedent in System.IO.Compression.

Reusing the managed resolver on WASI is possible in principle — WASI does have TCP and UDP sockets — but it has no resolver configuration to read and no threads, so the synchronous query path (which blocks on IAsyncResult.AsyncWaitHandle.WaitOne and blocking Socket.Send/Receive) would deadlock the only thread. Tracked by #132215.

A new test asserts the PlatformNotSupportedException contract on each of Android, Browser and WASI. The argument-validation tests were switched to a resolver built with an explicit (never-contacted) server so that they keep running on Android instead of being skipped there.

API

No new API surface. The only ref/ changes are [UnsupportedOSPlatform] attributes on API already approved and merged in #129846.

Validation

Built and tested on Linux x64: System.Net.NameResolution.Functional.Tests — 201 total, 0 failed, 6 skipped. The library builds clean (0 warnings) across all five target frameworks, including -browser and -wasi, and cross-compiles clean for TargetOS=android, osx and maccatalyst.

The mobile, macOS, Browser and WASI legs could not be exercised locally, so CI is the first execution there.

Note

This pull request was authored with GitHub Copilot.

The managed stub resolver added for Linux is already compiled for every
Unix-family target through the shared `-unix` target framework, so macOS,
the BSDs, iOS, tvOS and MacCatalyst all get a working DnsResolver without
any additional platform work. The tests, however, were still gated to
Windows only, and the loopback tests were excluded from mobile.
Widen the gating so the network tests run everywhere the resolver is
implemented and the loopback tests run on mobile as well, keeping the
handful of genuinely DnsQueryEx-specific tests on Windows and adding Unix
counterparts for them. The managed PAL surfaces cancellation as a plain
OperationCanceledException rather than TaskCanceledException, so the
pre-canceled token test now accepts any OperationCanceledException.
Android is the one Unix platform that cannot participate: it exposes no
readable resolver configuration (no accessible /etc/resolv.conf, and
IPInterfaceProperties.DnsAddresses throws PlatformNotSupportedException
for the same reason), so a resolver using the system-configured servers
would silently query an unreachable fallback address. Reject that up
front with PlatformNotSupportedException and annotate the affected
surface -- the parameterless DnsResolver constructor and the Dns.Resolve*
statics -- with [UnsupportedOSPlatform("android")].
DnsResolver is likewise unsupported on WASI, which is annotated too.
Browser needs no per-member attribute because the assembly already
carries an assembly-level [UnsupportedOSPlatform("browser")].
Follow-ups tracked by dotnet#132212 (Android) and dotnet#132215 (WASI).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI lite review requested due to automatic review settings August 12, 2026 16:13
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @karelz, @dotnet/ncl
See info in area-owners.md if you want to be subscribed.

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Expands System.Net.NameResolution’s DnsResolver functional test coverage beyond Windows by removing overly strict platform gating, while clarifying and enforcing the unsupported/PNSE contract on platforms where the default (system-server) resolver path cannot work.

Changes:

  • Enable DnsResolverTest network coverage on non-Android Unix platforms (and keep Browser/WASI excluded), while preserving Windows-only DnsQueryEx-specific behaviors.
  • Enable DnsResolverLoopbackTest on mobile platforms by relying on explicit loopback servers (no system resolver configuration dependency).
  • Enforce and document platform support contracts: throw early on Android when system DNS servers can’t be discovered, and annotate APIs as unsupported on Android (default constructor + Dns.Resolve*) and WASI (DnsResolver / Dns.Resolve*).

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.csBroadens test gating to run on Unix platforms where DnsResolver is implemented; adds explicit unsupported-platform and Android contract tests.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverLoopbackTest.csRemoves IsNotMobile gating so loopback-based deterministic resolver tests run on mobile where applicable.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Unsupported.csAdds clarifying comment about Browser/WASI lack of implementation and tracking issue.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolverPal.Managed.csRejects Android default (system-server) configuration up front with a clear PlatformNotSupportedException.
src/libraries/System.Net.NameResolution/src/System/Net/DnsResolver.csAnnotates DnsResolver as unsupported on WASI; marks parameterless ctor unsupported on Android and documents PNSE behavior.
src/libraries/System.Net.NameResolution/src/System/Net/Dns.Resolve.csAnnotates Dns.Resolve* statics as unsupported on Android/WASI and documents PNSE contract.
src/libraries/System.Net.NameResolution/src/Resources/Strings.resxAdds a dedicated SR message for “system-configured DNS servers cannot be determined”.
src/libraries/System.Net.NameResolution/ref/System.Net.NameResolution.csUpdates public contract with [UnsupportedOSPlatform] attributes consistent with implementation.

GetServers falls back to 127.0.0.1:53 when no explicit servers are
configured and /etc/resolv.conf yields none. Record why: resolv.conf(5)
specifies that a missing file or one without nameserver entries means the
name server on the local machine is queried, so this keeps DnsResolver
consistent with getaddrinfo on the same host.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings August 13, 2026 07:37
@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated no new comments.

Suppressed comments (1)

src/libraries/System.Net.NameResolution/tests/FunctionalTests/DnsResolverTest.cs:56

  • The Android-specific PNSE contract is only asserted for the synchronous Dns.ResolveAddresses path. Since the change also affects the async static APIs (they route through the same default resolver), add an assertion that ResolveAddressesAsync throws PlatformNotSupportedException as well to prevent regressions specific to the async entry point.
 // Android exposes no readable resolver configuration, so a resolver that would
// have to use the system-configured servers cannot be created.
Assert.Throws<PlatformNotSupportedException>(() => new DnsResolver());
Assert.Throws<PlatformNotSupportedException>(() => Dns.ResolveAddresses(TestHost));
}

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-android

@rzikm

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

1 similar comment
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

@rzikm

Copy link
Copy Markdown
MemberAuthor

/ba-g no NameResolution tests failed on the CI, other failures are unrelated.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rzikm@cincuranet