WorkflowCommon.h (6379B)
1 // Copyright (c) Microsoft Corporation. 2 // Licensed under the MIT License. 3 #include "pch.h" 4 #include "TestCommon.h" 5 #include "TestSource.h" 6 #include <winget/ManifestCommon.h> 7 #include <ExecutionContext.h> 8 #include <Workflows/WorkflowBase.h> 9 #include <Public/winget/RepositorySearch.h> 10 #include <Public/winget/RepositorySource.h> 11 12 #define REQUIRE_TERMINATED_WITH(_context_,_hr_) \ 13 REQUIRE(_context_.IsTerminated()); \ 14 REQUIRE(_hr_ == _context_.GetTerminationHR()) 15 16 namespace TestCommon 17 { 18 using namespace std::string_view_literals; 19 20 // Possible results returned when searching the WorkflowTestSource. 21 // If the search query matches with this object or is empty, it adds to the search results. 22 struct TestSourceResult 23 { 24 using AddResultsFunction = std::function<void(std::vector<AppInstaller::Repository::ResultMatch>&, std::weak_ptr<const AppInstaller::Repository::ISource>)>; 25 TestSourceResult(std::string_view query, AddResultsFunction addResults) : Query(query), AddResults(addResults) {} 26 27 std::string Query; 28 AddResultsFunction AddResults; 29 }; 30 31 namespace TSR 32 { 33 const extern TestSourceResult TestQuery_ReturnOne; 34 const extern TestSourceResult TestQuery_ReturnTwo; 35 const extern TestSourceResult TestInstaller_Exe; 36 const extern TestSourceResult TestInstaller_Exe_Dependencies; 37 const extern TestSourceResult TestInstaller_Exe_DifferentInstallerType; 38 const extern TestSourceResult TestInstaller_Exe_ExpectedReturnCodes; 39 const extern TestSourceResult TestInstaller_Exe_IncompatibleInstallerType; 40 const extern TestSourceResult TestInstaller_Exe_LatestInstalled; 41 const extern TestSourceResult TestInstaller_Exe_LicenseAgreement; 42 const extern TestSourceResult TestInstaller_Exe_NothingInstalled; 43 const extern TestSourceResult TestInstaller_Exe_UnknownVersion; 44 const extern TestSourceResult TestInstaller_Exe_UnsupportedArguments; 45 const extern TestSourceResult TestInstaller_Exe_UpgradeAllWithDuplicateUpgradeItems; 46 const extern TestSourceResult TestInstaller_Exe_UpgradeUsesAgreements; 47 const extern TestSourceResult TestInstaller_Msix; 48 const extern TestSourceResult TestInstaller_Msix_UpgradeRequiresExplicit; 49 const extern TestSourceResult TestInstaller_Msix_UpgradeUsesAgreements; 50 const extern TestSourceResult TestInstaller_Msix_WFDependency; 51 const extern TestSourceResult TestInstaller_MSStore; 52 const extern TestSourceResult TestInstaller_Zip; 53 const extern TestSourceResult TestInstaller_Portable; 54 } 55 56 struct WorkflowTestSource : public TestSource 57 { 58 WorkflowTestSource() {} 59 WorkflowTestSource(std::vector<TestSourceResult>&& testSourceResults) : m_testSourceResults(std::move(testSourceResults)) {} 60 61 AppInstaller::Repository::SearchResult Search(const AppInstaller::Repository::SearchRequest& request) const override; 62 63 void AddResult(const TestSourceResult& testSourceResult); 64 65 private: 66 std::vector<TestSourceResult> m_testSourceResults; 67 }; 68 69 std::shared_ptr<WorkflowTestSource> CreateTestSource(std::vector<TestSourceResult>&& testSourceResults); 70 71 struct TestContext; 72 73 struct WorkflowTaskOverride 74 { 75 WorkflowTaskOverride(AppInstaller::CLI::Workflow::WorkflowTask::Func f, const std::function<void(TestContext&)>& o, int expectedUseCount = -1) : 76 Target(f), Override(o), ExpectedUseCount(expectedUseCount) {} 77 78 WorkflowTaskOverride(std::string_view n, const std::function<void(TestContext&)>& o, int expectedUseCount = -1) : 79 Target(n), Override(o), ExpectedUseCount(expectedUseCount) {} 80 81 WorkflowTaskOverride(const AppInstaller::CLI::Workflow::WorkflowTask& t, const std::function<void(TestContext&)>& o, int expectedUseCount = -1) : 82 Target(t), Override(o), ExpectedUseCount(expectedUseCount) {} 83 84 // -1 means no check on actual use count, as long as it's used. 85 int ExpectedUseCount = -1; 86 int UseCount = 0; 87 AppInstaller::CLI::Workflow::WorkflowTask Target; 88 std::function<void(TestContext&)> Override; 89 }; 90 91 // Enables overriding the behavior of specific workflow tasks. 92 struct TestContext : public AppInstaller::CLI::Execution::Context 93 { 94 TestContext(std::ostream& out, std::istream& in); 95 96 TestContext(std::ostream& out, std::istream& in, bool isClone, std::shared_ptr<std::vector<WorkflowTaskOverride>> overrides); 97 98 ~TestContext(); 99 100 void Override(const WorkflowTaskOverride& wto); 101 102 std::unique_ptr<AppInstaller::CLI::Execution::Context> CreateSubContext() override; 103 104 private: 105 std::shared_ptr<std::vector<WorkflowTaskOverride>> m_overrides; 106 std::ostream& m_out; 107 std::istream& m_in; 108 bool m_isClone = false; 109 }; 110 111 void OverrideForOpenSource(TestContext& context, std::shared_ptr<WorkflowTestSource> testSource, bool overrideOpenCompositeSource = false); 112 113 void OverrideForCompositeInstalledSource(TestContext& context, std::shared_ptr<WorkflowTestSource> testSource); 114 115 void OverrideForUpdateInstallerMotw(TestContext& context); 116 117 void OverrideForCheckExistingInstaller(TestContext& context); 118 119 void OverrideForShellExecute(TestContext& context, int expectedUseCount = -1); 120 121 void OverrideForShellExecute(TestContext& context, std::vector<AppInstaller::Manifest::Dependency>& installationLog); 122 123 void OverrideForPortableInstall(TestContext& context); 124 125 void OverrideForPortableInstallFlow(TestContext& context); 126 127 void OverridePortableInstaller(TestContext& context); 128 129 void OverrideForExtractInstallerFromArchive(TestContext& context); 130 131 void OverrideForVerifyAndSetNestedInstaller(TestContext& context); 132 133 void OverrideForMSIX(TestContext& context); 134 135 void OverrideForMSStore(TestContext& context, bool isUpdate); 136 137 void OverrideOpenDependencySource(TestContext& context); 138 139 void OverrideEnableWindowsFeaturesDependencies(TestContext& context); 140 141 void OverrideRegisterStartupAfterReboot(TestContext& context); 142 143 void OverrideDownloadInstallerFileForMSStoreDownload(TestContext& context); 144 }