Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
ccc3afb
1. Add XML documentation summaries for every method (public/internal/…
malavikakrishnan123 Jan 20, 2026
be2773d
Merge branch 'feature/ChocoPackages_Discovery' into feature/Artifacto…
MalavikaKrishnan100 Jan 22, 2026
0e7b90c
conflict issue fix
malavikakrishnan123 Jan 22, 2026
0f82dff
code duplicate issue fix
malavikakrishnan123 Jan 23, 2026
d9566cc
updated code
malavikakrishnan123 Jan 23, 2026
8e19a22
Merge branch 'feature/ChocoPackages_Discovery' into feature/Artifacto…
MalavikaKrishnan100 Jan 27, 2026
270cadb
updated the merge conflict files
malavikakrishnan123 Jan 27, 2026
2e68601
updated the code for the build error
malavikakrishnan123 Jan 27, 2026
49e640f
Merge branch 'feature/ChocoPackages_Discovery' into feature/Artifacto…
MalavikaKrishnan100 Jan 27, 2026
384d575
updated the summary
malavikakrishnan123 Jan 27, 2026
a246a3a
Merge branch 'feature/Artifactoryuploadercleanup' of https://github.c…
malavikakrishnan123 Jan 27, 2026
3f24679
removed the duplicate lines
malavikakrishnan123 Jan 27, 2026
a338682
added the code
malavikakrishnan123 Jan 29, 2026
399bf27
Merge branch 'feature/ChocoPackages_Discovery' into feature/Artifacto…
MalavikaKrishnan100 Feb 1, 2026
d8825e0
testing
malavikakrishnan123 Feb 2, 2026
c8deaff
updated the code
malavikakrishnan123 Feb 3, 2026
6f0fb37
reverted the changes
malavikakrishnan123 Feb 3, 2026
0abb3d5
updated the code
malavikakrishnan123 Feb 3, 2026
f6d2c17
Artfactory spelling changed to Artifactory
malavikakrishnan123 Feb 4, 2026
deee864
updated the file
malavikakrishnan123 Feb 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 25 additions & 25 deletions src/AritfactoryUploader.UTest/ArtifactoryUploaderTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,16 @@
using System.Threading.Tasks;
using UnitTestUtilities;

namespace AritfactoryUploader.UTest
namespace LCT.ArtifactoryUploader.UTest
{
[TestFixture]
public class ArtifactoryUploader
public class ArtifactoryUploaderTests
{
[Test]
public void GettPathForArtifactoryUpload_ReturnsValidPath()
{
// Act
var result = ArtfactoryUploader.GettPathForArtifactoryUpload();
var result = ArtifactoryUploader.GettPathForArtifactoryUpload();
// Assert
Assert.IsNotNull(result);
Assert.IsTrue(result.Contains("ClearingTool"));
Expand Down Expand Up @@ -63,7 +63,7 @@ public void Setup()


[Test]
public async Task UploadPackageToRepo_InputEmptyCreds_ReturnsPackgeNotFound()
public async Task UploadPackageToRepo_InputEmptyCreds_ReturnsPackageNotFound()
{
//Arrange
CommonAppSettings appSettings = new CommonAppSettings();
Expand All @@ -72,7 +72,7 @@ public async Task UploadPackageToRepo_InputEmptyCreds_ReturnsPackgeNotFound()
URL = UTParams.JFrogURL
};

ArtfactoryUploader.JFrogService = GetJfrogService(appSettings);
ArtifactoryUploader.JFrogService = GetJfrogService(appSettings);
DisplayPackagesInfo displayPackagesInfo = PackageUploadInformation.GetComponentsToBePackages();
var componentsToArtifactory = new ComponentsToArtifactory
{
Expand All @@ -94,7 +94,7 @@ public async Task UploadPackageToRepo_InputEmptyCreds_ReturnsPackgeNotFound()
};

//Act
var responseMessage = await ArtfactoryUploader.UploadPackageToRepo(componentsToArtifactory, 100, displayPackagesInfo);
var responseMessage = await ArtifactoryUploader.UploadPackageToRepo(componentsToArtifactory, 100, displayPackagesInfo);
Assert.AreEqual(HttpStatusCode.NotFound, responseMessage.StatusCode);
Assert.AreEqual("Package Not Found", responseMessage.ReasonPhrase);

Expand Down Expand Up @@ -128,9 +128,9 @@ public async Task UploadPackageToRepo_WhenPackageInfoIsNull_ReturnsNotFoundRespo
var jFrogServiceMock = new Mock<IJFrogService>();
jFrogServiceMock.Setup(x => x.GetPackageInfo(component))
.ReturnsAsync((AqlResult)null);
ArtfactoryUploader.JFrogService = jFrogServiceMock.Object;
ArtifactoryUploader.JFrogService = jFrogServiceMock.Object;
// Act
var response = await ArtfactoryUploader.UploadPackageToRepo(component, timeout, displayPackagesInfo);
var response = await ArtifactoryUploader.UploadPackageToRepo(component, timeout, displayPackagesInfo);

// Assert
Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode);
Expand Down Expand Up @@ -158,10 +158,10 @@ public async Task UploadPackageToRepo_WhenPackageTypeIsClearedThirdPartyOrDevelo
.ReturnsAsync(new AqlResult());
jfrogApicommunicationMock.Setup(x => x.CopyFromRemoteRepo(It.IsAny<ComponentsToArtifactory>()))
.ReturnsAsync(new HttpResponseMessage(HttpStatusCode.OK));
ArtfactoryUploader.JFrogService = jFrogServiceMock.Object;
ArtfactoryUploader.JFrogApiCommInstance = jfrogApicommunicationMock.Object;
ArtifactoryUploader.JFrogService = jFrogServiceMock.Object;
ArtifactoryUploader.JFrogApiCommInstance = jfrogApicommunicationMock.Object;
// Act
_ = await ArtfactoryUploader.UploadPackageToRepo(component, timeout, displayPackagesInfo);
_ = await ArtifactoryUploader.UploadPackageToRepo(component, timeout, displayPackagesInfo);

// Assert
jfrogApicommunicationMock.Verify(x => x.CopyFromRemoteRepo(component), Times.Once);
Expand All @@ -188,10 +188,10 @@ public async Task UploadPackageToRepo_WhenPackageTypeIsInternal_CallsMoveFromRep
.ReturnsAsync(new AqlResult());
jfrogApicommunicationMock.Setup(x => x.MoveFromRepo(It.IsAny<ComponentsToArtifactory>()))
.ReturnsAsync(new HttpResponseMessage(HttpStatusCode.OK));
ArtfactoryUploader.JFrogService = jFrogServiceMock.Object;
ArtfactoryUploader.JFrogApiCommInstance = jfrogApicommunicationMock.Object;
ArtifactoryUploader.JFrogService = jFrogServiceMock.Object;
ArtifactoryUploader.JFrogApiCommInstance = jfrogApicommunicationMock.Object;
// Act
var response = await ArtfactoryUploader.UploadPackageToRepo(component, timeout, displayPackagesInfo);
var response = await ArtifactoryUploader.UploadPackageToRepo(component, timeout, displayPackagesInfo);

// Assert
jfrogApicommunicationMock.Verify(x => x.MoveFromRepo(component), Times.Once);
Expand All @@ -214,9 +214,9 @@ public async Task UploadPackageToRepo_WhenPackageTypeIsNotSupported_ReturnsNotFo
var timeout = 10000;
var displayPackagesInfo = new DisplayPackagesInfo();
var jFrogServiceMock = new Mock<IJFrogService>();
ArtfactoryUploader.JFrogService = jFrogServiceMock.Object;
ArtifactoryUploader.JFrogService = jFrogServiceMock.Object;
// Act
var response = await ArtfactoryUploader.UploadPackageToRepo(component, timeout, displayPackagesInfo);
var response = await ArtifactoryUploader.UploadPackageToRepo(component, timeout, displayPackagesInfo);

// Assert
Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode);
Expand All @@ -240,11 +240,11 @@ public async Task UploadPackageToRepo_WhenHttpRequestExceptionOccurs_ReturnsErro
var jfrogApicommunicationMock = new Mock<IJFrogApiCommunication>();
jFrogServiceMock.Setup(x => x.GetPackageInfo(component))
.ThrowsAsync(new HttpRequestException());
ArtfactoryUploader.JFrogService = jFrogServiceMock.Object;
ArtfactoryUploader.JFrogApiCommInstance = jfrogApicommunicationMock.Object;
ArtifactoryUploader.JFrogService = jFrogServiceMock.Object;
ArtifactoryUploader.JFrogApiCommInstance = jfrogApicommunicationMock.Object;

// Act
var response = await ArtfactoryUploader.UploadPackageToRepo(component, timeout, displayPackagesInfo);
var response = await ArtifactoryUploader.UploadPackageToRepo(component, timeout, displayPackagesInfo);

// Assert
Assert.AreEqual(ApiConstant.ErrorInUpload, response.ReasonPhrase);
Expand All @@ -269,11 +269,11 @@ public async Task UploadPackageToRepo_WhenInvalidOperationExceptionOccurs_Return
var jfrogApicommunicationMock = new Mock<IJFrogApiCommunication>();
jFrogServiceMock.Setup(x => x.GetPackageInfo(component))
.ThrowsAsync(new InvalidOperationException());
ArtfactoryUploader.JFrogService = jFrogServiceMock.Object;
ArtfactoryUploader.JFrogApiCommInstance = jfrogApicommunicationMock.Object;
ArtifactoryUploader.JFrogService = jFrogServiceMock.Object;
ArtifactoryUploader.JFrogApiCommInstance = jfrogApicommunicationMock.Object;

// Act
var response = await ArtfactoryUploader.UploadPackageToRepo(component, timeout, displayPackagesInfo);
var response = await ArtifactoryUploader.UploadPackageToRepo(component, timeout, displayPackagesInfo);

// Assert
Assert.AreEqual(ApiConstant.ErrorInUpload, response.ReasonPhrase);
Expand Down Expand Up @@ -313,11 +313,11 @@ public async Task UploadPackageToRepo_WhenDebianOrNugetNameMismatch_UpdatesCopyP
.Setup(c => c.CopyFromRemoteRepo(component))
.ReturnsAsync(new HttpResponseMessage(HttpStatusCode.OK));

ArtfactoryUploader.JFrogService = jfrogServiceMock.Object;
ArtfactoryUploader.JFrogApiCommInstance = jfrogApiCommMock.Object;
ArtifactoryUploader.JFrogService = jfrogServiceMock.Object;
ArtifactoryUploader.JFrogApiCommInstance = jfrogApiCommMock.Object;

// Act
var response = await ArtfactoryUploader.UploadPackageToRepo(component, timeout, displayPackagesInfo);
var response = await ArtifactoryUploader.UploadPackageToRepo(component, timeout, displayPackagesInfo);

// Assert
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode, "Expected successful copy response.");
Expand Down
7 changes: 3 additions & 4 deletions src/AritfactoryUploader.UTest/PackageUploaderTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,10 @@
// SPDX-License-Identifier: MIT
// --------------------------------------------------------------------------------------------------------------------

using ArtifactoryUploader;
using LCT.ArtifactoryUploader;
using LCT.APICommunications;
using LCT.APICommunications.Interfaces;
using LCT.APICommunications.Model;
using LCT.ArtifactoryUploader;
using LCT.Common;
using LCT.Common.Model;
using LCT.Facade;
Expand All @@ -22,7 +21,7 @@
using System.Threading.Tasks;
using UnitTestUtilities;

namespace AritfactoryUploader.UTest
namespace LCT.ArtifactoryUploader.UTest
{
[TestFixture]
public class PackageUploaderTest
Expand Down Expand Up @@ -76,7 +75,7 @@ public async Task UploadPackageToArtifactory_GivenAppsettings()
IJFrogService jFrogService = GetJfrogService(commonAppSettings);
PackageUploadHelper.JFrogService = jFrogService;
UploadToArtifactory.JFrogService = jFrogService;
ArtfactoryUploader.JFrogService = jFrogService;
ArtifactoryUploader.JFrogService = jFrogService;

Program.UploaderStopWatch = new Stopwatch();
Program.UploaderStopWatch.Start();
Expand Down
55 changes: 53 additions & 2 deletions src/ArtifactoryUploader/ArtifactoryUploader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,31 @@

namespace LCT.ArtifactoryUploader
{
public static class ArtfactoryUploader
public static class ArtifactoryUploader
{
//ConfigurationAttribute
#region Fields

static readonly ILog Logger = LoggerFactory.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

#endregion

#region Properties

public static IJFrogService JFrogService { get; set; }
public static IJFrogApiCommunication JFrogApiCommInstance { get; set; }

#endregion

#region Methods

/// <summary>
/// Asynchronously uploads a package to the repository.
/// </summary>
/// <param name="component">The component to upload.</param>
/// <param name="timeout">The timeout value in seconds.</param>
/// <param name="displayPackagesInfo">The display information for packages.</param>
/// <returns>A task containing the HTTP response message.</returns>

public static async Task<HttpResponseMessage> UploadPackageToRepo(ComponentsToArtifactory component, int timeout, DisplayPackagesInfo displayPackagesInfo)
{

Expand Down Expand Up @@ -77,6 +95,11 @@ public static async Task<HttpResponseMessage> UploadPackageToRepo(ComponentsToAr
return responsemessage;
}

/// <summary>
/// Gets the operation type for the component based on package type.
/// </summary>
/// <param name="component">The component to determine operation type for.</param>
/// <returns>The operation type as a string ("copy" or "move").</returns>
private static string GetOperationType(ComponentsToArtifactory component)
{
if (component.ComponentType == "CHOCO")
Expand All @@ -86,6 +109,11 @@ private static string GetOperationType(ComponentsToArtifactory component)
return (component.PackageType == PackageType.ClearedThirdParty || component.PackageType == PackageType.Development) ? "copy" : "move";
}

/// <summary>
/// Asynchronously gets the repository operation response based on package type.
/// </summary>
/// <param name="component">The component to perform the operation on.</param>
/// <returns>A task containing the HTTP response message.</returns>
private static async Task<HttpResponseMessage> GetRepoOperationResponse(ComponentsToArtifactory component)
{
return component.PackageType switch
Expand All @@ -98,6 +126,11 @@ await JFrogApiCommInstance.MoveFromRepo(component),
};
}

/// <summary>
/// Creates a not found HTTP response message.
/// </summary>
/// <param name="reasonPhrase">The reason phrase for the response.</param>
/// <returns>An HTTP response message with not found status.</returns>
private static HttpResponseMessage CreateNotFoundResponse(string reasonPhrase)
{
return new HttpResponseMessage(HttpStatusCode.NotFound)
Expand All @@ -106,13 +139,25 @@ private static HttpResponseMessage CreateNotFoundResponse(string reasonPhrase)
};
}

/// <summary>
/// Handles upload exceptions and returns an error response.
/// </summary>
/// <param name="ex">The exception that occurred.</param>
/// <param name="responsemessage">The response message to update.</param>
/// <returns>An HTTP response message with error information.</returns>
private static HttpResponseMessage HandleUploadException(Exception ex, HttpResponseMessage responsemessage)
{
Logger.Error("Error has occurred in UploadPackageToArtifactory--{Exception}", ex);
responsemessage.ReasonPhrase = ApiConstant.ErrorInUpload;
return responsemessage;
}

/// <summary>
/// Asynchronously gets package information with retry logic for lowercase names.
/// </summary>
/// <param name="jFrogService">The JFrog service instance.</param>
/// <param name="component">The component to get information for.</param>
/// <returns>A task containing the AQL result with package information, or null if not found.</returns>
private static async Task<AqlResult> GetPackageInfoWithRetry(IJFrogService jFrogService, ComponentsToArtifactory component)
{
async Task<AqlResult> TryGetPackageInfo(ComponentsToArtifactory component)
Expand Down Expand Up @@ -145,6 +190,11 @@ async Task<AqlResult> TryGetPackageInfo(ComponentsToArtifactory component)

return packageInfo;
}

/// <summary>
/// Gets the path for Artifactory upload directory.
/// </summary>
/// <returns>The local path for Artifactory upload.</returns>
public static string GettPathForArtifactoryUpload()
{
string localPathforartifactory = string.Empty;
Expand All @@ -169,5 +219,6 @@ public static string GettPathForArtifactoryUpload()
return localPathforartifactory;
}

#endregion
}
}
20 changes: 20 additions & 0 deletions src/ArtifactoryUploader/ArtifactoryValidator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,31 @@ namespace LCT.ArtifactoryUploader
{
public class ArtifactoryValidator
{
#region Fields

private readonly IJfrogAqlApiCommunication _JfrogAqlApiCommunication;

#endregion

#region Constructors

/// <summary>
/// Initializes a new instance of the ArtifactoryValidator class.
/// </summary>
/// <param name="jfrogAqlApiCommunication">The JFrog AQL API communication instance.</param>
public ArtifactoryValidator(IJfrogAqlApiCommunication jfrogAqlApiCommunication)
{
_JfrogAqlApiCommunication = jfrogAqlApiCommunication;
}

#endregion

#region Methods

/// <summary>
/// Asynchronously validates Artifactory credentials by checking the connection.
/// </summary>
/// <returns>A task containing 0 if validation succeeds, -1 if validation fails.</returns>
public async Task<int> ValidateArtifactoryCredentials()
{
HttpResponseMessage responseMessage = new HttpResponseMessage();
Expand All @@ -37,5 +55,7 @@ public async Task<int> ValidateArtifactoryCredentials()
return -1;
}
}

#endregion
}
}
4 changes: 4 additions & 0 deletions src/ArtifactoryUploader/Constants/ArtifactoryConstant.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ namespace ArtifactoryUploader.Constants
[ExcludeFromCodeCoverage]
public static class ArtifactoryConstant
{
#region Fields

public const string Log4netArtifactoryUploaderConfigFileName = "log4netArtifactoryUploader.config";

#endregion
}
}
Loading