Esempio n. 1
0
        public void findDependencies_HardcodedDependencyNotInstalled()
        {
            var    inst          = new Installation(Directory.GetCurrentDirectory());
            var    pkgs          = inst.GetPackages();
            string inputXml      = @"<?xml version='1.0' encoding='utf-8' ?>
<Package Name='Test3' xmlns ='http://opentap.io/schemas/package'>
  <Dependencies>
    <PackageDependency Package='NotInstalled' Version='Any'/>
  </Dependencies>
  <Files>
    <File Path='OpenTap.Package.UnitTests.dll'/>
  </Files>
</Package>
";
            string inputFilename = "test3.package.xml";

            File.WriteAllText(inputFilename, inputXml);

            try
            {
                PackageDef pkg = PackageDefExt.FromInputXml(inputFilename, Directory.GetCurrentDirectory());
                Assert.Fail("Missing dependency should have thrown an exception");
            }
            catch (Cli.ExitCodeException ex)
            {
                Assert.AreEqual((int)PackageCreateAction.ExitCodes.PackageDependencyError, ex.ExitCode);
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Load the input as a PackageDef, saves it again and compares the saved output to the original input
        /// </summary>
        /// <param name="input"></param>
        private static void LoadSaveCompare(string input, string expectedOutput)
        {
            PackageDef pkg;

            byte[] inputArray = System.Text.Encoding.ASCII.GetBytes(input);
            using (MemoryStream inputStream = new MemoryStream(inputArray))
            {
                pkg = PackageDef.FromXml(inputStream);
            }
            string output = "";

            using (Stream str = new MemoryStream())
            {
                pkg.SaveTo(str);
                using (StreamReader reader = new StreamReader(str))
                {
                    reader.BaseStream.Seek(0, 0);
                    output = reader.ReadToEnd();
                }
            }
            XDocument inputDoc  = XDocument.Parse(expectedOutput);
            XDocument outputDoc = XDocument.Parse(output);

            AssertElementEquals(inputDoc.Root, outputDoc.Root);
            AssertElementEquals(outputDoc.Root, inputDoc.Root);
        }
Esempio n. 3
0
        internal static void RunCustomActions(PackageDef package, PackageActionStage stage, CustomPackageActionArgs args)
        {
            var customActions = PluginManager.GetPlugins <ICustomPackageAction>()
                                .Select(s => Activator.CreateInstance(s) as ICustomPackageAction)
                                .Where(w => w.ActionStage == stage)
                                .OrderBy(p => p.Order())
                                .ToList();

            if (customActions.Count == 0)
            {
                log.Debug($"Found no custom actions to run at '{stage.ToString().ToLower()}' stage.");
                return;
            }

            log.Debug($"Available custom actions for '{stage.ToString().ToLower()}' stage. ({customActions.Count} actions: {string.Join(", ", customActions.Select(s => s.ToString()))})");

            foreach (ICustomPackageAction action in customActions)
            {
                Stopwatch timer = Stopwatch.StartNew();
                try
                {
                    if (action.Execute(package, args))
                    {
                        log.Info(timer, $"Package action {action.GetType().Name} completed");
                        continue;
                    }
                }
                catch (Exception ex)
                {
                    log.Warning(timer, $"Package action {action.ToString()} failed", ex);
                    throw;
                }
            }
        }
Esempio n. 4
0
        public void NoDowngradeInstallTest()
        {
            var installation = new Installation(Directory.GetCurrentDirectory());

            var package = new PackageDef();

            package.Name    = "NoDowngradeTest";
            package.Version = SemanticVersion.Parse("1.0.1");
            var newPath = DummyPackageGenerator.GeneratePackage(package);

            package.Version = SemanticVersion.Parse("1.0.0");
            var oldPath = DummyPackageGenerator.GeneratePackage(package);

            // Install new version
            var output = RunPackageCli($"install {newPath}", out int exitCode);

            Assert.IsTrue(exitCode == 0 && output.ToLower().Contains("installed"), "NoDowngradeTest package was not installed.");
            var installedVersion = installation.GetPackages()?.FirstOrDefault(p => p.Name == "NoDowngradeTest")?.Version;

            Assert.IsTrue(installedVersion == SemanticVersion.Parse("1.0.1"), $"NoDowngradeTest installed the wrong version: '{installedVersion}'.");

            // Install older version with --no-downgrade option. This should not install the old version.
            output = RunPackageCli($"install --no-downgrade {oldPath}", out exitCode);
            Assert.IsTrue(exitCode == 0 && output.ToLower().Contains("already installed"), "NoDowngradeTest package was not installed.");
            installedVersion = installation.GetPackages()?.FirstOrDefault(p => p.Name == "NoDowngradeTest")?.Version;
            Assert.IsTrue(installedVersion == SemanticVersion.Parse("1.0.1"), $"NoDowngradeTest failed to skip the install: '{installedVersion}'.");

            // Install older version without --no-downgrade option. This should install the old version.
            output = RunPackageCli($"install {oldPath}", out exitCode);
            Assert.IsTrue(exitCode == 0 && output.ToLower().Contains("installed"), "NoDowngradeTest package was not installed.");
            installedVersion = installation.GetPackages()?.FirstOrDefault(p => p.Name == "NoDowngradeTest")?.Version;
            Assert.IsTrue(installedVersion == SemanticVersion.Parse("1.0.0"), $"NoDowngradeTest failed to install the old version: '{installedVersion}'.");
        }
Esempio n. 5
0
        public void InstallFileWithMissingDependencyTest()
        {
            var def = new PackageDef();

            def.Name    = "Dummy2";
            def.OS      = "Windows,Linux";
            def.Version = SemanticVersion.Parse("1.0");
            def.AddFile("Dummy.txt");
            def.Dependencies.Add(new PackageDependency("Missing", VersionSpecifier.Parse("1.0")));
            DummyPackageGenerator.InstallDummyPackage("Missing");
            string pkgFile = DummyPackageGenerator.GeneratePackage(def);

            DummyPackageGenerator.UninstallDummyPackage("Missing");

            try
            {
                int    exitCode;
                string output = RunPackageCli("install Dummy2 -y", out exitCode);
                //Assert.AreNotEqual(0, exitCode, "Unexpected exit code");
                StringAssert.Contains("'Missing' with a version compatible with 1.0", output);
            }
            finally
            {
                File.Delete(pkgFile);
            }
        }
Esempio n. 6
0
 static void tryUninstall(string path, PackageDef package, string target)
 {
     log.Info("Uninstalling package '{0}'.", package.Name);
     Uninstall(package, target);
     log.Flush();
     log.Info("Uninstalled package '{0}'.", path);
 }
Esempio n. 7
0
        /// <summary>
        /// Loads and manages Index2, Catalog2, PackageDef objects
        /// </summary>
        /// <param name="workingDirectory"></param>
        public SongManager(string workingDirectory)
        {
            // Returns if directory doesn't exist
            if (!Directory.Exists(workingDirectory))
            {
                return;
            }
            _workingDirectory = workingDirectory;

            string[] rifFiles = Directory.GetFiles(_workingDirectory, "*.rif", SearchOption.TopDirectoryOnly);

            // Loads objects from riff files
            foreach (string rifFile in rifFiles)
            {
                RiffFile rif = new RiffFile();
                rif.Import(rifFile);

                foreach (ZObject zobj in rif.Objects)
                {
                    if (zobj is Index2)
                    {
                        _index2 = zobj as Index2;
                        LoadStringTablePaths();
                    }
                    else if (zobj is Catalog2)
                    {
                        _catalog2 = zobj as Catalog2;
                    }
                    else if (zobj is PackageDef)
                    {
                        _packageDef = zobj as PackageDef;
                    }
                }
            }

            // Look for PackageDef
            string[] packageDefs = Directory.GetFiles(Path.Combine(_workingDirectory, "packagedefs"), "packagedef.rif", SearchOption.AllDirectories);
            //packageDefs = packageDefs.OrderBy(x => x).ToArray();
            if (packageDefs.Length <= 0)
            {
                return;
            }

            RiffFile packageDef = new RiffFile();

            packageDef.Import(packageDefs[0]);

            foreach (ZObject zobj in packageDef.Objects)
            {
                if (zobj is PackageDef)
                {
                    _packageDef = zobj as PackageDef;
                    break;
                }
            }

            UpdateStringTableFromHKey(_index2.IndexKey);
            UpdateStringTableFromHKey(_catalog2.IndexKey);
            UpdateStringTableFromHKey(_packageDef.IndexKey);
        }
Esempio n. 8
0
        public void InstallLocalFile()
        {
            var package = new PackageDef();

            package.Name        = "Dummy Something";
            package.Version     = SemanticVersion.Parse("1.0.0");
            package.Description = "Cached version";

            var file = DummyPackageGenerator.GeneratePackage(package);

            if (File.Exists(Path.Combine("PackageCache", file)))
            {
                File.Delete(Path.Combine("PackageCache", file));
            }
            File.Move(file, Path.Combine("PackageCache", file));

            package.Description = "Right version";
            var file2 = DummyPackageGenerator.GeneratePackage(package);

            var result = RunPackageCli("install -v -f \"" + Path.GetFullPath(file2) + "\"", out int exitcode);

            Assert.IsTrue(result.ToLower().Contains("installed"));
            Assert.IsTrue(result.ToLower().Contains("downloading file without searching"));

            var installedPackage = new Installation(Directory.GetCurrentDirectory()).GetPackages().FirstOrDefault(p => p.Name == package.Name);

            Assert.IsNotNull(installedPackage, "Package was not installed");
            Assert.AreEqual(package.Description, installedPackage.Description);
        }
Esempio n. 9
0
        /// <summary>
        /// Returns the names of the files in a plugin package.
        /// </summary>
        /// <param name="packagePath"></param>
        /// <returns></returns>
        internal static List <string> FilesInPackage(string packagePath)
        {
            List <string> files    = new List <string>();
            string        fileType = Path.GetExtension(packagePath);

            if (fileType == ".xml")
            {
                var pkg = PackageDef.FromXml(packagePath);
                return(pkg.Files.Select(f => f.FileName).ToList());
            }

            try
            {
                using (var fileStream = File.OpenRead(packagePath))
                    using (var zip = new ZipArchive(fileStream, ZipArchiveMode.Read))
                    {
                        foreach (var part in zip.Entries)
                        {
                            if (part.Name == "[Content_Types].xml" || part.Name == ".rels" || part.FullName.StartsWith("package/services/metadata/core-properties"))
                            {
                                continue; // skip strange extra files that are created by System.IO.Packaging.Package (TAP 7.x)
                            }
                            string path = Uri.UnescapeDataString(part.FullName);
                            files.Add(path);
                        }
                    }
            }
            catch (InvalidDataException)
            {
                log.Error($"Could not unpackage '{packagePath}'.");
                throw;
            }
            return(files);
        }
Esempio n. 10
0
    IEnumerable<string> GetUrls(PackageDef packageDef)
    {
        foreach (var feed in PackageFeeds)
        {
            if (IsLocalPath(feed))
            {
                // Local
                yield return Path.Combine(feed, string.Format("{0}.{1}.nupkg", packageDef.Id, packageDef.Version));
            }
            else
            {
                // Online
                var nugetUrl = feed;
                nugetUrl = nugetUrl.TrimEnd('/');
                if (!nugetUrl.EndsWith("package",StringComparison.OrdinalIgnoreCase))
                {
                    nugetUrl += "/package";
                }

                yield return string.Format("{0}/{1}/{2}", nugetUrl, packageDef.Id, packageDef.Version);
            }
        }

        //return AdditionalFeeds
        //    .Select(source => string.Format("{0}/api/v2/package/{1}/{2}", source, packageDef.Id, packageDef.Version));
    }
Esempio n. 11
0
        /// <summary>
        /// Compresses the files to a zip package.
        /// </summary>
        static private void Compress(this PackageDef pkg, string outputPath, IEnumerable <PackageFile> inputPaths)
        {
            var dir = Path.GetDirectoryName(outputPath);

            if (String.IsNullOrWhiteSpace(dir) == false)
            {
                Directory.CreateDirectory(dir);
            }
            using (var zip = new System.IO.Compression.ZipArchive(File.Open(outputPath, FileMode.Create), System.IO.Compression.ZipArchiveMode.Create))
            {
                foreach (PackageFile file in inputPaths)
                {
                    var sw          = Stopwatch.StartNew();
                    var relFileName = file.RelativeDestinationPath;
                    var ZipPart     = zip.CreateEntry(relFileName, System.IO.Compression.CompressionLevel.Optimal);

                    using (var instream = File.OpenRead(file.FileName))
                    {
                        using (var outstream = ZipPart.Open())
                        {
                            var compressTask = instream.CopyToAsync(outstream, 2048, TapThread.Current.AbortToken);
                            ConsoleUtils.PrintProgressTillEnd(compressTask, "Compressing", () => instream.Position, () => instream.Length);
                        }
                    }
                    log.Debug(sw, "Compressed '{0}'", file.FileName);
                }

                // add the metadata xml file:

                var metaPart = zip.CreateEntry(String.Join("/", PackageDef.PackageDefDirectory, pkg.Name, PackageDef.PackageDefFileName), System.IO.Compression.CompressionLevel.Optimal);
                using (var str = metaPart.Open())
                    pkg.SaveTo(str);
            }
        }
Esempio n. 12
0
            public static List <PackageDef> GetInstallation()
            {
                var opentap = new PackageDef
                {
                    Name       = "OpenTAP",
                    RawVersion = "1.0.0"
                };

                var A = new PackageDef()
                {
                    Name       = "A",
                    RawVersion = "1.0.0"
                };

                A.Dependencies.Add(new PackageDependency("OpenTAP", VersionSpecifier.Any));
                var file = new PackageFile();

                file.FileName = "Package/A/test";
                file.CustomData.Add(new FileHashPackageAction.Hash {
                    Value = "TEST1234"
                });
                A.Files.Add(file);

                var file2 = new PackageFile();

                file2.FileName = "Dependencies/A/test";
                file2.CustomData.Add(new FileHashPackageAction.Hash {
                    Value = "TEST1234"
                });
                A.Files.Add(file2);

                return(new List <PackageDef> {
                    opentap, A
                });
            }
Esempio n. 13
0
        public void DependencyAnalyzerBuildAnalyzerContextTest()
        {
            log.Info("-----------------------------DependencyAnalyzer BuildAnalyzerContext-----------------------------");

            // Test setup.
            var tapPackage = new PackageDef()
            {
                Name = "Tap", Version = PluginManager.GetOpenTapAssembly().SemanticVersion
            };
            var packages = new List <PackageDef>();

            packages.Add(tapPackage);

            // Correct packages.
            using (var xmlText = File.OpenRead(Path.Combine(Directory.GetCurrentDirectory(), "TapPackages/MyPlugin1.xml")))
            {
                packages.AddRange(PackageDef.ManyFromXml(xmlText));

                // Multiple identical packages.
                xmlText.Seek(0, 0);
                packages.AddRange(PackageDef.ManyFromXml(xmlText));
            }

            // Reset test.
            packages.Clear();

            // No packages.
            var dependencyAnalyzer = DependencyAnalyzer.BuildAnalyzerContext(packages);

            Assert.IsTrue(dependencyAnalyzer.BrokenPackages.Count == 0, "No packages");
            log.Info("Multiple identical items - SUCCESS");
        }
Esempio n. 14
0
            public static List <PackageDef> TestNonConflicting()
            {
                var B = new PackageDef {
                    Name = "B", RawVersion = "2.0.0"
                };
                var file = new PackageFile {
                    FileName = "Package/A/test"
                };

                file.CustomData.Add(new FileHashPackageAction.Hash {
                    Value = "TEST1234"
                });                                                                       // same hash
                B.Files.Add(file);
                var C = new PackageDef {
                    Name = "C", RawVersion = "2.0.0"
                };
                var file2 = new PackageFile {
                    FileName = "Package/B/test"
                };

                file2.CustomData.Add(new FileHashPackageAction.Hash {
                    Value = "TEST1234"
                });
                B.Files.Add(file2);
                return(new List <PackageDef> {
                    B, C
                });
            }
Esempio n. 15
0
        /// <summary>
        /// Returns package definition list of installed packages in the TAP installation defined in the constructor, and system-wide packages.
        /// </summary>
        /// <returns></returns>
        public List <PackageDef> GetPackages()
        {
            List <PackageDef> plugins       = new List <PackageDef>();
            List <string>     package_files = new List <string>();


            // Add normal package from OpenTAP folder
            package_files.AddRange(PackageDef.GetPackageMetadataFilesInTapInstallation(TapPath));

            // Add system wide packages
            package_files.AddRange(PackageDef.GetSystemWidePackages());

            foreach (var file in package_files)
            {
                var package = installedPackageMemorizer.Invoke(file);
                if (package != null && !plugins.Any(s => s.Name == package.Name))
                {
#pragma warning disable 618
                    package.Location = file;
#pragma warning restore 618
                    package.PackageSource = new InstalledPackageDefSource
                    {
                        Installation       = this,
                        PackageDefFilePath = file
                    };
                    plugins.Add(package);
                }
            }

            return(plugins);
        }
Esempio n. 16
0
        public void InstalledPackages_InvalidXmlIgnored()
        {
            Assert.IsTrue(File.Exists(PackageDef.GetDefaultPackageMetadataPath("XSeries")), "Necessary package file missing.");


            File.WriteAllText(Path.Combine(PackageDef.PackageDefDirectory, "Invalid.package.xml"),
                              @"<?xml version='1.0' encoding='utf-8' ?>
<Package Name='Invalid' xmlns='http://keysight.com/schemas/TAP/Package'>
  <Files>
    <File Path='Tap.Engine.dll' Obfuscate='false'><UseVersion/></File>
  </Files>
  <FileName>This should not be there<FileName/>
</Package>");

            System.Collections.Generic.List <PackageDef> target = new Installation(Directory.GetCurrentDirectory()).GetPackages();;


            CollectionAssert.AllItemsAreInstancesOfType(target, typeof(PackageDef));
            CollectionAssert.AllItemsAreNotNull(target);
            CollectionAssert.AllItemsAreUnique(target);
            Assert.IsTrue(target.Any(pkg => pkg.Name == "XSeries"));
            Assert.IsTrue(target.Any(pkg => pkg.Name == "Test"));
            Assert.IsFalse(target.Any(pkg => pkg.Name == "Invalid"));

            File.Delete(Path.Combine(PackageDef.PackageDefDirectory, "Invalid.package.xml"));
        }
Esempio n. 17
0
        public void UninstallFirstTest()
        {
            var dep0Def = new PackageDef();

            dep0Def.Name    = "UninstallPackage";
            dep0Def.Version = SemanticVersion.Parse("0.1");
            dep0Def.AddFile("UninstallText.txt");
            string dep0File = DummyPackageGenerator.GeneratePackage(dep0Def);

            var dep1Def = new PackageDef();

            dep1Def.Name    = "UninstallPackage";
            dep1Def.Version = SemanticVersion.Parse("0.2");
            dep1Def.AddFile("SubDir/UninstallText.txt");
            Directory.CreateDirectory("SubDir");
            string dep1File = DummyPackageGenerator.GeneratePackage(dep1Def);

            int    exitCode;
            string output = RunPackageCli("install " + dep0File, out exitCode);

            Assert.AreEqual(0, exitCode, "Unexpected exit code1: " + output);

            Assert.IsTrue(File.Exists("UninstallText.txt"), "File0 should exist");

            output = RunPackageCli("install " + dep1File, out exitCode);
            Assert.AreEqual(0, exitCode, "Unexpected exit code2: " + output);

            Assert.IsTrue(File.Exists("SubDir/UninstallText.txt"), "File1 should exist");
            Assert.IsFalse(File.Exists("UninstallText.txt"), "File0 should not exist");
        }
Esempio n. 18
0
        private void GetDependenciesRecursive(List <IPackageRepository> repositories, PackageDependency dependency, CpuArchitecture packageArchitecture, string OS)
        {
            if (Dependencies.Any(p => (p.Name == dependency.Name) &&
                                 dependency.Version.IsCompatible(p.Version) &&
                                 ArchitectureHelper.PluginsCompatible(p.Architecture, packageArchitecture)))
            {
                return;
            }
            PackageDef depPkg = GetPackageDefFromInstallation(dependency.Name, dependency.Version);

            if (depPkg == null)
            {
                depPkg = GetPackageDefFromRepo(repositories, dependency.Name, dependency.Version);
                MissingDependencies.Add(depPkg);
            }
            if (depPkg == null)
            {
                UnknownDependencies.Add(dependency);
                return;
            }
            Dependencies.Add(depPkg);
            foreach (var nextLevelDep in depPkg.Dependencies)
            {
                GetDependenciesRecursive(repositories, nextLevelDep, packageArchitecture, OS);
            }
        }
Esempio n. 19
0
        private static void AddFileDependencies(PackageDef pkg, AssemblyData dependency, AssemblyData foundAsm)
        {
            var depender = pkg.Files.FirstOrDefault(f => f.DependentAssemblies.Contains(dependency));

            if (depender == null)
            {
                log.Warning("Adding dependent assembly '{0}' to package. It was not found in any other packages.", Path.GetFileName(foundAsm.Location));
            }
            else
            {
                log.Info($"'{Path.GetFileName(depender.FileName)}' dependents on '{dependency.Name}' version '{dependency.Version}'. Adding dependency to package, it was not found in any other packages.");
            }

            var destPath = string.Format("Dependencies/{0}.{1}/{2}", Path.GetFileNameWithoutExtension(foundAsm.Location), foundAsm.Version.ToString(), Path.GetFileName(foundAsm.Location));

            pkg.Files.Add(new PackageFile {
                SourcePath = foundAsm.Location, RelativeDestinationPath = destPath, DependentAssemblies = foundAsm.References.ToList()
            });

            // Copy the file to the actual directory so we can rely on it actually existing where we say the package has it.
            if (!File.Exists(destPath))
            {
                Directory.CreateDirectory(Path.GetDirectoryName(destPath));
                ProgramHelper.FileCopy(foundAsm.Location, destPath);
            }
        }
Esempio n. 20
0
        public void SkipInstallExactVersionAlreadyInstalledTest()
        {
            var package = new PackageDef();

            package.Name    = "ExactVersionTest";
            package.Version = SemanticVersion.Parse("1.0.1");
            package.OS      = "Windows,Linux";
            var path = DummyPackageGenerator.GeneratePackage(package);

            // Install
            var output = RunPackageCli($"install {path}", out int exitCode);

            Assert.IsTrue(exitCode == 0 && output.ToLower().Contains("installed"), "ExactVersionTest package was not installed.");

            // Install the exact same version. This should skip.
            output = RunPackageCli($"install {package.Name} --version 1.0.1", out exitCode);
            Assert.IsTrue(exitCode == 0 && output.ToLower().Contains("already installed"), "ExactVersionTest package install was not skipped.");

            // Install the exact same version with --force. This should not skip.
            output = RunPackageCli($"install {package.Name} --version 1.0.1 -f", out exitCode);
            Assert.IsTrue(exitCode == 0 && output.ToLower().Contains("already installed") == false, "ExactVersionTest package install with -f was skipped.");

            // Install the exact same version from file. This should not skip.
            output = RunPackageCli($"install {path}", out exitCode);
            Assert.IsTrue(exitCode == 0 && output.ToLower().Contains("already installed") == false, "ExactVersionTest package install was skipped.");
        }
Esempio n. 21
0
        public static string GeneratePackage(PackageDef definition)
        {
            foreach (var packageFile in definition.Files)
            {
                File.CreateText(packageFile.FileName).Close();
            }
            string defFileName = "generated_package.xml";

            using (var stream = File.Create(defFileName))
                definition.SaveTo(stream);

            var proc = OpenTap.Engine.UnitTests.TapProcessContainer.StartFromArgs("package create " + defFileName, TimeSpan.FromMinutes(5));

            proc.WaitForEnd();
            string output     = proc.ConsoleOutput;
            string outputFile = definition.Name + "." + definition.Version + ".TapPackage";

            if (File.Exists(outputFile))
            {
                return(outputFile);
            }
            else
            {
                throw new Exception(output);
            }
        }
Esempio n. 22
0
        private static void updateVersion(this PackageDef pkg, string ProjectDirectory)
        {
            // Replace macro if possible
            pkg.RawVersion = TryReplaceMacro(pkg.RawVersion, ProjectDirectory);

            foreach (var depPackage in pkg.Dependencies)
            {
                ReplaceDependencyVersion(ProjectDirectory, depPackage);
            }

            if (pkg.RawVersion == null)
            {
                foreach (var file in pkg.Files.Where(file => file.HasCustomData <UseVersionData>()))
                {
                    pkg.Version = PluginManager.GetSearcher().Assemblies.FirstOrDefault(a => Path.GetFullPath(a.Location) == Path.GetFullPath(file.FileName)).SemanticVersion;
                    break;
                }
            }
            else
            {
                if (String.IsNullOrWhiteSpace(pkg.RawVersion))
                {
                    pkg.Version = new SemanticVersion(0, 0, 0, null, null);
                }
                else if (SemanticVersion.TryParse(pkg.RawVersion, out var semver))
                {
                    pkg.Version = semver;
                }
                else
                {
                    throw new FormatException("The version string in the package is not a valid semantic version.");
                }
            }
        }
Esempio n. 23
0
        public void GetPluginName_Test()
        {
            string     inputFilename = "Packages/test2/package.xml";
            PackageDef pkg           = PackageDefExt.FromInputXml(inputFilename, Directory.GetCurrentDirectory());

            Assert.AreEqual("Test Step", pkg.Files?.FirstOrDefault()?.Plugins?.FirstOrDefault(p => p.Type == typeof(IfStep).FullName)?.BaseType);
            Assert.AreEqual(pkg.Files?.FirstOrDefault()?.Plugins.FirstOrDefault(p => p.Type == typeof(GenericScpiInstrument).FullName)?.BaseType, "Instrument");
        }
Esempio n. 24
0
        public void CreatePackageDepVersions()
        {
            var tmp  = Path.GetTempFileName();
            var tmp2 = Path.GetTempFileName();

            Directory.Move("Packages", "Packages2");
            try
            {
                {
                    PackageDef def = new PackageDef();
                    def.Name     = "test";
                    def.InfoLink = "a";
                    def.Date     = DateTime.Today;

                    def.AddFile(tmp);

                    var bs = PluginManager.GetSearcher().Assemblies.First(asm => asm.Name == "OpenTap.Plugins.BasicSteps");
                    def.Files[0].DependentAssemblies.Add(bs);

                    var searcher = new PluginSearcher();
                    searcher.Search(Directory.GetCurrentDirectory());
                    List <AssemblyData> assemblies = searcher.Assemblies.ToList();
                    def.findDependencies(new List <string>(), assemblies);

                    Assert.AreEqual(0, def.Dependencies.Count);
                    Assert.AreNotEqual(0, def.Files.Count);
                }

                {
                    PackageDef def = new PackageDef();

                    def.AddFile(tmp);

                    var bs = PluginManager.GetSearcher().Assemblies.First(asm => asm.Name == "OpenTap.Plugins.BasicSteps");
                    def.Files[0].DependentAssemblies.Add(bs);

                    var searcher = new PluginSearcher();
                    searcher.Search(Directory.GetCurrentDirectory());
                    List <AssemblyData> assemblies = searcher.Assemblies.ToList();
                    def.findDependencies(new List <string> {
                        "OpenTap"
                    }, assemblies);

                    Assert.AreEqual(0, def.Dependencies.Count);
                    Assert.AreNotEqual(1, def.Files.Count);
                }
            }
            finally
            {
                if (Directory.Exists("Packages"))
                {
                    Directory.Delete("Packages", true);
                }
                Directory.Move("Packages2", "Packages");
            }
        }
Esempio n. 25
0
        public void DownloadPackage(IPackageIdentifier package, string destination, CancellationToken cancellationToken)
        {
            PackageDef packageDef = null;

            // If the requested package is a file we do not want to start searching the entire repo.
            if (package is PackageDef def && File.Exists((def.PackageSource as FilePackageDefSource)?.PackageFilePath))
            {
                log.Debug("Downloading file without searching repository.");
                packageDef = def;
            }
Esempio n. 26
0
        protected override int LockedExecute(CancellationToken cancellationToken)
        {
            if (Packages == null)
            {
                throw new Exception("No packages specified.");
            }

            if (Force == false && Packages.Any(p => p == "OpenTAP") && Target == ExecutorClient.ExeDir)
            {
                log.Error("Aborting request to uninstall the OpenTAP package that is currently executing as that would brick this installation. Use --force to uninstall anyway.");
                return(-4);
            }

            Installer installer = new Installer(Target, cancellationToken)
            {
                DoSleep = false
            };

            installer.ProgressUpdate += RaiseProgressUpdate;
            installer.Error          += RaiseError;

            var installedPackages = new Installation(Target).GetPackages();

            bool anyUnrecognizedPlugins = false;

            foreach (string pack in Packages)
            {
                PackageDef package = installedPackages.FirstOrDefault(p => p.Name == pack);

                if (package != null && package.PackageSource is InstalledPackageDefSource source)
                {
                    installer.PackagePaths.Add(source.PackageDefFilePath);
                }
                else if (!IgnoreMissing)
                {
                    log.Error("Package '{0}' is not installed", pack);
                    anyUnrecognizedPlugins = true;
                }
            }

            if (anyUnrecognizedPlugins)
            {
                return(-2);
            }

            if (!Force)
            {
                if (!CheckPackageAndDependencies(installedPackages, installer.PackagePaths))
                {
                    return(-3);
                }
            }

            return(installer.RunCommand("uninstall", Force, true) ? 0 : -1);
        }
Esempio n. 27
0
        public void InstalledPackages_TwoPackages()
        {
            Assert.IsTrue(File.Exists(PackageDef.GetDefaultPackageMetadataPath("XSeries")), "Necessary package file missing.");

            System.Collections.Generic.List <PackageDef> target = new Installation(Directory.GetCurrentDirectory()).GetPackages();
            CollectionAssert.AllItemsAreInstancesOfType(target, typeof(PackageDef));
            CollectionAssert.AllItemsAreNotNull(target);
            CollectionAssert.AllItemsAreUnique(target);
            Assert.IsTrue(target.Any(pkg => pkg.Name == "XSeries"));
            Assert.IsTrue(target.Any(pkg => pkg.Name == "Test"));
        }
Esempio n. 28
0
        public void CheckDependencies_AllDepsInstalled()
        {
            var xseries = PackageDef.FromXml(PackageDef.GetDefaultPackageMetadataPath("XSeries"));

            //var test2 = PackageDef.FromXmlFile(PackageDef.GetDefaultPackageMetadataPath("Test2"));
            File.Copy(PackageDef.GetDefaultPackageMetadataPath("CheckDependencies_AllDepsInstalled"), "CheckDependencies_AllDepsInstalled.xml", true);
            PackageDef.ValidateXml("CheckDependencies_AllDepsInstalled.xml");
            var alldeps = PackageDef.FromXml("CheckDependencies_AllDepsInstalled.xml");
            //var tree = DependencyAnalyzer.BuildAnalyzerContext(new List<PackageDef> { xseries, test2, alldeps });
            //Assert.AreEqual(tree.BrokenPackages.Count, 1);
            //PackageDependencyExt.CheckDependencies(inputFilename);
        }
Esempio n. 29
0
        public void CyclicDependenciesTest()
        {
            DummyPackageGenerator.InstallDummyPackage(); // We need to have "Dummy" installed before we can create a package that depends on it.
            var depDef = new PackageDef();

            depDef.Name    = "Dependency";
            depDef.OS      = "Windows,Linux";
            depDef.Version = SemanticVersion.Parse("1.0");
            depDef.AddFile("Dependency.txt");
            depDef.Dependencies.Add(new PackageDependency("Dummy", VersionSpecifier.Parse("1.0")));
            string dep0File = DummyPackageGenerator.GeneratePackage(depDef);

            DummyPackageGenerator.UninstallDummyPackage();

            DummyPackageGenerator.InstallDummyPackage("Dependency");
            var dummyDef = new PackageDef();

            dummyDef.Name    = "Dummy";
            dummyDef.OS      = "Windows,Linux";
            dummyDef.Version = SemanticVersion.Parse("1.0");
            dummyDef.AddFile("Dummy.txt");
            dummyDef.Dependencies.Add(new PackageDependency("Dependency", VersionSpecifier.Parse("1.0")));
            string dummyFile = DummyPackageGenerator.GeneratePackage(dummyDef);

            DummyPackageGenerator.UninstallDummyPackage("Dependency");

            try
            {
                if (File.Exists("Dependency.txt"))
                {
                    File.Delete("Dependency.txt");
                }
                if (File.Exists("Dummy.txt"))
                {
                    File.Delete("Dummy.txt");
                }
                int    exitCode;
                string output = RunPackageCli("install Dummy -y", out exitCode);
                Assert.AreEqual(0, exitCode, "Unexpected exit code.\r\n" + output);
                StringAssert.Contains("Dummy", output);
                StringAssert.Contains("Dependency", output);
                Assert.IsTrue(File.Exists("Dependency.txt"));
                Assert.IsTrue(File.Exists("Dummy.txt"));
            }
            finally
            {
                PluginInstaller.Uninstall(dummyDef, Directory.GetCurrentDirectory());
                PluginInstaller.Uninstall(depDef, Directory.GetCurrentDirectory());
                File.Delete(dep0File);
                File.Delete(dummyFile);
            }
        }
Esempio n. 30
0
        public void DependencyAnalyzerGetIssuesTest()
        {
            log.Info("-----------------------------DependencyAnalyzer GetIssues-----------------------------");

            // Test setup.
            var tapPackage = new PackageDef()
            {
                Name = "Tap", Version = SemanticVersion.Parse("7.0.700")
            };
            var packages = new List <PackageDef>();

            packages.Add(tapPackage);

            // Dependencies without any issues.
            using (var xmlText = File.OpenRead(Path.Combine(Directory.GetCurrentDirectory(), "TapPackages/MyPlugin1.xml")))
                packages.AddRange(PackageDef.ManyFromXml(xmlText));
            var dependencyAnalyzer = DependencyAnalyzer.BuildAnalyzerContext(packages);
            var issues             = dependencyAnalyzer.GetIssues(packages.Last());

            if (issues.Any())
            {
                Assert.Fail("Unexpected Dependency Issue: {1} {0} ", issues.First().IssueType, issues.First().PackageName);
            }
            log.Info("Dependencies without any issues - SUCCESS");

            // Reset test.
            packages = packages.Take(1).ToList();

            // Dependencies with issues (Tap newer than plugin).
            using (var xmlText = File.OpenRead(Path.Combine(Directory.GetCurrentDirectory(), "TapPackages/MyPlugin2.xml")))
            {
                var pkgs = PackageDef.ManyFromXml(xmlText);
                packages.AddRange(pkgs);
                Assert.IsTrue(pkgs.First().Version.Major == 1);
                Assert.IsTrue(pkgs.First().Version.Minor == 2);
                Assert.IsTrue(pkgs.First().Version.Patch == 3);
            }
            dependencyAnalyzer = DependencyAnalyzer.BuildAnalyzerContext(packages);
            issues             = dependencyAnalyzer.GetIssues(packages.Last());
            Assert.IsTrue(issues.Count == 1, "Dependencies with issues (Tap newer than plugin)");
            log.Info("Dependencies with issues (Tap newer than plugin) - SUCCESS");

            // Reset test.
            packages = packages.Take(1).ToList();

            // No dependencies.
            dependencyAnalyzer = DependencyAnalyzer.BuildAnalyzerContext(packages);
            issues             = dependencyAnalyzer.GetIssues(new PackageDef());
            Assert.IsTrue(issues.Count == 0, "No dependencies");
            log.Info("No dependencies - SUCCESS");
        }
Esempio n. 31
0
        public void LoadPackageFile()
        {
            var        packageString = Resources.GetEmbedded("ExamplePackage.xml");
            PackageDef package;

            using (var str = new MemoryStream(Encoding.UTF8.GetBytes(packageString)))
            {
                package = PackageDef.FromXml(str);
            }
            Assert.AreEqual(package.Dependencies.Count, 1);
            Assert.AreEqual("Tap", package.Dependencies[0].Name);
            Assert.AreEqual(package.Files.Count, 2);
            Assert.IsNotNull(package.Description);
        }
Esempio n. 32
0
    void Download(PackageDef packageDef, string nupkgCacheFilePath)
    {
        cacheCleanRequired = true;
        var errors = new StringBuilder("Failed to download. This package may no longer exist on the nuget feed or there is a problem with your internet connection. Errors:");

        var addresses = GetUrls(packageDef).ToList();
        foreach (var address in addresses)
        {
            try
            {
                DownloadFromSpecificSource(nupkgCacheFilePath, address);
                return;
            }
            catch (Exception ex)
            {
                errors.AppendLine(string.Format("Failed to download '{0}' due to '{1}'.", address, ex.Message));
            }
        }

        throw new ExpectedException(errors.ToString());
    }
Esempio n. 33
0
    string GetPackageCacheFile(PackageDef packageDef)
    {
        var nupkgCacheFilePath = Path.Combine(CachePath, string.Format("{0}.{1}.nupkg", packageDef.Id, packageDef.Version));

        if (File.Exists(nupkgCacheFilePath))
        {
            WriteInfo("Found in cache " + nupkgCacheFilePath);
            File.SetLastWriteTime(nupkgCacheFilePath, DateTime.Now);
            return nupkgCacheFilePath;
        }
        Download(packageDef, nupkgCacheFilePath);

        return nupkgCacheFilePath;
    }
Esempio n. 34
0
    void ProcessPackageDef(PackageDef packageDef)
    {
        var packagePath = Path.Combine(PackagesPath, packageDef.Id + "." + packageDef.Version);
        if (Directory.Exists(packagePath))
        {
            WriteInfo("Already exists so skipped " + packagePath);
            return;
        }

        var packageCacheFile = GetPackageCacheFile(packageDef);

        Directory.CreateDirectory(packagePath);
        try
        {
            var nupkgFilePath = Path.Combine(packagePath, string.Format("{0}.{1}.nupkg", packageDef.Id, packageDef.Version));

            // Resolve relative paths
            nupkgFilePath = Path.GetFullPath(nupkgFilePath);

            if (Directory.Exists(nupkgFilePath))
            {
                return;
            }
            File.Copy(packageCacheFile, nupkgFilePath, true);

            ProcessPackage(packagePath, nupkgFilePath);
        }
        catch (Exception)
        {
            Directory.Delete(packagePath, true);
            throw;
        }
    }