diff --git a/src/c#/GeneralUpdate.sln b/src/c#/GeneralUpdate.sln
index d4f9416b..84cdea36 100644
--- a/src/c#/GeneralUpdate.sln
+++ b/src/c#/GeneralUpdate.sln
@@ -31,56 +31,162 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExtensionTest", "ExtensionT
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GeneralUpdate.Ext", "GeneralUpdate.Ext\GeneralUpdate.Ext.csproj", "{27028918-925E-45D4-BD72-199349B6E6AA}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CoreTest", "..\..\tests\CoreTest\CoreTest.csproj", "{D8B45203-B939-4628-AC77-C477A4AC5F45}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{35BFF228-5EE4-49A6-B721-FB0122E967A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{35BFF228-5EE4-49A6-B721-FB0122E967A0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {35BFF228-5EE4-49A6-B721-FB0122E967A0}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {35BFF228-5EE4-49A6-B721-FB0122E967A0}.Debug|x64.Build.0 = Debug|Any CPU
+ {35BFF228-5EE4-49A6-B721-FB0122E967A0}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {35BFF228-5EE4-49A6-B721-FB0122E967A0}.Debug|x86.Build.0 = Debug|Any CPU
{35BFF228-5EE4-49A6-B721-FB0122E967A0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{35BFF228-5EE4-49A6-B721-FB0122E967A0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {35BFF228-5EE4-49A6-B721-FB0122E967A0}.Release|x64.ActiveCfg = Release|Any CPU
+ {35BFF228-5EE4-49A6-B721-FB0122E967A0}.Release|x64.Build.0 = Release|Any CPU
+ {35BFF228-5EE4-49A6-B721-FB0122E967A0}.Release|x86.ActiveCfg = Release|Any CPU
+ {35BFF228-5EE4-49A6-B721-FB0122E967A0}.Release|x86.Build.0 = Release|Any CPU
{BAEFF926-6B2C-46F1-BB73-AA2AB1355565}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BAEFF926-6B2C-46F1-BB73-AA2AB1355565}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BAEFF926-6B2C-46F1-BB73-AA2AB1355565}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {BAEFF926-6B2C-46F1-BB73-AA2AB1355565}.Debug|x64.Build.0 = Debug|Any CPU
+ {BAEFF926-6B2C-46F1-BB73-AA2AB1355565}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {BAEFF926-6B2C-46F1-BB73-AA2AB1355565}.Debug|x86.Build.0 = Debug|Any CPU
{BAEFF926-6B2C-46F1-BB73-AA2AB1355565}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BAEFF926-6B2C-46F1-BB73-AA2AB1355565}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BAEFF926-6B2C-46F1-BB73-AA2AB1355565}.Release|x64.ActiveCfg = Release|Any CPU
+ {BAEFF926-6B2C-46F1-BB73-AA2AB1355565}.Release|x64.Build.0 = Release|Any CPU
+ {BAEFF926-6B2C-46F1-BB73-AA2AB1355565}.Release|x86.ActiveCfg = Release|Any CPU
+ {BAEFF926-6B2C-46F1-BB73-AA2AB1355565}.Release|x86.Build.0 = Release|Any CPU
{40BDA496-7614-4213-92D0-3B1B187675D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{40BDA496-7614-4213-92D0-3B1B187675D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {40BDA496-7614-4213-92D0-3B1B187675D3}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {40BDA496-7614-4213-92D0-3B1B187675D3}.Debug|x64.Build.0 = Debug|Any CPU
+ {40BDA496-7614-4213-92D0-3B1B187675D3}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {40BDA496-7614-4213-92D0-3B1B187675D3}.Debug|x86.Build.0 = Debug|Any CPU
{40BDA496-7614-4213-92D0-3B1B187675D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{40BDA496-7614-4213-92D0-3B1B187675D3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {40BDA496-7614-4213-92D0-3B1B187675D3}.Release|x64.ActiveCfg = Release|Any CPU
+ {40BDA496-7614-4213-92D0-3B1B187675D3}.Release|x64.Build.0 = Release|Any CPU
+ {40BDA496-7614-4213-92D0-3B1B187675D3}.Release|x86.ActiveCfg = Release|Any CPU
+ {40BDA496-7614-4213-92D0-3B1B187675D3}.Release|x86.Build.0 = Release|Any CPU
{E1F9FF93-CA63-4A9C-82F0-450F09ED81F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E1F9FF93-CA63-4A9C-82F0-450F09ED81F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E1F9FF93-CA63-4A9C-82F0-450F09ED81F9}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E1F9FF93-CA63-4A9C-82F0-450F09ED81F9}.Debug|x64.Build.0 = Debug|Any CPU
+ {E1F9FF93-CA63-4A9C-82F0-450F09ED81F9}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E1F9FF93-CA63-4A9C-82F0-450F09ED81F9}.Debug|x86.Build.0 = Debug|Any CPU
{E1F9FF93-CA63-4A9C-82F0-450F09ED81F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E1F9FF93-CA63-4A9C-82F0-450F09ED81F9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E1F9FF93-CA63-4A9C-82F0-450F09ED81F9}.Release|x64.ActiveCfg = Release|Any CPU
+ {E1F9FF93-CA63-4A9C-82F0-450F09ED81F9}.Release|x64.Build.0 = Release|Any CPU
+ {E1F9FF93-CA63-4A9C-82F0-450F09ED81F9}.Release|x86.ActiveCfg = Release|Any CPU
+ {E1F9FF93-CA63-4A9C-82F0-450F09ED81F9}.Release|x86.Build.0 = Release|Any CPU
{7779FB4A-D121-48CC-B033-C3D36BD5D4FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7779FB4A-D121-48CC-B033-C3D36BD5D4FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7779FB4A-D121-48CC-B033-C3D36BD5D4FF}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7779FB4A-D121-48CC-B033-C3D36BD5D4FF}.Debug|x64.Build.0 = Debug|Any CPU
+ {7779FB4A-D121-48CC-B033-C3D36BD5D4FF}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7779FB4A-D121-48CC-B033-C3D36BD5D4FF}.Debug|x86.Build.0 = Debug|Any CPU
{7779FB4A-D121-48CC-B033-C3D36BD5D4FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7779FB4A-D121-48CC-B033-C3D36BD5D4FF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7779FB4A-D121-48CC-B033-C3D36BD5D4FF}.Release|x64.ActiveCfg = Release|Any CPU
+ {7779FB4A-D121-48CC-B033-C3D36BD5D4FF}.Release|x64.Build.0 = Release|Any CPU
+ {7779FB4A-D121-48CC-B033-C3D36BD5D4FF}.Release|x86.ActiveCfg = Release|Any CPU
+ {7779FB4A-D121-48CC-B033-C3D36BD5D4FF}.Release|x86.Build.0 = Release|Any CPU
{D14E59CD-404B-467B-9C6D-91EFC5994D37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D14E59CD-404B-467B-9C6D-91EFC5994D37}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D14E59CD-404B-467B-9C6D-91EFC5994D37}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D14E59CD-404B-467B-9C6D-91EFC5994D37}.Debug|x64.Build.0 = Debug|Any CPU
+ {D14E59CD-404B-467B-9C6D-91EFC5994D37}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D14E59CD-404B-467B-9C6D-91EFC5994D37}.Debug|x86.Build.0 = Debug|Any CPU
{D14E59CD-404B-467B-9C6D-91EFC5994D37}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D14E59CD-404B-467B-9C6D-91EFC5994D37}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D14E59CD-404B-467B-9C6D-91EFC5994D37}.Release|x64.ActiveCfg = Release|Any CPU
+ {D14E59CD-404B-467B-9C6D-91EFC5994D37}.Release|x64.Build.0 = Release|Any CPU
+ {D14E59CD-404B-467B-9C6D-91EFC5994D37}.Release|x86.ActiveCfg = Release|Any CPU
+ {D14E59CD-404B-467B-9C6D-91EFC5994D37}.Release|x86.Build.0 = Release|Any CPU
{49D0687D-1321-48E9-84C3-936B10532367}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{49D0687D-1321-48E9-84C3-936B10532367}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {49D0687D-1321-48E9-84C3-936B10532367}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {49D0687D-1321-48E9-84C3-936B10532367}.Debug|x64.Build.0 = Debug|Any CPU
+ {49D0687D-1321-48E9-84C3-936B10532367}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {49D0687D-1321-48E9-84C3-936B10532367}.Debug|x86.Build.0 = Debug|Any CPU
{49D0687D-1321-48E9-84C3-936B10532367}.Release|Any CPU.ActiveCfg = Release|Any CPU
{49D0687D-1321-48E9-84C3-936B10532367}.Release|Any CPU.Build.0 = Release|Any CPU
+ {49D0687D-1321-48E9-84C3-936B10532367}.Release|x64.ActiveCfg = Release|Any CPU
+ {49D0687D-1321-48E9-84C3-936B10532367}.Release|x64.Build.0 = Release|Any CPU
+ {49D0687D-1321-48E9-84C3-936B10532367}.Release|x86.ActiveCfg = Release|Any CPU
+ {49D0687D-1321-48E9-84C3-936B10532367}.Release|x86.Build.0 = Release|Any CPU
{1BA0EEDF-D75A-49E9-9244-EA32DFA130B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1BA0EEDF-D75A-49E9-9244-EA32DFA130B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1BA0EEDF-D75A-49E9-9244-EA32DFA130B3}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1BA0EEDF-D75A-49E9-9244-EA32DFA130B3}.Debug|x64.Build.0 = Debug|Any CPU
+ {1BA0EEDF-D75A-49E9-9244-EA32DFA130B3}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1BA0EEDF-D75A-49E9-9244-EA32DFA130B3}.Debug|x86.Build.0 = Debug|Any CPU
{1BA0EEDF-D75A-49E9-9244-EA32DFA130B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1BA0EEDF-D75A-49E9-9244-EA32DFA130B3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1BA0EEDF-D75A-49E9-9244-EA32DFA130B3}.Release|x64.ActiveCfg = Release|Any CPU
+ {1BA0EEDF-D75A-49E9-9244-EA32DFA130B3}.Release|x64.Build.0 = Release|Any CPU
+ {1BA0EEDF-D75A-49E9-9244-EA32DFA130B3}.Release|x86.ActiveCfg = Release|Any CPU
+ {1BA0EEDF-D75A-49E9-9244-EA32DFA130B3}.Release|x86.Build.0 = Release|Any CPU
{7B8E164F-C2D8-4C5F-8E20-450FB56AEB34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7B8E164F-C2D8-4C5F-8E20-450FB56AEB34}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7B8E164F-C2D8-4C5F-8E20-450FB56AEB34}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7B8E164F-C2D8-4C5F-8E20-450FB56AEB34}.Debug|x64.Build.0 = Debug|Any CPU
+ {7B8E164F-C2D8-4C5F-8E20-450FB56AEB34}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7B8E164F-C2D8-4C5F-8E20-450FB56AEB34}.Debug|x86.Build.0 = Debug|Any CPU
{7B8E164F-C2D8-4C5F-8E20-450FB56AEB34}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7B8E164F-C2D8-4C5F-8E20-450FB56AEB34}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7B8E164F-C2D8-4C5F-8E20-450FB56AEB34}.Release|x64.ActiveCfg = Release|Any CPU
+ {7B8E164F-C2D8-4C5F-8E20-450FB56AEB34}.Release|x64.Build.0 = Release|Any CPU
+ {7B8E164F-C2D8-4C5F-8E20-450FB56AEB34}.Release|x86.ActiveCfg = Release|Any CPU
+ {7B8E164F-C2D8-4C5F-8E20-450FB56AEB34}.Release|x86.Build.0 = Release|Any CPU
{3FA78F9A-A942-4F7E-A30D-70DF42E8A83D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3FA78F9A-A942-4F7E-A30D-70DF42E8A83D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3FA78F9A-A942-4F7E-A30D-70DF42E8A83D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3FA78F9A-A942-4F7E-A30D-70DF42E8A83D}.Debug|x64.Build.0 = Debug|Any CPU
+ {3FA78F9A-A942-4F7E-A30D-70DF42E8A83D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3FA78F9A-A942-4F7E-A30D-70DF42E8A83D}.Debug|x86.Build.0 = Debug|Any CPU
{3FA78F9A-A942-4F7E-A30D-70DF42E8A83D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3FA78F9A-A942-4F7E-A30D-70DF42E8A83D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3FA78F9A-A942-4F7E-A30D-70DF42E8A83D}.Release|x64.ActiveCfg = Release|Any CPU
+ {3FA78F9A-A942-4F7E-A30D-70DF42E8A83D}.Release|x64.Build.0 = Release|Any CPU
+ {3FA78F9A-A942-4F7E-A30D-70DF42E8A83D}.Release|x86.ActiveCfg = Release|Any CPU
+ {3FA78F9A-A942-4F7E-A30D-70DF42E8A83D}.Release|x86.Build.0 = Release|Any CPU
{27028918-925E-45D4-BD72-199349B6E6AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{27028918-925E-45D4-BD72-199349B6E6AA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {27028918-925E-45D4-BD72-199349B6E6AA}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {27028918-925E-45D4-BD72-199349B6E6AA}.Debug|x64.Build.0 = Debug|Any CPU
+ {27028918-925E-45D4-BD72-199349B6E6AA}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {27028918-925E-45D4-BD72-199349B6E6AA}.Debug|x86.Build.0 = Debug|Any CPU
{27028918-925E-45D4-BD72-199349B6E6AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{27028918-925E-45D4-BD72-199349B6E6AA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {27028918-925E-45D4-BD72-199349B6E6AA}.Release|x64.ActiveCfg = Release|Any CPU
+ {27028918-925E-45D4-BD72-199349B6E6AA}.Release|x64.Build.0 = Release|Any CPU
+ {27028918-925E-45D4-BD72-199349B6E6AA}.Release|x86.ActiveCfg = Release|Any CPU
+ {27028918-925E-45D4-BD72-199349B6E6AA}.Release|x86.Build.0 = Release|Any CPU
+ {D8B45203-B939-4628-AC77-C477A4AC5F45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D8B45203-B939-4628-AC77-C477A4AC5F45}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D8B45203-B939-4628-AC77-C477A4AC5F45}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D8B45203-B939-4628-AC77-C477A4AC5F45}.Debug|x64.Build.0 = Debug|Any CPU
+ {D8B45203-B939-4628-AC77-C477A4AC5F45}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D8B45203-B939-4628-AC77-C477A4AC5F45}.Debug|x86.Build.0 = Debug|Any CPU
+ {D8B45203-B939-4628-AC77-C477A4AC5F45}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D8B45203-B939-4628-AC77-C477A4AC5F45}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D8B45203-B939-4628-AC77-C477A4AC5F45}.Release|x64.ActiveCfg = Release|Any CPU
+ {D8B45203-B939-4628-AC77-C477A4AC5F45}.Release|x64.Build.0 = Release|Any CPU
+ {D8B45203-B939-4628-AC77-C477A4AC5F45}.Release|x86.ActiveCfg = Release|Any CPU
+ {D8B45203-B939-4628-AC77-C477A4AC5F45}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/tests/CoreTest/Bootstrap/GeneralUpdateBootstrapTests.cs b/tests/CoreTest/Bootstrap/GeneralUpdateBootstrapTests.cs
new file mode 100644
index 00000000..92481102
--- /dev/null
+++ b/tests/CoreTest/Bootstrap/GeneralUpdateBootstrapTests.cs
@@ -0,0 +1,210 @@
+using GeneralUpdate.Common.Download;
+using GeneralUpdate.Common.Internal;
+using GeneralUpdate.Common.Shared.Object;
+using GeneralUpdate.Core;
+using Xunit;
+
+namespace CoreTest.Bootstrap
+{
+ ///
+ /// Contains test cases for the GeneralUpdateBootstrap class.
+ /// Tests the main orchestrator for platform-agnostic update process.
+ ///
+ public class GeneralUpdateBootstrapTests
+ {
+ ///
+ /// Tests that GeneralUpdateBootstrap can be instantiated.
+ ///
+ [Fact]
+ public void Constructor_CreatesInstance()
+ {
+ // Act
+ var bootstrap = new GeneralUpdateBootstrap();
+
+ // Assert
+ Assert.NotNull(bootstrap);
+ }
+
+ ///
+ /// Tests that SetConfig returns the bootstrap instance for chaining.
+ ///
+ [Fact]
+ public void SetConfig_ReturnsBootstrapInstance()
+ {
+ // Arrange
+ var bootstrap = new GeneralUpdateBootstrap();
+ var configInfo = new Configinfo
+ {
+ InstallPath = "/test/install",
+ MainAppName = "TestApp.exe",
+ UpdateUrl = "https://example.com/update",
+ ClientVersion = "1.0.0"
+ };
+
+ // Act
+ var result = bootstrap.SetConfig(configInfo);
+
+ // Assert
+ Assert.Same(bootstrap, result);
+ }
+
+ ///
+ /// Tests that SetFieldMappings returns the bootstrap instance for chaining.
+ ///
+ [Fact]
+ public void SetFieldMappings_ReturnsBootstrapInstance()
+ {
+ // Arrange
+ var bootstrap = new GeneralUpdateBootstrap();
+ var fieldMappings = new Dictionary
+ {
+ { "field1", "value1" }
+ };
+
+ // Act
+ var result = bootstrap.SetFieldMappings(fieldMappings);
+
+ // Assert
+ Assert.Same(bootstrap, result);
+ }
+
+ ///
+ /// Tests that SetCustomSkipOption returns the bootstrap instance for chaining.
+ ///
+ [Fact]
+ public void SetCustomSkipOption_ReturnsBootstrapInstance()
+ {
+ // Arrange
+ var bootstrap = new GeneralUpdateBootstrap();
+ Func skipFunc = () => false;
+
+ // Act
+ var result = bootstrap.SetCustomSkipOption(skipFunc);
+
+ // Assert
+ Assert.Same(bootstrap, result);
+ }
+
+ ///
+ /// Tests that AddListenerMultiAllDownloadCompleted returns the bootstrap instance for chaining.
+ ///
+ [Fact]
+ public void AddListenerMultiAllDownloadCompleted_ReturnsBootstrapInstance()
+ {
+ // Arrange
+ var bootstrap = new GeneralUpdateBootstrap();
+ Action