Skip to content

Commit bfa6b88

Browse files
committed
Add unit test to ensure proper sorting of mapped installed versions
1 parent 9649235 commit bfa6b88

File tree

1 file changed

+164
-13
lines changed

1 file changed

+164
-13
lines changed

src/AppInstallerCLITests/CompositeSource.cpp

Lines changed: 164 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -73,47 +73,79 @@ Manifest::Manifest MakeDefaultManifest(std::string_view version = "1.0"sv)
7373
return result;
7474
}
7575

76-
struct TestPackageHelper
76+
struct TestManifestHelper
7777
{
78-
TestPackageHelper(bool isInstalled, std::shared_ptr<ISource> source = {}) :
79-
m_isInstalled(isInstalled), m_manifest(MakeDefaultManifest()), m_source(source) {}
78+
TestManifestHelper() : m_manifest(MakeDefaultManifest()) {}
8079

81-
TestPackageHelper& WithId(const std::string& id)
80+
TestManifestHelper& WithId(const std::string& id)
8281
{
8382
m_manifest.Id = id;
8483
return *this;
8584
}
8685

87-
TestPackageHelper& WithVersion(std::string_view version)
86+
TestManifestHelper& WithVersion(std::string_view version)
8887
{
8988
m_manifest.Version = version;
9089
return *this;
9190
}
9291

93-
TestPackageHelper& WithChannel(const std::string& channel)
92+
TestManifestHelper& WithChannel(const std::string& channel)
9493
{
9594
m_manifest.Channel = channel;
9695
return *this;
9796
}
9897

99-
TestPackageHelper& WithDefaultName(std::string_view name)
98+
TestManifestHelper& WithDefaultName(std::string_view name)
10099
{
101100
m_manifest.DefaultLocalization.Add<Manifest::Localization::PackageName>(std::string{ name });
102101
return *this;
103102
}
104103

105-
TestPackageHelper& WithPFN(const std::string& pfn)
104+
TestManifestHelper& WithPFN(const std::string& pfn)
106105
{
107106
m_manifest.Installers[0].PackageFamilyName = pfn;
108107
return *this;
109108
}
110109

111-
TestPackageHelper& WithPC(const std::string& pc)
110+
TestManifestHelper& WithPC(const std::string& pc)
112111
{
113112
m_manifest.Installers[0].ProductCode = pc;
114113
return *this;
115114
}
116115

116+
TestManifestHelper& WithType(Manifest::InstallerTypeEnum type)
117+
{
118+
m_manifest.Installers[0].BaseInstallerType = type;
119+
return *this;
120+
}
121+
122+
TestManifestHelper& WithDisplayVersion(std::string_view version)
123+
{
124+
if (m_manifest.Installers[0].AppsAndFeaturesEntries.empty())
125+
{
126+
m_manifest.Installers[0].AppsAndFeaturesEntries.emplace_back();
127+
}
128+
m_manifest.Installers[0].AppsAndFeaturesEntries[0].DisplayVersion = version;
129+
return *this;
130+
}
131+
132+
operator const Manifest::Manifest& () const
133+
{
134+
return m_manifest;
135+
}
136+
137+
private:
138+
Manifest::Manifest m_manifest;
139+
};
140+
141+
struct TestPackageHelper
142+
{
143+
TestPackageHelper(bool isInstalled, std::shared_ptr<ISource> source = {}) :
144+
m_isInstalled(isInstalled), m_source(source)
145+
{
146+
m_manifestHelpers.emplace_back();
147+
}
148+
117149
TestPackageHelper& HideSRS(bool value = true)
118150
{
119151
m_hideSystemReferenceStrings = value;
@@ -126,11 +158,18 @@ struct TestPackageHelper
126158
{
127159
if (m_isInstalled)
128160
{
129-
m_package = TestCompositePackage::Make(m_manifest, TestCompositePackage::MetadataMap{}, std::vector<Manifest::Manifest>(), m_source);
161+
m_package = TestCompositePackage::Make(this->operator const Manifest::Manifest&(), m_metadata, std::vector<Manifest::Manifest>(), m_source);
130162
}
131163
else
132164
{
133-
m_package = TestCompositePackage::Make(std::vector<Manifest::Manifest>{ m_manifest }, m_source, m_hideSystemReferenceStrings);
165+
std::vector<Manifest::Manifest> manifests;
166+
167+
for (const auto& helper : m_manifestHelpers)
168+
{
169+
manifests.emplace_back(helper.operator const AppInstaller::Manifest::Manifest &());
170+
}
171+
172+
m_package = TestCompositePackage::Make(manifests, m_source, m_hideSystemReferenceStrings);
134173
}
135174
}
136175

@@ -142,17 +181,89 @@ struct TestPackageHelper
142181
return ToPackage();
143182
}
144183

184+
TestPackageHelper& WithId(const std::string& id)
185+
{
186+
THROW_HR_IF(E_UNEXPECTED, m_manifestHelpers.size() != 1);
187+
m_manifestHelpers[0].WithId(id);
188+
return *this;
189+
}
190+
191+
TestPackageHelper& WithVersion(std::string_view version)
192+
{
193+
THROW_HR_IF(E_UNEXPECTED, m_manifestHelpers.size() != 1);
194+
m_manifestHelpers[0].WithVersion(version);
195+
return *this;
196+
}
197+
198+
TestPackageHelper& WithChannel(const std::string& channel)
199+
{
200+
THROW_HR_IF(E_UNEXPECTED, m_manifestHelpers.size() != 1);
201+
m_manifestHelpers[0].WithChannel(channel);
202+
return *this;
203+
}
204+
205+
TestPackageHelper& WithDefaultName(std::string_view name)
206+
{
207+
THROW_HR_IF(E_UNEXPECTED, m_manifestHelpers.size() != 1);
208+
m_manifestHelpers[0].WithDefaultName(name);
209+
return *this;
210+
}
211+
212+
TestPackageHelper& WithPFN(const std::string& pfn)
213+
{
214+
THROW_HR_IF(E_UNEXPECTED, m_manifestHelpers.size() != 1);
215+
m_manifestHelpers[0].WithPFN(pfn);
216+
return *this;
217+
}
218+
219+
TestPackageHelper& WithPC(const std::string& pc)
220+
{
221+
THROW_HR_IF(E_UNEXPECTED, m_manifestHelpers.size() != 1);
222+
m_manifestHelpers[0].WithPC(pc);
223+
return *this;
224+
}
225+
226+
TestPackageHelper& WithType(Manifest::InstallerTypeEnum type)
227+
{
228+
THROW_HR_IF(E_UNEXPECTED, m_manifestHelpers.size() != 1);
229+
m_manifestHelpers[0].WithType(type);
230+
return *this;
231+
}
232+
233+
TestPackageHelper& WithDisplayVersion(std::string_view version)
234+
{
235+
THROW_HR_IF(E_UNEXPECTED, m_manifestHelpers.size() != 1);
236+
m_manifestHelpers[0].WithDisplayVersion(version);
237+
return *this;
238+
}
239+
240+
TestPackageHelper& WithMetadata(PackageVersionMetadata metadata, const std::string& value)
241+
{
242+
THROW_HR_IF(E_UNEXPECTED, !m_isInstalled);
243+
m_metadata[metadata] = value;
244+
return *this;
245+
}
246+
145247
operator const Manifest::Manifest& () const
146248
{
147-
return m_manifest;
249+
THROW_HR_IF(E_UNEXPECTED, m_manifestHelpers.size() != 1);
250+
return m_manifestHelpers[0];
251+
}
252+
253+
TestManifestHelper& MakeManifest()
254+
{
255+
THROW_HR_IF(E_UNEXPECTED, m_isInstalled);
256+
m_manifestHelpers.emplace_back();
257+
return m_manifestHelpers.back();
148258
}
149259

150260
private:
151261
bool m_isInstalled;
152-
Manifest::Manifest m_manifest;
262+
std::vector<TestManifestHelper> m_manifestHelpers;
153263
std::shared_ptr<ISource> m_source;
154264
std::shared_ptr<TestCompositePackage> m_package;
155265
bool m_hideSystemReferenceStrings = false;
266+
TestCompositePackage::MetadataMap m_metadata;
156267
};
157268

