public void PlacingCustomNodeInstanceFromPackageRetainsCorrectPackageInfoState() { var loader = GetPackageLoader(); var libraryLoader = new ExtensionLibraryLoader(CurrentDynamoModel); loader.PackagesLoaded += libraryLoader.LoadPackages; loader.RequestLoadNodeLibrary += (libraryLoader as ExtensionLibraryLoader).LoadLibraryAndSuppressZTSearchImport; var packageDirectory = Path.Combine(TestDirectory, "pkgs", "EvenOdd"); var package1 = Package.FromDirectory(packageDirectory, CurrentDynamoModel.Logger); loader.LoadPackages(new Package[] { package1 }); var packageInfo = new PackageInfo("EvenOdd", new System.Version(1, 0, 0)); var matchingNodes = CurrentDynamoModel.CustomNodeManager.NodeInfos.Where(x => x.Value.PackageInfo.Equals(packageInfo)).ToList(); //the node should have the correct package info and should be marked a packageMember. Assert.AreEqual(1, matchingNodes.Count); Assert.IsTrue(matchingNodes.All(x => x.Value.IsPackageMember == true)); var cninst = CurrentDynamoModel.CustomNodeManager.CreateCustomNodeInstance(matchingNodes.FirstOrDefault().Key, null, true); this.CurrentDynamoModel.CurrentWorkspace.AddAndRegisterNode(cninst); matchingNodes = CurrentDynamoModel.CustomNodeManager.NodeInfos.Where(x => x.Value.PackageInfo.Equals(packageInfo)).ToList(); Assert.AreEqual(1, matchingNodes.Count); Assert.IsTrue(matchingNodes.All(x => x.Value.IsPackageMember == true)); }
public void LoadingConflictingCustomNodePackageDoesNotGetLoaded() { var loader = new PackageLoader(PackagesDirectory); var libraryLoader = new ExtensionLibraryLoader(CurrentDynamoModel); loader.PackagesLoaded += libraryLoader.LoadPackages; loader.RequestLoadNodeLibrary += (libraryLoader as ExtensionLibraryLoader).LoadLibraryAndSuppressZTSearchImport; // This test needs the "isTestMode" flag to be turned off as an exception to be able // to test duplicate custom node def loading. loader.RequestLoadCustomNodeDirectory += (dir, pkgInfo) => CurrentDynamoModel.CustomNodeManager.AddUninitializedCustomNodesInPath(dir, isTestMode: false, packageInfo: pkgInfo); loader.LoadAll(new LoadPackageParams { Preferences = CurrentDynamoModel.PreferenceSettings, PathManager = CurrentDynamoModel.PathManager }); // There are 15 packages in "GitHub\Dynamo\test\pkgs" Assert.AreEqual(15, loader.LocalPackages.Count()); var entries = CurrentDynamoModel.SearchModel.SearchEntries.OfType <CustomNodeSearchElement>(); // Check that conflicting custom node package "EvenOdd2" is not installed Assert.IsTrue(entries.Count(x => Path.GetDirectoryName(x.Path).EndsWith(@"EvenOdd2\dyf")) == 0); Assert.IsTrue(entries.Count(x => Path.GetDirectoryName(x.Path).EndsWith(@"EvenOdd\dyf") && x.FullName == "Test.EvenOdd") == 1); }
public void LoadingPackageDoesNotAffectLoadedSearchEntries() { var loader = new PackageLoader(PackagesDirectory); var libraryLoader = new ExtensionLibraryLoader(CurrentDynamoModel); loader.PackagesLoaded += libraryLoader.LoadPackages; loader.RequestLoadNodeLibrary += (libraryLoader as ExtensionLibraryLoader).LoadLibraryAndSuppressZTSearchImport; loader.LoadAll(new LoadPackageParams { Preferences = CurrentDynamoModel.PreferenceSettings, PathManager = CurrentDynamoModel.PathManager }); // There are 15 packages in "GitHub\Dynamo\test\pkgs" Assert.AreEqual(15, loader.LocalPackages.Count()); // Simulate loading new package from PM string packageDirectory = Path.Combine(TestDirectory, @"core\packageDependencyTests\ZTTestPackage"); var pkg = loader.ScanPackageDirectory(packageDirectory); loader.LoadPackages(new List <Package> { pkg }); // Assert that node belonging to new package is imported var node = GetNodeInstance("ZTTestPackage.RRTestClass.RRTestClass"); Assert.IsNotNull(node); // Check that node belonging to one of the preloaded packages exists and is unique var entries = CurrentDynamoModel.SearchModel.SearchEntries.ToList(); Assert.IsTrue(entries.Count(x => x.FullName == "AnotherPackage.AnotherPackage.AnotherPackage.HelloAnotherWorld") == 1); }
public void LoadingCustomNodeFromPackageSetsNodeInfoPackageInfoCorrectly() { var loader = new PackageLoader(PackagesDirectory); var libraryLoader = new ExtensionLibraryLoader(CurrentDynamoModel); loader.PackagesLoaded += libraryLoader.LoadPackages; loader.RequestLoadNodeLibrary += (libraryLoader as ExtensionLibraryLoader).LoadLibraryAndSuppressZTSearchImport; // This test needs the "isTestMode" flag to be turned off as an exception to be able // to test duplicate custom node def loading. loader.RequestLoadCustomNodeDirectory += (dir, pkgInfo) => CurrentDynamoModel.CustomNodeManager.AddUninitializedCustomNodesInPath(dir, isTestMode: false, packageInfo: pkgInfo); loader.LoadAll(new LoadPackageParams { Preferences = CurrentDynamoModel.PreferenceSettings, PathManager = CurrentDynamoModel.PathManager }); var packageInfo = new PackageInfo("EvenOdd", new System.Version(1, 0, 0)); var matchingNodes = CurrentDynamoModel.CustomNodeManager.NodeInfos.Where(x => x.Value.PackageInfo.Equals(packageInfo)).ToList(); //the node should have the correct package info and should be marked a packageMember. Assert.AreEqual(1, matchingNodes.Count); Assert.IsTrue(matchingNodes.All(x => x.Value.IsPackageMember == true)); }
public void EnableCustomPackagePathsLoadsPackagesOnClosingPreferences() { var setting = new PreferenceSettings() { CustomPackageFolders = { PackagesDirectory } }; var vm = CreatePackagePathViewModel(setting); var libraryLoader = new ExtensionLibraryLoader(ViewModel.Model); vm.packageLoader.PackagesLoaded += libraryLoader.LoadPackages; vm.packageLoader.RequestLoadNodeLibrary += libraryLoader.LoadLibraryAndSuppressZTSearchImport; (setting as IDisablePackageLoadingPreferences).DisableCustomPackageLocations = true; // Load packages in package path. vm.packageLoader.LoadAll(vm.loadPackageParams); Assert.AreEqual(0, vm.packageLoader.LocalPackages.Count()); // simulate turning off "disable custom package paths" toggle. vm.SetPackagesScheduledState(setting.CustomPackageFolders.First(), false); // simulate closing preferences dialog by saving changes to packagepathviewmodel vm.SaveSettingCommand.Execute(null); // packages are expected to load from 'PackagesDirectory' above when toggle is turned off Assert.AreEqual(19, vm.packageLoader.LocalPackages.Count()); vm.packageLoader.PackagesLoaded -= libraryLoader.LoadPackages; vm.packageLoader.RequestLoadNodeLibrary -= libraryLoader.LoadLibraryAndSuppressZTSearchImport; }
public void LoadPackagesReturnsAllValidPackagesInValidDirectory() { var loader = new PackageLoader(PackagesDirectory); var libraryLoader = new ExtensionLibraryLoader(CurrentDynamoModel); loader.PackagesLoaded += libraryLoader.LoadPackages; loader.RequestLoadNodeLibrary += (libraryLoader as ExtensionLibraryLoader).LoadLibraryAndSuppressZTSearchImport; loader.LoadAll(new LoadPackageParams { Preferences = CurrentDynamoModel.PreferenceSettings, PathManager = CurrentDynamoModel.PathManager }); // There are 15 packages in "GitHub\Dynamo\test\pkgs" Assert.AreEqual(15, loader.LocalPackages.Count()); // Verify that interdependent packages are resolved successfully var libs = CurrentDynamoModel.LibraryServices.ImportedLibraries.ToList(); Assert.IsTrue(libs.Any(x => File.Exists(Path.Combine(PackagesDirectory, "AnotherPackage", "bin", "AnotherPackage.dll")))); Assert.IsTrue(libs.Any(x => File.Exists(Path.Combine(PackagesDirectory, "Dependent Package", "bin", "DependentPackage.dll")))); Assert.IsTrue(libs.Any(x => File.Exists(Path.Combine(PackagesDirectory, "Package", "bin", "Package.dll")))); // Verify that interdependent packages are imported successfully var entries = CurrentDynamoModel.SearchModel.SearchEntries.ToList(); Assert.IsTrue(entries.Any(x => x.FullName == "AnotherPackage.AnotherPackage.AnotherPackage.HelloAnotherWorld")); Assert.IsTrue(entries.Any(x => x.FullName == "DependentPackage.DependentPackage.DependentPackage.HelloWorld")); Assert.IsTrue(entries.Any(x => x.FullName == "Package.Package.Package.Hello")); }
public void ScanPackageDirectoryWithCheckingCertificatesEnabledWillLoadPackageWithValidCertificate() { var loader = new PackageLoader(new[] { PackagesDirectory }, new[] { PackagesDirectorySigned }); var libraryLoader = new ExtensionLibraryLoader(CurrentDynamoModel); loader.PackagesLoaded += libraryLoader.LoadPackages; loader.RequestLoadNodeLibrary += libraryLoader.LoadNodeLibrary; var pkgDir = Path.Combine(PackagesDirectorySigned, "Signed Package"); var pkg = loader.ScanPackageDirectory(pkgDir, true); // Assert that ScanPackageDirectory returns a package Assert.IsNotNull(pkg); Assert.IsTrue(pkg.RequiresSignedEntryPoints); loader.LoadPackages(new List <Package> { pkg }); // Verify that package resolved successfully var libs = CurrentDynamoModel.LibraryServices.ImportedLibraries.ToList(); Assert.IsTrue(libs.Contains(Path.Combine(PackagesDirectorySigned, "Signed Package", "bin", "SignedPackage.dll"))); // Verify that the package are imported successfully var entries = CurrentDynamoModel.SearchModel.SearchEntries.ToList(); Assert.IsTrue(entries.Any(x => x.FullName == "SignedPackage.SignedPackage.SignedPackage.Hello")); }
public void LoadingAPackageThatConflictsWithLooseLoadedCustomNodeWillOverwriteLocalCustomNode() { var customNodeWS = CurrentDynamoModel.CustomNodeManager.CreateCustomNode("aConlictingNode", "aCategory", "a node that will conflict via id with loaded package", Guid.Parse("3f19c484-d3f3-49ba-88c2-6c386a41f6ac")); customNodeWS.AddAndRegisterNode(new Output()); Assert.AreEqual(1, customNodeWS.Nodes.Count()); //var tempPath = GetNewFileNameOnTempPath(".dyf"); //customNodeWS.Save(tempPath); //var customNodeInstance = CurrentDynamoModel.CustomNodeManager.CreateCustomNodeInstance(Guid.Parse("3f19c484-d3f3-49ba-88c2-6c386a41f6ac")); //this will reset the info. //this.CurrentDynamoModel.CurrentWorkspace.AddAndRegisterNode(customNodeInstance); var loader = GetPackageLoader(); var libraryLoader = new ExtensionLibraryLoader(CurrentDynamoModel); loader.PackagesLoaded += libraryLoader.LoadPackages; loader.RequestLoadNodeLibrary += (libraryLoader as ExtensionLibraryLoader).LoadLibraryAndSuppressZTSearchImport; var packageDirectory = Path.Combine(TestDirectory, "pkgs", "EvenOdd"); var package1 = Package.FromDirectory(packageDirectory, CurrentDynamoModel.Logger); loader.LoadPackages(new Package[] { package1 }); // There is 1 package loaded directly Assert.AreEqual(1, loader.LocalPackages.Count()); var entries = CurrentDynamoModel.SearchModel.SearchEntries.OfType <CustomNodeSearchElement>(); Assert.IsTrue(entries.Count(x => Path.GetDirectoryName(x.Path).EndsWith(@"EvenOdd\dyf") && x.FullName == "Test.EvenOdd") == 1); Assert.IsTrue(entries.Count(x => x.FullName == "aCategory.aConlictingNode") == 0); var customNodeInstance2 = CurrentDynamoModel.CustomNodeManager.CreateCustomNodeInstance(Guid.Parse("3f19c484-d3f3-49ba-88c2-6c386a41f6ac"), "Test.EvenOdd", true); //this will reset the info. this.CurrentDynamoModel.CurrentWorkspace.AddAndRegisterNode(customNodeInstance2); Assert.AreEqual(3, customNodeInstance2.InPorts.Count()); //the definition now points to the updated function //Assert.AreEqual(4, this.CurrentDynamoModel.CurrentWorkspace.Nodes.OfType<Function>().LastOrDefault().Definition.FunctionBody.Count()); //Assert.AreEqual(4, this.CurrentDynamoModel.CustomNodeManager.LoadedDefinitions.Where(x => x.FunctionId == customNodeInstance2.Definition.FunctionId).Count()); var matchingNode = CurrentDynamoModel.CustomNodeManager.NodeInfos[customNodeInstance2.Definition.FunctionId]; Assert.IsNotNull(matchingNode); //This still points to the package the guid came from - should it? Assert.True(matchingNode.IsPackageMember); }
public void ScanPackageDirectoryWithCheckingCertificatesEnabledWillNotLoadPackageWithAlteredCertificate() { var loader = new PackageLoader(new[] { PackagesDirectory }, new[] { PackagesDirectorySigned }); var libraryLoader = new ExtensionLibraryLoader(CurrentDynamoModel); loader.PackagesLoaded += libraryLoader.LoadPackages; loader.RequestLoadNodeLibrary += libraryLoader.LoadNodeLibrary; var pkgDir = Path.Combine(PackagesDirectorySigned, "Modfied Signed Package"); var pkg = loader.ScanPackageDirectory(pkgDir, true); // Assert that ScanPackageDirectory returns no packages Assert.IsNull(pkg); }
public void ExtensionLoader_LoadNodeLibraryAddsZTNodesToSearch() { var assemPath = Path.Combine(testpkgPath, "Dynamo Samples", "bin", "SampleLibraryZeroTouch.dll"); var assembly = Assembly.LoadFrom(assemPath); var libraryLoader = new ExtensionLibraryLoader(model); libraryLoader.LoadNodeLibrary(assembly); var entries = model.SearchModel.SearchEntries.ToList(); var nodesInLib = entries.Where(x => x.Assembly.Contains("SampleLibraryZeroTouch")).Select(y => y.FullName).ToList(); Assert.AreEqual(13, nodesInLib.Count()); Assert.IsTrue(entries.Count(x => x.FullName == "SampleLibraryZeroTouch.Examples.TransformableExample.TransformObject") == 1); }
public void LoadingConflictingCustomNodePackage_AfterPlacingNode_DoesNotGetLoaded() { var loader = GetPackageLoader(); var libraryLoader = new ExtensionLibraryLoader(CurrentDynamoModel); loader.PackagesLoaded += libraryLoader.LoadPackages; loader.RequestLoadNodeLibrary += (libraryLoader as ExtensionLibraryLoader).LoadLibraryAndSuppressZTSearchImport; var packageDirectory = Path.Combine(TestDirectory, "pkgs", "EvenOdd"); var packageDirectory2 = Path.Combine(TestDirectory, "pkgs", "EvenOdd2"); var package1 = Package.FromDirectory(packageDirectory, CurrentDynamoModel.Logger); var package2 = Package.FromDirectory(packageDirectory2, CurrentDynamoModel.Logger); loader.LoadPackages(new Package[] { package1, package2 }); // 2 packages loaded as expected var expectedLoadedPackageNum = 0; foreach (var pkg in loader.LocalPackages) { if (pkg.Name == "EvenOdd" || pkg.Name == "EvenOdd2") { expectedLoadedPackageNum++; } } Assert.AreEqual(2, expectedLoadedPackageNum); var entries = CurrentDynamoModel.SearchModel.SearchEntries.OfType <CustomNodeSearchElement>(); // Check that conflicting custom node package "EvenOdd2" is not installed Assert.IsTrue(entries.Count(x => Path.GetDirectoryName(x.Path).EndsWith(@"EvenOdd2\dyf")) == 0); Assert.IsTrue(entries.Count(x => Path.GetDirectoryName(x.Path).EndsWith(@"EvenOdd\dyf") && x.FullName == "Test.EvenOdd") == 1); var customNodeInstance = CurrentDynamoModel.CustomNodeManager.CreateCustomNodeInstance(Guid.Parse("3f19c484-d3f3-49ba-88c2-6c386a41f6ac")); //this will reset the info. this.CurrentDynamoModel.CurrentWorkspace.AddAndRegisterNode(customNodeInstance); //load again. loader.LoadPackages(new Package[] { package1, package2 }); //reassert conflicting package not loaded. Assert.IsTrue(entries.Count(x => Path.GetDirectoryName(x.Path).EndsWith(@"EvenOdd2\dyf")) == 0); Assert.IsTrue(entries.Count(x => Path.GetDirectoryName(x.Path).EndsWith(@"EvenOdd\dyf") && x.FullName == "Test.EvenOdd") == 1); }
public void LocalizedPackageLocalizedCorrectly() { var esculture = CultureInfo.CreateSpecificCulture("es-ES"); // Save current culture - usually "en-US" var currentCulture = Thread.CurrentThread.CurrentCulture; var currentUICulture = Thread.CurrentThread.CurrentUICulture; // Set "es-ES" Thread.CurrentThread.CurrentCulture = esculture; Thread.CurrentThread.CurrentUICulture = esculture; var loader = new PackageLoader(new[] { PackagesDirectory }, new[] { string.Empty }); var libraryLoader = new ExtensionLibraryLoader(CurrentDynamoModel); loader.PackagesLoaded += libraryLoader.LoadPackages; loader.RequestLoadNodeLibrary += libraryLoader.LoadNodeLibrary; var pkgDir = Path.Combine(PackagesDirectory, "Dynamo Samples"); var pkg = loader.ScanPackageDirectory(pkgDir, false); // Assert that ScanPackageDirectory returns a package Assert.IsNotNull(pkg); loader.LoadPackages(new List <Package> { pkg }); // Verify that the package are imported successfully var entries = CurrentDynamoModel.SearchModel.SearchEntries.ToList(); var nse = entries.Where(x => x.FullName == "SampleLibraryUI.Examples.LocalizedNode").FirstOrDefault(); Assert.IsNotNull(nse); //verify that the node has the correctly localized description Assert.AreEqual("Un nodo de interfaz de usuario de muestra que muestra una interfaz de usuario personalizada." , nse.Description); var node = nse.CreateNode(); Assert.AreEqual("Un nodo de interfaz de usuario de muestra que muestra una interfaz de usuario personalizada." , nse.Description); // Restore "en-US" Thread.CurrentThread.CurrentCulture = currentCulture; Thread.CurrentThread.CurrentUICulture = currentUICulture; }
public void RemoveAddPackagePathChangesInstalledPackageState() { var setting = new PreferenceSettings() { CustomPackageFolders = { PackagesDirectory } }; var vm = CreatePackagePathViewModel(setting); var libraryLoader = new ExtensionLibraryLoader(ViewModel.Model); vm.packageLoader.PackagesLoaded += libraryLoader.LoadPackages; vm.packageLoader.RequestLoadNodeLibrary += libraryLoader.LoadLibraryAndSuppressZTSearchImport; // Load packages in package path. vm.packageLoader.LoadAll(vm.loadPackageParams); Assert.AreEqual(19, vm.packageLoader.LocalPackages.Count()); // Remove package path. vm.DeletePathCommand.Execute(0); foreach (var pkg in vm.packageLoader.LocalPackages) { Assert.True(pkg.LoadState.State == PackageLoadState.StateTypes.Loaded); Assert.True(pkg.LoadState.ScheduledState == PackageLoadState.ScheduledTypes.ScheduledForUnload); } var path = string.Empty; vm.RequestShowFileDialog += (sender, args) => { args.Path = path; }; path = Path.Combine(GetTestDirectory(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)), "pkgs"); //Add the path back. vm.AddPathCommand.Execute(null); foreach (var pkg in vm.packageLoader.LocalPackages) { Assert.True(pkg.LoadState.State == PackageLoadState.StateTypes.Loaded); Assert.True(pkg.LoadState.ScheduledState == PackageLoadState.ScheduledTypes.None); } vm.packageLoader.PackagesLoaded -= libraryLoader.LoadPackages; vm.packageLoader.RequestLoadNodeLibrary -= libraryLoader.LoadLibraryAndSuppressZTSearchImport; }
public void InstalledPackagesContainsCorrectNumberOfPackages() { var setting = new PreferenceSettings() { CustomPackageFolders = { PackagesDirectory } }; var vm = CreatePackagePathViewModel(setting); var libraryLoader = new ExtensionLibraryLoader(ViewModel.Model); vm.packageLoader.PackagesLoaded += libraryLoader.LoadPackages; vm.packageLoader.RequestLoadNodeLibrary += libraryLoader.LoadLibraryAndSuppressZTSearchImport; var packagesLoaded = false; Action <IEnumerable <Assembly> > pkgsLoadedDelegate = (x) => { packagesLoaded = true; }; vm.packageLoader.PackagesLoaded += pkgsLoadedDelegate; vm.packageLoader.LoadAll(vm.loadPackageParams); Assert.AreEqual(19, vm.packageLoader.LocalPackages.Count()); Assert.AreEqual(true, packagesLoaded); var installedPackagesViewModel = new InstalledPackagesViewModel(ViewModel, vm.packageLoader); Assert.AreEqual(19, installedPackagesViewModel.LocalPackages.Count); var installedPackagesView = new Dynamo.Wpf.Controls.InstalledPackagesControl(); installedPackagesView.DataContext = installedPackagesViewModel; DispatcherUtil.DoEvents(); Assert.AreEqual(19, installedPackagesView.SearchResultsListBox.Items.Count); Assert.AreEqual(2, installedPackagesView.Filters.Items.Count); vm.packageLoader.PackagesLoaded -= libraryLoader.LoadPackages; vm.packageLoader.RequestLoadNodeLibrary -= libraryLoader.LoadLibraryAndSuppressZTSearchImport; }