diff --git a/plugins/+buildframework/BuildSummaryPlugin.m b/plugins/+buildframework/BuildSummaryPlugin.m index b5b64cc..826279c 100644 --- a/plugins/+buildframework/BuildSummaryPlugin.m +++ b/plugins/+buildframework/BuildSummaryPlugin.m @@ -10,15 +10,13 @@ function runTaskGraph(plugin, pluginData) runTaskGraph@matlab.buildtool.plugins.BuildRunnerPlugin(plugin, pluginData); - if strcmpi(getenv("MW_GENERATE_JOB_SUMMARY"), "true") - [fID, msg] = fopen(fullfile(getenv("RUNNER_TEMP"), "buildSummary" + getenv("GITHUB_ACTION") + "_" + string(datetime('now', 'Format', 'yyyyMMdd_HHmmss_SSS')) + ".json"), "w"); - if fID == -1 - warning("buildframework:BuildSummaryPlugin:UnableToOpenFile","Unable to open a file required to create the MATLAB build summary table: %s", msg); - else - closeFile = onCleanup(@()fclose(fID)); - s = jsonencode(plugin.TaskDetails); - fprintf(fID, "%s",s); - end + [fID, msg] = fopen(fullfile(getenv("RUNNER_TEMP"), "buildSummary" + getenv("GITHUB_ACTION") + "_" + string(datetime('now', 'Format', 'yyyyMMdd_HHmmss_SSS')) + ".json"), "w"); + if fID == -1 + warning("buildframework:BuildSummaryPlugin:UnableToOpenFile","Unable to open a file required to create the MATLAB build summary table: %s", msg); + else + closeFile = onCleanup(@()fclose(fID)); + s = jsonencode(plugin.TaskDetails); + fprintf(fID, "%s",s); end end diff --git a/plugins/+buildframework/ParallelizableBuildSummaryPlugin.m b/plugins/+buildframework/ParallelizableBuildSummaryPlugin.m index 64b71e7..492e70b 100644 --- a/plugins/+buildframework/ParallelizableBuildSummaryPlugin.m +++ b/plugins/+buildframework/ParallelizableBuildSummaryPlugin.m @@ -34,16 +34,14 @@ function runBuild(plugin, pluginData) end % Write to file - if strcmpi(getenv("MW_GENERATE_JOB_SUMMARY"), "true") - folder = fileparts(plugin.TempFolder); - [fID, msg] = fopen(fullfile(folder, "buildSummary" + getenv("GITHUB_ACTION") + "_" + string(datetime('now', 'Format', 'yyyyMMdd_HHmmss_SSS')) + ".json"), "w"); - if fID == -1 - warning("buildframework:BuildSummaryPlugin:UnableToOpenFile","Unable to open a file required to create the MATLAB build summary table: %s", msg); - else - closeFile = onCleanup(@()fclose(fID)); - s = jsonencode(taskDetails); - fprintf(fID, "%s", s); - end + folder = fileparts(plugin.TempFolder); + [fID, msg] = fopen(fullfile(folder, "buildSummary" + getenv("GITHUB_ACTION") + "_" + string(datetime('now', 'Format', 'yyyyMMdd_HHmmss_SSS')) + ".json"), "w"); + if fID == -1 + warning("buildframework:BuildSummaryPlugin:UnableToOpenFile","Unable to open a file required to create the MATLAB build summary table: %s", msg); + else + closeFile = onCleanup(@()fclose(fID)); + s = jsonencode(taskDetails); + fprintf(fID, "%s", s); end end diff --git a/plugins/+buildframework/getDefaultPlugins.m b/plugins/+buildframework/getDefaultPlugins.m index b7af766..c87d7f6 100644 --- a/plugins/+buildframework/getDefaultPlugins.m +++ b/plugins/+buildframework/getDefaultPlugins.m @@ -6,15 +6,17 @@ pluginProviderData (1,1) struct = struct(); end -if isMATLABReleaseOlderThan("R2026a") - reportPlugin = buildframework.BuildSummaryPlugin(); -else - reportPlugin = buildframework.ParallelizableBuildSummaryPlugin(); -end - plugins = [ ... matlab.buildtool.internal.getFactoryDefaultPlugins(pluginProviderData) ... buildframework.GitHubLogPlugin() ... - reportPlugin ... ]; + +if strcmpi(getenv("MW_GENERATE_SUMMARY"), "true") + if isMATLABReleaseOlderThan("R2026a") + reportPlugin = buildframework.BuildSummaryPlugin(); + else + reportPlugin = buildframework.ParallelizableBuildSummaryPlugin(); + end + plugins = [plugins reportPlugin]; +end end diff --git a/plugins/+matlab/+unittest/+internal/+services/+plugins/TestResultsSummaryPluginService.m b/plugins/+matlab/+unittest/+internal/+services/+plugins/TestResultsSummaryPluginService.m index 178afc2..66cb138 100644 --- a/plugins/+matlab/+unittest/+internal/+services/+plugins/TestResultsSummaryPluginService.m +++ b/plugins/+matlab/+unittest/+internal/+services/+plugins/TestResultsSummaryPluginService.m @@ -4,7 +4,7 @@ methods function plugins = providePlugins(~, ~) % Check if MATLAB Test license is available - if license('test', 'matlab_test') + if strcmpi(getenv("MW_GENERATE_SUMMARY"), "true") && license('test', 'matlab_test') plugins = testframework.TestResultsSummaryPlugin(); else plugins = matlab.unittest.plugins.TestRunnerPlugin.empty(1,0); diff --git a/plugins/+testframework/TestResultsSummaryPlugin.m b/plugins/+testframework/TestResultsSummaryPlugin.m index 3c3b389..5d28750 100644 --- a/plugins/+testframework/TestResultsSummaryPlugin.m +++ b/plugins/+testframework/TestResultsSummaryPlugin.m @@ -3,39 +3,37 @@ methods (Access=protected) function reportFinalizedSuite(plugin, pluginData) - if strcmpi(getenv("MW_GENERATE_JOB_SUMMARY"), "true") - % Checkout MATLAB Test license - license('checkout', 'matlab_test'); + % Checkout MATLAB Test license + license('checkout', 'matlab_test'); - testDetails = struct([]); - for idx = 1:numel(pluginData.TestResult) - testDetails(idx).TestResult.Duration = pluginData.TestResult(idx).Duration; - if isfield(pluginData.TestResult(idx).Details, "DiagnosticRecord") && ~isempty(pluginData.TestResult(idx).Details.DiagnosticRecord) - testDetails(idx).TestResult.Details.DiagnosticRecord.Event = pluginData.TestResult(idx).Details.DiagnosticRecord.Event; - testDetails(idx).TestResult.Details.DiagnosticRecord.Report = pluginData.TestResult(idx).Details.DiagnosticRecord.Report; - else - testDetails(idx).TestResult.Details = struct(); - end - testDetails(idx).TestResult.Name = pluginData.TestResult(idx).Name; - testDetails(idx).TestResult.Passed = pluginData.TestResult(idx).Passed; - testDetails(idx).TestResult.Failed = pluginData.TestResult(idx).Failed; - testDetails(idx).TestResult.Incomplete = pluginData.TestResult(idx).Incomplete; - testDetails(idx).BaseFolder = pluginData.TestSuite(idx).BaseFolder; + testDetails = struct([]); + for idx = 1:numel(pluginData.TestResult) + testDetails(idx).TestResult.Duration = pluginData.TestResult(idx).Duration; + if isfield(pluginData.TestResult(idx).Details, "DiagnosticRecord") && ~isempty(pluginData.TestResult(idx).Details.DiagnosticRecord) + testDetails(idx).TestResult.Details.DiagnosticRecord.Event = pluginData.TestResult(idx).Details.DiagnosticRecord.Event; + testDetails(idx).TestResult.Details.DiagnosticRecord.Report = pluginData.TestResult(idx).Details.DiagnosticRecord.Report; + else + testDetails(idx).TestResult.Details = struct(); end + testDetails(idx).TestResult.Name = pluginData.TestResult(idx).Name; + testDetails(idx).TestResult.Passed = pluginData.TestResult(idx).Passed; + testDetails(idx).TestResult.Failed = pluginData.TestResult(idx).Failed; + testDetails(idx).TestResult.Incomplete = pluginData.TestResult(idx).Incomplete; + testDetails(idx).BaseFolder = pluginData.TestSuite(idx).BaseFolder; + end - try - jsonTestResults = jsonencode(testDetails, "PrettyPrint", true); - testArtifactFile = fullfile(getenv("RUNNER_TEMP"), "matlabTestResults" + getenv("GITHUB_ACTION") + "_" + string(datetime('now', 'Format', 'yyyyMMdd_HHmmss_SSS')) + ".json"); - [fID, msg] = fopen(testArtifactFile, "w"); - if fID == -1 - warning("testframework:TestResultsSummaryPlugin:UnableToOpenFile","Unable to open a file required to create the table of test results. (Cause: %s)", msg); - else - closeFile = onCleanup(@()fclose(fID)); - fprintf(fID, '%s', jsonTestResults); - end - catch e - warning("testframework:TestResultsSummaryPlugin:UnableToJsonEncode","Unable to jsonencode test results data. (Cause: %s)", e.message); + try + jsonTestResults = jsonencode(testDetails, "PrettyPrint", true); + testArtifactFile = fullfile(getenv("RUNNER_TEMP"), "matlabTestResults" + getenv("GITHUB_ACTION") + "_" + string(datetime('now', 'Format', 'yyyyMMdd_HHmmss_SSS')) + ".json"); + [fID, msg] = fopen(testArtifactFile, "w"); + if fID == -1 + warning("testframework:TestResultsSummaryPlugin:UnableToOpenFile","Unable to open a file required to create the table of test results. (Cause: %s)", msg); + else + closeFile = onCleanup(@()fclose(fID)); + fprintf(fID, '%s', jsonTestResults); end + catch e + warning("testframework:TestResultsSummaryPlugin:UnableToJsonEncode","Unable to jsonencode test results data. (Cause: %s)", e.message); end % Invoke the superclass method diff --git a/src/testResultsSummary.ts b/src/testResultsSummary.ts index ea7ff6f..2d2d867 100644 --- a/src/testResultsSummary.ts +++ b/src/testResultsSummary.ts @@ -86,7 +86,6 @@ export function getTestResults( actionName: string, workspace: string, ): TestResultsData | null { - let testResultsData = null; const filePrefix = `matlabTestResults${actionName}_`; const fileSuffix = `.json`; @@ -118,12 +117,6 @@ export function getTestResults( Duration: 0, }; - testResultsData = { - TestSessions: testSessions, - OverallStats: overallStats, - }; - - // Process each test result file for (const fileName of testResultFiles) { const resultsPath = path.join(runnerTemp, fileName); @@ -140,21 +133,18 @@ export function getTestResults( }; const map = new Map(); - const testCases = Array.isArray(testArtifact) ? testArtifact : [testArtifact]; for (const jsonTestCase of testCases) { processTestCase(sessionResults, jsonTestCase, map, sessionStats, workspace); } - // Add this session to the list testSessions.push({ FileName: fileName, TestResults: sessionResults, Stats: sessionStats, }); - // Update overall stats overallStats.Total += sessionStats.Total; overallStats.Passed += sessionStats.Passed; overallStats.Failed += sessionStats.Failed; @@ -178,7 +168,11 @@ export function getTestResults( } } - return testResultsData; + if (testSessions.length === 0) { + return null; + } + + return { TestSessions: testSessions, OverallStats: overallStats }; } export function addSummary( testResultsData: TestResultsData | null, diff --git a/src/testResultsSummary.unit.test.ts b/src/testResultsSummary.unit.test.ts index aa9f80d..6c540ce 100644 --- a/src/testResultsSummary.unit.test.ts +++ b/src/testResultsSummary.unit.test.ts @@ -653,9 +653,7 @@ describe("Error Handling Tests", () => { try { const result = testResultsSummary.getTestResults(runnerTemp, "", ""); - expect(result).not.toBeNull(); - expect(result!.TestSessions.length).toBe(0); - expect(result!.OverallStats.Total).toBe(0); + expect(result).toBeNull(); expect(consoleSpy).toHaveBeenCalledWith( expect.stringContaining( diff --git a/tests/tParallelizableBuildSummaryPlugin.m b/tests/tParallelizableBuildSummaryPlugin.m index e089763..eac95b1 100644 --- a/tests/tParallelizableBuildSummaryPlugin.m +++ b/tests/tParallelizableBuildSummaryPlugin.m @@ -24,7 +24,7 @@ function createPlugin(testCase) testCase.applyFixture(WorkingFolderFixture); testCase.TempFolder = pwd(); - testCase.applyFixture(EnvironmentVariableFixture("MW_GENERATE_JOB_SUMMARY", "true")); + testCase.applyFixture(EnvironmentVariableFixture("MW_GENERATE_SUMMARY", "true")); testCase.applyFixture(EnvironmentVariableFixture("GITHUB_ACTION", "my-action")); testCase.Plugin = ParallelizableBuildSummaryPlugin(TempFolder=testCase.TempFolder);