Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
07340eb
Route the stray EF package pins through $(EFCoreVersion)
ChrisJollyAU Jul 28, 2026
f040e91
Move src to .NET 11 and EF Core 11 preview 6
ChrisJollyAU Jul 28, 2026
2c3182d
Move the test projects to xunit v3: packages and call sites
ChrisJollyAU Jul 28, 2026
751e182
xunit v3: port the orderers, and retire the conditional machinery
ChrisJollyAU Jul 28, 2026
e9aa852
xunit v3: rebuild crash detection on BeforeAfterTestAttribute
ChrisJollyAU Jul 28, 2026
3a9f7a8
EF 11: rename the NonSharedModel store-factory overrides
ChrisJollyAU Jul 28, 2026
3d97582
EF 11: add the reorganised spec-test namespaces
ChrisJollyAU Jul 28, 2026
b0546ae
Sweep the mechanical EF 11 / xunit v3 breaks
ChrisJollyAU Jul 28, 2026
e217911
Finish the EF 11 test-base churn and revive the two xunit hooks
ChrisJollyAU Jul 28, 2026
eea4702
CI: opt in to the MTP dotnet test, and fix the feeds it restores from
ChrisJollyAU Aug 3, 2026
f8c7f34
tests
ChrisJollyAU Aug 3, 2026
9ec9291
CI: get the MSTest suite onto MTP, and stop running an empty one
ChrisJollyAU Aug 3, 2026
cb0a497
LibRed: SGN returns an Integer, not a Double
ChrisJollyAU Aug 3, 2026
ab0566c
Jet: emulate NULL propagation through string concatenation
ChrisJollyAU Aug 3, 2026
ed0b411
Test churn for the EF 11 spec-test reshuffle
ChrisJollyAU Aug 3, 2026
6e54b59
CI: restore the per-test hang timeout, and cap every job
ChrisJollyAU Aug 3, 2026
aa70dc7
CI: stop printing captured output for passing tests
ChrisJollyAU Aug 3, 2026
5936729
CI: dump and retry when ACE takes the test host down
ChrisJollyAU Aug 3, 2026
d55005a
Drop green-test entries whose methods no longer exist
ChrisJollyAU Aug 3, 2026
550ac94
Back out of Microsoft.Testing.Platform, onto VSTest as upstream uses
ChrisJollyAU Aug 4, 2026
a6ddbc4
Jet: only guard a bare nullable column in a string concat
ChrisJollyAU Aug 4, 2026
ef62513
test(Jet + LibRed): drop the Group37310 composite FK during seeding
ChrisJollyAU Aug 4, 2026
5ab390e
tests
ChrisJollyAU Aug 4, 2026
6cd0dde
CI: make the x86 test hosts large-address-aware
ChrisJollyAU Aug 4, 2026
66c02a9
CI: patch the x86 SDK before the build, not after
ChrisJollyAU Aug 4, 2026
577acc8
Skip flaky tests on CI, update expected SQL, minor fixes
ChrisJollyAU Aug 5, 2026
20c5fe0
CI: rebalance the two Query shards, leave the non-Query shard alone
ChrisJollyAU Aug 5, 2026
51be0fa
Fix the stray comma that broke the LibRed functional build
ChrisJollyAU Aug 5, 2026
b7b9dd6
Update Load_collection SQL assertions for EntityState
ChrisJollyAU Aug 5, 2026
1b540ef
Upgrade to EF Core 11 preview 7 and sync tests with upstream
ChrisJollyAU Aug 13, 2026
f46e57f
Pin the preview 7 SDK, add ARM64 CI legs, finish the constraint excep…
ChrisJollyAU Aug 13, 2026
17e727b
Restore the pre-.NET-11 double->decimal conversion in the Jet reader
ChrisJollyAU Aug 14, 2026
22b7762
Tidy JetDateTimeTypeMapping's leftover default-date handling
ChrisJollyAU Aug 14, 2026
5506867
LibRed: match ACE's VBA conversion semantics
ChrisJollyAU Aug 14, 2026
5812e9d
LibRed: compare dates by OLE Automation serial, as ACE does
ChrisJollyAU Aug 14, 2026
6015be1
Update tests for Jet/ACE SQL compliance
ChrisJollyAU Aug 14, 2026
613879c
Make JetDecimalConverter public and cover it against the old runtime
ChrisJollyAU Aug 15, 2026
e050d2d
Adapt tests to EF Core 11, and drop two unrunnable green-test entries
ChrisJollyAU Aug 15, 2026
fa7a17b
Regenerate the compiled-model baselines for EF Core 11
ChrisJollyAU Aug 15, 2026
c3a8498
Drop the '&' versus '+' rationale comment from GetOperator
ChrisJollyAU Aug 15, 2026
d8cba5d
Drop the UTF-8 BOM everywhere and state the encoding in .editorconfig
ChrisJollyAU Aug 15, 2026
4f80fbb
Simplify LEFT JOIN predicates in Jet SQL generation
ChrisJollyAU Aug 16, 2026
cf5604e
Always reseed after the deadlock batching tests
ChrisJollyAU Aug 16, 2026
62b0891
Guard NULL numeric arguments to VBA functions at SQL generation
ChrisJollyAU Aug 16, 2026
5a07b3a
Probe which VBA function arguments reject NULL
ChrisJollyAU Aug 16, 2026
1a84a73
Flip Jet's VARIANT_BOOL in the expression factory, not the SQL generator
ChrisJollyAU Aug 16, 2026
592d52e
Re-baseline the green tests against EF Core 11
ChrisJollyAU Aug 18, 2026
2e4e007
Fix the AutoCommit checkout, and skip it for forks
ChrisJollyAU Aug 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .docker/BuildAllDockerfiles.ps1
Original file line number Diff line number Diff line change
@@ -1 +1 @@
Get-ChildItem $PSScriptRoot -Filter '*.dockerfile' -File | ForEach-Object { echo "Build $($_.Name)"; docker build -f $_.FullName -t "$($_.BaseName):latest" (Join-Path $PSScriptRoot '..') }
Get-ChildItem $PSScriptRoot -Filter '*.dockerfile' -File | ForEach-Object { echo "Build $($_.Name)"; docker build -f $_.FullName -t "$($_.BaseName):latest" (Join-Path $PSScriptRoot '..') }
2 changes: 1 addition & 1 deletion .docker/windows-ace-12.0-x64.dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# asdfescape=`
# asdfescape=`

