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
63 changes: 36 additions & 27 deletions TUnit.Engine/Building/TestBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ public async Task<IEnumerable<AbstractExecutableTest>> BuildTestsFromMetadataAsy

if (metadata.ClassDataSources.Any(ds => ds is IAccessesInstanceData))
{
var failedTest = await CreateFailedTestForClassDataSourceCircularDependency(metadata);
var failedTest = CreateFailedTestForClassDataSourceCircularDependency(metadata);
tests.Add(failedTest);
return tests;
}
Expand Down Expand Up @@ -279,7 +279,7 @@ await _objectLifecycleService.RegisterObjectAsync(
}
catch (Exception ex)
{
var failedTest = await CreateFailedTestForInstanceDataSourceError(metadata, ex);
var failedTest = CreateFailedTestForInstanceDataSourceError(metadata, ex);
tests.Add(failedTest);
continue;
}
Expand Down Expand Up @@ -382,15 +382,15 @@ await _objectLifecycleService.RegisterObjectAsync(
catch (Exception innerEx)
{
// If we still can't resolve, create a failed test
var failedTest = await CreateFailedTestForDataGenerationError(metadata, innerEx);
var failedTest = CreateFailedTestForDataGenerationError(metadata, innerEx);
tests.Add(failedTest);
continue;
}
}
catch (Exception ex)
{
// If generic resolution fails, create a failed test
var failedTest = await CreateFailedTestForDataGenerationError(metadata, ex);
var failedTest = CreateFailedTestForDataGenerationError(metadata, ex);
tests.Add(failedTest);
continue;
}
Expand Down Expand Up @@ -488,7 +488,7 @@ await _objectLifecycleService.RegisterObjectAsync(
// If generic type inference failed, create a failed test instead of skipped
if (genericResolutionException != null)
{
var failedTest = await CreateFailedTestForDataGenerationError(metadata, genericResolutionException);
var failedTest = CreateFailedTestForDataGenerationError(metadata, genericResolutionException);
tests.Add(failedTest);
}
else
Expand Down Expand Up @@ -547,7 +547,7 @@ await _objectLifecycleService.RegisterObjectAsync(
// If generic type inference failed, create a failed test instead of skipped
if (genericResolutionException != null)
{
var failedTest = await CreateFailedTestForDataGenerationError(metadata, genericResolutionException);
var failedTest = CreateFailedTestForDataGenerationError(metadata, genericResolutionException);
tests.Add(failedTest);
}
else
Expand Down Expand Up @@ -597,7 +597,7 @@ await _objectLifecycleService.RegisterObjectAsync(
}
catch (Exception ex)
{
var failedTest = await CreateFailedTestForDataGenerationError(metadata, ex);
var failedTest = CreateFailedTestForDataGenerationError(metadata, ex);
tests.Add(failedTest);
return tests;
}
Expand Down Expand Up @@ -1114,16 +1114,16 @@ private Task InvokeDiscoveryEventReceiversAsync(TestContext context)
return _eventReceiverOrchestrator.InvokeTestDiscoveryEventReceiversAsync(context, discoveredContext, CancellationToken.None);
}

private async Task<AbstractExecutableTest> CreateFailedTestForDataGenerationError(TestMetadata metadata, Exception exception)
private AbstractExecutableTest CreateFailedTestForDataGenerationError(TestMetadata metadata, Exception exception)
{
return await CreateFailedTestForDataGenerationError(metadata, exception, new TestDataCombination());
return CreateFailedTestForDataGenerationError(metadata, exception, new TestDataCombination());
}

private async Task<AbstractExecutableTest> CreateFailedTestForDataGenerationError(TestMetadata metadata, Exception exception, TestDataCombination combination)
private AbstractExecutableTest CreateFailedTestForDataGenerationError(TestMetadata metadata, Exception exception, TestDataCombination combination)
{
var testId = TestIdentifierService.GenerateFailedTestId(metadata, combination);

var testDetails = await CreateFailedTestDetails(metadata, testId);
var testDetails = CreateFailedTestDetails(metadata, testId);
var context = CreateFailedTestContext(metadata, testDetails);

return new FailedExecutableTest(exception)
Expand All @@ -1132,14 +1132,24 @@ private async Task<AbstractExecutableTest> CreateFailedTestForDataGenerationErro
Metadata = metadata,
Arguments = [],
ClassArguments = [],
Context = context
Context = context,
State = TestState.Failed,
Result = new TestResult
{
State = TestState.Failed,
Start = DateTimeOffset.UtcNow,
End = DateTimeOffset.UtcNow,
Duration = TimeSpan.Zero,
Exception = exception,
ComputerName = EnvironmentHelper.MachineName,
TestContext = context
}
};
}

