summaryrefslogtreecommitdiffstats
path: root/tests/auto/installer/treename
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/installer/treename')
-rw-r--r--tests/auto/installer/treename/data/components.xml59
-rw-r--r--tests/auto/installer/treename/data/invalid_repository/Updates.xml55
-rw-r--r--tests/auto/installer/treename/data/repository/Updates.xml135
-rw-r--r--tests/auto/installer/treename/data/repository/componentA.sub1/1.0.0content.7zbin0 -> 243 bytes
-rw-r--r--tests/auto/installer/treename/data/repository/componentA.sub1/1.0.0content.7z.sha11
-rw-r--r--tests/auto/installer/treename/data/repository/componentA.sub1/1.0.0meta.7zbin0 -> 138 bytes
-rw-r--r--tests/auto/installer/treename/data/repository/componentA.sub2/1.0.0content.7zbin0 -> 243 bytes
-rw-r--r--tests/auto/installer/treename/data/repository/componentA.sub2/1.0.0content.7z.sha11
-rw-r--r--tests/auto/installer/treename/data/repository/componentA.sub2/1.0.0meta.7zbin0 -> 138 bytes
-rw-r--r--tests/auto/installer/treename/data/repository/componentA/1.0.0content.7zbin0 -> 235 bytes
-rw-r--r--tests/auto/installer/treename/data/repository/componentA/1.0.0content.7z.sha11
-rw-r--r--tests/auto/installer/treename/data/repository/componentA/1.0.0meta.7zbin0 -> 130 bytes
-rw-r--r--tests/auto/installer/treename/data/repository/componentB.sub1.sub1/1.0.0content.7zbin0 -> 251 bytes
-rw-r--r--tests/auto/installer/treename/data/repository/componentB.sub1.sub1/1.0.0content.7z.sha11
-rw-r--r--tests/auto/installer/treename/data/repository/componentB.sub1.sub1/1.0.0meta.7zbin0 -> 146 bytes
-rw-r--r--tests/auto/installer/treename/data/repository/componentB.sub1.sub2/1.0.0content.7zbin0 -> 251 bytes
-rw-r--r--tests/auto/installer/treename/data/repository/componentB.sub1.sub2/1.0.0content.7z.sha11
-rw-r--r--tests/auto/installer/treename/data/repository/componentB.sub1.sub2/1.0.0meta.7zbin0 -> 146 bytes
-rw-r--r--tests/auto/installer/treename/data/repository/componentB.sub1/1.0.0content.7zbin0 -> 243 bytes
-rw-r--r--tests/auto/installer/treename/data/repository/componentB.sub1/1.0.0content.7z.sha11
-rw-r--r--tests/auto/installer/treename/data/repository/componentB.sub1/1.0.0meta.7zbin0 -> 138 bytes
-rw-r--r--tests/auto/installer/treename/data/repository/componentB.sub2/1.0.0content.7zbin0 -> 243 bytes
-rw-r--r--tests/auto/installer/treename/data/repository/componentB.sub2/1.0.0content.7z.sha11
-rw-r--r--tests/auto/installer/treename/data/repository/componentB.sub2/1.0.0meta.7zbin0 -> 138 bytes
-rw-r--r--tests/auto/installer/treename/data/repository/componentB/1.0.0content.7zbin0 -> 235 bytes
-rw-r--r--tests/auto/installer/treename/data/repository/componentB/1.0.0content.7z.sha11
-rw-r--r--tests/auto/installer/treename/data/repository/componentB/1.0.0meta.7zbin0 -> 130 bytes
-rw-r--r--tests/auto/installer/treename/data/repository/componentC/1.0.0content.7zbin0 -> 235 bytes
-rw-r--r--tests/auto/installer/treename/data/repository/componentC/1.0.0content.7z.sha11
-rw-r--r--tests/auto/installer/treename/data/repository/componentC/1.0.0meta.7zbin0 -> 130 bytes
-rw-r--r--tests/auto/installer/treename/data/repository/componentD/1.0.0content.7zbin0 -> 235 bytes
-rw-r--r--tests/auto/installer/treename/data/repository/componentD/1.0.0content.7z.sha11
-rw-r--r--tests/auto/installer/treename/data/repository/componentD/1.0.0meta.7zbin0 -> 130 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/Updates.xml229
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentA.subcomponent1/1.0.0content.7zbin0 -> 227 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentA.subcomponent1/1.0.0meta.7zbin0 -> 137 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentA/1.0.0content.7zbin0 -> 223 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentA/1.0.0meta.7zbin0 -> 109 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentB/1.0.0content.7zbin0 -> 223 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentB/1.0.0meta.7zbin0 -> 109 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentE/1.0.0content.7zbin0 -> 223 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentE/1.0.0meta.7zbin0 -> 109 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent1/1.0.0content.7zbin0 -> 231 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent1/1.0.0meta.7zbin0 -> 171 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent2/1.0.0content.7zbin0 -> 231 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent2/1.0.0meta.7zbin0 -> 171 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent1/1.0.0content.7zbin0 -> 227 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent1/1.0.0meta.7zbin0 -> 137 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent1/1.0.0content.7zbin0 -> 231 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent1/1.0.0meta.7zbin0 -> 171 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent2/1.0.0content.7zbin0 -> 231 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent2/1.0.0meta.7zbin0 -> 171 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent2/1.0.0content.7zbin0 -> 227 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF.subcomponent2/1.0.0meta.7zbin0 -> 137 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF/1.0.0content.7zbin0 -> 223 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentF/1.0.0meta.7zbin0 -> 109 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentH.subcomponent1/1.0.0content.7zbin0 -> 227 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentH.subcomponent1/1.0.0meta.7zbin0 -> 137 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentH/1.0.0content.7zbin0 -> 223 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentH/1.0.0meta.7zbin0 -> 109 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentI.subcomponent1/1.0.0content.7zbin0 -> 227 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentI.subcomponent1/1.0.0meta.7zbin0 -> 137 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentI.subcomponent2/1.0.0content.7zbin0 -> 227 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentI.subcomponent2/1.0.0meta.7zbin0 -> 137 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentJ.subcomponent1/1.0.0content.7zbin0 -> 227 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentJ.subcomponent1/1.0.0meta.7zbin0 -> 137 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentJ/1.0.0content.7zbin0 -> 223 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentJ/1.0.0meta.7zbin0 -> 109 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentK/1.0.0content.7zbin0 -> 223 bytes
-rw-r--r--tests/auto/installer/treename/data/repository_children/componentK/1.0.0meta.7zbin0 -> 109 bytes
-rw-r--r--tests/auto/installer/treename/settings.qrc65
-rw-r--r--tests/auto/installer/treename/treename.pro10
-rw-r--r--tests/auto/installer/treename/tst_treename.cpp457
73 files changed, 1020 insertions, 0 deletions
diff --git a/tests/auto/installer/treename/data/components.xml b/tests/auto/installer/treename/data/components.xml
new file mode 100644
index 000000000..0cb0e9826
--- /dev/null
+++ b/tests/auto/installer/treename/data/components.xml
@@ -0,0 +1,59 @@
+<Packages>
+ <ApplicationName>Test Application</ApplicationName>
+ <ApplicationVersion>1.0.0</ApplicationVersion>
+ <Package>
+ <Name>ASub2ToRoot</Name>
+ <Title>Root component 1</Title>
+ <Description>A package without treename (remote treename conflicts with local name)</Description>
+ <TreeName></TreeName>
+ <Version>1.0.0-1</Version>
+ <LastUpdateDate></LastUpdateDate>
+ <InstallDate>2021-01-01</InstallDate>
+ <Size>0</Size>
+ <Checkable>true</Checkable>
+ </Package>
+ <Package>
+ <Name>B</Name>
+ <Title>Root component 2</Title>
+ <Description>A package with treename (remote treename conflicts with local treename)</Description>
+ <TreeName>BSub2ToRoot</TreeName>
+ <Version>1.0.0-1</Version>
+ <LastUpdateDate></LastUpdateDate>
+ <InstallDate>2021-01-01</InstallDate>
+ <Size>0</Size>
+ <Checkable>true</Checkable>
+ </Package>
+ <Package>
+ <Name>componentB.sub1.sub2</Name>
+ <Title>Sub component</Title>
+ <Description>A package with treename (remote has different treename)</Description>
+ <TreeName>componentC.sub2</TreeName>
+ <Version>1.0.0-1</Version>
+ <LastUpdateDate></LastUpdateDate>
+ <InstallDate>2021-01-01</InstallDate>
+ <Size>0</Size>
+ <Checkable>true</Checkable>
+ </Package>
+ <Package>
+ <Name>C</Name>
+ <Title>Root component 3</Title>
+ <Description>A package with treename (remote name conflicts with local treename)</Description>
+ <TreeName>componentA</TreeName>
+ <Version>1.0.0-1</Version>
+ <LastUpdateDate></LastUpdateDate>
+ <InstallDate>2021-01-01</InstallDate>
+ <Size>0</Size>
+ <Checkable>true</Checkable>
+ </Package>
+ <Package>
+ <Name>componentD</Name>
+ <Title>Root component 4</Title>
+ <Description>A package with treename (remote does not have treename)</Description>
+ <TreeName>componentDNew</TreeName>
+ <Version>1.0.0-1</Version>
+ <LastUpdateDate></LastUpdateDate>
+ <InstallDate>2021-01-01</InstallDate>
+ <Size>0</Size>
+ <Checkable>true</Checkable>
+ </Package>
+</Packages>
diff --git a/tests/auto/installer/treename/data/invalid_repository/Updates.xml b/tests/auto/installer/treename/data/invalid_repository/Updates.xml
new file mode 100644
index 000000000..b329bb223
--- /dev/null
+++ b/tests/auto/installer/treename/data/invalid_repository/Updates.xml
@@ -0,0 +1,55 @@
+<Updates>
+ <ApplicationName>{AnyApplication}</ApplicationName>
+ <ApplicationVersion>1.0.0</ApplicationVersion>
+ <Checksum>false</Checksum>
+ <PackageUpdate>
+ <Name>componentA</Name>
+ <DisplayName>Component A</DisplayName>
+ <Description>This component depends on componentB.sub2.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>80</SortingPriority>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentA.sub1</Name>
+ <DisplayName>Component A subcomponent 1</DisplayName>
+ <Description>component</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>80</SortingPriority>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentB</Name>
+ <DisplayName>Component B</DisplayName>
+ <Description>Component B</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>40</SortingPriority>
+ <TreeName>componentA.sub1</TreeName>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentC.sub1</Name>
+ <DisplayName>Component C subcomponent1</DisplayName>
+ <Description>Component</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>40</SortingPriority>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentD</Name>
+ <DisplayName>Component D</DisplayName>
+ <Description>Component</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>40</SortingPriority>
+ <TreeName moveChildren="true">componentC</TreeName>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentD.sub1</Name>
+ <DisplayName>Component D subcomponent 1</DisplayName>
+ <Description>Component</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>40</SortingPriority>
+ </PackageUpdate>
+</Updates>
diff --git a/tests/auto/installer/treename/data/repository/Updates.xml b/tests/auto/installer/treename/data/repository/Updates.xml
new file mode 100644
index 000000000..295f076dd
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/Updates.xml
@@ -0,0 +1,135 @@
+<Updates>
+ <ApplicationName>{AnyApplication}</ApplicationName>
+ <ApplicationVersion>1.0.0</ApplicationVersion>
+ <Checksum>false</Checksum>
+ <PackageUpdate>
+ <Name>componentA</Name>
+ <DisplayName>Component A</DisplayName>
+ <Description>This component depends on componentB.sub2.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>80</SortingPriority>
+ <Dependencies>componentB.sub2</Dependencies>
+ <UpdateFile CompressedSize="275" UncompressedSize="101" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>570dec768b1f266c66656f015e772f0e6e41b73d</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentA.sub1</Name>
+ <DisplayName>Component A subcomponent 1</DisplayName>
+ <Description>component</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>80</SortingPriority>
+ <UpdateFile CompressedSize="283" UncompressedSize="101" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>da5819910a7f7c95eb61a49543e273fd6e2e9aae</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentA.sub2</Name>
+ <DisplayName>Component A subcomponent 2</DisplayName>
+ <Description>component</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>80</SortingPriority>
+ <TreeName>ASub2ToRoot</TreeName>
+ <UpdateFile CompressedSize="283" UncompressedSize="101" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>73ac2c332ce01fadf0f1c7e16a27faaf0f853e18</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentB</Name>
+ <DisplayName>Component B</DisplayName>
+ <Description>Component B</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>40</SortingPriority>
+ <UpdateFile CompressedSize="275" UncompressedSize="101" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>72eee5304ff866e024b477d7b2432df8f2428483</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentB.sub1</Name>
+ <DisplayName>Component B subcomponent 2 1</DisplayName>
+ <Description>Subcomponent for B</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>100</SortingPriority>
+ <UpdateFile CompressedSize="283" UncompressedSize="101" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>e19f1a26698afe0b72c9048b403253421b8fed4b</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentB.sub1.sub1</Name>
+ <DisplayName>Component B sub component for sub1</DisplayName>
+ <Description>Subsubcomponent for B. Moved to root with treename.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>100</SortingPriority>
+ <TreeName>BSub1Sub1ToRoot</TreeName>
+ <UpdateFile CompressedSize="291" UncompressedSize="101" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>6a348979273336862c7a5e16305779e81fee1081</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentB.sub1.sub2</Name>
+ <DisplayName>Component B second sub component for sub1</DisplayName>
+ <Description>Subsubcomponent for B. Moved under componentC with treename.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>100</SortingPriority>
+ <TreeName>componentC.sub1</TreeName>
+ <UpdateFile CompressedSize="291" UncompressedSize="101" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>c1bca8944147ec64343c146f461288990268b4a9</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentB.sub2</Name>
+ <DisplayName>Component B subcomponent 2</DisplayName>
+ <Description>Subcomponent for B. Moved to root with treename.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>8000</SortingPriority>
+ <TreeName>BSub2ToRoot</TreeName>
+ <UpdateFile CompressedSize="283" UncompressedSize="101" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>bde9feba3a8134e9c1412b674ee21642938fafec</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentC</Name>
+ <DisplayName>Component C</DisplayName>
+ <Description>Component C</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <UpdateFile CompressedSize="275" UncompressedSize="101" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>cc33e730d9127e1636566ea35bbe4f186ba4bcb7</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentD</Name>
+ <DisplayName>Component D</DisplayName>
+ <Description>Component D. Autodepends on moved item componentA.sub2 </Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <AutoDependOn>componentA.sub2</AutoDependOn>
+ <UpdateFile CompressedSize="275" UncompressedSize="101" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>3ca69d6bb062c4442fdb20fe0e62bb0f04e8a419</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentE</Name>
+ <DisplayName>Component E</DisplayName>
+ <Description>Component with tree name, is replaced by other component.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2022-01-01</ReleaseDate>
+ <TreeName>EToNewRoot</TreeName>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentF</Name>
+ <DisplayName>Component F</DisplayName>
+ <Description>Component that replaces other component</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2022-01-01</ReleaseDate>
+ <Replaces>componentE</Replaces>
+ </PackageUpdate>
+</Updates>
diff --git a/tests/auto/installer/treename/data/repository/componentA.sub1/1.0.0content.7z b/tests/auto/installer/treename/data/repository/componentA.sub1/1.0.0content.7z
new file mode 100644
index 000000000..f7e22c055
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentA.sub1/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository/componentA.sub1/1.0.0content.7z.sha1 b/tests/auto/installer/treename/data/repository/componentA.sub1/1.0.0content.7z.sha1
new file mode 100644
index 000000000..3378d2da5
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentA.sub1/1.0.0content.7z.sha1
@@ -0,0 +1 @@
+d46bf0f128c64749fb03050045afc816774185e2 \ No newline at end of file
diff --git a/tests/auto/installer/treename/data/repository/componentA.sub1/1.0.0meta.7z b/tests/auto/installer/treename/data/repository/componentA.sub1/1.0.0meta.7z
new file mode 100644
index 000000000..81ff563fc
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentA.sub1/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository/componentA.sub2/1.0.0content.7z b/tests/auto/installer/treename/data/repository/componentA.sub2/1.0.0content.7z
new file mode 100644
index 000000000..d7f4c781c
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentA.sub2/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository/componentA.sub2/1.0.0content.7z.sha1 b/tests/auto/installer/treename/data/repository/componentA.sub2/1.0.0content.7z.sha1
new file mode 100644
index 000000000..0eb4045af
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentA.sub2/1.0.0content.7z.sha1
@@ -0,0 +1 @@
+6561aae70d055e1c4d72b30b12aef7a85cf2139e \ No newline at end of file
diff --git a/tests/auto/installer/treename/data/repository/componentA.sub2/1.0.0meta.7z b/tests/auto/installer/treename/data/repository/componentA.sub2/1.0.0meta.7z
new file mode 100644
index 000000000..38d7c557d
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentA.sub2/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository/componentA/1.0.0content.7z b/tests/auto/installer/treename/data/repository/componentA/1.0.0content.7z
new file mode 100644
index 000000000..e50fc1e92
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentA/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository/componentA/1.0.0content.7z.sha1 b/tests/auto/installer/treename/data/repository/componentA/1.0.0content.7z.sha1
new file mode 100644
index 000000000..082bcbf64
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentA/1.0.0content.7z.sha1
@@ -0,0 +1 @@
+d8486606a02b9c492e4c17d1e42cfea835a1da51 \ No newline at end of file
diff --git a/tests/auto/installer/treename/data/repository/componentA/1.0.0meta.7z b/tests/auto/installer/treename/data/repository/componentA/1.0.0meta.7z
new file mode 100644
index 000000000..c062c3cee
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentA/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository/componentB.sub1.sub1/1.0.0content.7z b/tests/auto/installer/treename/data/repository/componentB.sub1.sub1/1.0.0content.7z
new file mode 100644
index 000000000..2c254e3aa
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentB.sub1.sub1/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository/componentB.sub1.sub1/1.0.0content.7z.sha1 b/tests/auto/installer/treename/data/repository/componentB.sub1.sub1/1.0.0content.7z.sha1
new file mode 100644
index 000000000..019ab5051
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentB.sub1.sub1/1.0.0content.7z.sha1
@@ -0,0 +1 @@
+3fd04b8e55846f9622ffb8f9ae5f4e6c8b57f90e \ No newline at end of file
diff --git a/tests/auto/installer/treename/data/repository/componentB.sub1.sub1/1.0.0meta.7z b/tests/auto/installer/treename/data/repository/componentB.sub1.sub1/1.0.0meta.7z
new file mode 100644
index 000000000..31630e810
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentB.sub1.sub1/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository/componentB.sub1.sub2/1.0.0content.7z b/tests/auto/installer/treename/data/repository/componentB.sub1.sub2/1.0.0content.7z
new file mode 100644
index 000000000..261ea6ab9
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentB.sub1.sub2/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository/componentB.sub1.sub2/1.0.0content.7z.sha1 b/tests/auto/installer/treename/data/repository/componentB.sub1.sub2/1.0.0content.7z.sha1
new file mode 100644
index 000000000..c3753ca62
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentB.sub1.sub2/1.0.0content.7z.sha1
@@ -0,0 +1 @@
+2e89c27c3590e12cd900cb55fa2c91428babfd45 \ No newline at end of file
diff --git a/tests/auto/installer/treename/data/repository/componentB.sub1.sub2/1.0.0meta.7z b/tests/auto/installer/treename/data/repository/componentB.sub1.sub2/1.0.0meta.7z
new file mode 100644
index 000000000..c449e57f6
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentB.sub1.sub2/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository/componentB.sub1/1.0.0content.7z b/tests/auto/installer/treename/data/repository/componentB.sub1/1.0.0content.7z
new file mode 100644
index 000000000..d938d0fb2
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentB.sub1/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository/componentB.sub1/1.0.0content.7z.sha1 b/tests/auto/installer/treename/data/repository/componentB.sub1/1.0.0content.7z.sha1
new file mode 100644
index 000000000..3db5bca08
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentB.sub1/1.0.0content.7z.sha1
@@ -0,0 +1 @@
+2407a2adb3d82211921b509e6dd792d67862de0e \ No newline at end of file
diff --git a/tests/auto/installer/treename/data/repository/componentB.sub1/1.0.0meta.7z b/tests/auto/installer/treename/data/repository/componentB.sub1/1.0.0meta.7z
new file mode 100644
index 000000000..6996a4d01
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentB.sub1/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository/componentB.sub2/1.0.0content.7z b/tests/auto/installer/treename/data/repository/componentB.sub2/1.0.0content.7z
new file mode 100644
index 000000000..7319cf08f
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentB.sub2/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository/componentB.sub2/1.0.0content.7z.sha1 b/tests/auto/installer/treename/data/repository/componentB.sub2/1.0.0content.7z.sha1
new file mode 100644
index 000000000..855e2edab
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentB.sub2/1.0.0content.7z.sha1
@@ -0,0 +1 @@
+a8b85ffe4f91b4dc68a6402b314402949ef17a7a \ No newline at end of file
diff --git a/tests/auto/installer/treename/data/repository/componentB.sub2/1.0.0meta.7z b/tests/auto/installer/treename/data/repository/componentB.sub2/1.0.0meta.7z
new file mode 100644
index 000000000..b91e41207
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentB.sub2/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository/componentB/1.0.0content.7z b/tests/auto/installer/treename/data/repository/componentB/1.0.0content.7z
new file mode 100644
index 000000000..b3a0e683c
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentB/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository/componentB/1.0.0content.7z.sha1 b/tests/auto/installer/treename/data/repository/componentB/1.0.0content.7z.sha1
new file mode 100644
index 000000000..377526fb6
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentB/1.0.0content.7z.sha1
@@ -0,0 +1 @@
+274b3dbe9cceeca1b577eb2a8302d7690ad93eb3 \ No newline at end of file
diff --git a/tests/auto/installer/treename/data/repository/componentB/1.0.0meta.7z b/tests/auto/installer/treename/data/repository/componentB/1.0.0meta.7z
new file mode 100644
index 000000000..e9ab3969d
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentB/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository/componentC/1.0.0content.7z b/tests/auto/installer/treename/data/repository/componentC/1.0.0content.7z
new file mode 100644
index 000000000..7eca1e977
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentC/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository/componentC/1.0.0content.7z.sha1 b/tests/auto/installer/treename/data/repository/componentC/1.0.0content.7z.sha1
new file mode 100644
index 000000000..d3b44feee
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentC/1.0.0content.7z.sha1
@@ -0,0 +1 @@
+d3015ef5340508ad426c43daa2517c7b62581bab \ No newline at end of file
diff --git a/tests/auto/installer/treename/data/repository/componentC/1.0.0meta.7z b/tests/auto/installer/treename/data/repository/componentC/1.0.0meta.7z
new file mode 100644
index 000000000..47ea321ec
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentC/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository/componentD/1.0.0content.7z b/tests/auto/installer/treename/data/repository/componentD/1.0.0content.7z
new file mode 100644
index 000000000..2299f9812
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentD/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository/componentD/1.0.0content.7z.sha1 b/tests/auto/installer/treename/data/repository/componentD/1.0.0content.7z.sha1
new file mode 100644
index 000000000..51dcdd0ed
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentD/1.0.0content.7z.sha1
@@ -0,0 +1 @@
+5ce5b91fb7ce209d83ba616ac01bf30e2942f70c \ No newline at end of file
diff --git a/tests/auto/installer/treename/data/repository/componentD/1.0.0meta.7z b/tests/auto/installer/treename/data/repository/componentD/1.0.0meta.7z
new file mode 100644
index 000000000..3443e843b
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository/componentD/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/Updates.xml b/tests/auto/installer/treename/data/repository_children/Updates.xml
new file mode 100644
index 000000000..a17f481d6
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/Updates.xml
@@ -0,0 +1,229 @@
+<Updates>
+ <ApplicationName>{AnyApplication}</ApplicationName>
+ <ApplicationVersion>1.0.0</ApplicationVersion>
+ <Checksum>false</Checksum>
+ <PackageUpdate>
+ <Name>componentA</Name>
+ <DisplayName>Component A</DisplayName>
+ <Description>This component does not depend on any other component.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>100</SortingPriority>
+ <TreeName moveChildren="true">componentANew</TreeName>
+ <UpdateFile UncompressedSize="99" CompressedSize="263" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>8148a84c9a52eb989525f4807482f42c49c743a4</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentA.subcomponent1</Name>
+ <DisplayName>Subcomponent 1</DisplayName>
+ <Description>This component does not have leaf components.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>100</SortingPriority>
+ <UpdateFile UncompressedSize="99" CompressedSize="267" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>c0c5d273b9c413db07fbd1ffee58759f0059d668</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentB</Name>
+ <DisplayName>Component B (automatic dependency to componentA.subcomponent1)</DisplayName>
+ <Description>This component has an automatic dependency, If the dependency is marked for installation, this component is also installed.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>90</SortingPriority>
+ <AutoDependOn>componentA.subcomponent1</AutoDependOn>
+ <UpdateFile UncompressedSize="99" CompressedSize="263" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>c517b08c40ef5c5984f6bf34a626060dcbab6ba5</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentE</Name>
+ <DisplayName>Component E</DisplayName>
+ <Description>This is a component.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>60</SortingPriority>
+ <UpdateFile UncompressedSize="99" CompressedSize="263" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>2833ea6d508925e64f00fb6b699532992b923ab2</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentF</Name>
+ <DisplayName>Component F</DisplayName>
+ <Description>This component contains 2 subcomponents.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>40</SortingPriority>
+ <UpdateFile UncompressedSize="99" CompressedSize="263" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>21ca242b83ce32dfe066348cbb453080b5967e30</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentF.subcomponent1</Name>
+ <DisplayName>Subcomponent 1</DisplayName>
+ <Description>This component contains 2 leaf components.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>100</SortingPriority>
+ <TreeName moveChildren="true">FSub1ToRoot</TreeName>
+ <UpdateFile UncompressedSize="99" CompressedSize="267" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>e2745196bceaae476cac330f0af0ce6e564d2d3d</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentF.subcomponent1.subsubcomponent1</Name>
+ <DisplayName>Subsubcomponent 1</DisplayName>
+ <Description>This component does not depend on any other component.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>100</SortingPriority>
+ <UpdateFile UncompressedSize="99" CompressedSize="271" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>8af98107adadb1fda37c1c086c53ed289cc77661</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentF.subcomponent1.subsubcomponent2</Name>
+ <DisplayName>Subsubcomponent 2</DisplayName>
+ <Description>This component does not depend on any other component.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>50</SortingPriority>
+ <UpdateFile UncompressedSize="99" CompressedSize="271" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>69458b616989a44e52b480dd9133721bc52b1558</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentF.subcomponent2</Name>
+ <DisplayName>Subcomponent 2</DisplayName>
+ <Description>This component contains 2 leaf components.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>50</SortingPriority>
+ <TreeName moveChildren="true">componentE.sub1</TreeName>
+ <UpdateFile UncompressedSize="99" CompressedSize="267" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>9d985ee35442e6e621f8ec24dc41be9f6cab9dad</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentF.subcomponent2.subsubcomponent1</Name>
+ <DisplayName>Subsubcomponent 1</DisplayName>
+ <Description>This component does not depend on any other component.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>100</SortingPriority>
+ <UpdateFile UncompressedSize="99" CompressedSize="271" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>43223427efd8c2a428ead343a79709cd1bfc5618</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentF.subcomponent2.subsubcomponent2</Name>
+ <DisplayName>Subsubcomponent 2</DisplayName>
+ <Description>This component does not depend on any other component.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>50</SortingPriority>
+ <UpdateFile UncompressedSize="99" CompressedSize="271" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>d76690fb2f41aab262d7d8621c46fa464f35a550</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentH</Name>
+ <DisplayName>Component H</DisplayName>
+ <Description>An example component without dependencies.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>30</SortingPriority>
+ <TreeName moveChildren="true">componentI</TreeName>
+ <UpdateFile UncompressedSize="99" CompressedSize="263" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>04426aec311900e8d74ae42cc6fe49282d314841</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentH.subcomponent1</Name>
+ <DisplayName>Subcomponent 1</DisplayName>
+ <Description>This component does not contain leaf components.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>100</SortingPriority>
+ <UpdateFile UncompressedSize="99" CompressedSize="267" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>065a901fd86d4e7fd86200da47079c97070178c7</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentI.subcomponent2</Name>
+ <DisplayName>Subcomponent 1</DisplayName>
+ <Description>Subcomponent without original parent.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>30</SortingPriority>
+ <UpdateFile UncompressedSize="99" CompressedSize="267" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>3d2d928ed10455fe884cab96498a3fc826505406</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentJ</Name>
+ <DisplayName>Component J</DisplayName>
+ <Description>An example component without dependencies.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>30</SortingPriority>
+ <TreeName moveChildren="true">componentJNew</TreeName>
+ <UpdateFile UncompressedSize="99" CompressedSize="263" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>1a46e58cd1824b2c0a4a93d6b27050eb0f6feb29</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentJ.subcomponent1</Name>
+ <DisplayName>Subcomponent 1</DisplayName>
+ <Description>Subcomponent with parent.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>30</SortingPriority>
+ <UpdateFile UncompressedSize="99" CompressedSize="267" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>dd1cfaa8f6cd14f81635e8917f348006ca7ffdce</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentK</Name>
+ <DisplayName>Component K (depends on componentJ.subcomponent1)</DisplayName>
+ <Description>This component depends on Component J subcomponent.</Description>
+ <Dependencies>componentJ.subcomponent1</Dependencies>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2014-08-25</ReleaseDate>
+ <SortingPriority>80</SortingPriority>
+ <UpdateFile UncompressedSize="99" CompressedSize="263" OS="Any"/>
+ <DownloadableArchives>content.7z</DownloadableArchives>
+ <SHA1>98253c1ab872c9baa64d2fe3525f86a65e73d1f2</SHA1>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentL</Name>
+ <DisplayName>Component L</DisplayName>
+ <Description>Component with tree name, is replaced by other component.</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2022-01-01</ReleaseDate>
+ <TreeName moveChildren="true">LToNewRoot</TreeName>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentL.sub1</Name>
+ <DisplayName>Component L subcomponent 1</DisplayName>
+ <Description>Child of component L</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2022-01-01</ReleaseDate>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentL.sub2</Name>
+ <DisplayName>Component L subcomponent 2</DisplayName>
+ <Description>Child of component L</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2022-01-01</ReleaseDate>
+ </PackageUpdate>
+ <PackageUpdate>
+ <Name>componentM</Name>
+ <DisplayName>Component M</DisplayName>
+ <Description>Component that replaces other component</Description>
+ <Version>1.0.0</Version>
+ <ReleaseDate>2022-01-01</ReleaseDate>
+ <Replaces>componentL</Replaces>
+ </PackageUpdate>
+</Updates>
diff --git a/tests/auto/installer/treename/data/repository_children/componentA.subcomponent1/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentA.subcomponent1/1.0.0content.7z
new file mode 100644
index 000000000..095fd7e30
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentA.subcomponent1/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentA.subcomponent1/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentA.subcomponent1/1.0.0meta.7z
new file mode 100644
index 000000000..5dcce5d73
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentA.subcomponent1/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentA/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentA/1.0.0content.7z
new file mode 100644
index 000000000..21d62e629
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentA/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentA/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentA/1.0.0meta.7z
new file mode 100644
index 000000000..094ae8806
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentA/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentB/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentB/1.0.0content.7z
new file mode 100644
index 000000000..2cb5dfee9
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentB/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentB/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentB/1.0.0meta.7z
new file mode 100644
index 000000000..d3ed0961e
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentB/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentE/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentE/1.0.0content.7z
new file mode 100644
index 000000000..cfdef213e
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentE/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentE/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentE/1.0.0meta.7z
new file mode 100644
index 000000000..466926547
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentE/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent1/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent1/1.0.0content.7z
new file mode 100644
index 000000000..3e9297acc
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent1/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent1/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent1/1.0.0meta.7z
new file mode 100644
index 000000000..7adec9a82
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent1/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent2/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent2/1.0.0content.7z
new file mode 100644
index 000000000..b715e5587
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent2/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent2/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent2/1.0.0meta.7z
new file mode 100644
index 000000000..69406b1b2
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1.subsubcomponent2/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1/1.0.0content.7z
new file mode 100644
index 000000000..f2d2141d7
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1/1.0.0meta.7z
new file mode 100644
index 000000000..1f5c58d2d
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent1/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent1/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent1/1.0.0content.7z
new file mode 100644
index 000000000..5307b3de4
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent1/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent1/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent1/1.0.0meta.7z
new file mode 100644
index 000000000..1b44385ab
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent1/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent2/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent2/1.0.0content.7z
new file mode 100644
index 000000000..7e83e996e
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent2/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent2/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent2/1.0.0meta.7z
new file mode 100644
index 000000000..c89ac2b7b
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2.subsubcomponent2/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2/1.0.0content.7z
new file mode 100644
index 000000000..9c97e4a99
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2/1.0.0meta.7z
new file mode 100644
index 000000000..258b3905f
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF.subcomponent2/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentF/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentF/1.0.0content.7z
new file mode 100644
index 000000000..12c4c1248
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentF/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentF/1.0.0meta.7z
new file mode 100644
index 000000000..88ec39233
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentF/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentH.subcomponent1/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentH.subcomponent1/1.0.0content.7z
new file mode 100644
index 000000000..4b2747235
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentH.subcomponent1/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentH.subcomponent1/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentH.subcomponent1/1.0.0meta.7z
new file mode 100644
index 000000000..ab120d4c3
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentH.subcomponent1/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentH/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentH/1.0.0content.7z
new file mode 100644
index 000000000..767f789ff
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentH/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentH/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentH/1.0.0meta.7z
new file mode 100644
index 000000000..e5c9b47c9
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentH/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentI.subcomponent1/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentI.subcomponent1/1.0.0content.7z
new file mode 100644
index 000000000..2000479c9
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentI.subcomponent1/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentI.subcomponent1/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentI.subcomponent1/1.0.0meta.7z
new file mode 100644
index 000000000..8ecfeaca8
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentI.subcomponent1/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentI.subcomponent2/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentI.subcomponent2/1.0.0content.7z
new file mode 100644
index 000000000..09a8e921a
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentI.subcomponent2/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentI.subcomponent2/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentI.subcomponent2/1.0.0meta.7z
new file mode 100644
index 000000000..acaccd042
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentI.subcomponent2/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentJ.subcomponent1/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentJ.subcomponent1/1.0.0content.7z
new file mode 100644
index 000000000..25247bad4
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentJ.subcomponent1/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentJ.subcomponent1/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentJ.subcomponent1/1.0.0meta.7z
new file mode 100644
index 000000000..c45a63b41
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentJ.subcomponent1/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentJ/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentJ/1.0.0content.7z
new file mode 100644
index 000000000..aa3354b8c
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentJ/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentJ/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentJ/1.0.0meta.7z
new file mode 100644
index 000000000..14b41bdfe
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentJ/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentK/1.0.0content.7z b/tests/auto/installer/treename/data/repository_children/componentK/1.0.0content.7z
new file mode 100644
index 000000000..e28bb9ea7
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentK/1.0.0content.7z
Binary files differ
diff --git a/tests/auto/installer/treename/data/repository_children/componentK/1.0.0meta.7z b/tests/auto/installer/treename/data/repository_children/componentK/1.0.0meta.7z
new file mode 100644
index 000000000..9112f88c3
--- /dev/null
+++ b/tests/auto/installer/treename/data/repository_children/componentK/1.0.0meta.7z
Binary files differ
diff --git a/tests/auto/installer/treename/settings.qrc b/tests/auto/installer/treename/settings.qrc
new file mode 100644
index 000000000..9b31cbade
--- /dev/null
+++ b/tests/auto/installer/treename/settings.qrc
@@ -0,0 +1,65 @@
+<RCC>
+ <qresource prefix="/">
+ <file>data/components.xml</file>
+
+ <file>data/repository/Updates.xml</file>
+ <file>data/repository/componentA/1.0.0meta.7z</file>
+ <file>data/repository/componentA/1.0.0content.7z</file>
+ <file>data/repository/componentA.sub1/1.0.0meta.7z</file>
+ <file>data/repository/componentA.sub1/1.0.0content.7z</file>
+ <file>data/repository/componentA.sub2/1.0.0meta.7z</file>
+ <file>data/repository/componentA.sub2/1.0.0content.7z</file>
+ <file>data/repository/componentB/1.0.0meta.7z</file>
+ <file>data/repository/componentB/1.0.0content.7z</file>
+ <file>data/repository/componentB.sub1/1.0.0meta.7z</file>
+ <file>data/repository/componentB.sub1/1.0.0content.7z</file>
+ <file>data/repository/componentB.sub1.sub1/1.0.0meta.7z</file>
+ <file>data/repository/componentB.sub1.sub1/1.0.0content.7z</file>
+ <file>data/repository/componentB.sub1.sub2/1.0.0meta.7z</file>
+ <file>data/repository/componentB.sub1.sub2/1.0.0content.7z</file>
+ <file>data/repository/componentB.sub2/1.0.0meta.7z</file>
+ <file>data/repository/componentB.sub2/1.0.0content.7z</file>
+ <file>data/repository/componentC/1.0.0meta.7z</file>
+ <file>data/repository/componentC/1.0.0content.7z</file>
+ <file>data/repository/componentD/1.0.0meta.7z</file>
+ <file>data/repository/componentD/1.0.0content.7z</file>
+
+ <file>data/invalid_repository/Updates.xml</file>
+
+ <file>data/repository_children/componentA/1.0.0content.7z</file>
+ <file>data/repository_children/componentA/1.0.0meta.7z</file>
+ <file>data/repository_children/componentA.subcomponent1/1.0.0content.7z</file>
+ <file>data/repository_children/componentA.subcomponent1/1.0.0meta.7z</file>
+ <file>data/repository_children/componentB/1.0.0content.7z</file>
+ <file>data/repository_children/componentB/1.0.0meta.7z</file>
+ <file>data/repository_children/componentE/1.0.0content.7z</file>
+ <file>data/repository_children/componentE/1.0.0meta.7z</file>
+ <file>data/repository_children/componentF/1.0.0content.7z</file>
+ <file>data/repository_children/componentF/1.0.0meta.7z</file>
+ <file>data/repository_children/componentF.subcomponent1/1.0.0content.7z</file>
+ <file>data/repository_children/componentF.subcomponent1/1.0.0meta.7z</file>
+ <file>data/repository_children/componentF.subcomponent1.subsubcomponent1/1.0.0content.7z</file>
+ <file>data/repository_children/componentF.subcomponent1.subsubcomponent1/1.0.0meta.7z</file>
+ <file>data/repository_children/componentF.subcomponent1.subsubcomponent2/1.0.0content.7z</file>
+ <file>data/repository_children/componentF.subcomponent1.subsubcomponent2/1.0.0meta.7z</file>
+ <file>data/repository_children/componentF.subcomponent2/1.0.0content.7z</file>
+ <file>data/repository_children/componentF.subcomponent2/1.0.0meta.7z</file>
+ <file>data/repository_children/componentF.subcomponent2.subsubcomponent1/1.0.0content.7z</file>
+ <file>data/repository_children/componentF.subcomponent2.subsubcomponent1/1.0.0meta.7z</file>
+ <file>data/repository_children/componentF.subcomponent2.subsubcomponent2/1.0.0content.7z</file>
+ <file>data/repository_children/componentF.subcomponent2.subsubcomponent2/1.0.0meta.7z</file>
+ <file>data/repository_children/componentH/1.0.0content.7z</file>
+ <file>data/repository_children/componentH/1.0.0meta.7z</file>
+ <file>data/repository_children/componentH.subcomponent1/1.0.0content.7z</file>
+ <file>data/repository_children/componentH.subcomponent1/1.0.0meta.7z</file>
+ <file>data/repository_children/componentI.subcomponent2/1.0.0content.7z</file>
+ <file>data/repository_children/componentI.subcomponent2/1.0.0meta.7z</file>
+ <file>data/repository_children/componentJ/1.0.0content.7z</file>
+ <file>data/repository_children/componentJ/1.0.0meta.7z</file>
+ <file>data/repository_children/componentJ.subcomponent1/1.0.0content.7z</file>
+ <file>data/repository_children/componentJ.subcomponent1/1.0.0meta.7z</file>
+ <file>data/repository_children/componentK/1.0.0content.7z</file>
+ <file>data/repository_children/componentK/1.0.0meta.7z</file>
+ <file>data/repository_children/Updates.xml</file>
+ </qresource>
+</RCC>
diff --git a/tests/auto/installer/treename/treename.pro b/tests/auto/installer/treename/treename.pro
new file mode 100644
index 000000000..97315faad
--- /dev/null
+++ b/tests/auto/installer/treename/treename.pro
@@ -0,0 +1,10 @@
+include(../../qttest.pri)
+
+QT -= gui
+QT += testlib
+
+SOURCES += tst_treename.cpp
+
+RESOURCES += \
+ settings.qrc \
+ ../shared/config.qrc
diff --git a/tests/auto/installer/treename/tst_treename.cpp b/tests/auto/installer/treename/tst_treename.cpp
new file mode 100644
index 000000000..2c8be6ddd
--- /dev/null
+++ b/tests/auto/installer/treename/tst_treename.cpp
@@ -0,0 +1,457 @@
+/**************************************************************************
+**
+** Copyright (C) 2022 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Installer Framework.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+**************************************************************************/
+#include "../shared/packagemanager.h"
+#include "../shared/verifyinstaller.h"
+
+#include <packagemanagercore.h>
+#include <component.h>
+#include <componentmodel.h>
+
+#include <QTest>
+#include <QRegularExpression>
+
+class tst_TreeName : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void moveToRoot();
+ void moveToSubItem();
+ void dependencyToMovedItem();
+ void autodependOnMovedItem();
+
+ void moveToExistingAllowUnstableComponents();
+ void moveToExistingItemNoUnstableComponents();
+ void moveWithChildrenChildConflictsAllowUnstable();
+ void moveWithChildrenChildConflictsNoUnstable();
+
+ void moveToRootWithChildren();
+ void moveToSubItemWithChildren();
+ void moveToAvailableParentItemWithChilren();
+ void dependencyToMovedSubItem();
+ void autoDependOnMovedSubItem();
+
+ void replaceComponentWithTreeName();
+ void replaceComponentWithTreeNameMoveChildren();
+
+ void remotePackageConflictsLocal();
+
+ void init();
+ void cleanup();
+
+private:
+ QString m_installDir;
+
+};
+
+void tst_TreeName::moveToRoot()
+{
+ // componentB.sub1.sub1 moved from sub item to root (BSub1Sub1ToRoot)
+ QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit
+ (m_installDir, ":///data/repository"));
+ QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently(QStringList() << "componentB.sub1.sub1"));
+ QList<Component*> installedComponents = core->orderedComponentsToInstall();
+
+ QCOMPARE(installedComponents.count(), 1);
+ QCOMPARE(installedComponents.at(0)->name(), "componentB.sub1.sub1");
+ QCOMPARE(installedComponents.at(0)->treeName(), "BSub1Sub1ToRoot");
+ QVERIFY(core->componentByName("componentB.sub1.sub1") != 0);
+ QVERIFY(core->componentByName("BSub1Sub1ToRoot") == 0);
+ VerifyInstaller::verifyInstallerResources(m_installDir, "componentB.sub1.sub1", "1.0.0content.txt");
+ VerifyInstaller::verifyFileExistence(m_installDir, QStringList() << "components.xml"
+ << "componentBSub1Sub1.txt");
+}
+
+void tst_TreeName::moveToSubItem()
+{
+ // componentB.sub1.sub2 moved under componentC (componentC.sub1)
+ QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit
+ (m_installDir, ":///data/repository"));
+
+ QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently(QStringList() << "componentC"));
+ VerifyInstaller::verifyInstallerResources(m_installDir, "componentB.sub1.sub2", "1.0.0content.txt");
+ VerifyInstaller::verifyInstallerResources(m_installDir, "componentC", "1.0.0content.txt");
+ VerifyInstaller::verifyFileExistence(m_installDir, QStringList() << "components.xml"
+ << "componentBSub1Sub2.txt" << "componentC.txt");
+}
+
+void tst_TreeName::dependencyToMovedItem()
+{
+ // componentA depends on componentB.sub2 which is moved to root
+ QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit
+ (m_installDir, ":///data/repository"));
+ QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently(QStringList() << "componentA"));
+
+ VerifyInstaller::verifyInstallerResources(m_installDir, "componentA", "1.0.0content.txt");
+ VerifyInstaller::verifyInstallerResources(m_installDir, "componentA.sub1", "1.0.0content.txt");
+ VerifyInstaller::verifyInstallerResources(m_installDir, "componentB.sub2", "1.0.0content.txt");
+ VerifyInstaller::verifyFileExistence(m_installDir, QStringList() << "components.xml"
+ << "componentA.txt" << "componentASub1.txt" << "componentBSub2.txt");
+}
+
+void tst_TreeName::autodependOnMovedItem()
+{
+ // componentD autodepends on componentA.sub2 which is moved to root
+ QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit
+ (m_installDir, ":///data/repository"));
+ QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently(QStringList() << "componentA.sub2"));
+ VerifyInstaller::verifyInstallerResources(m_installDir, "componentA.sub2", "1.0.0content.txt");
+ VerifyInstaller::verifyInstallerResources(m_installDir, "componentD", "1.0.0content.txt");
+ VerifyInstaller::verifyFileExistence(m_installDir, QStringList() << "components.xml"
+ << "componentASub2.txt" << "componentD.txt");
+}
+
+void tst_TreeName::moveToExistingAllowUnstableComponents()
+{
+ QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit
+ (m_installDir, ":///data/invalid_repository"));
+ core->settings().setAllowUnstableComponents(true);
+
+ QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently(QStringList() << "componentA"));
+ QVERIFY(core->componentByName("componentB")->isUnstable());
+}
+
+void tst_TreeName::moveToExistingItemNoUnstableComponents()
+{
+ QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit
+ (m_installDir, ":///data/invalid_repository"));
+ core->settings().setAllowUnstableComponents(false);
+
+ QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently(QStringList() << "componentA"));
+ QVERIFY(!core->componentByName("componentB"));
+}
+
+void tst_TreeName::replaceComponentWithTreeName()
+{
+ QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit
+ (m_installDir, ":///data/repository"));
+
+ QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently(QStringList() << "componentF"));
+ QVERIFY(core->componentByName("componentF")->value(scTreeName).isEmpty());
+ QVERIFY(!core->componentByName("componentE"));
+}
+
+void tst_TreeName::replaceComponentWithTreeNameMoveChildren()
+{
+ QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit
+ (m_installDir, ":///data/repository_children"));
+
+ QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently(QStringList() << "componentM"));
+ QVERIFY(core->componentByName("componentM")->value(scTreeName).isEmpty());
+ QVERIFY(!core->componentByName("componentL"));
+
+ Component *component1 = core->componentByName("componentL.sub1");
+ QCOMPARE(component1->treeName(), component1->name());
+
+ Component *component2 = core->componentByName("componentL.sub2");
+ QCOMPARE(component2->treeName(), component2->name());
+}
+
+void tst_TreeName::moveWithChildrenChildConflictsAllowUnstable()
+{
+ QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit
+ (m_installDir, ":///data/invalid_repository"));
+ core->settings().setAllowUnstableComponents(true);
+
+ QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently(QStringList() << "componentD"));
+ Component *const component = core->componentByName("componentD.sub1");
+ QVERIFY(component && component->isUnstable() && !component->isInstalled());
+}
+
+void tst_TreeName::moveWithChildrenChildConflictsNoUnstable()
+{
+ QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit
+ (m_installDir, ":///data/invalid_repository"));
+ core->settings().setAllowUnstableComponents(false);
+
+ QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently(QStringList() << "componentD"));
+ QVERIFY(!core->componentByName("componentD.sub1"));
+}
+
+void tst_TreeName::moveToRootWithChildren()
+{
+ // componentF.subcomponent1 moved from sub item to root (FSub1ToRoot)
+ QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit
+ (m_installDir, ":///data/repository_children"));
+ QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently(
+ QStringList() << "componentF.subcomponent1"));
+ const QList<Component*> installedComponents = core->orderedComponentsToInstall();
+
+ QCOMPARE(installedComponents.count(), 3);
+
+ Component const *parent = installedComponents.at(0);
+ QCOMPARE(parent->name(), "componentF.subcomponent1");
+ QCOMPARE(parent->treeName(), "FSub1ToRoot");
+ QVERIFY(parent->value(scAutoTreeName).isEmpty());
+
+ Component const *child1 = installedComponents.at(1);
+ QCOMPARE(child1->name(), "componentF.subcomponent1.subsubcomponent1");
+ QCOMPARE(child1->treeName(), "FSub1ToRoot.subsubcomponent1");
+ QCOMPARE(child1->treeName(), child1->value(scAutoTreeName));
+
+ Component const *child2 = installedComponents.at(2);
+ QCOMPARE(child2->name(), "componentF.subcomponent1.subsubcomponent2");
+ QCOMPARE(child2->treeName(), "FSub1ToRoot.subsubcomponent2");
+ QCOMPARE(child2->treeName(), child2->value(scAutoTreeName));
+
+ QVERIFY(core->componentByName("componentF.subcomponent1"));
+ QVERIFY(!core->componentByName("FSub1ToRoot"));
+ QVERIFY(core->componentByName("componentF.subcomponent1.subsubcomponent1"));
+ QVERIFY(!core->componentByName("FSub1ToRoot.subsubcomponent1"));
+ QVERIFY(core->componentByName("componentF.subcomponent1.subsubcomponent2"));
+ QVERIFY(!core->componentByName("FSub1ToRoot.subsubcomponent2"));
+
+ VerifyInstaller::verifyInstallerResources(m_installDir,
+ "componentF.subcomponent1", "1.0.0content.txt");
+ VerifyInstaller::verifyInstallerResources(m_installDir,
+ "componentF.subcomponent1.subsubcomponent1", "1.0.0content.txt");
+ VerifyInstaller::verifyInstallerResources(m_installDir,
+ "componentF.subcomponent1.subsubcomponent2", "1.0.0content.txt");
+ VerifyInstaller::verifyFileExistence(m_installDir, QStringList() << "components.xml"
+ << "installcontentF_1.txt" << "installcontentF_1_1.txt" << "installcontentF_1_2.txt");
+}
+
+void tst_TreeName::moveToSubItemWithChildren()
+{
+ // componentF.subcomponent2 moved under componentE (componentE.sub1)
+ QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit
+ (m_installDir, ":///data/repository_children"));
+ QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently(
+ QStringList() << "componentF.subcomponent2"));
+ const QList<Component*> installedComponents = core->orderedComponentsToInstall();
+
+ QCOMPARE(installedComponents.count(), 4);
+
+ Component const *parent = installedComponents.at(1);
+ QCOMPARE(parent->name(), "componentF.subcomponent2");
+ QCOMPARE(parent->treeName(), "componentE.sub1");
+ QVERIFY(parent->value(scAutoTreeName).isEmpty());
+
+ Component const *child1 = installedComponents.at(2);
+ QCOMPARE(child1->name(), "componentF.subcomponent2.subsubcomponent1");
+ QCOMPARE(child1->treeName(), "componentE.sub1.subsubcomponent1");
+ QCOMPARE(child1->treeName(), child1->value(scAutoTreeName));
+
+ Component const *child2 = installedComponents.at(3);
+ QCOMPARE(child2->name(), "componentF.subcomponent2.subsubcomponent2");
+ QCOMPARE(child2->treeName(), "componentE.sub1.subsubcomponent2");
+ QCOMPARE(child2->treeName(), child2->value(scAutoTreeName));
+
+ QVERIFY(core->componentByName("componentF.subcomponent2"));
+ QVERIFY(!core->componentByName("componentE.sub1"));
+ QVERIFY(core->componentByName("componentF.subcomponent2.subsubcomponent1"));
+ QVERIFY(!core->componentByName("componentE.sub1.subsubcomponent1"));
+ QVERIFY(core->componentByName("componentF.subcomponent2.subsubcomponent2"));
+ QVERIFY(!core->componentByName("componentE.sub1.subsubcomponent2"));
+
+ VerifyInstaller::verifyInstallerResources(m_installDir, "componentE", "1.0.0content.txt");
+ VerifyInstaller::verifyInstallerResources(m_installDir,
+ "componentF.subcomponent2", "1.0.0content.txt");
+ VerifyInstaller::verifyInstallerResources(m_installDir,
+ "componentF.subcomponent2.subsubcomponent1", "1.0.0content.txt");
+ VerifyInstaller::verifyInstallerResources(m_installDir,
+ "componentF.subcomponent2.subsubcomponent2", "1.0.0content.txt");
+ VerifyInstaller::verifyFileExistence(m_installDir, QStringList() << "components.xml"
+ << "installcontentE.txt" << "installcontentF_2.txt" << "installcontentF_2_1.txt"
+ << "installcontentF_2_2.txt");
+}
+
+void tst_TreeName::moveToAvailableParentItemWithChilren()
+{
+ // componentH moved to componentI
+ QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit
+ (m_installDir, ":///data/repository_children"));
+ QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently(
+ QStringList() << "componentH"));
+ const QList<Component*> installedComponents = core->orderedComponentsToInstall();
+
+ QCOMPARE(installedComponents.count(), 3);
+
+ Component const *parent = installedComponents.at(0);
+ QCOMPARE(parent->name(), "componentH");
+ QCOMPARE(parent->treeName(), "componentI");
+ QVERIFY(parent->value(scAutoTreeName).isEmpty());
+
+ Component const *child1 = installedComponents.at(1);
+ QCOMPARE(child1->name(), "componentH.subcomponent1");
+ QCOMPARE(child1->treeName(), "componentI.subcomponent1");
+ QCOMPARE(child1->treeName(), child1->value(scAutoTreeName));
+
+ Component const *child2 = installedComponents.at(2);
+ QCOMPARE(child2->name(), "componentI.subcomponent2");
+ QCOMPARE(child2->treeName(), child2->name());
+ QVERIFY(child2->value(scAutoTreeName).isEmpty());
+
+ QVERIFY(core->componentByName("componentH"));
+ QVERIFY(!core->componentByName("componentI"));
+ QVERIFY(core->componentByName("componentH.subcomponent1"));
+ QVERIFY(!core->componentByName("componentI.subcomponent1"));
+ QVERIFY(core->componentByName("componentI.subcomponent2"));
+
+ VerifyInstaller::verifyInstallerResources(m_installDir, "componentH", "1.0.0content.txt");
+ VerifyInstaller::verifyInstallerResources(m_installDir,
+ "componentH.subcomponent1", "1.0.0content.txt");
+ VerifyInstaller::verifyInstallerResources(m_installDir,
+ "componentI.subcomponent2", "1.0.0content.txt");
+ VerifyInstaller::verifyFileExistence(m_installDir, QStringList() << "components.xml"
+ << "installcontentH.txt" << "installcontentH_1.txt" << "installcontentI_2.txt");
+}
+
+void tst_TreeName::dependencyToMovedSubItem()
+{
+ // componentK has dependency to componentJ.subcomponent1, which has a parent with treename
+ QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit
+ (m_installDir, ":///data/repository_children"));
+ QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently(
+ QStringList() << "componentK"));
+ const QList<Component*> installedComponents = core->orderedComponentsToInstall();
+
+ QCOMPARE(installedComponents.count(), 2);
+
+ Component const *component1 = installedComponents.at(0);
+ QCOMPARE(component1->name(), "componentJ.subcomponent1");
+ QCOMPARE(component1->treeName(), "componentJNew.subcomponent1");
+ QCOMPARE(component1->treeName(), component1->value(scAutoTreeName));
+
+ Component const *component2 = installedComponents.at(1);
+ QCOMPARE(component2->name(), "componentK");
+ QCOMPARE(component2->treeName(), component2->name());
+ QVERIFY(component2->value(scAutoTreeName).isEmpty());
+
+ VerifyInstaller::verifyInstallerResources(m_installDir,
+ "componentJ.subcomponent1", "1.0.0content.txt");
+ VerifyInstaller::verifyInstallerResources(m_installDir, "componentK", "1.0.0content.txt");
+ VerifyInstaller::verifyFileExistence(m_installDir, QStringList() << "components.xml"
+ << "installcontentJ_1.txt" << "installcontentK.txt");
+}
+
+void tst_TreeName::autoDependOnMovedSubItem()
+{
+ // componentB auto-depends on componentA.subcomponent1, which has a parent with treename
+ QScopedPointer<PackageManagerCore> core(PackageManager::getPackageManagerWithInit
+ (m_installDir, ":///data/repository_children"));
+ QCOMPARE(PackageManagerCore::Success, core->installSelectedComponentsSilently(
+ QStringList() << "componentA.subcomponent1"));
+ const QList<Component*> installedComponents = core->orderedComponentsToInstall();
+
+ QCOMPARE(installedComponents.count(), 3);
+
+ Component const *component1 = installedComponents.at(0);
+ QCOMPARE(component1->name(), "componentA");
+ QCOMPARE(component1->treeName(), "componentANew");
+ QVERIFY(component1->value(scAutoTreeName).isEmpty());
+
+ Component const *component2 = installedComponents.at(1);
+ QCOMPARE(component2->name(), "componentA.subcomponent1");
+ QCOMPARE(component2->treeName(), "componentANew.subcomponent1");
+ QCOMPARE(component2->treeName(), component2->value(scAutoTreeName));
+
+ Component const *component3 = installedComponents.at(2);
+ QCOMPARE(component3->name(), "componentB");
+ QCOMPARE(component3->treeName(), component3->name());
+
+ VerifyInstaller::verifyInstallerResources(m_installDir, "componentA", "1.0.0content.txt");
+ VerifyInstaller::verifyInstallerResources(m_installDir,
+ "componentA.subcomponent1", "1.0.0content.txt");
+ VerifyInstaller::verifyInstallerResources(m_installDir, "componentB", "1.0.0content.txt");
+ VerifyInstaller::verifyFileExistence(m_installDir, QStringList() << "components.xml"
+ << "installcontentA.txt" << "installcontentA_1.txt" << "installcontentB.txt");
+}
+
+void tst_TreeName::remotePackageConflictsLocal()
+{
+ const QString packageHubFile = qApp->applicationDirPath() + QDir::separator() + "components.xml";
+ QFile::remove(packageHubFile);
+ QVERIFY(QFile::copy(":///data/components.xml", packageHubFile));
+ // For some reason Windows sets the read-only flag when we copy the resource..
+ QVERIFY(setDefaultFilePermissions(packageHubFile, DefaultFilePermissions::NonExecutable));
+
+ QHash<QString, QString> params;
+ params.insert(scTargetDir, qApp->applicationDirPath());
+ PackageManagerCore core(BinaryContent::MagicPackageManagerMarker, QList<OperationBlob>(),
+ QString(), QString(), Protocol::DefaultAuthorizationKey, Protocol::Mode::Production, params);
+
+ core.settings().setAllowUnstableComponents(true);
+ core.settings().setDefaultRepositories(QSet<Repository>()
+ << Repository::fromUserInput(":///data/repository"));
+
+ QVERIFY(core.fetchRemotePackagesTree());
+ {
+ // Remote treename conflicts with local name
+ Component *const local = core.componentByName("ASub2ToRoot");
+ QVERIFY(local && local->isInstalled());
+
+ Component *const remote = core.componentByName("componentA.sub2");
+ QVERIFY(remote && remote->isUnstable());
+ QCOMPARE(remote->treeName(), remote->name());
+ }
+ {
+ // Remote treename conflicts with local treename
+ Component *const local = core.componentByName("B");
+ QVERIFY(local && local->isInstalled() && local->treeName() == "BSub2ToRoot");
+
+ Component *const remote = core.componentByName("componentB.sub2");
+ QVERIFY(remote && remote->isUnstable());
+ QCOMPARE(remote->treeName(), remote->name());
+ }
+ {
+ // Remote name conflicts with local treename
+ Component *const local = core.componentByName("C");
+ QVERIFY(local && local->isInstalled() && local->treeName() == "componentA");
+
+ Component *const remote = core.componentByName("componentA");
+ QVERIFY(!remote);
+ }
+ {
+ // Component has a treename in local but not in remote, add with local treename
+ Component *const component = core.componentByName("componentD");
+ QVERIFY(component && component->isInstalled() && component->treeName() == "componentDNew");
+ }
+ {
+ // Component has different treename in local and remote, add with local treename
+ Component *const component = core.componentByName("componentB.sub1.sub2");
+ QVERIFY(component && component->isInstalled() && component->treeName() == "componentC.sub2");
+ }
+ QVERIFY(QFile::remove(packageHubFile));
+}
+
+void tst_TreeName::init()
+{
+ m_installDir = QInstaller::generateTemporaryFileName();
+ QVERIFY(QDir().mkpath(m_installDir));
+}
+
+void tst_TreeName::cleanup()
+{
+ QDir dir(m_installDir);
+ QVERIFY(dir.removeRecursively());
+}
+
+QTEST_MAIN(tst_TreeName)
+
+#include "tst_treename.moc"