winget-cli

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

DependenciesTestSource.h (7715B)


      1 #pragma once
      2 
      3 #include "pch.h"
      4 #include "TestSource.h"
      5 #include "TestCommon.h"
      6 #include "AppInstallerVersions.h"
      7 #include <Public/winget/RepositorySource.h>
      8 #include <winget/ManifestYamlParser.h>
      9 
     10 using namespace AppInstaller::Repository;
     11 using namespace AppInstaller::Manifest;
     12 using namespace AppInstaller::Utility;
     13 
     14 namespace TestCommon
     15 {
     16     namespace 
     17     {
     18         Manifest CreateFakeManifestWithDependencies(std::string input)
     19         {
     20             auto manifest = YamlParser::CreateFromPath(TestDataFile("Installer_Exe_Dependencies.yaml"));
     21             manifest.Id = input;
     22             manifest.Moniker = input;
     23 
     24             auto& installer = manifest.Installers.at(0);
     25             installer.ProductId = input;
     26             installer.Dependencies.Clear();
     27 
     28             string_t defaultFakeVersion("0.0.1-defaultFakeVersion");
     29 
     30             if (input == "withoutInstallers")
     31             {
     32                 manifest.Installers.clear();
     33                 return manifest;
     34             }
     35 
     36             /*
     37             * Dependencies:
     38             *   "A": Depends on the test
     39             *   B: NoDependency
     40             *   C: B
     41             *   D: E
     42             *   E: D
     43             *   F: B
     44             *   G: C
     45             *   H: G, B
     46             *
     47             *   installed1
     48             *   minVersion1.0
     49             *   minVersion1.5
     50             *   requires1.5: minVersion1.5
     51             *   minVersion2.0 //invalid version (not returned as result)
     52             */
     53 
     54             //-- predefined
     55             if (input == "C")
     56             {
     57                 installer.Dependencies.Add(Dependency(DependencyType::Package, "B", defaultFakeVersion));
     58             }
     59             if (input == "D")
     60             {
     61                 installer.Dependencies.Add(Dependency(DependencyType::Package, "E", defaultFakeVersion));
     62             }
     63             if (input == "E")
     64             {
     65                 installer.Dependencies.Add(Dependency(DependencyType::Package, "D", defaultFakeVersion));
     66             }
     67             if (input == "F")
     68             {
     69                 installer.Dependencies.Add(Dependency(DependencyType::Package, "B", defaultFakeVersion));
     70             }
     71             if (input == "G")
     72             {
     73                 installer.Dependencies.Add(Dependency(DependencyType::Package, "C", defaultFakeVersion));
     74             }
     75             if (input == "H")
     76             {
     77                 installer.Dependencies.Add(Dependency(DependencyType::Package, "G", defaultFakeVersion));
     78                 installer.Dependencies.Add(Dependency(DependencyType::Package, "B", defaultFakeVersion));
     79             }
     80             if (input == "installed1")
     81             {
     82                 installer.Dependencies.Add(Dependency(DependencyType::Package, "installed1Dep", defaultFakeVersion));
     83             }
     84             if (input == "minVersion1.0")
     85             {
     86                 manifest.Id = "minVersion";
     87                 manifest.Version = "1.0";
     88             }
     89             if (input == "minVersion1.5")
     90             {
     91                 manifest.Id = "minVersion";
     92                 manifest.Version = "1.5";
     93             }
     94             if (input == "requires1.5")
     95             {
     96                 installer.Dependencies.Add(Dependency(DependencyType::Package, "minVersion", "1.5"));
     97             }
     98 
     99             // depends on test
    100             if (input == "StackOrderIsOk")
    101             {
    102                 installer.Dependencies.Add(Dependency(DependencyType::Package, "C", defaultFakeVersion));
    103             }
    104             if (input == "NeedsToInstallBFirst")
    105             {
    106                 installer.Dependencies.Add(Dependency(DependencyType::Package, "B", defaultFakeVersion));
    107                 installer.Dependencies.Add(Dependency(DependencyType::Package, "C", defaultFakeVersion));
    108             }
    109             if (input == "EasyToSeeLoop")
    110             {
    111                 installer.Dependencies.Add(Dependency(DependencyType::Package, "D", defaultFakeVersion));
    112             }
    113             if (input == "DependencyAlreadyInStackButNoLoop")
    114             {
    115                 installer.Dependencies.Add(Dependency(DependencyType::Package, "C", defaultFakeVersion));
    116                 installer.Dependencies.Add(Dependency(DependencyType::Package, "F", defaultFakeVersion));
    117             }
    118             if (input == "PathBetweenBranchesButNoLoop")
    119             {
    120                 installer.Dependencies.Add(Dependency(DependencyType::Package, "C", defaultFakeVersion));
    121                 installer.Dependencies.Add(Dependency(DependencyType::Package, "H", defaultFakeVersion));
    122             }
    123             if (input == "DependenciesInstalled")
    124             {
    125                 installer.Dependencies.Add(Dependency(DependencyType::Package, "installed1", defaultFakeVersion));
    126             }
    127             if (input == "DependenciesValidMinVersions")
    128             {
    129                 installer.Dependencies.Add(Dependency(DependencyType::Package, "minVersion", "1.0"));
    130             }
    131             if (input == "DependenciesValidMinVersionsMultiple")
    132             {
    133                 installer.Dependencies.Add(Dependency(DependencyType::Package, "minVersion", "1.0"));
    134                 installer.Dependencies.Add(Dependency(DependencyType::Package, "requires1.5"));
    135             }
    136 
    137             return manifest;
    138         }
    139     }
    140 
    141     struct DependenciesTestSource : public TestSource
    142     {
    143         SearchResult Search(const SearchRequest& request) const override
    144         {
    145             SearchResult result;
    146 
    147             std::string input;
    148 
    149             if (request.Query)
    150             {
    151                 input = request.Query->Value;
    152             }
    153             else if (!request.Inclusions.empty())
    154             {
    155                 input = request.Inclusions[0].Value;
    156             }
    157             else if (!request.Filters.empty())
    158             {
    159                 input = request.Filters[0].Value;
    160             }
    161 
    162             bool installed = false;
    163             if (input == "installed1")
    164             {
    165                 installed  = true;
    166             }
    167 
    168             if (input == "NoMatches")
    169             {
    170                 return result;
    171             }
    172 
    173             Manifest manifest;
    174             if (input == "MultipleDependenciesFromManifest")
    175             {
    176                 manifest = YamlParser::CreateFromPath(TestDataFile("InstallFlowTest_MultipleDependencies.yaml"));
    177             }
    178             else
    179             {
    180                 manifest = CreateFakeManifestWithDependencies(input);
    181             }
    182 
    183             //TODO:
    184             // test for installed packages and packages that need upgrades
    185             // test for different min Version of dependencies
    186             if (installed)
    187             {
    188                 //auto manifest2 = YamlParser::CreateFromPath(TestDataFile("UpdateFlowTest_Exe.yaml"));
    189                 result.Matches.emplace_back(
    190                     ResultMatch(
    191                         TestCompositePackage::Make(
    192                             manifest,
    193                             TestCompositePackage::MetadataMap{ { PackageVersionMetadata::InstalledType, "Exe" } },
    194                             std::vector<Manifest>{ manifest },
    195                             shared_from_this()
    196                         ),
    197                         PackageMatchFilter(PackageMatchField::Id, MatchType::CaseInsensitive, manifest.Id)));
    198             }
    199             else
    200             {
    201                 result.Matches.emplace_back(
    202                     ResultMatch(
    203                         TestCompositePackage::Make(
    204                             std::vector<Manifest>{ manifest },
    205                             shared_from_this()
    206                         ),
    207                         PackageMatchFilter(PackageMatchField::Id, MatchType::CaseInsensitive, manifest.Id)));
    208             }
    209 
    210             return result;
    211         }
    212     };
    213 
    214 }