private async Task<TestDetails> CreateFailedTestDetails(TestMetadata metadata, string testId)
private TestDetails CreateFailedTestDetails(TestMetadata metadata, string testId)
{
var attributes = (await InitializeAttributesAsync(metadata.GetOrCreateAttributes()));
return new TestDetails(attributes)
return new TestDetails([])
{
TestId = testId,
TestName = metadata.TestName,
Expand All @@ -1152,8 +1162,8 @@ private async Task<TestDetails> CreateFailedTestDetails(TestMetadata metadata, s
TestLineNumber = metadata.LineNumber,
ReturnType = typeof(Task),
MethodMetadata = metadata.MethodMetadata,
AttributesByType = attributes.ToAttributeDictionary(),
Timeout = TimeSpan.FromMinutes(30) // Default 30-minute timeout (can be overridden by TimeoutAttribute)
AttributesByType = AttributeDictionaryHelper.Empty,
Timeout = TimeSpan.FromMinutes(30)
};
}

Expand Down Expand Up @@ -1190,13 +1200,12 @@ private TestContext CreateFailedTestContext(TestMetadata metadata, TestDetails t



private async Task<AbstractExecutableTest> CreateFailedTestForInstanceDataSourceError(TestMetadata metadata, Exception exception)
private AbstractExecutableTest CreateFailedTestForInstanceDataSourceError(TestMetadata metadata, Exception exception)
{
var message = $"Failed to create instance for method data source expansion: {exception.Message}";
return await CreateFailedTestForDataGenerationError(metadata, exception);
return CreateFailedTestForDataGenerationError(metadata, exception);
}

private async Task<AbstractExecutableTest> CreateFailedTestForClassDataSourceCircularDependency(TestMetadata metadata)
private AbstractExecutableTest CreateFailedTestForClassDataSourceCircularDependency(TestMetadata metadata)
{
var instanceClassDataSources = metadata.ClassDataSources
.Where(ds => ds is IAccessesInstanceData)
Expand All @@ -1211,7 +1220,7 @@ private async Task<AbstractExecutableTest> CreateFailedTestForClassDataSourceCir
"Consider using static method data sources for class constructor arguments instead.";

var exception = new InvalidOperationException(message);
return await CreateFailedTestForDataGenerationError(metadata, exception);
return CreateFailedTestForDataGenerationError(metadata, exception);
}

private static bool IsDataCompatibleWithExpectedTypes(TestMetadata metadata, object?[] methodData)
Expand Down Expand Up @@ -1556,7 +1565,7 @@ public async IAsyncEnumerable<AbstractExecutableTest> BuildTestsStreamingAsync(
// Check for circular dependency
if (metadata.ClassDataSources.Any(ds => ds is IAccessesInstanceData))
{
yield return await CreateFailedTestForClassDataSourceCircularDependency(metadata);
yield return CreateFailedTestForClassDataSourceCircularDependency(metadata);
yield break;
}

Expand Down Expand Up @@ -1597,7 +1606,7 @@ public async IAsyncEnumerable<AbstractExecutableTest> BuildTestsStreamingAsync(
if (!instanceResult.Success)
{
// Yield a failed test instead of silently skipping
yield return await CreateFailedTestForInstanceDataSourceError(metadata, instanceResult.Exception!);
yield return CreateFailedTestForInstanceDataSourceError(metadata, instanceResult.Exception!);
continue;
}

Expand Down Expand Up @@ -1782,12 +1791,12 @@ private Task<InstanceCreationResult> CreateInstanceForMethodDataSources(
}
catch (Exception ex)
{
return await CreateFailedTestForDataGenerationError(metadata, ex);
return CreateFailedTestForDataGenerationError(metadata, ex);
}
}
catch (Exception ex)
{
return await CreateFailedTestForDataGenerationError(metadata, ex);
return CreateFailedTestForDataGenerationError(metadata, ex);
}

if (metadata.TestClassType.IsGenericTypeDefinition && resolvedClassGenericArgs.Length == 0)
Expand Down Expand Up @@ -1851,7 +1860,7 @@ private Task<InstanceCreationResult> CreateInstanceForMethodDataSources(
}
catch (Exception ex)
{
return await CreateFailedTestForDataGenerationError(metadata, ex);
return CreateFailedTestForDataGenerationError(metadata, ex);
}
}

Expand Down
2 changes: 1 addition & 1 deletion TUnit.Engine/TestDiscoveryService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ private async IAsyncEnumerable<AbstractExecutableTest> DiscoverTestsStreamAsync(
using var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
cts.CancelAfter(TimeSpan.FromMinutes(5));

var tests = await _testBuilderPipeline.BuildTestsStreamingAsync(testSessionId, buildingContext, metadataFilter: null, cancellationToken).ConfigureAwait(false);
var tests = await _testBuilderPipeline.BuildTestsStreamingAsync(testSessionId, buildingContext, metadataFilter: null, cts.Token).ConfigureAwait(false);

foreach (var test in tests)
{
Expand Down
Loading