Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add CircleCI Test Split Feature #75

Closed
wants to merge 182 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
182 commits
Select commit Hold shift + click to select a range
7610ecb
Update test-deploy.yml
vanditaMW Jun 19, 2024
526f157
Update test-deploy.yml
vanditaMW Jun 19, 2024
febb8e2
Update test-deploy.yml
vanditaMW Jun 19, 2024
7dbbdef
Update test-deploy.yml
vanditaMW Jun 19, 2024
d682469
Update test-deploy.yml
vanditaMW Jun 19, 2024
39cd967
Update test-deploy.yml
vanditaMW Jun 19, 2024
3a6a396
Update run-tests.sh
vanditaMW Jun 19, 2024
e08d1cd
Added use-split
vanditaMW Jun 19, 2024
4758dd1
Update run-tests.yml
vanditaMW Jun 19, 2024
99c76cd
Update test-deploy.yml
vanditaMW Jun 19, 2024
c52ff68
Update test-deploy.yml
vanditaMW Jun 19, 2024
510f9e9
Update test-deploy.yml
vanditaMW Jun 19, 2024
75de0ac
Update run-tests.sh
vanditaMW Jun 20, 2024
ac727d0
Update test-deploy.yml
vanditaMW Jun 20, 2024
c393864
POC
vanditaMW Jun 20, 2024
d50d5ff
Resolved merge conflicts.
vanditaMW Jun 20, 2024
52254ba
Update run-tests.sh
vanditaMW Jun 20, 2024
0654224
Update run-tests.sh
vanditaMW Jun 20, 2024
a8356cf
Update test-deploy.yml
vanditaMW Jun 20, 2024
de8a044
Update custom_genscript.m
vanditaMW Jun 20, 2024
aab59fb
Update test-deploy.yml
vanditaMW Jun 20, 2024
5056ebf
Added test files
vanditaMW Jun 20, 2024
f141947
updated
vanditaMW Jun 20, 2024
96a529b
Added one line
vanditaMW Jun 20, 2024
5a5b638
Update run-tests.sh
vanditaMW Jun 20, 2024
4f338f0
Update run-tests.sh
vanditaMW Jun 20, 2024
ec429bf
added parallelism
vanditaMW Jun 20, 2024
f8047e5
Update test-deploy.yml
vanditaMW Jun 24, 2024
54ea8cd
Update custom_genscript.m
vanditaMW Jun 24, 2024
c378673
poc2
vanditaMW Jun 24, 2024
ae4eb36
adding echo statement
vanditaMW Jun 24, 2024
613ec1b
poc3
vanditaMW Jun 24, 2024
d2ba42e
poc2
vanditaMW Jun 24, 2024
ecdb3e3
poc2
vanditaMW Jun 24, 2024
be290bb
poc2
vanditaMW Jun 24, 2024
ab1c2fb
poc3
vanditaMW Jun 24, 2024
02c2c68
poc3
vanditaMW Jun 24, 2024
ed5ebb2
poc3
vanditaMW Jun 24, 2024
c0456ba
poc_second
vanditaMW Jun 26, 2024
f9617e8
poc_second
vanditaMW Jun 26, 2024
d5bcfcb
poc_second
vanditaMW Jun 26, 2024
8f4e5c7
poc_second
vanditaMW Jun 26, 2024
3fa1db8
poc_second
vanditaMW Jun 26, 2024
58c3b56
poc_second
vanditaMW Jun 26, 2024
8f7cd07
poc_second
vanditaMW Jun 26, 2024
c3b21b5
poc_second
vanditaMW Jun 26, 2024
b768b73
poc_second
vanditaMW Jun 26, 2024
6a3b3d5
poc_second
vanditaMW Jun 26, 2024
ccbf09e
poc_second
vanditaMW Jun 26, 2024
f09ab1d
poc_second
vanditaMW Jun 26, 2024
f765f7f
poc_second
vanditaMW Jun 27, 2024
6b53445
poc_second
vanditaMW Jun 27, 2024
ca9df3b
new_second_poc
vanditaMW Jun 27, 2024
8578bdd
new_second_poc
vanditaMW Jun 27, 2024
36ec8b0
new_FIRST_poc
vanditaMW Jun 27, 2024
91d1337
test file identification
vanditaMW Jun 28, 2024
cd2effa
test file identification
vanditaMW Jun 28, 2024
c63baa4
test file identification
vanditaMW Jun 28, 2024
d2f9c5c
test file identification
vanditaMW Jun 28, 2024
b5f4abe
identifying test_files method2
vanditaMW Jul 1, 2024
a48de06
poc3 test file identification
vanditaMW Jul 1, 2024
8171ad6
poc3 test file identification
vanditaMW Jul 1, 2024
b794f1d
poc3 optimized
vanditaMW Jul 1, 2024
ff7c1e6
poc3 test file identification
vanditaMW Jul 1, 2024
060aa26
poc3
vanditaMW Jul 2, 2024
373e739
poc3 optimized
vanditaMW Jul 2, 2024
0cb199f
Adding store_test_results
vanditaMW Jul 3, 2024
5f8e467
Adding store_test_results
vanditaMW Jul 3, 2024
c323a93
Adding store_test_results
vanditaMW Jul 3, 2024
b478eae
store_artifacts
vanditaMW Jul 7, 2024
80d072b
store_artifacts
vanditaMW Jul 7, 2024
3f29020
split-by-timings
vanditaMW Jul 7, 2024
a05055e
inside tests
vanditaMW Jul 7, 2024
73cea78
store_artifacts
vanditaMW Jul 7, 2024
97ac3a2
store_artifacts
vanditaMW Jul 7, 2024
9708584
full path
vanditaMW Jul 8, 2024
bac7f78
full path
vanditaMW Jul 8, 2024
80bbfa3
using selectIf
vanditaMW Jul 10, 2024
4c82a26
using selectIf 1st pipeline run
vanditaMW Jul 10, 2024
a18ace5
using selectIf 1st pipeline run
vanditaMW Jul 10, 2024
28bb8bc
using selectIf
vanditaMW Jul 10, 2024
64a7b7c
using selectIf
vanditaMW Jul 10, 2024
33fb55f
using selectIf
vanditaMW Jul 10, 2024
5346737
using selectIf 2nd run
vanditaMW Jul 10, 2024
edfb986
alternate_poc
vanditaMW Jul 10, 2024
14d1254
using selectIf 2nd run
vanditaMW Jul 10, 2024
6c60d20
alternate_poc
vanditaMW Jul 10, 2024
00fd6e4
using selectIf 2nd run
vanditaMW Jul 10, 2024
1ee91ac
Same file in different folder
vanditaMW Jul 11, 2024
f0fbe5d
Full path
vanditaMW Jul 11, 2024
4270495
Full path
vanditaMW Jul 11, 2024
adebee2
Full path
vanditaMW Jul 11, 2024
8ee933c
Full path
vanditaMW Jul 11, 2024
558184b
Full path2
vanditaMW Jul 11, 2024
f4f7714
Full path
vanditaMW Jul 11, 2024
9fad01b
Full path3
vanditaMW Jul 11, 2024
96e7ff1
Full path with store results
vanditaMW Jul 11, 2024
d6c556b
calling 2 scripts
vanditaMW Jul 11, 2024
ceb2d23
calling 2 scripts
vanditaMW Jul 11, 2024
cf1a349
calling 2 scripts
vanditaMW Jul 11, 2024
cf45473
calling 2 scripts (poc)
vanditaMW Jul 11, 2024
624f509
calling 2 scripts
vanditaMW Jul 11, 2024
aefeaaf
Full path
vanditaMW Jul 12, 2024
1d4e1f0
2scripts reproducible
vanditaMW Jul 16, 2024
fdab687
2scripts reproducible
vanditaMW Jul 16, 2024
3dbf876
splitting own
vanditaMW Jul 16, 2024
06d3fcc
splitting own
vanditaMW Jul 16, 2024
b5dbfa4
splitting own
vanditaMW Jul 16, 2024
7a9146b
printing output
vanditaMW Jul 17, 2024
5f2f74b
printing output
vanditaMW Jul 17, 2024
dc798bd
printing output
vanditaMW Jul 17, 2024
0b33024
printing output
vanditaMW Jul 17, 2024
637adf0
printing output
vanditaMW Jul 17, 2024
078938a
printing output
vanditaMW Jul 17, 2024
21b3fbf
printing output
vanditaMW Jul 17, 2024
8614c43
printing output
vanditaMW Jul 17, 2024
af26bfa
printing output
vanditaMW Jul 17, 2024
60ae038
printing output
vanditaMW Jul 17, 2024
a227e1b
printing output
vanditaMW Jul 17, 2024
a58a74e
printing output
vanditaMW Jul 17, 2024
4c42169
printing output
vanditaMW Jul 17, 2024
a510779
printing output
vanditaMW Jul 17, 2024
56e83a3
SELECT_BY_FILES
vanditaMW Jul 17, 2024
5eaf3d4
printing output
vanditaMW Jul 17, 2024
f76d8e7
SELECT_BY_FILES
vanditaMW Jul 17, 2024
6ac2d94
SELECT_BY_FILES
vanditaMW Jul 17, 2024
cf6f515
SELECT_BY_FILES UPDATED
vanditaMW Jul 17, 2024
3dae86f
SELECT_BY_FILES UPDATED
vanditaMW Jul 17, 2024
1132032
SELECT_BY_FILES WITHOUT AWK/SED
vanditaMW Jul 17, 2024
5bd7a85
SELECT_BY_FILES UPDATED
vanditaMW Jul 17, 2024
427e09c
SELECT_BY_FILES UPDATED
vanditaMW Jul 17, 2024
3c7eb25
SELECT_BY_FILES WITHOUT AWK/SED
vanditaMW Jul 17, 2024
2efc5f9
SELECT_BY_FILES WITHOUT AWK/SED
vanditaMW Jul 17, 2024
3c02b20
SELECT_BY_FILES WITHOUT AWK/SED
vanditaMW Jul 17, 2024
46c0314
Passing splitby
vanditaMW Aug 9, 2024
de4ea03
Passing splitby
vanditaMW Aug 9, 2024
5b79532
Passing splitby
vanditaMW Aug 9, 2024
57f155a
Passing splitby
vanditaMW Aug 9, 2024
7760e50
Passing splitby
vanditaMW Aug 9, 2024
300e623
Passing splitby
vanditaMW Aug 9, 2024
9dd2203
Passing splitby
vanditaMW Aug 9, 2024
68dfb3f
Passing splitby
vanditaMW Aug 9, 2024
b2f3ac4
genscript addition
vanditaMW Aug 9, 2024
cb0eab2
genscript addition
vanditaMW Aug 9, 2024
881182a
genscript addition
vanditaMW Aug 9, 2024
8029554
genscript addition
vanditaMW Aug 9, 2024
449219e
Added changes to custom script
vanditaMW Aug 9, 2024
fd08133
genscript addition
vanditaMW Aug 9, 2024
b2f4674
use-parallel
vanditaMW Aug 11, 2024
7c2ddd4
use-parallel without split
vanditaMW Aug 11, 2024
1f32b3a
filesize
vanditaMW Aug 11, 2024
568f635
filesize
vanditaMW Aug 11, 2024
c126d10
filesize
vanditaMW Aug 11, 2024
034673f
filesize
vanditaMW Aug 11, 2024
7d8854f
Detecting circleci env
vanditaMW Aug 12, 2024
5f63500
Detecting circleci env
vanditaMW Aug 12, 2024
cfb676a
Detecting circleci env
vanditaMW Aug 12, 2024
f4074dc
file size
vanditaMW Aug 12, 2024
1dfbf50
file size
vanditaMW Aug 12, 2024
0201068
filename
vanditaMW Aug 12, 2024
4394233
file size
vanditaMW Aug 12, 2024
674c64c
file name
vanditaMW Aug 12, 2024
f7397aa
update filesize
vanditaMW Aug 12, 2024
8d5b821
update filesize
vanditaMW Aug 12, 2024
9d6d1e6
filesize
vanditaMW Aug 12, 2024
9116c26
timing
vanditaMW Aug 12, 2024
d65d677
selectbyfolder
vanditaMW Aug 12, 2024
0e3d909
timing
vanditaMW Aug 13, 2024
4c19030
timing
vanditaMW Aug 13, 2024
173dec6
test results
vanditaMW Aug 13, 2024
d33f3a5
timing
vanditaMW Aug 13, 2024
17b4066
timing and use paralle
vanditaMW Aug 13, 2024
e7c3ec4
updated variables
vanditaMW Aug 13, 2024
46bfa92
updated variables
vanditaMW Aug 13, 2024
126ee59
updated variables and sh file
vanditaMW Aug 13, 2024
7d1d298
check with circlci test split
vanditaMW Aug 13, 2024
9348bf5
check with circlci test split
vanditaMW Aug 13, 2024
60676d3
intrgrate
vanditaMW Aug 14, 2024
9c1fc0b
circleci test split
vanditaMW Aug 14, 2024
dc9853e
Merge remote-tracking branch 'origin/master' into vandita/TestSplit
vanditaMW Aug 14, 2024
d45dbe4
Added if else inside matlab executable
vanditaMW Aug 16, 2024
ae90128
Added if else inside matlab executable
vanditaMW Aug 16, 2024
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
2 changes: 1 addition & 1 deletion .circleci/test-deploy.yml
vanditaMW marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version: 2.1
version: 2.1
vanditaMW marked this conversation as resolved.
Show resolved Hide resolved
orbs:
matlab: mathworks/matlab@dev:<<pipeline.git.revision>>
orb-tools: circleci/orb-tools@11.1
Expand Down
25 changes: 25 additions & 0 deletions generateFolderSelectionStatement.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
function finalStatement= generateFolderSelectionStatement(statement)
vanditaMW marked this conversation as resolved.
Show resolved Hide resolved
vanditaMW marked this conversation as resolved.
Show resolved Hide resolved
import scriptgen.internal.unquoteText;
import scriptgen.internal.isAbsolutePath;