FROM mcr.microsoft.com/windows:ltsc2019-amd64

Expand Down
2 changes: 1 addition & 1 deletion .docker/windows-ace-12.0-x86.dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# asdfescape=`
# asdfescape=`

FROM mcr.microsoft.com/windows:ltsc2019-amd64

Expand Down
2 changes: 1 addition & 1 deletion .docker/windows-ace-16.0-x64.dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# asdfescape=`
# asdfescape=`

FROM mcr.microsoft.com/windows:ltsc2019-amd64

Expand Down
2 changes: 1 addition & 1 deletion .docker/windows-ace-16.0-x86.dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# asdfescape=`
# asdfescape=`

FROM mcr.microsoft.com/windows:ltsc2019-amd64

Expand Down
2 changes: 1 addition & 1 deletion .docker/windows-ace-none-x64.dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# asdfescape=`
# asdfescape=`

FROM mcr.microsoft.com/windows:ltsc2019-amd64

Expand Down
2 changes: 1 addition & 1 deletion .docker/windows-ace-none-x86.dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# asdfescape=`
# asdfescape=`

FROM mcr.microsoft.com/windows:ltsc2019-amd64

Expand Down
2 changes: 1 addition & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
**
**
!global.json
4 changes: 4 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ indent_size = 4
indent_style = space
tab_width = 4

# Encoding
charset = utf-8

