-
-
Notifications
You must be signed in to change notification settings - Fork 49
/
unity-test.ts
147 lines (128 loc) · 6.47 KB
/
unity-test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import path = require('path');
import tl = require('azure-pipelines-task-lib/task');
import fs = require('fs-extra');
import { UnityTestMode } from './unity-test-mode.enum';
import {
UnityToolRunner,
UnityPathTools,
UnityVersionInfoResult,
Utilities
} from '@dinomite-studios/unity-azure-pipelines-tasks-lib';
import { getUnityEditorVersion } from './unity-build-shared';
tl.setResourcePath(path.join(__dirname, 'task.json'));
// Input variables.
const testModeInputVariableName = 'testMode';
const unityEditorsPathModeInputVariableName = 'unityEditorsPathMode';
const customUnityEditorsPathInputVariableName = 'customUnityEditorsPath';
const unityProjectPathInputVariableName = 'unityProjectPath';
const unityVersionInputVariableName = 'unityVersion';
const testCategoryInputVariableName = 'testCategory';
const testFilterInputVariableName = 'testFilter';
const failOnTestFailInputVariableName = 'failOnTestFail';
const noGraphicsInputVariableName = 'noGraphics';
const batchModeInputVariableName = 'batchMode';
const acceptApiUpdateInputVariableName = 'acceptApiUpdate';
const noPackageManagerInputVariableName = 'noPackageManager';
const testResultsPathInputVariableName = 'testResultsPath';
const tempDirectoryInputVariableName = 'Agent.TempDirectory';
const cleanBuildInputVariableName = 'Build.Repository.Clean';
const additionalCmdArgsInputVariableName = 'additionalCmdArgs';
// Constants
const editModeResultsFileName = 'EditMode.xml';
const playModeResultsFileName = 'PlayMode.xml';
const testSuccessNoTestsFailed = 0;
const testSuccessTestsFailed = 2;
// Output variables.
const logsOutputPathOutputVariableName = 'logsOutputPath';
const testResultsOutputPathAndFileNameOutputVariableName = 'testResultsOutputPathAndFileName';
const testsFailedOutputVariableName = 'testsFailed';
/**
* Main task runner. Executes the task and sets the result status for the task.
*/
async function run() {
try {
// Setup and read inputs.
const testMode: UnityTestMode = (<any>UnityTestMode)[tl.getInput(testModeInputVariableName, true)!];
const projectPath = tl.getPathInput(unityProjectPathInputVariableName) || '';
const testCategory = tl.getInput(testCategoryInputVariableName) || '';
const testFilter = tl.getInput(testFilterInputVariableName) || '';
const testResultsPath = tl.getInput(testResultsPathInputVariableName) || 'Test Results';
const unityEditorsPath = UnityPathTools.getUnityEditorsPath(
tl.getInput(unityEditorsPathModeInputVariableName, true)!,
tl.getInput(customUnityEditorsPathInputVariableName));
const unityVersionInput = tl.getInput(unityVersionInputVariableName);
const unityVersion = unityVersionInput ? { info: { version: unityVersionInput } } as UnityVersionInfoResult : getUnityEditorVersion();
const unityExecutablePath = UnityPathTools.getUnityExecutableFullPath(unityEditorsPath, unityVersion.info!);
const cleanBuild = tl.getVariable(cleanBuildInputVariableName);
const batchMode = tl.getBoolInput(batchModeInputVariableName);
const failOnTestFail = tl.getBoolInput(failOnTestFailInputVariableName);
const noGraphics = tl.getBoolInput(noGraphicsInputVariableName);
const acceptApiUpdate = tl.getBoolInput(acceptApiUpdateInputVariableName);
const noPackageManager = tl.getBoolInput(noPackageManagerInputVariableName);
const additionalCmdArgs = tl.getInput(additionalCmdArgsInputVariableName) || '';
const repositoryLocalPath = tl.getVariable(tempDirectoryInputVariableName)!;
const testResultsFileName = testMode === UnityTestMode.editMode ? editModeResultsFileName : playModeResultsFileName;
const testResultsPathAndFileName = path.join(`${testResultsPath}`, `${testResultsFileName}`);
const logFilesDirectory = path.join(repositoryLocalPath!, 'Logs');
const logFilePath = path.join(logFilesDirectory, `UnityTestLog_${Utilities.getLogFileNameTimeStamp()}.log`);
// Set output variable values.
tl.setVariable(logsOutputPathOutputVariableName, logFilesDirectory);
tl.setVariable(testResultsOutputPathAndFileNameOutputVariableName, testResultsPathAndFileName);
// If clean was specified by the user, delete the existing test results, if any exist.
if (cleanBuild === 'true') {
fs.removeSync(testResultsPath);
}
tl.mkdirP(testResultsPath);
tl.checkPath(testResultsPath, 'Test Results Output Directory');
// Execute Unity command line.
const unityCmd = tl.tool(unityExecutablePath)
.arg('-runTests')
.arg('-testPlatform').arg(testMode === UnityTestMode.editMode ? 'EditMode' : 'PlayMode')
.arg('-projectPath').arg(projectPath)
.arg('-testResults').arg(testResultsPathAndFileName)
.arg('-logfile').arg(logFilePath)
.arg('-forgetProjectPath');
if (noGraphics) {
unityCmd.arg('-noGraphics');
}
if (batchMode) {
unityCmd.arg('-batchmode');
}
if (noPackageManager) {
unityCmd.arg('-noUpm');
}
if (acceptApiUpdate) {
unityCmd.arg('-accept-apiupdate');
}
if (testCategory && testCategory.length > 0) {
unityCmd.arg('-testCategory').arg(testCategory);
}
if (testFilter && testFilter.length > 0) {
unityCmd.arg('-testFilter').arg(testFilter);
}
if (additionalCmdArgs !== '') {
unityCmd.line(additionalCmdArgs);
}
const exitCode = await UnityToolRunner.run(unityCmd, logFilePath);
// Unity process has finished. Set task result.
tl.setVariable(testsFailedOutputVariableName, exitCode === testSuccessTestsFailed ? 'true' : 'false');
if (exitCode === testSuccessNoTestsFailed || (exitCode === testSuccessTestsFailed && !failOnTestFail)) {
const buildSuccessLog = tl.loc('testSuccess');
console.log(buildSuccessLog);
tl.setResult(tl.TaskResult.Succeeded, buildSuccessLog);
} else {
const buildFailLog = `${tl.loc('testFailed')} ${exitCode}`;
console.log(buildFailLog);
tl.setResult(tl.TaskResult.Failed, buildFailLog);
}
} catch (e) {
if (e instanceof Error) {
console.error(e.message);
tl.setResult(tl.TaskResult.Failed, e.message);
} else {
console.error(e);
tl.setResult(tl.TaskResult.Failed, `${e}`);
}
}
}
run();