158269
// A helper to create the sources used by the majority of tests in this file.
@@ -1831,3 +1942,43 @@ TEST_CASE("CompositeSource_SxS_Available_TwoVersions_SameAvailable", "[Composite
18311942
REQUIRE(availablePackages.size() == 1);
18321943
REQUIRE(availablePackages[0]->IsSame(availablePackage->Available[0].get()));
18331944
}
1945+
1946+
TEST_CASE("CompositeSource_MappedVersions_ProperSorting", "[CompositeSource]")
1947+
{
1948+
std::string installedID = "Installed.Id";
1949+
std::string availableID = "Available.Id";
1950+
auto type = Manifest::InstallerTypeEnum::Exe;
1951+
std::string pfn = "MY_PFN";
1952+
std::string version1 = "1000.0";
1953+
std::string version2 = "2000.0";
1954+
std::string versionMapped1 = "1.0";
1955+
std::string versionMapped2 = "2.0";
1956+
1957+
CompositeTestSetup setup;
1958+
1959+
setup.Installed->Everything.Matches.emplace_back(setup.MakeInstalled().WithId(installedID).WithPFN(pfn).WithVersion(version1).WithMetadata(PackageVersionMetadata::InstalledType, "exe"), Criteria());
1960+
setup.Installed->Everything.Matches.emplace_back(setup.MakeInstalled().WithId(installedID).WithPFN(pfn).WithVersion(version2).WithMetadata(PackageVersionMetadata::InstalledType, "exe"), Criteria());
1961+
1962+
setup.Available->SearchFunction = [&](const SearchRequest&)
1963+
{
1964+
auto package = setup.MakeAvailable();
1965+
package.WithId(availableID).WithType(type).WithPFN(pfn).WithVersion(versionMapped1).WithDisplayVersion(version1);
1966+
package.MakeManifest().WithId(availableID).WithType(type).WithPFN(pfn).WithVersion(versionMapped2).WithDisplayVersion(version2);
1967+
1968+
SearchResult result;
1969+
result.Matches.emplace_back(package, Criteria());
1970+
return result;
1971+
};
1972+
1973+
SearchResult result = setup.Search(true);
1974+
1975+
REQUIRE(result.Matches.size() == 1);
1976+
auto package = result.Matches[0].Package;
1977+
REQUIRE(package);
1978+
auto installedPackage = package->GetInstalled();
1979+
REQUIRE(installedPackage);
1980+
auto installedVersions = installedPackage->GetVersionKeys();
1981+
REQUIRE(installedVersions.size() == 2);
1982+
REQUIRE(installedVersions[0].Version == versionMapped2);
1983+
REQUIRE(installedVersions[1].Version == versionMapped1);
1984+
}

0 commit comments

Comments
 (0)