[mobile] Skip failing Android localhost subdomain DNS tests - #127742

Merged
kotlarmilos merged 4 commits into
mainfrom
mobile-fix-android-localhost-subdomain-45341ff49b7b78a5
May 5, 2026
Merged

[mobile] Skip failing Android localhost subdomain DNS tests#127742
kotlarmilos merged 4 commits into
mainfrom
mobile-fix-android-localhost-subdomain-45341ff49b7b78a5

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Summary

Fixes failing System.Net.NameResolution tests on Android by adding ActiveIssue attributes to skip tests that expect localhost subdomain resolution to return loopback addresses.

Details

On Android, DNS resolution for .localhost subdomains (e.g., foo.localhost, test.localhost) returns link-local IPv6 addresses (fe80::/10) instead of loopback addresses, causing test failures.

Tests Fixed

  • DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback
  • DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback

These tests are now skipped on Android with reference to existing issue #124751, which already tracks the same underlying problem for the RespectsAddressFamily variants of these tests.

Build Information

  • Build: 1406427
  • Date: 2026-05-03
  • Job: android-arm Release AllSubsets_Mono
  • Helix Job: 6255e58e-bf4f-4c25-ba48-27c957d4ea3e
  • Work Item: System.Net.NameResolution.Functional.Tests

Console Log Excerpt (sanitized)

[20:56:01] info: Instrumentation finished normally with exit code 1
[FAIL] System.Net.NameResolution.Tests.GetHostAddressesTest.DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback(hostName: "foo.localhost")
Assert.All() Failure: 2 out of 3 items in the collection did not pass.
Error: Expected loopback address but got: fe80::cb7c:d6fd:eb1f:6f44%10
Error: Expected loopback address but got: fe80::b4f2:efff:fea1:dbef%3
[FAIL] System.Net.NameResolution.Tests.GetHostAddressesTest.DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback(hostName: "test.localhost")
Assert.All() Failure: 2 out of 3 items in the collection did not pass.
Error: Expected loopback address but got: fe80::cb7c:d6fd:eb1f:6f44%10
Error: Expected loopback address but got: fe80::b4f2:efff:fea1:dbef%3

The tests receive link-local IPv6 addresses instead of the expected loopback addresses (127.0.0.1 or ::1).

Root Cause

Android's DNS resolver behavior for RFC 6761 localhost subdomains differs from desktop platforms. When the OS resolver fallback tries to resolve plain "localhost" with or without an address family filter, Android may return the device's network interface addresses instead of loopback addresses.

Related Issue

Closes: #124751

Note

This content was generated by GitHub Copilot and may contain AI-generated content.

Note

🔒 Integrity filter blocked 2 items

The following items were blocked because they don't meet the GitHub integrity level.

  • #19443search_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • #126805search_pull_requests: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".

To allow these resources, lower min-integrity in your GitHub frontmatter:

tools:
github:
min-integrity: approved # merged | approved | unapproved | none

Generated by Mobile Platform Failure Scanner · ● 3.6M ·

Skip System.Net.NameResolution tests that fail on Android due to
localhost subdomain resolution returning link-local IPv6 addresses
instead of loopback addresses.
Adds ActiveIssue attribute for issue #124751 to:
- DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback
- DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback
Build: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1406427
Failed work item: System.Net.NameResolution.Functional.Tests
Helix job: 6255e58e-bf4f-4c25-ba48-27c957d4ea3e
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@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.

@github-actions

This comment has been minimized.

@kotlarmilos
kotlarmilos marked this pull request as ready for review May 4, 2026 15:30
CopilotAI review requested due to automatic review settings May 4, 2026 15:30

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

This PR updates System.Net.NameResolution functional tests to avoid consistent Android failures by skipping the localhost-subdomain loopback assertions on Android via ActiveIssue.

Changes:

  • Skip DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback on Android with an ActiveIssue attribute.
  • Skip DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback on Android with an ActiveIssue attribute.
Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/FunctionalTests/GetHostEntryTest.csAdds an Android ActiveIssue skip for the localhost-subdomain loopback theory.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/GetHostAddressesTest.csAdds an Android ActiveIssue skip for the localhost-subdomain loopback theory.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 2

kotlarmilosand others added 2 commits May 5, 2026 09:44
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilos enabled auto-merge (squash) May 5, 2026 07:44
@github-actions

Copy link
Copy Markdown
ContributorAuthor

🤖 Copilot Code Review — PR #127742

Note

This review was generated by GitHub Copilot.

Holistic Assessment

Motivation: Justified. These two DNS tests (DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback and DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback) are failing on Android because localhost subdomain resolution returns link-local IPv6 addresses instead of loopback. Skipping them with a tracking issue is the standard approach in dotnet/runtime.

Approach: Correct. Adding [ActiveIssue] with TestPlatforms.Android targeting is the established pattern in this test file and across the repository.

