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 }