Skip to content

Commit e157ce5

Browse files
authored
Abort old-way unit test launch when model connection lifetime is terminated (#1439)
1 parent 9cbb686 commit e157ce5

File tree

2 files changed

+55
-34
lines changed

2 files changed

+55
-34
lines changed

unity/EditorPlugin/AfterUnity56/UnitTesting/Initialization.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public static void OnModelInitializationHandler(UnityModelAndLifetime modelAndLi
2727
modelValue.RunUnitTestLaunch.Set(rdVoid =>
2828
{
2929
if (!modelValue.UnitTestLaunch.HasValue()) return false;
30-
var testLauncher = new UnityEditorTestLauncher(modelValue.UnitTestLaunch.Value);
30+
var testLauncher = new UnityEditorTestLauncher(modelValue.UnitTestLaunch.Value, connectionLifetime);
3131
return testLauncher.TryLaunchUnitTests();
3232
});
3333
}

unity/EditorPlugin/AfterUnity56/UnitTesting/UnityEditorTestLauncher.cs

Lines changed: 54 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Reflection;
44
using JetBrains.Collections.Viewable;
55
using JetBrains.Diagnostics;
6+
using JetBrains.Lifetimes;
67
using JetBrains.Platform.Unity.EditorPluginModel;
78
using JetBrains.Rd.Tasks;
89
using NUnit.Framework.Interfaces;
@@ -15,13 +16,15 @@ namespace JetBrains.Rider.Unity.Editor.AfterUnity56.UnitTesting
1516
public class UnityEditorTestLauncher
1617
{
1718
private readonly UnitTestLaunch myLaunch;
18-
19+
private readonly Lifetime myConnectionLifetime;
20+
1921
private static readonly ILog ourLogger = Log.GetLog("RiderPlugin");
2022
private static string RunnerAddListener = "AddListener";
2123

22-
public UnityEditorTestLauncher(UnitTestLaunch launch)
24+
public UnityEditorTestLauncher(UnitTestLaunch launch, Lifetime connectionLifetime)
2325
{
2426
myLaunch = launch;
27+
myConnectionLifetime = connectionLifetime;
2528
}
2629

2730
public bool TryLaunchUnitTests()
@@ -261,46 +264,64 @@ private bool TryLaunchUnitTestsInAssembly(string[] testNames)
261264
var runner = runnerField.GetValue(launcher);
262265
SupportAbort(runner);
263266

264-
if (!AdviseTestStarted(runner, "m_TestStartedEvent", test =>
267+
var runLifetimeDef = Lifetime.Define(myConnectionLifetime);
268+
runLifetimeDef.Lifetime.OnTermination(() =>
269+
{
270+
if (myConnectionLifetime.IsNotAlive)
271+
TestEventsSender.RunFinished(myLaunch, new RunResult(false));
272+
});
273+
274+
var runStarted = false;
275+
try
265276
{
266-
if (!(test is TestMethod)) return;
267-
ourLogger.Verbose("TestStarted : {0}", test.FullName);
277+
if (!AdviseTestStarted(runner, "m_TestStartedEvent", test =>
278+
{
279+
if (!(test is TestMethod)) return;
280+
ourLogger.Verbose("TestStarted : {0}", test.FullName);
268281

269-
var testId = TestEventsSender.GetIdFromNUnitTest(test);
270-
var tResult = new TestResult(testId, test.Method.TypeInfo.Assembly.GetName().Name,string.Empty, 0, Status.Running, TestEventsSender.GetIdFromNUnitTest(test.Parent));
282+
var testId = TestEventsSender.GetIdFromNUnitTest(test);
283+
var tResult = new TestResult(testId, test.Method.TypeInfo.Assembly.GetName().Name,string.Empty, 0, Status.Running, TestEventsSender.GetIdFromNUnitTest(test.Parent));
271284

272-
clientController?.OnTestStarted(testId);
273-
TestEventsSender.TestStarted(myLaunch, tResult);
274-
}))
275-
return false;
285+
clientController?.OnTestStarted(testId);
286+
TestEventsSender.TestStarted(myLaunch, tResult);
287+
}))
288+
return false;
276289

277-
if (!AdviseTestFinished(runner, "m_TestFinishedEvent", result =>
278-
{
279-
if (!(result.Test is TestMethod)) return;
290+
if (!AdviseTestFinished(runner, "m_TestFinishedEvent", result =>
291+
{
292+
if (!(result.Test is TestMethod)) return;
280293

281-
clientController?.OnTestFinished();
282-
TestEventsSender.TestFinished(myLaunch, TestEventsSender.GetTestResult(result));
283-
}))
284-
return false;
294+
clientController?.OnTestFinished();
295+
TestEventsSender.TestFinished(myLaunch, TestEventsSender.GetTestResult(result));
296+
}))
297+
return false;
285298

286-
if (!AdviseSessionFinished(runner, "m_RunFinishedEvent", result =>
287-
{
288-
clientController?.OnSessionFinished();
289-
var runResult = new RunResult(Equals(result.ResultState, ResultState.Success));
290-
TestEventsSender.RunFinished(myLaunch, runResult);
291-
}))
292-
return false;
299+
if (!AdviseSessionFinished(runner, "m_RunFinishedEvent", result =>
300+
{
301+
clientController?.OnSessionFinished();
302+
runLifetimeDef.Terminate();
303+
var runResult = new RunResult(Equals(result.ResultState, ResultState.Success));
304+
TestEventsSender.RunFinished(myLaunch, runResult);
305+
}))
306+
return false;
307+
308+
var runMethod = launcherType.GetMethod("Run", BindingFlags.Instance | BindingFlags.Public);
309+
if (runMethod == null)
310+
{
311+
ourLogger.Verbose("Could not find runMethod via reflection");
312+
return false;
313+
}
293314

294-
var runMethod = launcherType.GetMethod("Run", BindingFlags.Instance | BindingFlags.Public);
295-
if (runMethod == null)
315+
//run!
316+
runMethod.Invoke(launcher, null);
317+
runStarted = true;
318+
return true;
319+
}
320+
finally
296321
{
297-
ourLogger.Verbose("Could not find runMethod via reflection");
298-
return false;
322+
if (!runStarted)
323+
runLifetimeDef.Terminate();
299324
}
300-
301-
//run!
302-
runMethod.Invoke(launcher, null);
303-
return true;
304325
}
305326
catch (Exception e)
306327
{

0 commit comments

Comments
 (0)