winget-cli

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

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 }