# New line preferences
end_of_line = crlf
insert_final_newline = false
Expand Down Expand Up @@ -261,6 +264,7 @@ dotnet_style_operator_placement_when_wrapping = beginning_of_line
tab_width = 4
indent_size = 4
end_of_line = crlf
charset = utf-8
dotnet_style_prefer_simplified_interpolation = true:suggestion
dotnet_style_prefer_collection_expression = when_types_loosely_match:suggestion
dotnet_style_namespace_match_folder = true:suggestion
Expand Down
2 changes: 1 addition & 1 deletion .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
# Can be changed to /.github/workflows/ if necessary.
# Can be changed to /.github/workflows/ if necessary.
/.github/ @CirrusRedOrg/ci-admins
8 changes: 5 additions & 3 deletions .github/workflows/auto_commit.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: AutoCommit
name: AutoCommit
on:
workflow_run:
workflows:
Expand All @@ -8,12 +8,14 @@ on:
jobs:
AutoCommit:
runs-on: ubuntu-latest
if: github.event.workflow_run.conclusion == 'success' && (github.event.workflow_run.head_commit.author.email != 'github-actions@github.com' || github.event.workflow_run.head_commit.message != '[GitHub Actions] Update green tests.')
# Same-repository branches only. A fork's PR could not be pushed to with GITHUB_TOKEN anyway, and
# checking one out here - with this repo's token and secrets - is the "pwn request" hole that
# actions/checkout now refuses by default.
if: github.event.workflow_run.conclusion == 'success' && (github.event.workflow_run.head_commit.author.email != 'github-actions@github.com' || github.event.workflow_run.head_commit.message != '[GitHub Actions] Update green tests.') && github.event.workflow_run.head_repository.full_name == github.repository
steps:
- name: Checkout
uses: actions/checkout@v5
with:
repository: ${{ github.event.workflow_run.head_repository.full_name }}
ref: ${{ github.event.workflow_run.head_branch }}
token: ${{ secrets.GITHUB_TOKEN }}
fetch-depth: 0
Expand Down
110 changes: 101 additions & 9 deletions .github/workflows/pull_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ env:
DOTNET_CLI_TELEMETRY_OPTOUT: true
DOTNET_NOLOGO: true
PIPELINE_WORKSPACE: true
DOTNET_CI: true
checkoutFetchDepth: 2
buildConfiguration: 'Debug'
skipTests: false
Expand Down Expand Up @@ -249,6 +250,47 @@ jobs:
Retry-Command {
&([ScriptBlock]::Create((Invoke-WebRequest -UseBasicParsing 'https://dot.net/v1/dotnet-install.ps1'))) -JSonFile global.json -Architecture '${{ matrix.aceArchitecture }}' -InstallDir '${{ env.dotnetInstallDirectory }}' -Verbose
} -Maximum 10 -ExponentialBackoff
# x86 hosts the tests in a 2GB user address space, and ACE is the one native component in that
# process. On ACE 2010 the same driver and tests get through all 23,509 of shard 3 on x64 and die
# partway on x86, which is the shape of address-space pressure - so lift the ceiling to 4GB by
# setting IMAGE_FILE_LARGE_ADDRESS_AWARE (COFF Characteristics 0x0020). Patched directly rather
# than via editbin so no vcvars environment is needed; signatures are invalidated, which does not
# matter on an ephemeral runner. (ACE 2016 dies early on BOTH architectures, so this cannot help
# there - its failure is the driver, not address space.)
#
# This runs BEFORE the build: MSBuild keeps worker nodes alive after a build and they hold
# dotnet.exe open, so patching it afterwards fails with "being used by another process".
- name: 'Make the x86 SDK large-address-aware'
if: matrix.aceArchitecture == 'x86'
shell: pwsh
run: |
function Set-LargeAddressAware {
param([string]$Path)

$bytes = [System.IO.File]::ReadAllBytes($Path)
$peOffset = [BitConverter]::ToInt32($bytes, 0x3C)
if ([BitConverter]::ToUInt32($bytes, $peOffset) -ne 0x00004550) { return 'not-a-pe' }

$machine = [BitConverter]::ToUInt16($bytes, $peOffset + 4)
if ($machine -ne 0x014C) { return "skipped-$('0x{0:X4}' -f $machine)" }

$charOffset = $peOffset + 22
$characteristics = [BitConverter]::ToUInt16($bytes, $charOffset)
if (($characteristics -band 0x0020) -ne 0) { return 'already' }

[BitConverter]::GetBytes([UInt16]($characteristics -bor 0x0020)).CopyTo($bytes, $charOffset)
[System.IO.File]::WriteAllBytes($Path, $bytes)

$verify = [System.IO.File]::ReadAllBytes($Path)
if (([BitConverter]::ToUInt16($verify, $charOffset) -band 0x0020) -eq 0) { return 'FAILED' }
return 'patched'
}
$target = '${{ env.dotnetExecutable }}'
if (Test-Path $target) {
echo ("{0,-9} {1}" -f (Set-LargeAddressAware -Path $target), $target)
} else {
echo "missing: $target"
}
- name: .NET Information After SDK Install
shell: pwsh
run: try { & '${{ env.dotnetExecutable }}' --info } catch { echo 'No ${{ matrix.aceArchitecture }} .NET SDK installed.' }
Expand Down Expand Up @@ -294,6 +336,49 @@ jobs:
shell: pwsh
run: |
& '${{ env.dotnetExecutable }}' build --configuration '${{ env.buildConfiguration }}'
# The apphosts the build emits are the other candidate for the process that ends up holding ACE,
# depending on whether VSTest launches the output-directory apphost or 'dotnet exec testhost.dll'.
# Shut the build server down first so nothing is still holding these open.
- name: 'Make the x86 test hosts large-address-aware'
if: matrix.aceArchitecture == 'x86'
shell: pwsh
run: |
function Set-LargeAddressAware {
param([string]$Path)

$bytes = [System.IO.File]::ReadAllBytes($Path)
$peOffset = [BitConverter]::ToInt32($bytes, 0x3C)
if ([BitConverter]::ToUInt32($bytes, $peOffset) -ne 0x00004550) { return 'not-a-pe' }

$machine = [BitConverter]::ToUInt16($bytes, $peOffset + 4)
if ($machine -ne 0x014C) { return "skipped-$('0x{0:X4}' -f $machine)" }

$charOffset = $peOffset + 22
$characteristics = [BitConverter]::ToUInt16($bytes, $charOffset)
if (($characteristics -band 0x0020) -ne 0) { return 'already' }

[BitConverter]::GetBytes([UInt16]($characteristics -bor 0x0020)).CopyTo($bytes, $charOffset)
[System.IO.File]::WriteAllBytes($Path, $bytes)

$verify = [System.IO.File]::ReadAllBytes($Path)
if (([BitConverter]::ToUInt16($verify, $charOffset) -band 0x0020) -eq 0) { return 'FAILED' }
return 'patched'
}
& '${{ env.dotnetExecutable }}' build-server shutdown | Out-Null

