Skip to content

Commit b2d9c3e

Browse files
julienamsellemEvergreen
authored andcommitted
[VFX] Template window can be empty because of an exception with package manager
1 parent d0bc8f1 commit b2d9c3e

2 files changed

Lines changed: 74 additions & 18 deletions

File tree

Packages/com.unity.visualeffectgraph/Editor/TemplateWindow/VFXTemplateWindow.cs

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -215,34 +215,48 @@ private void OnCreate()
215215

216216
private bool TryFindSample(string sampleName, out Sample sample)
217217
{
218-
var startTime = Time.time;
219-
var searchRequest = Client.Search(VisualEffectGraphPackageInfo.name, true);
220-
while (!searchRequest.IsCompleted && Time.time - startTime < PackageManagerTimeout)
218+
try
221219
{
222-
Thread.Sleep(20);
223-
}
224-
225-
if (searchRequest is { Result: { Length: 1 }, IsCompleted: true } && searchRequest.Result[0] is { } vfxPackageInfo)
226-
{
227-
// Workaround for UUM-63664
228-
foreach (var extension in PackageManagerExtensions.Extensions)
220+
var startTime = Time.time;
221+
var searchRequest = Client.Search(VisualEffectGraphPackageInfo.name, true);
222+
while (!searchRequest.IsCompleted && Time.time - startTime < PackageManagerTimeout)
229223
{
230-
extension.OnPackageSelectionChange(vfxPackageInfo);
224+
Thread.Sleep(20);
231225
}
232226

233-
foreach (var samplePackage in Sample.FindByPackage(VisualEffectGraphPackageInfo.name, null))
227+
if (searchRequest is { Result: { Length: 1 }, IsCompleted: true } && searchRequest.Result[0] is { } vfxPackageInfo)
234228
{
235-
if (string.Compare(samplePackage.displayName, sampleName, StringComparison.OrdinalIgnoreCase) ==
236-
0)
229+
// Workaround for UUM-63664
230+
foreach (var extension in PackageManagerExtensions.Extensions)
231+
{
232+
try
233+
{
234+
extension.OnPackageSelectionChange(vfxPackageInfo);
235+
}
236+
catch (Exception e)
237+
{
238+
Debug.LogWarning($"An error occured while trying to select a package extension.\n{e.Message}");
239+
}
240+
}
241+
242+
foreach (var samplePackage in Sample.FindByPackage(VisualEffectGraphPackageInfo.name, null))
237243
{
238-
sample = samplePackage;
239-
return true;
244+
if (string.Compare(samplePackage.displayName, sampleName, StringComparison.OrdinalIgnoreCase) ==
245+
0)
246+
{
247+
sample = samplePackage;
248+
return true;
249+
}
240250
}
241251
}
252+
else
253+
{
254+
Debug.LogWarning($"Could not determine if the {sampleName} package is installed");
255+
}
242256
}
243-
else
257+
catch (Exception ex)
244258
{
245-
Debug.LogWarning("Could not determine if the Learning Sample package is installed");
259+
Debug.LogWarning($"Something went wrong while trying to retrieve {sampleName} package info\n{ex.Message}");
246260
}
247261

248262
sample = default;

Tests/SRPTests/Projects/VisualEffectGraph_HDRP/Assets/AllTests/Editor/Tests/VFXTemplateWindowTest.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44
using System.IO;
55
using System.Linq;
66
using System.Reflection;
7+
8+
using Moq;
79
using NUnit.Framework;
810

11+
using UnityEditor.PackageManager.UI;
912
using UnityEditor.VFX.UI;
1013
using UnityEngine;
1114
using UnityEngine.TestTools;
@@ -415,6 +418,45 @@ public IEnumerator VFXView_Open_Two_View_Delete_Replace_Other_Content()
415418
yield return null;
416419
}
417420

421+
[UnityTest, Description("Covers UUM-95871")]
422+
public IEnumerator Check_Install_Learning_Sample_Button()
423+
{
424+
var controller = VFXTestCommon.StartEditTestAsset();
425+
yield return null;
426+
427+
// Create a mock package extension that throws to simulate a failing package
428+
var throwingExtensionMock = new Mock<IPackageManagerExtension>();
429+
throwingExtensionMock.Setup(x => x.OnPackageSelectionChange(It.IsAny<PackageManager.PackageInfo>())).Throws<NullReferenceException>();
430+
431+
try
432+
{
433+
PackageManagerExtensions.RegisterExtension(throwingExtensionMock.Object);
434+
435+
// Get template dropdown from the VFX graph toolbar
436+
var vfxViewWindow = VFXViewWindow.GetWindow(controller.graph, false, true);
437+
var templateDropDown = vfxViewWindow.rootVisualElement.Q<CreateFromTemplateDropDownButton>();
438+
Assert.NotNull(templateDropDown);
439+
440+
// Open the template window
441+
var onCreateNewMethod = templateDropDown.GetType().GetMethod("OnCreateNew", BindingFlags.Instance | BindingFlags.NonPublic);
442+
Assert.NotNull(onCreateNewMethod);
443+
onCreateNewMethod.Invoke(templateDropDown, null);
444+
445+
Assert.True(EditorWindow.HasOpenInstances<VFXTemplateWindow>());
446+
var templateWindow = EditorWindow.GetWindow<VFXTemplateWindow>();
447+
var installButton = templateWindow.rootVisualElement.Q<Button>("InstallButton");
448+
Assert.NotNull(installButton);
449+
Assert.True(installButton.enabledSelf);
450+
451+
// Check the failing extension package has been called otherwise the test does nothing useful
452+
throwingExtensionMock.Verify(x => x.OnPackageSelectionChange(It.IsAny<PackageManager.PackageInfo>()), Times.Once);
453+
}
454+
finally
455+
{
456+
PackageManagerExtensions.Extensions.Remove(throwingExtensionMock.Object);
457+
}
458+
}
459+
418460
internal static IEnumerator CheckNewVFXIsCreated(int templateIndex = 3)
419461
{
420462
// Make sure the project browser is opened

0 commit comments

Comments
 (0)