statement = strtrim(strsplit(statement, {';', ':'}));
statement = cellfun(@(t) ['''' t ''''], strrep(statement, '''', ''''''), 'UniformOutput', false);

constraints = {};

for i = 1:numel(statement)
folder = statement{i};

if ~strcmp(folder, unquoteText(folder)) && ~isAbsolutePath(unquoteText(folder))
constraint = sprintf('StartsWithSubstring(fullfile(pwd, %s))', folder);
else
constraint = sprintf('StartsWithSubstring(%s)', folder);
end

constraints{end+1} = constraint; %#ok<AGROW>
end

statement = sprintf('HasBaseFolder(%s)', strjoin(constraints, ' | '));
finalStatement = sprintf('suite = suite.selectIf(%s);', statement);
end

95 changes: 95 additions & 0 deletions getCircleCISplitFiles.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
function stdout = getCircleCISplitFiles(paramSplitType, paramSelectByTag, paramSelectByFolder, paramSourceFolder)
% getCircleCISplitFiles - splits test files using CircleCI split command.
%
% The getCircleCISplitFiles function provides a convenient way to
% split test files based on specified parameters.
%
% STDOUT = getCircleCISplitFiles(PARAMSPLITTYPE, PARAMSELECTBYTAG,
% PARAMSELECTBYFOLDER, PARAMSOURCEFOLDER) generates and returns a list of
% split test files. The parameters are as follows:
% - PARAMSPLITTYPE: The type of split (e.g., 'timings', 'filename' or 'filesize').
% - PARAMSELECTBYTAG: A tag to filter tests by.
% - PARAMSELECTBYFOLDER: folder(s) to filter tests by.
% - PARAMSOURCEFOLDER: The source folder(s) to add to the path.
%
% These parameters are used to update the test suite and extract the list
% of MATLAB test files to be passed to the CircleCI test split command.
%
% Examples:
%
% resultFiles = getCircleCISplitFiles('timings', 'MyTag', 'MyFolder', 'src');
% disp(resultFiles);


import matlab.unittest.selectors.HasTag;
import matlab.unittest.constraints.StartsWithSubstring;
import matlab.unittest.plugins.XMLPlugin;
import matlab.unittest.selectors.HasBaseFolder;

if ~isempty(paramSourceFolder)
dirs = strtrim(strsplit(paramSourceFolder, {';', ':'}));
for i = numel(dirs):-1:1
statement{i} = sprintf('addpath(genpath(''%s''));', strrep(dirs{i}, '''', ''''''));
eval(statement{i});
end
end

suite = testsuite(pwd, 'IncludingSubfolders', true);

if ~isempty(paramSelectByTag)
Statement = sprintf('suite = suite.selectIf(HasTag(''%s''));', paramSelectByTag);
eval(Statement);
end

if ~isempty(paramSelectByFolder)
Statement = generateFolderSelectionStatement(paramSelectByFolder);
eval(Statement);
end

testFilePaths = {};

for i = 1:numel(suite)
baseFolder = suite(i).BaseFolder;
relativePath = strrep(baseFolder, [pwd, filesep], '');
testClass = suite(i).TestParentName;

if isstring(testClass)
testClass = char(testClass);
end

testFilePath = fullfile(relativePath, strcat(testClass, '.m'));
testFilePaths{end+1} = testFilePath;
end

testNames= unique(testFilePaths);

if strcmp(paramSplitType, 'timings')
[~, testNames, ~] = cellfun(@fileparts, testNames, 'UniformOutput', false);
end

tempAllFile = tempname;
tempErrorFile = tempname;
fid = fopen(tempAllFile, 'w');
fprintf(fid, '%s\n', testNames{:});
fclose(fid);

if strcmp(paramSplitType, 'filename')
command = sprintf('circleci tests split %s 2> %s', tempAllFile, tempErrorFile);
else
command = sprintf('circleci tests split --split-by=%s %s 2> %s', paramSplitType, tempAllFile, tempErrorFile);
end
[~, stdout] = system(command);

stderr = fileread(tempErrorFile);
disp(stderr);


stdout = strsplit(stdout, '\n');
stdout = stdout(~cellfun('isempty', stdout));
stdout = strtrim(stdout);
stdout = stdout(:)';
[~, stdout, ~] = cellfun(@fileparts, stdout, 'UniformOutput', false);

delete(tempAllFile);
delete(tempErrorFile);
end
6 changes: 6 additions & 0 deletions src/commands/run-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ parameters:
parameter requires a Parallel Computing Toolbox license.
type: boolean
default: false
split-type:
vanditaMW marked this conversation as resolved.
Show resolved Hide resolved
description: >
Option to use CircleCI Test Split feature, specified as 'timings', 'filename' or 'filesize'.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we need to use the same terminology as in CircleCI documentation. Instead of "CircleCI Test Split feature" CircleCI uses "CircleCI test splitting" in their documentation: https://circleci.com/docs/parallelism-faster-jobs/#:~:text=CircleCI%20test%20splitting

The information in this description is minimal. For example, it doesn't say anything about the parallelism key. At a minimum, we should link to this page: https://circleci.com/docs/parallelism-faster-jobs/. Alternatively, the description can be expanded to include some important details.

Also, it might be good to clarify how one should use the new parameter alongside use-parallel.

type: string
default: ''
vanditaMW marked this conversation as resolved.
Show resolved Hide resolved
output-detail:
description: >
Amount of event detail displayed for the test run, specified as `none`, `terse`, `concise`, `detailed`,
Expand Down Expand Up @@ -128,6 +133,7 @@ steps:
PARAM_TEST_RESULTS_PDF: <<parameters.test-results-pdf>>
PARAM_STRICT: <<parameters.strict>>
PARAM_USE_PARALLEL: <<parameters.use-parallel>>
PARAM_SPLIT_TYPE: <<parameters.split-type>>
PARAM_OUTPUT_DETAIL: <<parameters.output-detail>>
PARAM_LOGGING_LEVEL: <<parameters.logging-level>>
PARAM_STARTUP_OPTIONS: <<parameters.startup-options>>
Expand Down
2 changes: 1 addition & 1 deletion src/scripts/run-command.sh
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,4 @@ ${PARAM_COMMAND}
EOF

# run MATLAB command
"${tmpdir}/bin/run-matlab-command$binext" "setenv('MW_ORIG_WORKING_FOLDER', cd('${scriptdir//\'/\'\'}'));$script" $PARAM_STARTUP_OPTIONS
"${tmpdir}/bin/run-matlab-command$binext" "setenv('MW_ORIG_WORKING_FOLDER', cd('${scriptdir//\'/\'\'}'));$script" $PARAM_STARTUP_OPTIONS
50 changes: 29 additions & 21 deletions src/scripts/run-tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -61,24 +61,32 @@ if [[ "$os" = CYGWIN* || "$os" = MINGW* || "$os" = MSYS* ]]; then
fi

"${tmpdir}/bin/run-matlab-command$binext" "\
addpath('${gendir}/scriptgen');\
testScript = genscript('Test',\
'JUnitTestResults','${PARAM_TEST_RESULTS_JUNIT}',\
'CoberturaCodeCoverage','${PARAM_CODE_COVERAGE_COBERTURA}',\
'HTMLCodeCoverage','${PARAM_CODE_COVERAGE_HTML}',\
'SourceFolder','${PARAM_SOURCE_FOLDER}',\
'SelectByFolder','${PARAM_SELECT_BY_FOLDER}',\
'SelectByTag','$PARAM_SELECT_BY_TAG',\
'CoberturaModelCoverage','${PARAM_MODEL_COVERAGE_COBERTURA}',\
'HTMLModelCoverage','${PARAM_MODEL_COVERAGE_HTML}',\
'SimulinkTestResults','${PARAM_TEST_RESULTS_SIMULINK_TEST}',\
'HTMLTestReport','${PARAM_TEST_RESULTS_HTML}',\
'PDFTestReport','${PARAM_TEST_RESULTS_PDF}',\
'Strict',${PARAM_STRICT},\
'UseParallel',${PARAM_USE_PARALLEL},\
'OutputDetail','${PARAM_OUTPUT_DETAIL}',\
'LoggingLevel','${PARAM_LOGGING_LEVEL}');\
disp('Running MATLAB script with contents:');\
disp(testScript.Contents);\
fprintf('__________\n\n');\
run(testScript);" $PARAM_STARTUP_OPTIONS
addpath('${gendir}/scriptgen');\
if ~isempty('${PARAM_SPLIT_TYPE}')
circleciTestFiles = getCircleCISplitFiles('${PARAM_SPLIT_TYPE}', '${PARAM_SELECT_BY_TAG}', '${PARAM_SELECT_BY_FOLDER}', '${PARAM_SOURCE_FOLDER}');
else
circleciTestFiles = '';
end;\
testScript = genscript('Test', ...
'JUnitTestResults', '${PARAM_TEST_RESULTS_JUNIT}', ...
'CoberturaCodeCoverage', '${PARAM_CODE_COVERAGE_COBERTURA}', ...
'HTMLCodeCoverage', '${PARAM_CODE_COVERAGE_HTML}', ...
'SourceFolder', '${PARAM_SOURCE_FOLDER}', ...
'SelectByFolder', '${PARAM_SELECT_BY_FOLDER}', ...
'SelectByTag', '${PARAM_SELECT_BY_TAG}', ...
'CoberturaModelCoverage', '${PARAM_MODEL_COVERAGE_COBERTURA}', ...
'HTMLModelCoverage', '${PARAM_MODEL_COVERAGE_HTML}', ...
'SimulinkTestResults', '${PARAM_TEST_RESULTS_SIMULINK_TEST}', ...
'HTMLTestReport', '${PARAM_TEST_RESULTS_HTML}', ...
'PDFTestReport', '${PARAM_TEST_RESULTS_PDF}', ...
'Strict', ${PARAM_STRICT}, ...
'UseParallel', ${PARAM_USE_PARALLEL}, ...
'OutputDetail', '${PARAM_OUTPUT_DETAIL}', ...
'LoggingLevel', '${PARAM_LOGGING_LEVEL}', ...
'CircleCITestFiles', circleciTestFiles);\
disp('Running MATLAB script with contents:');\
disp(testScript.Contents);\
fprintf('__________\n\n');\
run(testScript);" $PARAM_STARTUP_OPTIONS