$results = @{}
foreach ($target in (Get-ChildItem -Path '. est' -Recurse -Filter '*.exe' -ErrorAction SilentlyContinue |
Where-Object { $_.FullName -match '\bin\' } | ForEach-Object { $_.FullName })) {
$state = Set-LargeAddressAware -Path $target
$results[$state] = 1 + ($results[$state] ?? 0)
if ($state -in 'patched', 'already', 'FAILED') {
echo ("{0,-9} {1}" -f $state, (Resolve-Path $target -Relative))
}
}

echo ''
echo (($results.GetEnumerator() | Sort-Object Name | ForEach-Object { "$($_.Key)=$($_.Value)" }) -join ' ')
if ($results['FAILED']) { echo 'Could not set the flag on one or more binaries.'; exit 1 }
- name: 'Run Tests: EFCore.Jet.Data.Tests'
if: always() && env.skipTests != 'true'
shell: pwsh
Expand All @@ -305,12 +390,10 @@ jobs:
# trx, and crash detection looks for Sequence_* blame dumps - so it cost console I/O for a log too
# big to read. On these sequential suites those writes sit directly on the critical path.
& '${{ env.dotnetExecutable }}' test .\test\EFCore.Jet.Data.Tests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --logger trx --blame-hang-timeout 3m
- name: 'Run Tests: EFCore.Jet.Tests'
if: always() && env.skipTests != 'true'
shell: pwsh
run: |
$env:EFCoreJet_DefaultConnection = '${{ env.defaultConnection }}'
& '${{ env.dotnetExecutable }}' test .\test\EFCore.Jet.Tests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --logger trx --blame-hang-timeout 3m
# EFCore.Jet.Tests is not run: the project compiles to an assembly with no tests in it. Its only two
# test files have been <Compile Remove>d since 45bae420 (the initial EF 9 update, July 2024), so the
# step spent two years reporting green over an empty run. Much of what is in those files appears to
# be covered by EFCore.Jet.FunctionalTests now; restore the step if they come back into the build.
- name: 'Run Tests: EFCore.Jet.FunctionalTests (Shard 1 - Query Core)'
if: always() && env.skipTests != 'true'
shell: pwsh
Expand All @@ -323,7 +406,7 @@ jobs:
}

$env:EFCoreJet_DefaultConnection = '${{ env.defaultConnection }}'
& '${{ env.dotnetExecutable }}' test .\test\EFCore.Jet.FunctionalTests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --logger trx --blame-hang-timeout 3m --results-directory $shardDir --filter "FullyQualifiedName~.FunctionalTests.Query.&FullyQualifiedName!~.FunctionalTests.Query.Associations.&FullyQualifiedName!~.FunctionalTests.Query.Translations."
& '${{ env.dotnetExecutable }}' test .\test\EFCore.Jet.FunctionalTests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --logger trx --blame-hang-timeout 3m --results-directory $shardDir --filter "FullyQualifiedName~.FunctionalTests.Query.&FullyQualifiedName!~Northwind&FullyQualifiedName!~GearsOfWar"

#
# Check for test runner crashes:
Expand Down Expand Up @@ -368,7 +451,7 @@ jobs:
}