Summary: ✅ LGTM. The change is minimal, correctly scoped, and follows established conventions. The tracking issue (#126456) is already referenced by sibling tests in the same files, confirming it's the correct issue for this class of Android DNS failures.


Detailed Findings

✅ Correctness — Attribute usage is correct

The [ActiveIssue("https://github.com/dotnet/runtime/issues/126456", TestPlatforms.Android)] annotation correctly:

✅ Consistency — Follows existing patterns

The issue reference and attribute pattern matches the established convention in these test files. The consolidated issue #126456 covers all localhost subdomain failures on mobile platforms, making it the appropriate tracking reference.

✅ Scope — Appropriately focused

Only the two affected tests are skipped; no unrelated changes are included. The commit message includes the failing build link, work item, and Helix job for traceability.

💡 Observation — Related test uses different issue

The sibling test DnsGetHostAddresses_LocalhostSubdomain_RespectsAddressFamily (line 253) still references issue #124751 rather than #126456. This is a pre-existing inconsistency and out of scope for this PR, but could be consolidated in a follow-up.

Generated by Code Review for issue #127742 ·

@kotlarmilos
kotlarmilos merged commit 578b4d2 into mainMay 5, 2026
88 of 90 checks passed
@kotlarmilos
kotlarmilos deleted the mobile-fix-android-localhost-subdomain-45341ff49b7b78a5 branch May 5, 2026 10:12
kotlarmilos added a commit that referenced this pull request May 20, 2026
…non-loopback addresses (#128068)
## Description
Dns falls back to resolving plain `localhost` when the OS resolver fails
or returns zero addresses for a `*.localhost` subdomain (RFC 6761 §6.3).
However, on Android the bionic `getaddrinfo` returns non-loopback
addresses (link-local `fe80::*` and globally-routable IPv6) for
`*.localhost`, bypassing the fallback and causing
`Dns.GetHostAddresses("foo.localhost.")` to return non-loopback
addresses. The same behavior was observed on iOS/tvOS/MacCatalyst. This
was caused by the fallback condition only triggering on empty or failed
OS responses; it is now extended to also trigger when the OS returns
only non-loopback addresses, in both the sync and async paths.
Six previously-disabled tests covering the same root cause are
re-enabled in this PR.
Fixes#127965.
Fixes#127953.
Supersedes the test-skip workarounds:
- #127983 (merged) — `[ci-scan] Skip
DnsGetHostAddresses_LocalhostSubdomainWithTrailingDot on Android`
- #127742 (merged) — `[mobile] Skip failing Android localhost subdomain
DNS tests`
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 5, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

DNS localhost subdomain tests with AddressFamily fail on Android

3 participants

@vitek-karas@kotlarmilos
, '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

[mobile] Skip failing Android localhost subdomain DNS tests - #127742

Merged
kotlarmilos merged 4 commits into
mainfrom
mobile-fix-android-localhost-subdomain-45341ff49b7b78a5
May 5, 2026
Merged

[mobile] Skip failing Android localhost subdomain DNS tests#127742
kotlarmilos merged 4 commits into
mainfrom
mobile-fix-android-localhost-subdomain-45341ff49b7b78a5

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Summary

Fixes failing System.Net.NameResolution tests on Android by adding ActiveIssue attributes to skip tests that expect localhost subdomain resolution to return loopback addresses.

Details

On Android, DNS resolution for .localhost subdomains (e.g., foo.localhost, test.localhost) returns link-local IPv6 addresses (fe80::/10) instead of loopback addresses, causing test failures.

Tests Fixed

  • DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback
  • DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback

These tests are now skipped on Android with reference to existing issue #124751, which already tracks the same underlying problem for the RespectsAddressFamily variants of these tests.

Build Information

  • Build: 1406427
  • Date: 2026-05-03
  • Job: android-arm Release AllSubsets_Mono
  • Helix Job: 6255e58e-bf4f-4c25-ba48-27c957d4ea3e
  • Work Item: System.Net.NameResolution.Functional.Tests

Console Log Excerpt (sanitized)

[20:56:01] info: Instrumentation finished normally with exit code 1
[FAIL] System.Net.NameResolution.Tests.GetHostAddressesTest.DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback(hostName: "foo.localhost")
Assert.All() Failure: 2 out of 3 items in the collection did not pass.
Error: Expected loopback address but got: fe80::cb7c:d6fd:eb1f:6f44%10
Error: Expected loopback address but got: fe80::b4f2:efff:fea1:dbef%3
[FAIL] System.Net.NameResolution.Tests.GetHostAddressesTest.DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback(hostName: "test.localhost")
Assert.All() Failure: 2 out of 3 items in the collection did not pass.
Error: Expected loopback address but got: fe80::cb7c:d6fd:eb1f:6f44%10
Error: Expected loopback address but got: fe80::b4f2:efff:fea1:dbef%3

The tests receive link-local IPv6 addresses instead of the expected loopback addresses (127.0.0.1 or ::1).

Root Cause

Android's DNS resolver behavior for RFC 6761 localhost subdomains differs from desktop platforms. When the OS resolver fallback tries to resolve plain "localhost" with or without an address family filter, Android may return the device's network interface addresses instead of loopback addresses.

Related Issue

Closes: #124751

Note

This content was generated by GitHub Copilot and may contain AI-generated content.

Note

🔒 Integrity filter blocked 2 items

The following items were blocked because they don't meet the GitHub integrity level.

  • #19443search_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • #126805search_pull_requests: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".

To allow these resources, lower min-integrity in your GitHub frontmatter:

tools:
github:
min-integrity: approved # merged | approved | unapproved | none

Generated by Mobile Platform Failure Scanner · ● 3.6M ·

Skip System.Net.NameResolution tests that fail on Android due to
localhost subdomain resolution returning link-local IPv6 addresses
instead of loopback addresses.
Adds ActiveIssue attribute for issue #124751 to:
- DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback
- DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback
Build: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1406427
Failed work item: System.Net.NameResolution.Functional.Tests
Helix job: 6255e58e-bf4f-4c25-ba48-27c957d4ea3e
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@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.

@github-actions

This comment has been minimized.

@kotlarmilos
kotlarmilos marked this pull request as ready for review May 4, 2026 15:30
CopilotAI review requested due to automatic review settings May 4, 2026 15:30

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

This PR updates System.Net.NameResolution functional tests to avoid consistent Android failures by skipping the localhost-subdomain loopback assertions on Android via ActiveIssue.

Changes:

  • Skip DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback on Android with an ActiveIssue attribute.
  • Skip DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback on Android with an ActiveIssue attribute.
Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/FunctionalTests/GetHostEntryTest.csAdds an Android ActiveIssue skip for the localhost-subdomain loopback theory.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/GetHostAddressesTest.csAdds an Android ActiveIssue skip for the localhost-subdomain loopback theory.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 2

kotlarmilosand others added 2 commits May 5, 2026 09:44
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilos enabled auto-merge (squash) May 5, 2026 07:44
@github-actions

Copy link
Copy Markdown
ContributorAuthor

🤖 Copilot Code Review — PR #127742

Note

This review was generated by GitHub Copilot.

Holistic Assessment

Motivation: Justified. These two DNS tests (DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback and DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback) are failing on Android because localhost subdomain resolution returns link-local IPv6 addresses instead of loopback. Skipping them with a tracking issue is the standard approach in dotnet/runtime.

Approach: Correct. Adding [ActiveIssue] with TestPlatforms.Android targeting is the established pattern in this test file and across the repository.

Summary: ✅ LGTM. The change is minimal, correctly scoped, and follows established conventions. The tracking issue (#126456) is already referenced by sibling tests in the same files, confirming it's the correct issue for this class of Android DNS failures.


Detailed Findings

✅ Correctness — Attribute usage is correct

The [ActiveIssue("https://github.com/dotnet/runtime/issues/126456", TestPlatforms.Android)] annotation correctly:

✅ Consistency — Follows existing patterns

The issue reference and attribute pattern matches the established convention in these test files. The consolidated issue #126456 covers all localhost subdomain failures on mobile platforms, making it the appropriate tracking reference.

✅ Scope — Appropriately focused

Only the two affected tests are skipped; no unrelated changes are included. The commit message includes the failing build link, work item, and Helix job for traceability.

💡 Observation — Related test uses different issue

The sibling test DnsGetHostAddresses_LocalhostSubdomain_RespectsAddressFamily (line 253) still references issue #124751 rather than #126456. This is a pre-existing inconsistency and out of scope for this PR, but could be consolidated in a follow-up.

Generated by Code Review for issue #127742 ·

@kotlarmilos
kotlarmilos merged commit 578b4d2 into mainMay 5, 2026
88 of 90 checks passed
@kotlarmilos
kotlarmilos deleted the mobile-fix-android-localhost-subdomain-45341ff49b7b78a5 branch May 5, 2026 10:12
kotlarmilos added a commit that referenced this pull request May 20, 2026
…non-loopback addresses (#128068)
## Description
Dns falls back to resolving plain `localhost` when the OS resolver fails
or returns zero addresses for a `*.localhost` subdomain (RFC 6761 §6.3).
However, on Android the bionic `getaddrinfo` returns non-loopback
addresses (link-local `fe80::*` and globally-routable IPv6) for
`*.localhost`, bypassing the fallback and causing
`Dns.GetHostAddresses("foo.localhost.")` to return non-loopback
addresses. The same behavior was observed on iOS/tvOS/MacCatalyst. This
was caused by the fallback condition only triggering on empty or failed
OS responses; it is now extended to also trigger when the OS returns
only non-loopback addresses, in both the sync and async paths.
Six previously-disabled tests covering the same root cause are
re-enabled in this PR.
Fixes#127965.
Fixes#127953.
Supersedes the test-skip workarounds:
- #127983 (merged) — `[ci-scan] Skip
DnsGetHostAddresses_LocalhostSubdomainWithTrailingDot on Android`
- #127742 (merged) — `[mobile] Skip failing Android localhost subdomain
DNS tests`
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 5, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

DNS localhost subdomain tests with AddressFamily fail on Android

3 participants

@vitek-karas@kotlarmilos
, '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

[mobile] Skip failing Android localhost subdomain DNS tests - #127742

Merged
kotlarmilos merged 4 commits into
mainfrom
mobile-fix-android-localhost-subdomain-45341ff49b7b78a5
May 5, 2026
Merged

[mobile] Skip failing Android localhost subdomain DNS tests#127742
kotlarmilos merged 4 commits into
mainfrom
mobile-fix-android-localhost-subdomain-45341ff49b7b78a5

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Summary

Fixes failing System.Net.NameResolution tests on Android by adding ActiveIssue attributes to skip tests that expect localhost subdomain resolution to return loopback addresses.

Details

On Android, DNS resolution for .localhost subdomains (e.g., foo.localhost, test.localhost) returns link-local IPv6 addresses (fe80::/10) instead of loopback addresses, causing test failures.

Tests Fixed

  • DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback
  • DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback

These tests are now skipped on Android with reference to existing issue #124751, which already tracks the same underlying problem for the RespectsAddressFamily variants of these tests.

Build Information

  • Build: 1406427
  • Date: 2026-05-03
  • Job: android-arm Release AllSubsets_Mono
  • Helix Job: 6255e58e-bf4f-4c25-ba48-27c957d4ea3e
  • Work Item: System.Net.NameResolution.Functional.Tests

Console Log Excerpt (sanitized)

[20:56:01] info: Instrumentation finished normally with exit code 1
[FAIL] System.Net.NameResolution.Tests.GetHostAddressesTest.DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback(hostName: "foo.localhost")
Assert.All() Failure: 2 out of 3 items in the collection did not pass.
Error: Expected loopback address but got: fe80::cb7c:d6fd:eb1f:6f44%10
Error: Expected loopback address but got: fe80::b4f2:efff:fea1:dbef%3
[FAIL] System.Net.NameResolution.Tests.GetHostAddressesTest.DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback(hostName: "test.localhost")
Assert.All() Failure: 2 out of 3 items in the collection did not pass.
Error: Expected loopback address but got: fe80::cb7c:d6fd:eb1f:6f44%10
Error: Expected loopback address but got: fe80::b4f2:efff:fea1:dbef%3

The tests receive link-local IPv6 addresses instead of the expected loopback addresses (127.0.0.1 or ::1).

Root Cause

Android's DNS resolver behavior for RFC 6761 localhost subdomains differs from desktop platforms. When the OS resolver fallback tries to resolve plain "localhost" with or without an address family filter, Android may return the device's network interface addresses instead of loopback addresses.

Related Issue

Closes: #124751

Note

This content was generated by GitHub Copilot and may contain AI-generated content.

Note

🔒 Integrity filter blocked 2 items

The following items were blocked because they don't meet the GitHub integrity level.

  • #19443search_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • #126805search_pull_requests: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".

To allow these resources, lower min-integrity in your GitHub frontmatter:

tools:
github:
min-integrity: approved # merged | approved | unapproved | none

Generated by Mobile Platform Failure Scanner · ● 3.6M ·

Skip System.Net.NameResolution tests that fail on Android due to
localhost subdomain resolution returning link-local IPv6 addresses
instead of loopback addresses.
Adds ActiveIssue attribute for issue #124751 to:
- DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback
- DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback
Build: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1406427
Failed work item: System.Net.NameResolution.Functional.Tests
Helix job: 6255e58e-bf4f-4c25-ba48-27c957d4ea3e
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@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.

@github-actions

This comment has been minimized.

@kotlarmilos
kotlarmilos marked this pull request as ready for review May 4, 2026 15:30
CopilotAI review requested due to automatic review settings May 4, 2026 15:30

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

This PR updates System.Net.NameResolution functional tests to avoid consistent Android failures by skipping the localhost-subdomain loopback assertions on Android via ActiveIssue.

Changes:

  • Skip DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback on Android with an ActiveIssue attribute.
  • Skip DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback on Android with an ActiveIssue attribute.
Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/FunctionalTests/GetHostEntryTest.csAdds an Android ActiveIssue skip for the localhost-subdomain loopback theory.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/GetHostAddressesTest.csAdds an Android ActiveIssue skip for the localhost-subdomain loopback theory.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 2

kotlarmilosand others added 2 commits May 5, 2026 09:44
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilos enabled auto-merge (squash) May 5, 2026 07:44
@github-actions

Copy link
Copy Markdown
ContributorAuthor

🤖 Copilot Code Review — PR #127742

Note

This review was generated by GitHub Copilot.

Holistic Assessment

Motivation: Justified. These two DNS tests (DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback and DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback) are failing on Android because localhost subdomain resolution returns link-local IPv6 addresses instead of loopback. Skipping them with a tracking issue is the standard approach in dotnet/runtime.

Approach: Correct. Adding [ActiveIssue] with TestPlatforms.Android targeting is the established pattern in this test file and across the repository.

Summary: ✅ LGTM. The change is minimal, correctly scoped, and follows established conventions. The tracking issue (#126456) is already referenced by sibling tests in the same files, confirming it's the correct issue for this class of Android DNS failures.


Detailed Findings

✅ Correctness — Attribute usage is correct

The [ActiveIssue("https://github.com/dotnet/runtime/issues/126456", TestPlatforms.Android)] annotation correctly:

✅ Consistency — Follows existing patterns

The issue reference and attribute pattern matches the established convention in these test files. The consolidated issue #126456 covers all localhost subdomain failures on mobile platforms, making it the appropriate tracking reference.

✅ Scope — Appropriately focused

Only the two affected tests are skipped; no unrelated changes are included. The commit message includes the failing build link, work item, and Helix job for traceability.

💡 Observation — Related test uses different issue

The sibling test DnsGetHostAddresses_LocalhostSubdomain_RespectsAddressFamily (line 253) still references issue #124751 rather than #126456. This is a pre-existing inconsistency and out of scope for this PR, but could be consolidated in a follow-up.

Generated by Code Review for issue #127742 ·

@kotlarmilos
kotlarmilos merged commit 578b4d2 into mainMay 5, 2026
88 of 90 checks passed
@kotlarmilos
kotlarmilos deleted the mobile-fix-android-localhost-subdomain-45341ff49b7b78a5 branch May 5, 2026 10:12
kotlarmilos added a commit that referenced this pull request May 20, 2026
…non-loopback addresses (#128068)
## Description
Dns falls back to resolving plain `localhost` when the OS resolver fails
or returns zero addresses for a `*.localhost` subdomain (RFC 6761 §6.3).
However, on Android the bionic `getaddrinfo` returns non-loopback
addresses (link-local `fe80::*` and globally-routable IPv6) for
`*.localhost`, bypassing the fallback and causing
`Dns.GetHostAddresses("foo.localhost.")` to return non-loopback
addresses. The same behavior was observed on iOS/tvOS/MacCatalyst. This
was caused by the fallback condition only triggering on empty or failed
OS responses; it is now extended to also trigger when the OS returns
only non-loopback addresses, in both the sync and async paths.
Six previously-disabled tests covering the same root cause are
re-enabled in this PR.
Fixes#127965.
Fixes#127953.
Supersedes the test-skip workarounds:
- #127983 (merged) — `[ci-scan] Skip
DnsGetHostAddresses_LocalhostSubdomainWithTrailingDot on Android`
- #127742 (merged) — `[mobile] Skip failing Android localhost subdomain
DNS tests`
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 5, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

DNS localhost subdomain tests with AddressFamily fail on Android

3 participants

@vitek-karas@kotlarmilos
, '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

[mobile] Skip failing Android localhost subdomain DNS tests - #127742

Merged
kotlarmilos merged 4 commits into
mainfrom
mobile-fix-android-localhost-subdomain-45341ff49b7b78a5
May 5, 2026
Merged

[mobile] Skip failing Android localhost subdomain DNS tests#127742
kotlarmilos merged 4 commits into
mainfrom
mobile-fix-android-localhost-subdomain-45341ff49b7b78a5

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Summary

Fixes failing System.Net.NameResolution tests on Android by adding ActiveIssue attributes to skip tests that expect localhost subdomain resolution to return loopback addresses.

Details

On Android, DNS resolution for .localhost subdomains (e.g., foo.localhost, test.localhost) returns link-local IPv6 addresses (fe80::/10) instead of loopback addresses, causing test failures.

Tests Fixed

  • DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback
  • DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback

These tests are now skipped on Android with reference to existing issue #124751, which already tracks the same underlying problem for the RespectsAddressFamily variants of these tests.

Build Information

  • Build: 1406427
  • Date: 2026-05-03
  • Job: android-arm Release AllSubsets_Mono
  • Helix Job: 6255e58e-bf4f-4c25-ba48-27c957d4ea3e
  • Work Item: System.Net.NameResolution.Functional.Tests

Console Log Excerpt (sanitized)

[20:56:01] info: Instrumentation finished normally with exit code 1
[FAIL] System.Net.NameResolution.Tests.GetHostAddressesTest.DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback(hostName: "foo.localhost")
Assert.All() Failure: 2 out of 3 items in the collection did not pass.
Error: Expected loopback address but got: fe80::cb7c:d6fd:eb1f:6f44%10
Error: Expected loopback address but got: fe80::b4f2:efff:fea1:dbef%3
[FAIL] System.Net.NameResolution.Tests.GetHostAddressesTest.DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback(hostName: "test.localhost")
Assert.All() Failure: 2 out of 3 items in the collection did not pass.
Error: Expected loopback address but got: fe80::cb7c:d6fd:eb1f:6f44%10
Error: Expected loopback address but got: fe80::b4f2:efff:fea1:dbef%3

The tests receive link-local IPv6 addresses instead of the expected loopback addresses (127.0.0.1 or ::1).

Root Cause

Android's DNS resolver behavior for RFC 6761 localhost subdomains differs from desktop platforms. When the OS resolver fallback tries to resolve plain "localhost" with or without an address family filter, Android may return the device's network interface addresses instead of loopback addresses.

Related Issue

Closes: #124751

Note

This content was generated by GitHub Copilot and may contain AI-generated content.

Note

🔒 Integrity filter blocked 2 items

The following items were blocked because they don't meet the GitHub integrity level.

  • #19443search_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • #126805search_pull_requests: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".

To allow these resources, lower min-integrity in your GitHub frontmatter:

tools:
github:
min-integrity: approved # merged | approved | unapproved | none

Generated by Mobile Platform Failure Scanner · ● 3.6M ·

Skip System.Net.NameResolution tests that fail on Android due to
localhost subdomain resolution returning link-local IPv6 addresses
instead of loopback addresses.
Adds ActiveIssue attribute for issue #124751 to:
- DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback
- DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback
Build: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1406427
Failed work item: System.Net.NameResolution.Functional.Tests
Helix job: 6255e58e-bf4f-4c25-ba48-27c957d4ea3e
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@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.

@github-actions

This comment has been minimized.

@kotlarmilos
kotlarmilos marked this pull request as ready for review May 4, 2026 15:30
CopilotAI review requested due to automatic review settings May 4, 2026 15:30

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

This PR updates System.Net.NameResolution functional tests to avoid consistent Android failures by skipping the localhost-subdomain loopback assertions on Android via ActiveIssue.

Changes:

  • Skip DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback on Android with an ActiveIssue attribute.
  • Skip DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback on Android with an ActiveIssue attribute.
Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/FunctionalTests/GetHostEntryTest.csAdds an Android ActiveIssue skip for the localhost-subdomain loopback theory.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/GetHostAddressesTest.csAdds an Android ActiveIssue skip for the localhost-subdomain loopback theory.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 2

kotlarmilosand others added 2 commits May 5, 2026 09:44
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilos enabled auto-merge (squash) May 5, 2026 07:44
@github-actions

Copy link
Copy Markdown
ContributorAuthor

🤖 Copilot Code Review — PR #127742

Note

This review was generated by GitHub Copilot.

Holistic Assessment

Motivation: Justified. These two DNS tests (DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback and DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback) are failing on Android because localhost subdomain resolution returns link-local IPv6 addresses instead of loopback. Skipping them with a tracking issue is the standard approach in dotnet/runtime.

Approach: Correct. Adding [ActiveIssue] with TestPlatforms.Android targeting is the established pattern in this test file and across the repository.

Summary: ✅ LGTM. The change is minimal, correctly scoped, and follows established conventions. The tracking issue (#126456) is already referenced by sibling tests in the same files, confirming it's the correct issue for this class of Android DNS failures.


Detailed Findings

✅ Correctness — Attribute usage is correct

The [ActiveIssue("https://github.com/dotnet/runtime/issues/126456", TestPlatforms.Android)] annotation correctly:

✅ Consistency — Follows existing patterns

The issue reference and attribute pattern matches the established convention in these test files. The consolidated issue #126456 covers all localhost subdomain failures on mobile platforms, making it the appropriate tracking reference.

✅ Scope — Appropriately focused

Only the two affected tests are skipped; no unrelated changes are included. The commit message includes the failing build link, work item, and Helix job for traceability.

💡 Observation — Related test uses different issue

The sibling test DnsGetHostAddresses_LocalhostSubdomain_RespectsAddressFamily (line 253) still references issue #124751 rather than #126456. This is a pre-existing inconsistency and out of scope for this PR, but could be consolidated in a follow-up.

Generated by Code Review for issue #127742 ·

@kotlarmilos
kotlarmilos merged commit 578b4d2 into mainMay 5, 2026
88 of 90 checks passed
@kotlarmilos
kotlarmilos deleted the mobile-fix-android-localhost-subdomain-45341ff49b7b78a5 branch May 5, 2026 10:12
kotlarmilos added a commit that referenced this pull request May 20, 2026
…non-loopback addresses (#128068)
## Description
Dns falls back to resolving plain `localhost` when the OS resolver fails
or returns zero addresses for a `*.localhost` subdomain (RFC 6761 §6.3).
However, on Android the bionic `getaddrinfo` returns non-loopback
addresses (link-local `fe80::*` and globally-routable IPv6) for
`*.localhost`, bypassing the fallback and causing
`Dns.GetHostAddresses("foo.localhost.")` to return non-loopback
addresses. The same behavior was observed on iOS/tvOS/MacCatalyst. This
was caused by the fallback condition only triggering on empty or failed
OS responses; it is now extended to also trigger when the OS returns
only non-loopback addresses, in both the sync and async paths.
Six previously-disabled tests covering the same root cause are
re-enabled in this PR.
Fixes#127965.
Fixes#127953.
Supersedes the test-skip workarounds:
- #127983 (merged) — `[ci-scan] Skip
DnsGetHostAddresses_LocalhostSubdomainWithTrailingDot on Android`
- #127742 (merged) — `[mobile] Skip failing Android localhost subdomain
DNS tests`
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 5, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

DNS localhost subdomain tests with AddressFamily fail on Android

3 participants

@vitek-karas@kotlarmilos
, '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

[mobile] Skip failing Android localhost subdomain DNS tests - #127742

Merged
kotlarmilos merged 4 commits into
mainfrom
mobile-fix-android-localhost-subdomain-45341ff49b7b78a5
May 5, 2026
Merged

[mobile] Skip failing Android localhost subdomain DNS tests#127742
kotlarmilos merged 4 commits into
mainfrom
mobile-fix-android-localhost-subdomain-45341ff49b7b78a5

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Summary

Fixes failing System.Net.NameResolution tests on Android by adding ActiveIssue attributes to skip tests that expect localhost subdomain resolution to return loopback addresses.

Details

On Android, DNS resolution for .localhost subdomains (e.g., foo.localhost, test.localhost) returns link-local IPv6 addresses (fe80::/10) instead of loopback addresses, causing test failures.

Tests Fixed

  • DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback
  • DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback

These tests are now skipped on Android with reference to existing issue #124751, which already tracks the same underlying problem for the RespectsAddressFamily variants of these tests.

Build Information

  • Build: 1406427
  • Date: 2026-05-03
  • Job: android-arm Release AllSubsets_Mono
  • Helix Job: 6255e58e-bf4f-4c25-ba48-27c957d4ea3e
  • Work Item: System.Net.NameResolution.Functional.Tests

Console Log Excerpt (sanitized)

[20:56:01] info: Instrumentation finished normally with exit code 1
[FAIL] System.Net.NameResolution.Tests.GetHostAddressesTest.DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback(hostName: "foo.localhost")
Assert.All() Failure: 2 out of 3 items in the collection did not pass.
Error: Expected loopback address but got: fe80::cb7c:d6fd:eb1f:6f44%10
Error: Expected loopback address but got: fe80::b4f2:efff:fea1:dbef%3
[FAIL] System.Net.NameResolution.Tests.GetHostAddressesTest.DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback(hostName: "test.localhost")
Assert.All() Failure: 2 out of 3 items in the collection did not pass.
Error: Expected loopback address but got: fe80::cb7c:d6fd:eb1f:6f44%10
Error: Expected loopback address but got: fe80::b4f2:efff:fea1:dbef%3

The tests receive link-local IPv6 addresses instead of the expected loopback addresses (127.0.0.1 or ::1).

Root Cause

Android's DNS resolver behavior for RFC 6761 localhost subdomains differs from desktop platforms. When the OS resolver fallback tries to resolve plain "localhost" with or without an address family filter, Android may return the device's network interface addresses instead of loopback addresses.

Related Issue

Closes: #124751

Note

This content was generated by GitHub Copilot and may contain AI-generated content.

Note

🔒 Integrity filter blocked 2 items

The following items were blocked because they don't meet the GitHub integrity level.

  • #19443search_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • #126805search_pull_requests: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".

To allow these resources, lower min-integrity in your GitHub frontmatter:

tools:
github:
min-integrity: approved # merged | approved | unapproved | none

Generated by Mobile Platform Failure Scanner · ● 3.6M ·

Skip System.Net.NameResolution tests that fail on Android due to
localhost subdomain resolution returning link-local IPv6 addresses
instead of loopback addresses.
Adds ActiveIssue attribute for issue #124751 to:
- DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback
- DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback
Build: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1406427
Failed work item: System.Net.NameResolution.Functional.Tests
Helix job: 6255e58e-bf4f-4c25-ba48-27c957d4ea3e
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@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.

@github-actions

This comment has been minimized.

@kotlarmilos
kotlarmilos marked this pull request as ready for review May 4, 2026 15:30
CopilotAI review requested due to automatic review settings May 4, 2026 15:30

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

This PR updates System.Net.NameResolution functional tests to avoid consistent Android failures by skipping the localhost-subdomain loopback assertions on Android via ActiveIssue.

Changes:

  • Skip DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback on Android with an ActiveIssue attribute.
  • Skip DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback on Android with an ActiveIssue attribute.
Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/FunctionalTests/GetHostEntryTest.csAdds an Android ActiveIssue skip for the localhost-subdomain loopback theory.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/GetHostAddressesTest.csAdds an Android ActiveIssue skip for the localhost-subdomain loopback theory.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 2

kotlarmilosand others added 2 commits May 5, 2026 09:44
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilos enabled auto-merge (squash) May 5, 2026 07:44
@github-actions

Copy link
Copy Markdown
ContributorAuthor

🤖 Copilot Code Review — PR #127742

Note

This review was generated by GitHub Copilot.

Holistic Assessment

Motivation: Justified. These two DNS tests (DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback and DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback) are failing on Android because localhost subdomain resolution returns link-local IPv6 addresses instead of loopback. Skipping them with a tracking issue is the standard approach in dotnet/runtime.

Approach: Correct. Adding [ActiveIssue] with TestPlatforms.Android targeting is the established pattern in this test file and across the repository.

Summary: ✅ LGTM. The change is minimal, correctly scoped, and follows established conventions. The tracking issue (#126456) is already referenced by sibling tests in the same files, confirming it's the correct issue for this class of Android DNS failures.


Detailed Findings

✅ Correctness — Attribute usage is correct

The [ActiveIssue("https://github.com/dotnet/runtime/issues/126456", TestPlatforms.Android)] annotation correctly:

✅ Consistency — Follows existing patterns

The issue reference and attribute pattern matches the established convention in these test files. The consolidated issue #126456 covers all localhost subdomain failures on mobile platforms, making it the appropriate tracking reference.

✅ Scope — Appropriately focused

Only the two affected tests are skipped; no unrelated changes are included. The commit message includes the failing build link, work item, and Helix job for traceability.

💡 Observation — Related test uses different issue

The sibling test DnsGetHostAddresses_LocalhostSubdomain_RespectsAddressFamily (line 253) still references issue #124751 rather than #126456. This is a pre-existing inconsistency and out of scope for this PR, but could be consolidated in a follow-up.

Generated by Code Review for issue #127742 ·

@kotlarmilos
kotlarmilos merged commit 578b4d2 into mainMay 5, 2026
88 of 90 checks passed
@kotlarmilos
kotlarmilos deleted the mobile-fix-android-localhost-subdomain-45341ff49b7b78a5 branch May 5, 2026 10:12
kotlarmilos added a commit that referenced this pull request May 20, 2026
…non-loopback addresses (#128068)
## Description
Dns falls back to resolving plain `localhost` when the OS resolver fails
or returns zero addresses for a `*.localhost` subdomain (RFC 6761 §6.3).
However, on Android the bionic `getaddrinfo` returns non-loopback
addresses (link-local `fe80::*` and globally-routable IPv6) for
`*.localhost`, bypassing the fallback and causing
`Dns.GetHostAddresses("foo.localhost.")` to return non-loopback
addresses. The same behavior was observed on iOS/tvOS/MacCatalyst. This
was caused by the fallback condition only triggering on empty or failed
OS responses; it is now extended to also trigger when the OS returns
only non-loopback addresses, in both the sync and async paths.
Six previously-disabled tests covering the same root cause are
re-enabled in this PR.
Fixes#127965.
Fixes#127953.
Supersedes the test-skip workarounds:
- #127983 (merged) — `[ci-scan] Skip
DnsGetHostAddresses_LocalhostSubdomainWithTrailingDot on Android`
- #127742 (merged) — `[mobile] Skip failing Android localhost subdomain
DNS tests`
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 5, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

DNS localhost subdomain tests with AddressFamily fail on Android

3 participants

@vitek-karas@kotlarmilos
, '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

[mobile] Skip failing Android localhost subdomain DNS tests - #127742

Merged
kotlarmilos merged 4 commits into
mainfrom
mobile-fix-android-localhost-subdomain-45341ff49b7b78a5
May 5, 2026
Merged

[mobile] Skip failing Android localhost subdomain DNS tests#127742
kotlarmilos merged 4 commits into
mainfrom
mobile-fix-android-localhost-subdomain-45341ff49b7b78a5

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Summary

Fixes failing System.Net.NameResolution tests on Android by adding ActiveIssue attributes to skip tests that expect localhost subdomain resolution to return loopback addresses.

Details

On Android, DNS resolution for .localhost subdomains (e.g., foo.localhost, test.localhost) returns link-local IPv6 addresses (fe80::/10) instead of loopback addresses, causing test failures.

Tests Fixed

  • DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback
  • DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback

These tests are now skipped on Android with reference to existing issue #124751, which already tracks the same underlying problem for the RespectsAddressFamily variants of these tests.

Build Information

  • Build: 1406427
  • Date: 2026-05-03
  • Job: android-arm Release AllSubsets_Mono
  • Helix Job: 6255e58e-bf4f-4c25-ba48-27c957d4ea3e
  • Work Item: System.Net.NameResolution.Functional.Tests

Console Log Excerpt (sanitized)

[20:56:01] info: Instrumentation finished normally with exit code 1
[FAIL] System.Net.NameResolution.Tests.GetHostAddressesTest.DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback(hostName: "foo.localhost")
Assert.All() Failure: 2 out of 3 items in the collection did not pass.
Error: Expected loopback address but got: fe80::cb7c:d6fd:eb1f:6f44%10
Error: Expected loopback address but got: fe80::b4f2:efff:fea1:dbef%3
[FAIL] System.Net.NameResolution.Tests.GetHostAddressesTest.DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback(hostName: "test.localhost")
Assert.All() Failure: 2 out of 3 items in the collection did not pass.
Error: Expected loopback address but got: fe80::cb7c:d6fd:eb1f:6f44%10
Error: Expected loopback address but got: fe80::b4f2:efff:fea1:dbef%3

The tests receive link-local IPv6 addresses instead of the expected loopback addresses (127.0.0.1 or ::1).

Root Cause

Android's DNS resolver behavior for RFC 6761 localhost subdomains differs from desktop platforms. When the OS resolver fallback tries to resolve plain "localhost" with or without an address family filter, Android may return the device's network interface addresses instead of loopback addresses.

Related Issue

Closes: #124751

Note

This content was generated by GitHub Copilot and may contain AI-generated content.

Note

🔒 Integrity filter blocked 2 items

The following items were blocked because they don't meet the GitHub integrity level.

  • #19443search_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • #126805search_pull_requests: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".

To allow these resources, lower min-integrity in your GitHub frontmatter:

tools:
github:
min-integrity: approved # merged | approved | unapproved | none

Generated by Mobile Platform Failure Scanner · ● 3.6M ·

Skip System.Net.NameResolution tests that fail on Android due to
localhost subdomain resolution returning link-local IPv6 addresses
instead of loopback addresses.
Adds ActiveIssue attribute for issue #124751 to:
- DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback
- DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback
Build: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1406427
Failed work item: System.Net.NameResolution.Functional.Tests
Helix job: 6255e58e-bf4f-4c25-ba48-27c957d4ea3e
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@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.

@github-actions

This comment has been minimized.

@kotlarmilos
kotlarmilos marked this pull request as ready for review May 4, 2026 15:30
CopilotAI review requested due to automatic review settings May 4, 2026 15:30

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

This PR updates System.Net.NameResolution functional tests to avoid consistent Android failures by skipping the localhost-subdomain loopback assertions on Android via ActiveIssue.

Changes:

  • Skip DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback on Android with an ActiveIssue attribute.
  • Skip DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback on Android with an ActiveIssue attribute.
Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/FunctionalTests/GetHostEntryTest.csAdds an Android ActiveIssue skip for the localhost-subdomain loopback theory.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/GetHostAddressesTest.csAdds an Android ActiveIssue skip for the localhost-subdomain loopback theory.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 2

kotlarmilosand others added 2 commits May 5, 2026 09:44
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilos enabled auto-merge (squash) May 5, 2026 07:44
@github-actions

Copy link
Copy Markdown
ContributorAuthor

🤖 Copilot Code Review — PR #127742

Note

This review was generated by GitHub Copilot.

Holistic Assessment

Motivation: Justified. These two DNS tests (DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback and DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback) are failing on Android because localhost subdomain resolution returns link-local IPv6 addresses instead of loopback. Skipping them with a tracking issue is the standard approach in dotnet/runtime.

Approach: Correct. Adding [ActiveIssue] with TestPlatforms.Android targeting is the established pattern in this test file and across the repository.

Summary: ✅ LGTM. The change is minimal, correctly scoped, and follows established conventions. The tracking issue (#126456) is already referenced by sibling tests in the same files, confirming it's the correct issue for this class of Android DNS failures.


Detailed Findings

✅ Correctness — Attribute usage is correct

The [ActiveIssue("https://github.com/dotnet/runtime/issues/126456", TestPlatforms.Android)] annotation correctly:

✅ Consistency — Follows existing patterns

The issue reference and attribute pattern matches the established convention in these test files. The consolidated issue #126456 covers all localhost subdomain failures on mobile platforms, making it the appropriate tracking reference.

✅ Scope — Appropriately focused

Only the two affected tests are skipped; no unrelated changes are included. The commit message includes the failing build link, work item, and Helix job for traceability.

💡 Observation — Related test uses different issue

The sibling test DnsGetHostAddresses_LocalhostSubdomain_RespectsAddressFamily (line 253) still references issue #124751 rather than #126456. This is a pre-existing inconsistency and out of scope for this PR, but could be consolidated in a follow-up.

Generated by Code Review for issue #127742 ·

@kotlarmilos
kotlarmilos merged commit 578b4d2 into mainMay 5, 2026
88 of 90 checks passed
@kotlarmilos
kotlarmilos deleted the mobile-fix-android-localhost-subdomain-45341ff49b7b78a5 branch May 5, 2026 10:12
kotlarmilos added a commit that referenced this pull request May 20, 2026
…non-loopback addresses (#128068)
## Description
Dns falls back to resolving plain `localhost` when the OS resolver fails
or returns zero addresses for a `*.localhost` subdomain (RFC 6761 §6.3).
However, on Android the bionic `getaddrinfo` returns non-loopback
addresses (link-local `fe80::*` and globally-routable IPv6) for
`*.localhost`, bypassing the fallback and causing
`Dns.GetHostAddresses("foo.localhost.")` to return non-loopback
addresses. The same behavior was observed on iOS/tvOS/MacCatalyst. This
was caused by the fallback condition only triggering on empty or failed
OS responses; it is now extended to also trigger when the OS returns
only non-loopback addresses, in both the sync and async paths.
Six previously-disabled tests covering the same root cause are
re-enabled in this PR.
Fixes#127965.
Fixes#127953.
Supersedes the test-skip workarounds:
- #127983 (merged) — `[ci-scan] Skip
DnsGetHostAddresses_LocalhostSubdomainWithTrailingDot on Android`
- #127742 (merged) — `[mobile] Skip failing Android localhost subdomain
DNS tests`
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 5, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

DNS localhost subdomain tests with AddressFamily fail on Android

3 participants

@vitek-karas@kotlarmilos
, '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

[mobile] Skip failing Android localhost subdomain DNS tests - #127742

Merged
kotlarmilos merged 4 commits into
mainfrom
mobile-fix-android-localhost-subdomain-45341ff49b7b78a5
May 5, 2026
Merged

[mobile] Skip failing Android localhost subdomain DNS tests#127742
kotlarmilos merged 4 commits into
mainfrom
mobile-fix-android-localhost-subdomain-45341ff49b7b78a5

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Summary

Fixes failing System.Net.NameResolution tests on Android by adding ActiveIssue attributes to skip tests that expect localhost subdomain resolution to return loopback addresses.

Details

On Android, DNS resolution for .localhost subdomains (e.g., foo.localhost, test.localhost) returns link-local IPv6 addresses (fe80::/10) instead of loopback addresses, causing test failures.

Tests Fixed

  • DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback
  • DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback

These tests are now skipped on Android with reference to existing issue #124751, which already tracks the same underlying problem for the RespectsAddressFamily variants of these tests.

Build Information

  • Build: 1406427
  • Date: 2026-05-03
  • Job: android-arm Release AllSubsets_Mono
  • Helix Job: 6255e58e-bf4f-4c25-ba48-27c957d4ea3e
  • Work Item: System.Net.NameResolution.Functional.Tests

Console Log Excerpt (sanitized)

[20:56:01] info: Instrumentation finished normally with exit code 1
[FAIL] System.Net.NameResolution.Tests.GetHostAddressesTest.DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback(hostName: "foo.localhost")
Assert.All() Failure: 2 out of 3 items in the collection did not pass.
Error: Expected loopback address but got: fe80::cb7c:d6fd:eb1f:6f44%10
Error: Expected loopback address but got: fe80::b4f2:efff:fea1:dbef%3
[FAIL] System.Net.NameResolution.Tests.GetHostAddressesTest.DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback(hostName: "test.localhost")
Assert.All() Failure: 2 out of 3 items in the collection did not pass.
Error: Expected loopback address but got: fe80::cb7c:d6fd:eb1f:6f44%10
Error: Expected loopback address but got: fe80::b4f2:efff:fea1:dbef%3

The tests receive link-local IPv6 addresses instead of the expected loopback addresses (127.0.0.1 or ::1).

Root Cause

Android's DNS resolver behavior for RFC 6761 localhost subdomains differs from desktop platforms. When the OS resolver fallback tries to resolve plain "localhost" with or without an address family filter, Android may return the device's network interface addresses instead of loopback addresses.

Related Issue

Closes: #124751

Note

This content was generated by GitHub Copilot and may contain AI-generated content.

Note

🔒 Integrity filter blocked 2 items

The following items were blocked because they don't meet the GitHub integrity level.

  • #19443search_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • #126805search_pull_requests: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".

To allow these resources, lower min-integrity in your GitHub frontmatter:

tools:
github:
min-integrity: approved # merged | approved | unapproved | none

Generated by Mobile Platform Failure Scanner · ● 3.6M ·

Skip System.Net.NameResolution tests that fail on Android due to
localhost subdomain resolution returning link-local IPv6 addresses
instead of loopback addresses.
Adds ActiveIssue attribute for issue #124751 to:
- DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback
- DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback
Build: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1406427
Failed work item: System.Net.NameResolution.Functional.Tests
Helix job: 6255e58e-bf4f-4c25-ba48-27c957d4ea3e
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@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.

@github-actions

This comment has been minimized.

@kotlarmilos
kotlarmilos marked this pull request as ready for review May 4, 2026 15:30
CopilotAI review requested due to automatic review settings May 4, 2026 15:30

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

This PR updates System.Net.NameResolution functional tests to avoid consistent Android failures by skipping the localhost-subdomain loopback assertions on Android via ActiveIssue.

Changes:

  • Skip DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback on Android with an ActiveIssue attribute.
  • Skip DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback on Android with an ActiveIssue attribute.
Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/FunctionalTests/GetHostEntryTest.csAdds an Android ActiveIssue skip for the localhost-subdomain loopback theory.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/GetHostAddressesTest.csAdds an Android ActiveIssue skip for the localhost-subdomain loopback theory.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 2

kotlarmilosand others added 2 commits May 5, 2026 09:44
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilos enabled auto-merge (squash) May 5, 2026 07:44
@github-actions

Copy link
Copy Markdown
ContributorAuthor

🤖 Copilot Code Review — PR #127742

Note

This review was generated by GitHub Copilot.

Holistic Assessment

Motivation: Justified. These two DNS tests (DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback and DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback) are failing on Android because localhost subdomain resolution returns link-local IPv6 addresses instead of loopback. Skipping them with a tracking issue is the standard approach in dotnet/runtime.

Approach: Correct. Adding [ActiveIssue] with TestPlatforms.Android targeting is the established pattern in this test file and across the repository.

Summary: ✅ LGTM. The change is minimal, correctly scoped, and follows established conventions. The tracking issue (#126456) is already referenced by sibling tests in the same files, confirming it's the correct issue for this class of Android DNS failures.


Detailed Findings

✅ Correctness — Attribute usage is correct

The [ActiveIssue("https://github.com/dotnet/runtime/issues/126456", TestPlatforms.Android)] annotation correctly:

✅ Consistency — Follows existing patterns

The issue reference and attribute pattern matches the established convention in these test files. The consolidated issue #126456 covers all localhost subdomain failures on mobile platforms, making it the appropriate tracking reference.

✅ Scope — Appropriately focused

Only the two affected tests are skipped; no unrelated changes are included. The commit message includes the failing build link, work item, and Helix job for traceability.

💡 Observation — Related test uses different issue

The sibling test DnsGetHostAddresses_LocalhostSubdomain_RespectsAddressFamily (line 253) still references issue #124751 rather than #126456. This is a pre-existing inconsistency and out of scope for this PR, but could be consolidated in a follow-up.

Generated by Code Review for issue #127742 ·

@kotlarmilos
kotlarmilos merged commit 578b4d2 into mainMay 5, 2026
88 of 90 checks passed
@kotlarmilos
kotlarmilos deleted the mobile-fix-android-localhost-subdomain-45341ff49b7b78a5 branch May 5, 2026 10:12
kotlarmilos added a commit that referenced this pull request May 20, 2026
…non-loopback addresses (#128068)
## Description
Dns falls back to resolving plain `localhost` when the OS resolver fails
or returns zero addresses for a `*.localhost` subdomain (RFC 6761 §6.3).
However, on Android the bionic `getaddrinfo` returns non-loopback
addresses (link-local `fe80::*` and globally-routable IPv6) for
`*.localhost`, bypassing the fallback and causing
`Dns.GetHostAddresses("foo.localhost.")` to return non-loopback
addresses. The same behavior was observed on iOS/tvOS/MacCatalyst. This
was caused by the fallback condition only triggering on empty or failed
OS responses; it is now extended to also trigger when the OS returns
only non-loopback addresses, in both the sync and async paths.
Six previously-disabled tests covering the same root cause are
re-enabled in this PR.
Fixes#127965.
Fixes#127953.
Supersedes the test-skip workarounds:
- #127983 (merged) — `[ci-scan] Skip
DnsGetHostAddresses_LocalhostSubdomainWithTrailingDot on Android`
- #127742 (merged) — `[mobile] Skip failing Android localhost subdomain
DNS tests`
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 5, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

DNS localhost subdomain tests with AddressFamily fail on Android

3 participants

@vitek-karas@kotlarmilos
, '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

[mobile] Skip failing Android localhost subdomain DNS tests - #127742

Merged
kotlarmilos merged 4 commits into
mainfrom
mobile-fix-android-localhost-subdomain-45341ff49b7b78a5
May 5, 2026
Merged

[mobile] Skip failing Android localhost subdomain DNS tests#127742
kotlarmilos merged 4 commits into
mainfrom
mobile-fix-android-localhost-subdomain-45341ff49b7b78a5

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Summary

Fixes failing System.Net.NameResolution tests on Android by adding ActiveIssue attributes to skip tests that expect localhost subdomain resolution to return loopback addresses.

Details

On Android, DNS resolution for .localhost subdomains (e.g., foo.localhost, test.localhost) returns link-local IPv6 addresses (fe80::/10) instead of loopback addresses, causing test failures.

Tests Fixed

  • DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback
  • DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback

These tests are now skipped on Android with reference to existing issue #124751, which already tracks the same underlying problem for the RespectsAddressFamily variants of these tests.

Build Information

  • Build: 1406427
  • Date: 2026-05-03
  • Job: android-arm Release AllSubsets_Mono
  • Helix Job: 6255e58e-bf4f-4c25-ba48-27c957d4ea3e
  • Work Item: System.Net.NameResolution.Functional.Tests

Console Log Excerpt (sanitized)

[20:56:01] info: Instrumentation finished normally with exit code 1
[FAIL] System.Net.NameResolution.Tests.GetHostAddressesTest.DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback(hostName: "foo.localhost")
Assert.All() Failure: 2 out of 3 items in the collection did not pass.
Error: Expected loopback address but got: fe80::cb7c:d6fd:eb1f:6f44%10
Error: Expected loopback address but got: fe80::b4f2:efff:fea1:dbef%3
[FAIL] System.Net.NameResolution.Tests.GetHostAddressesTest.DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback(hostName: "test.localhost")
Assert.All() Failure: 2 out of 3 items in the collection did not pass.
Error: Expected loopback address but got: fe80::cb7c:d6fd:eb1f:6f44%10
Error: Expected loopback address but got: fe80::b4f2:efff:fea1:dbef%3

The tests receive link-local IPv6 addresses instead of the expected loopback addresses (127.0.0.1 or ::1).

Root Cause

Android's DNS resolver behavior for RFC 6761 localhost subdomains differs from desktop platforms. When the OS resolver fallback tries to resolve plain "localhost" with or without an address family filter, Android may return the device's network interface addresses instead of loopback addresses.

Related Issue

Closes: #124751

Note

This content was generated by GitHub Copilot and may contain AI-generated content.

Note

🔒 Integrity filter blocked 2 items

The following items were blocked because they don't meet the GitHub integrity level.

  • #19443search_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • #126805search_pull_requests: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".

To allow these resources, lower min-integrity in your GitHub frontmatter:

tools:
github:
min-integrity: approved # merged | approved | unapproved | none

Generated by Mobile Platform Failure Scanner · ● 3.6M ·

Skip System.Net.NameResolution tests that fail on Android due to
localhost subdomain resolution returning link-local IPv6 addresses
instead of loopback addresses.
Adds ActiveIssue attribute for issue #124751 to:
- DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback
- DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback
Build: https://dev.azure.com/dnceng-public/public/_build/results?buildId=1406427
Failed work item: System.Net.NameResolution.Functional.Tests
Helix job: 6255e58e-bf4f-4c25-ba48-27c957d4ea3e
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@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.

@github-actions

This comment has been minimized.

@kotlarmilos
kotlarmilos marked this pull request as ready for review May 4, 2026 15:30
CopilotAI review requested due to automatic review settings May 4, 2026 15:30

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

This PR updates System.Net.NameResolution functional tests to avoid consistent Android failures by skipping the localhost-subdomain loopback assertions on Android via ActiveIssue.

Changes:

  • Skip DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback on Android with an ActiveIssue attribute.
  • Skip DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback on Android with an ActiveIssue attribute.
Show a summary per file
FileDescription
src/libraries/System.Net.NameResolution/tests/FunctionalTests/GetHostEntryTest.csAdds an Android ActiveIssue skip for the localhost-subdomain loopback theory.
src/libraries/System.Net.NameResolution/tests/FunctionalTests/GetHostAddressesTest.csAdds an Android ActiveIssue skip for the localhost-subdomain loopback theory.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 2

kotlarmilosand others added 2 commits May 5, 2026 09:44
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilos enabled auto-merge (squash) May 5, 2026 07:44
@github-actions

Copy link
Copy Markdown
ContributorAuthor

🤖 Copilot Code Review — PR #127742

Note

This review was generated by GitHub Copilot.

Holistic Assessment

Motivation: Justified. These two DNS tests (DnsGetHostAddresses_LocalhostSubdomain_ReturnsLoopback and DnsGetHostEntry_LocalhostSubdomain_ReturnsLoopback) are failing on Android because localhost subdomain resolution returns link-local IPv6 addresses instead of loopback. Skipping them with a tracking issue is the standard approach in dotnet/runtime.

Approach: Correct. Adding [ActiveIssue] with TestPlatforms.Android targeting is the established pattern in this test file and across the repository.

Summary: ✅ LGTM. The change is minimal, correctly scoped, and follows established conventions. The tracking issue (#126456) is already referenced by sibling tests in the same files, confirming it's the correct issue for this class of Android DNS failures.


Detailed Findings

✅ Correctness — Attribute usage is correct

The [ActiveIssue("https://github.com/dotnet/runtime/issues/126456", TestPlatforms.Android)] annotation correctly:

✅ Consistency — Follows existing patterns

The issue reference and attribute pattern matches the established convention in these test files. The consolidated issue #126456 covers all localhost subdomain failures on mobile platforms, making it the appropriate tracking reference.

✅ Scope — Appropriately focused

Only the two affected tests are skipped; no unrelated changes are included. The commit message includes the failing build link, work item, and Helix job for traceability.

💡 Observation — Related test uses different issue

The sibling test DnsGetHostAddresses_LocalhostSubdomain_RespectsAddressFamily (line 253) still references issue #124751 rather than #126456. This is a pre-existing inconsistency and out of scope for this PR, but could be consolidated in a follow-up.

Generated by Code Review for issue #127742 ·

@kotlarmilos
kotlarmilos merged commit 578b4d2 into mainMay 5, 2026
88 of 90 checks passed
@kotlarmilos
kotlarmilos deleted the mobile-fix-android-localhost-subdomain-45341ff49b7b78a5 branch May 5, 2026 10:12
kotlarmilos added a commit that referenced this pull request May 20, 2026
…non-loopback addresses (#128068)
## Description
Dns falls back to resolving plain `localhost` when the OS resolver fails
or returns zero addresses for a `*.localhost` subdomain (RFC 6761 §6.3).
However, on Android the bionic `getaddrinfo` returns non-loopback
addresses (link-local `fe80::*` and globally-routable IPv6) for
`*.localhost`, bypassing the fallback and causing
`Dns.GetHostAddresses("foo.localhost.")` to return non-loopback
addresses. The same behavior was observed on iOS/tvOS/MacCatalyst. This
was caused by the fallback condition only triggering on empty or failed
OS responses; it is now extended to also trigger when the OS returns
only non-loopback addresses, in both the sync and async paths.
Six previously-disabled tests covering the same root cause are
re-enabled in this PR.
Fixes#127965.
Fixes#127953.
Supersedes the test-skip workarounds:
- #127983 (merged) — `[ci-scan] Skip
DnsGetHostAddresses_LocalhostSubdomainWithTrailingDot on Android`
- #127742 (merged) — `[mobile] Skip failing Android localhost subdomain
DNS tests`
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 5, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

DNS localhost subdomain tests with AddressFamily fail on Android

3 participants

@vitek-karas@kotlarmilos