From 0659d76562f8ba27d8e444b0dc81afa6690590ae Mon Sep 17 00:00:00 2001 From: pinzart90 Date: Mon, 29 Apr 2024 10:27:34 -0400 Subject: [PATCH] update --- .../ViewModels/Core/DynamoViewModel.cs | 34 ++++-------- .../PackageManagerViewExtensionTests.cs | 50 +++++++----------- .../bin/SampleViewExtensionCrash.dll | Bin 8704 -> 8192 bytes 3 files changed, 29 insertions(+), 55 deletions(-) diff --git a/src/DynamoCoreWpf/ViewModels/Core/DynamoViewModel.cs b/src/DynamoCoreWpf/ViewModels/Core/DynamoViewModel.cs index 0c007f5a06d..a70289a1c58 100644 --- a/src/DynamoCoreWpf/ViewModels/Core/DynamoViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Core/DynamoViewModel.cs @@ -877,35 +877,25 @@ private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionE } } - private void CrashGracefully(Exception ex, bool fatal = false) + // CrashGracefully should only be used in the DynamoViewModel class or within tests. + internal void CrashGracefully(Exception ex, bool fatal = false) { try { - - Model.Logger.LogError("CrashGracefully Current ViewModel ID " + this.GetHashCode()); - Model.Logger.LogError("CrashGracefully Current Model ID " + Model.GetHashCode()); - var exceptionAssembly = ex.TargetSite?.Module?.Assembly; + // TargetInvocationException is the exception that is thrown by methods invoked through reflection + // The inner exception contains the originating exception. + // https://learn.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/7.0/reflection-invoke-exceptions + if (ex is TargetInvocationException && ex.InnerException != null) + { + exceptionAssembly = ex.InnerException?.TargetSite?.Module?.Assembly; + } + // Do not crash if the exception is coming from a 3d party package; if (!fatal && exceptionAssembly != null) { - Console.WriteLine($"exceptionAssembly + {exceptionAssembly.Location}"); - - Console.WriteLine("PMExtensions.Count" + Model.ExtensionManager.Extensions.OfType().Count()); - Console.WriteLine("PMExtension " + Model.GetPackageManagerExtension()); - Console.WriteLine("PMExtension.PackageLoader " + Model.GetPackageManagerExtension()?.PackageLoader); - Console.WriteLine("PMExtension.PackageLoader.LocalPackages.Count " + Model.GetPackageManagerExtension()?.PackageLoader?.LocalPackages.Count()); - - foreach (var p in Model.GetPackageManagerExtension()?.PackageLoader?.LocalPackages) - { - Console.WriteLine(p.RootDirectory); - Console.WriteLine($"Excepotion from {p.RootDirectory} " + exceptionAssembly.Location.StartsWith(p.RootDirectory, StringComparison.OrdinalIgnoreCase)); - } - // Check if the exception might be coming from a loaded package assembly. var faultyPkg = Model.GetPackageManagerExtension()?.PackageLoader?.LocalPackages?.FirstOrDefault(p => exceptionAssembly.Location.StartsWith(p.RootDirectory, StringComparison.OrdinalIgnoreCase)); - - Console.WriteLine($"FaultyPackage + {faultyPkg?.Name ?? "Not found"}"); if (faultyPkg != null) { var crashDetails = new CrashErrorReportArgs(ex); @@ -914,10 +904,6 @@ private void CrashGracefully(Exception ex, bool fatal = false) return; } } - else - { - Console.WriteLine($"IsCrashing for real"); - } DynamoModel.IsCrashing = true; var crashData = new CrashErrorReportArgs(ex); diff --git a/test/DynamoCoreWpfTests/PackageManager/PackageManagerViewExtensionTests.cs b/test/DynamoCoreWpfTests/PackageManager/PackageManagerViewExtensionTests.cs index 10d3c2e5f91..066fa5a7e08 100644 --- a/test/DynamoCoreWpfTests/PackageManager/PackageManagerViewExtensionTests.cs +++ b/test/DynamoCoreWpfTests/PackageManager/PackageManagerViewExtensionTests.cs @@ -320,56 +320,44 @@ void PackageManagerViewExtensionTests_NotificationLogged(NotificationMessage obj public void TestCrashInPackage() { var pkgDir = Path.Combine(PackagesDirectory, "SampleViewExtension_Crash"); - var currentDynamoModel = ViewModel.Model; - var loader = currentDynamoModel.GetPackageManagerExtension().PackageLoader; var pkg = loader.ScanPackageDirectory(pkgDir); Assert.IsNotNull(pkg); - int count = 0; - void DynamoConsoleLogger_LogErrorToDynamoConsole(string obj) - { - if (obj.Contains("Unhandled exception coming from package")) - { - count++; - } - } - - Assert.IsFalse(DynamoModel.IsCrashing); - - DynamoConsoleLogger.LogErrorToDynamoConsole += DynamoConsoleLogger_LogErrorToDynamoConsole; - - Model.Logger.LogError("Current ViewModel ID " + currentDynamoModel.GetHashCode()); - Model.Logger.LogError("Current Model ID " + Model.GetHashCode()); - + loader.LoadPackages(new List() { pkg }); + + Exception expectedEx = null; + var assem = AppDomain.CurrentDomain.GetAssemblies().Where(x => x.GetName().Name == "TestCrash").FirstOrDefault(); + Assert.IsNotNull(assem); - NotImplementedException expectedEx = null; try { - loader.LoadPackages(new List() { pkg }); - DispatcherUtil.DoEventsLoop(() => count > 0); + assem.GetType("TestCrash.Class1").GetMethod("TestCrash").Invoke(null, new object[] { }); } - catch (NotImplementedException ex) + catch (Exception ex) { expectedEx = ex; } - var loadedPkg = currentDynamoModel.GetPackageManagerExtension()?.PackageLoader?.LocalPackages?.FirstOrDefault(p => + int count = 0; + void DynamoConsoleLogger_LogErrorToDynamoConsole(string obj) { - return p.RootDirectory.EndsWith("SampleViewExtension_Crash", StringComparison.OrdinalIgnoreCase); - }); + if (obj.Contains($"Unhandled exception coming from package {pkg.Name} was handled")) + { + count++; + } + } - Assert.AreEqual(PackageLoadState.StateTypes.Loaded, loadedPkg.LoadState.State); + DynamoConsoleLogger.LogErrorToDynamoConsole += DynamoConsoleLogger_LogErrorToDynamoConsole; - Assert.IsNotNull(expectedEx); - Assert.IsNotNull(expectedEx.TargetSite?.Module?.Assembly); - Assert.IsTrue(expectedEx.TargetSite?.Module?.Assembly.Location.StartsWith(pkg.RootDirectory, StringComparison.OrdinalIgnoreCase)); - Assert.IsFalse(DynamoModel.IsCrashing); - Assert.AreEqual(1, count); + ViewModel.CrashGracefully(expectedEx); DynamoConsoleLogger.LogErrorToDynamoConsole -= DynamoConsoleLogger_LogErrorToDynamoConsole; + + ViewModel.CrashGracefully(expectedEx); + Assert.AreEqual(1, count); } [OneTimeTearDown] diff --git a/test/pkgs/SampleViewExtension_Crash/bin/SampleViewExtensionCrash.dll b/test/pkgs/SampleViewExtension_Crash/bin/SampleViewExtensionCrash.dll index 00962a6becba8d75659ced8a273209459a09a282..dd8610affec0960fa252c35810ef6cb480ac2e36 100644 GIT binary patch delta 2099 zcmZ`)Yiv|S7(Fxh-ns3z-EQx;+Xq`%+DeygDOd=Cic-oO!62ebU&9+7R!r~@07Lxd=>7gOQ5cZLbc*pU@wbX95%rIY z5s`{AU~>o%-3boW0y`YPP9%y|LM6fjYz(J~<~*x42&h17rr#`UN-gOonJ_@7N979I z?dt5VHj*syzmNst9@;us#-nUyJiyq5AF|4;OUVOL#d~V|Y^!i!jRS!4GSqHK+lI3i2ROaHFz`}S1Nx)6s#irkx9|LZ+ za+7^XPOAh2mnacMWj#0%;EIe_(j=`mhhteuJ%s#A<#Lj(arTpa3EgtTzx4$5M6FzG z2`o%jY0@cI=p1*ZsHXM*Z2kP{c6`_%29~eX1qar->`z&;c;13Jt$Kz7a)1h!wY+f( z8d!KP0OeyE$Bkq=i+qrO%&siv7_j*=f$>mmSw-~og;So=j4Al!*j=r{A-UX9=xb>_ zA_h3QIKp6h$`@>f=M2s@7_zi-+Vp=nSZMHqnC1k~MpT$!lv>$nDZIwaK}-@!G5YfYP?p_r^)Y;9XpQ{GjgA!4t@G2*vuvYv){Y9&RI9Hrwx>Ljw998!S zg|KL_OE6WfqJI(kqXgetCmj#j%;{mU9t_j$B&}KW^sv(2t4ff1+p1@3!2pG%N&Tn2 ziB7p_&_x4J2OnYnLTIsD>{0))g>H-8$XaGn3E`U6VlQK*v&lx;Kf!_&7ucVLOT?Sb zZ^W7ED#pfi#^ad5NsAQ5chiIRbviuM&7Ou35}Ui(Hm=yh)^7G4r)uHdE|xJKyU5<} zX1#=F9~ri~D8i*#IDQ-Z+OSShEOwxf$N zsVf|uF{~XgA;@+7VpylpYvLj0LXNR|w{R*I35SMTif>tHVy)UzEMCMB$RjEg69ec= z4B>8rLk-p$9A|K{!6t*v!~)DS{Y3_s8EhvC?86N%>J#=Az9Po(GqDef#SC{KcB0K4 zg47;dv4`Q9aq2B57{kYQJ=Wt>6kv_f_Za-1_y~rIQulFg&S7g2>clx`Dfc_WSΜ z=x#@z&>JvW98hndNlbO$!5?OyFPjWe;z35Wa=bcmmUuaZ_jq*bM7xnL5-YI+aan^b z&a(z#lo5N-qXy*|PpraB;y{D<8LT(@1k9s8#VFGZ&O|$vr|=fB6(5MHZ8cri;9cUa}e!(ae1k+!x-in1lks`$TBG=oIic>H{OWzYZ~*t%V4B<5_IPe*aiz zIQ0y}G8lR5Ie|E1|Eo>Y7ZGE%=`wFq{fyBA-WK}}Hr=6}MZ$cOx5w6-F&OTelv^Et zVPLNBWu5Ji*-e(;n)^VPv;Xme$>e%L0h)~{vYajL!qet)m_2?_^ll|xT zUxuqvij9Z;dqpcEQXvqX{lrXFqf-J7THb1*?pN?=iLbNE0gVWC_ z{+sz_eVV0`QUz`0rQ6NSCK{Zq^eofuUCo+~Yx$+3!;8G`L@qARKddXO@B0OOH}Kbf lLy3Q~M_DL*eoO4ezNKRiR-dR{yy)S3_eW=oj$qF#*57@IL+1bh delta 2433 zcmZ`*ZEO_R6+Q3G%$wb@S=+P5V0+^%UTUw`#)%7(lNKZsn-W4yLmh`20>R)7aYH=* zObgW6btMp_O$C`YlG7wOQj17is~>Bmq$z4p)u^fX(WW1AqZG+)MAa%4B&kGEqon6O zuOq6o&z|${IrqMM-`9*b-;wV+dA#ZiC4YGj#da0-$r5=hkT~_+)6U%Oz-^(ZT^}A2 zE4-aG3`+7zginiRQ5U`{?x@;Z56o2nqL`p^9WdjB8%3sCWmG19tBw2VqPxNxD+iP} z=7s&THRlG^fHy%9@&jelGsgU0P)o3+8zk6gYQ}D2cUWcalSi1sZYf>ttAaY?9;G;( zsTtj>yE>V^S*wr9G-v6_bSaZcCNEh^p4Q11lS=P!_&b?uSw+Q@D$QkhnFp;EYnMrT zTu*9JvR+26n6z}iP0Dmxn6fgt6a$0R8a_cNX|8pH1{$T2ppo4&6&?MMlS!vZJU3`! zx8_fmJhw%;L5Ac_m4VnM2~Tg^yE5HOm$W7w*0KU!g45=%s<9T@!5TtQzV}AG zm3rora?}zS4sOxpvOJ=5d^`n@)cb$FwlHa@H=O0b)MG%U0@4xMJ>#Q;LkGt64A;ki z)!ge;Zx8mC0bBr5n|rr(u^%Sy3Xj^2)tmu%kYFPCeDvbDi)agfVW)B~Ev8`myuH{f zxYjjCVcei6XPq*vXLW_G^7ppF>jn!3cUf9#G}vKqpV8apyyM}QVxD=PGRmZ!u@tVz zYfcQ);(g`gDfHZ*g z5Z|y)vv5JQ5bI=%U59RWL@0EN)3o1GzN@ejx1bL7_Er{~c6H7vmaIaT)9%J_#?}?r z{MFWpHgTAb*X(w;4*#-VVFAIx3O_Mr4mqott_-I`q2jr7_BneK{rayQ(a1S_H}}&s z><;=Sx!WKm}2un&_d4 zSdKP>w;SAOaErn12Kx;56PIJq*dqoH8Jr>tT)^X8?Qdu+{E?W%JH!U864%|e$UTp$ z$ZdEDfwKXxnV=@|79CAu-t9!22%XIg9Y8mpM}u=OHd0YI1zRk~2^0U4!3E-eY!}~k zA4XI}?606t>`}*2ilfdmsKiD02dEbM_y)yi+!rw-uDU;i$eB&NZc-$On>lQj+uSFr z#YJ4l6<*3d@v>2xs5IgTJ|$bZ?aiVUajYZOqKBBm{lsQW5Z4;~w82iJZ^aSnJx1AO za6dvSxrcF{-57o)^5UzA$h-)#OwJg4rf7c)ZL$S>Fv{~2JT4wBwxLk~yM@Mss*!iw zr7jWSg_MXHR)bXtaRxt!onQP)F}T<+FbO|^$t8|?>@!}9AGLYRhyBs`z9)4>9sW^U zz@PtzHuHvSg1H-xiE-(V>q}&JJw)(*Epl zxGUDVl3@ecQG70#(DI}7-q}Aia4=hVCe|flH^>`D4-_tywTZ}q?Dzwn!O(bEQn97b zTagmw-#C2M%i90^>`ceb&B2B5uL_U*&AAEXO26DMwUa_5>?Hi%4lRGTl|;fxN|9Kp zG|x{*N&Nh?e*T-bEBq0cG**%Sjsj!+kuukgE%);$81e-FV|+*a{H&J*#UE)gvSdV! zc0$CVrB*Y7b>m>gn1U5!qbarbydGJ?`b&1$8?RrJmHfG&Vz%=0N6lor4Q^L@x_;l{ ze2*@6PZXYw-y{k@t^BrAwJs7pr4LN<8RGLce>S~c8$Mc7Uw#i}e>mN+seAgz2d>;# Vb#rgwY|VorEU!IVh$Y^&{sYcwqbL9X