$env:EFCoreJet_DefaultConnection = '${{ env.defaultConnection }}'
& '${{ env.dotnetExecutable }}' test .\test\EFCore.Jet.FunctionalTests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --logger trx --blame-hang-timeout 3m --results-directory $shardDir --filter "FullyQualifiedName~.FunctionalTests.Query.Associations.|FullyQualifiedName~.FunctionalTests.Query.Translations."
& '${{ env.dotnetExecutable }}' test .\test\EFCore.Jet.FunctionalTests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --logger trx --blame-hang-timeout 3m --results-directory $shardDir --filter "FullyQualifiedName~.FunctionalTests.Query.Northwind|FullyQualifiedName~GearsOfWar"

#
# Check for test runner crashes:
Expand Down Expand Up @@ -459,7 +542,6 @@ jobs:
path: |
test\EFCore.Jet.Data.Tests\TestResults\*.trx
test\EFCore.Jet.FunctionalTests\TestResults\**\*.trx
test\EFCore.Jet.Tests\TestResults\*.trx
- name: 'Check Tests: EFCore.Jet.FunctionalTests'
if: env.skipTests != 'true'
shell: pwsh
Expand Down Expand Up @@ -529,6 +611,11 @@ jobs:
- ubuntu-latest
- windows-latest
- macos-latest
# ARM64 legs. LibRed is fully managed with no ACE dependency, so these are the ones that
# actually prove the cross-platform claim on a non-x64 architecture. Excludes LibRedAccess,
# which cross-checks against the real Access engine and so needs Windows x64 with ACE.
- ubuntu-24.04-arm
- windows-11-arm
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
Expand Down Expand Up @@ -616,6 +703,11 @@ jobs:
- ubuntu-latest
- windows-latest
- macos-latest
# ARM64 legs. LibRed is fully managed with no ACE dependency, so these are the ones that
# actually prove the cross-platform claim on a non-x64 architecture. Excludes LibRedAccess,
# which cross-checks against the real Access engine and so needs Windows x64 with ACE.
- ubuntu-24.04-arm
- windows-11-arm
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
Expand Down
Loading
Loading