Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,7 @@ CoverageReports
**/nupkgs
src/Directory.Build.targets.bak.*
**/bin**
**/obj**
**/obj**
*.user
*.suo
packages/
17 changes: 17 additions & 0 deletions ai-pr-review.azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,23 @@ jobs:
- checkout: self
persistCredentials: true

- task: UseDotNet@2
displayName: Install dotnet
inputs:
packageType: 'sdk'
version: '10.x'
includePreviewVersions: false

- task: DotNetCoreCLI@2
displayName: Run targeted parallel integration tests
inputs:
command: 'test'
projects: |
src/AspNet/AspCore.Idempotency.MsSqlStore.Tests/AspCore.Idempotency.MsSqlStore.Tests.csproj
src/EfCore/EfCore.Specifications.Tests/EfCore.Specifications.Tests.csproj
src/EfCore/EfCore.Relational.Helpers.Tests/EfCore.Relational.Helpers.Tests.csproj
arguments: '--configuration Release -- RunConfiguration.MaxCpuCount=0'

- task: GPTPullRequestReview@0
inputs:
api_key: '$(open-ai-key)'
Expand Down
2 changes: 1 addition & 1 deletion azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ jobs:
inputs:
command: "test"
projects: "$(BuildParameters.TestProjects)"
arguments: '--configuration $(BuildConfiguration) --settings coverage.runsettings --collect "XPlat Code Coverage"'
arguments: '--configuration $(BuildConfiguration) --settings coverage.runsettings --collect "XPlat Code Coverage" -- RunConfiguration.MaxCpuCount=0'

- task: PublishCodeCoverageResults@2
displayName: Publish Code Coverage
Expand Down
34 changes: 34 additions & 0 deletions specs/001-migrate-itest-storage/checklists/requirements.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Specification Quality Checklist: Parallelize SQL Integration Tests

**Purpose**: Validate specification completeness and quality before proceeding to planning
**Created**: 2026-03-27
**Feature**: [spec.md](../spec.md)

## Content Quality

- [x] No implementation details (languages, frameworks, APIs)
- [x] Focused on user value and business needs
- [x] Written for non-technical stakeholders
- [x] All mandatory sections completed

## Requirement Completeness

- [x] No [NEEDS CLARIFICATION] markers remain
- [x] Requirements are testable and unambiguous
- [x] Success criteria are measurable
- [x] Success criteria are technology-agnostic (no implementation details)
- [x] All acceptance scenarios are defined
- [x] Edge cases are identified
- [x] Scope is clearly bounded
- [x] Dependencies and assumptions identified

## Feature Readiness

- [x] All functional requirements have clear acceptance criteria
- [x] User scenarios cover primary flows
- [x] Feature meets measurable outcomes defined in Success Criteria
- [x] No implementation details leak into specification

## Notes

- Validation completed in one iteration; no unresolved checklist items.
Original file line number Diff line number Diff line change
@@ -0,0 +1,250 @@
openapi: 3.0.3
info:
title: Integration Test Migration and Parallel Validation Contract
version: 0.1.0
description: >-
Contract for managing SQL-integration-test migration status, data-store profiles,
exception handling, and parallel execution validation evidence.
servers:
- url: https://ci.internal.dknet.local
paths:
/itest-projects:
get:
summary: List integration test projects and migration status
operationId: listIntegrationTestProjects
responses:
'200':
description: Current project migration state
content:
application/json:
schema:
type: object
properties:
projects:
type: array
items:
$ref: '#/components/schemas/IntegrationTestProject'
required: [projects]
/itest-projects/{projectId}/store-profile:
put:
summary: Set or update test store profile for a project
operationId: upsertTestStoreProfile
parameters:
- in: path
name: projectId
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TestStoreProfile'
responses:
'200':
description: Store profile updated
'400':
description: Invalid profile configuration
/parallel-runs:
post:
summary: Register and execute a parallel validation run
operationId: createParallelExecutionRun
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
commitSha:
type: string
targetProjectIds:
type: array
items:
type: string
parallelEnabled:
type: boolean
required: [commitSha, targetProjectIds, parallelEnabled]
responses:
'201':
description: Run accepted
content:
application/json:
schema:
$ref: '#/components/schemas/ParallelExecutionRun'
/parallel-runs/{runId}:
get:
summary: Fetch a single parallel execution run report
operationId: getParallelExecutionRun
parameters:
- in: path
name: runId
required: true
schema:
type: string
responses:
'200':
description: Run report
content:
application/json:
schema:
$ref: '#/components/schemas/ParallelExecutionRun'
'404':
description: Run not found
/migration-exceptions:
post:
summary: Record an approved migration exception
operationId: createMigrationException
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/MigrationExceptionRecord'
responses:
'201':
description: Exception recorded
'400':
description: Missing mitigation or approval data
components:
schemas:
IntegrationTestProject:
type: object
properties:
projectId:
type: string
projectPath:
type: string
moduleArea:
type: string
enum: [AspNet, EfCore]
currentStoreType:
type: string
enum: [SqlServerContainer, SqlServerConnection, SQLite, InMemory]
targetStoreType:
type: string
enum: [SQLite, InMemory]
requiresSqlContractLane:
type: boolean
migrationState:
type: string
enum: [Discovered, Assessed, Migrating, Validated, Exceptioned]
required:
- projectId
- projectPath
- moduleArea
- currentStoreType
- targetStoreType
- requiresSqlContractLane
- migrationState
TestStoreProfile:
type: object
properties:
profileId:
type: string
projectId:
type: string
provider:
type: string
enum: [SQLite, InMemory, SqlServerContainer]
isolationMode:
type: string
enum: [PerTest, PerClass, PerRun]
databaseNameStrategy:
type: string
enum: [GuidPerTest, TimestampedPerClass, Fixed]
setupStrategy:
type: string
enum: [Fixture, Factory, Inline]
teardownStrategy:
type: string
enum: [DisposeContext, DropDatabase, ContainerStop]
parallelSafe:
type: boolean
required:
- profileId
- projectId
- provider
- isolationMode
- databaseNameStrategy
- setupStrategy
- teardownStrategy
- parallelSafe
ParallelExecutionRun:
type: object
properties:
runId:
type: string
commitSha:
type: string
startedAtUtc:
type: string
format: date-time
endedAtUtc:
type: string
format: date-time
targetProjects:
type: array
items:
type: string
parallelEnabled:
type: boolean
passCount:
type: integer
minimum: 0
failCount:
type: integer
minimum: 0
contentionFailureCount:
type: integer
minimum: 0
durationSeconds:
type: integer
minimum: 0
required:
- runId
- commitSha
- startedAtUtc
- endedAtUtc
- targetProjects
- parallelEnabled
- passCount
- failCount
- contentionFailureCount
- durationSeconds
MigrationExceptionRecord:
type: object
properties:
exceptionId:
type: string
projectId:
type: string
reasonCode:
type: string
enum: [ProviderSpecificSql, TransactionSemantics, UnsupportedTranslation, Other]
description:
type: string
approvedBy:
type: string
reviewByDate:
type: string
format: date
mitigation:
type: string
required:
- exceptionId
- projectId
- reasonCode
- description
- approvedBy
- reviewByDate
- mitigation
example:
exceptionId: ex-efcore-relhelper-001
projectId: src/EfCore/EfCore.Relational.Helpers.Tests
reasonCode: ProviderSpecificSql
description: Test validates SQL Server metadata behavior unavailable in SQLite.
approvedBy: module-owner
reviewByDate: 2026-06-25
mitigation: Retain SQL contract-lane tests in targeted pipeline runs.
Loading
Loading