diff --git a/src/LiquidCode.Tester.Common/Models/SubmitForTesterModel.cs b/src/LiquidCode.Tester.Common/Models/SubmitForTesterModel.cs index 9434997..c321117 100644 --- a/src/LiquidCode.Tester.Common/Models/SubmitForTesterModel.cs +++ b/src/LiquidCode.Tester.Common/Models/SubmitForTesterModel.cs @@ -7,5 +7,7 @@ public record SubmitForTesterModel( string LanguageVersion, string SourceCode, string PackageUrl, - string CallbackUrl + string CallbackUrl, + int? TimeLimitMs = null, + int? MemoryLimitMb = null ); diff --git a/src/LiquidCode.Tester.Gateway/Controllers/TesterController.cs b/src/LiquidCode.Tester.Gateway/Controllers/TesterController.cs index ac52d66..f15dadb 100644 --- a/src/LiquidCode.Tester.Gateway/Controllers/TesterController.cs +++ b/src/LiquidCode.Tester.Gateway/Controllers/TesterController.cs @@ -82,7 +82,9 @@ public class TesterController : ControllerBase LanguageVersion: request.LanguageVersion, SourceCode: request.SourceCode, PackageUrl: packagePath, // Use local path instead of URL - CallbackUrl: request.CallbackUrl + CallbackUrl: request.CallbackUrl, + TimeLimitMs: request.TimeLimitMs, + MemoryLimitMb: request.MemoryLimitMb ); // Send to appropriate worker based on language diff --git a/src/LiquidCode.Tester.Gateway/Models/LocalSubmitModel.cs b/src/LiquidCode.Tester.Gateway/Models/LocalSubmitModel.cs index b150508..f0f8b5f 100644 --- a/src/LiquidCode.Tester.Gateway/Models/LocalSubmitModel.cs +++ b/src/LiquidCode.Tester.Gateway/Models/LocalSubmitModel.cs @@ -9,4 +9,14 @@ public class LocalSubmitModel public string SourceCode { get; set; } = string.Empty; public string CallbackUrl { get; set; } = string.Empty; public IFormFile? Package { get; set; } + + /// + /// Optional time limit override in milliseconds (for testing purposes) + /// + public int? TimeLimitMs { get; set; } + + /// + /// Optional memory limit override in megabytes (for testing purposes) + /// + public int? MemoryLimitMb { get; set; } } diff --git a/src/LiquidCode.Tester.Gateway/Services/WorkerClientService.cs b/src/LiquidCode.Tester.Gateway/Services/WorkerClientService.cs index 131d481..1231139 100644 --- a/src/LiquidCode.Tester.Gateway/Services/WorkerClientService.cs +++ b/src/LiquidCode.Tester.Gateway/Services/WorkerClientService.cs @@ -38,6 +38,16 @@ public class WorkerClientService : IWorkerClientService form.Add(new StringContent(submit.SourceCode), "SourceCode"); form.Add(new StringContent(submit.CallbackUrl), "CallbackUrl"); + // Add optional limit overrides (for testing purposes) + if (submit.TimeLimitMs.HasValue) + { + form.Add(new StringContent(submit.TimeLimitMs.Value.ToString()), "TimeLimitMs"); + } + if (submit.MemoryLimitMb.HasValue) + { + form.Add(new StringContent(submit.MemoryLimitMb.Value.ToString()), "MemoryLimitMb"); + } + // Add package file var fileStream = File.OpenRead(packagePath); var fileContent = new StreamContent(fileStream); diff --git a/src/LiquidCode.Tester.Worker/Controllers/TestController.cs b/src/LiquidCode.Tester.Worker/Controllers/TestController.cs index d2fbe14..e8f701b 100644 --- a/src/LiquidCode.Tester.Worker/Controllers/TestController.cs +++ b/src/LiquidCode.Tester.Worker/Controllers/TestController.cs @@ -51,7 +51,9 @@ public class TestController : ControllerBase SourceCode = request.SourceCode, CallbackUrl = request.CallbackUrl, Package = null, // Will use file path instead - PackageFilePath = packageFilePath + PackageFilePath = packageFilePath, + TimeLimitMs = request.TimeLimitMs, + MemoryLimitMb = request.MemoryLimitMb }; // Start testing in background @@ -109,4 +111,14 @@ public class TestRequest public string CallbackUrl { get; set; } = string.Empty; public IFormFile? Package { get; set; } public string? PackageFilePath { get; set; } // Internal use - path to saved package file + + /// + /// Optional time limit override in milliseconds (for testing purposes) + /// + public int? TimeLimitMs { get; set; } + + /// + /// Optional memory limit override in megabytes (for testing purposes) + /// + public int? MemoryLimitMb { get; set; } } diff --git a/src/LiquidCode.Tester.Worker/Services/TestingService.cs b/src/LiquidCode.Tester.Worker/Services/TestingService.cs index db37283..7ee9203 100644 --- a/src/LiquidCode.Tester.Worker/Services/TestingService.cs +++ b/src/LiquidCode.Tester.Worker/Services/TestingService.cs @@ -88,6 +88,17 @@ public class TestingService : ITestingService _logger.LogInformation("Compilation successful"); + // Check for limit overrides (for testing purposes) + var timeLimitOverride = request.TimeLimitMs; + var memoryLimitOverride = request.MemoryLimitMb; + + if (timeLimitOverride.HasValue || memoryLimitOverride.HasValue) + { + _logger.LogInformation("Using limit overrides - TimeLimit: {TimeLimit}ms, MemoryLimit: {MemoryLimit}MB", + timeLimitOverride?.ToString() ?? "default", + memoryLimitOverride?.ToString() ?? "default"); + } + // Send testing status await SendStatusAsync(request, State.Testing, ErrorCode.None, "Running tests", 0, package.TestCases.Count); @@ -100,12 +111,16 @@ public class TestingService : ITestingService await SendStatusAsync(request, State.Testing, ErrorCode.None, $"Running test {testCase.Number}", testCase.Number, package.TestCases.Count); + // Use override limits if provided, otherwise use test case limits + var timeLimit = timeLimitOverride ?? testCase.TimeLimit; + var memoryLimit = memoryLimitOverride ?? testCase.MemoryLimit; + // Execute solution var executionResult = await executionService.ExecuteAsync( compilationResult.ExecutablePath!, testCase.InputFilePath, - testCase.TimeLimit, - testCase.MemoryLimit); + timeLimit, + memoryLimit); // Check for execution errors if (executionResult.TimeLimitExceeded)