Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
43 changes: 43 additions & 0 deletions .github/workflows/build-and-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: Build and Test

on:
push:
branches: [ main, master, develop ]
pull_request:
branches: [ main, master, develop ]
workflow_dispatch:

jobs:
build:
uses: ./.github/workflows/compile.yml

test:
name: Run Tests
needs: build
runs-on: windows-latest

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup NuGet
uses: NuGet/setup-nuget@v2

- name: Download debug build artifacts
uses: actions/download-artifact@v4
with:
name: debug
path: dist/Debug

- name: Install NUnit console runner
run: nuget install NUnit.Runners -Version 2.7.1 -OutputDirectory packages -Source https://api.nuget.org/v3/index.json

- name: Run tests
run: packages/NUnit.Runners.2.7.1/tools/nunit-console.exe dist/Debug/Net452/Saleslogix.SData.Client.Test.dll /nologo /result=test-results.xml

- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results
path: test-results.xml
5 changes: 4 additions & 1 deletion .github/workflows/compile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,17 @@ on:

jobs:
build:
runs-on: windows-2019
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- uses: microsoft/setup-msbuild@v1.3.3
- uses: actions/setup-dotnet@v3
with:
dotnet-version: "8.0.x"

- name: Install .NET Framework 4.5.2 targeting pack
run: choco install netfx-4.5.2-devpack -y --no-progress

- name: debug build
shell: pwsh
run: |
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
uses: ./.github/workflows/compile.yml
nuget_job:
needs: build_job
runs-on: windows-2019
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- uses: nuget/setup-nuget@v1
Expand Down
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
*.sdf
ipch/
obj/
objnet/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Expand All @@ -33,6 +34,10 @@ _ReSharper*/
[Tt]est[Rr]esult*
*.ReSharper

#NuGet
packages/
*.nupkg

#OS junk files
Thumbs.db
*.DS_Store
Expand Down
20 changes: 1 addition & 19 deletions DotNetSDataClient.Framework.sln
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SlxFileBrowser", "demos\Slx
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SlxJobScheduler", "demos\SlxJobScheduler\SlxJobScheduler.csproj", "{5CC2002C-8D4A-47F3-847C-3C8EAF485C36}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Saleslogix.SData.Client.Test_4_0", "Saleslogix.SData.Client.Test\Saleslogix.SData.Client.Test_4_0.csproj", "{92C27580-82D9-46FC-8E4A-9B75E6FF6C2B}"
ProjectSection(ProjectDependencies) = postProject
{FEECA9B9-980E-470F-81BA-C56ABD8D520E} = {FEECA9B9-980E-470F-81BA-C56ABD8D520E}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Saleslogix.SData.Client_4_0", "Saleslogix.SData.Client\Saleslogix.SData.Client_4_0.csproj", "{FEECA9B9-980E-470F-81BA-C56ABD8D520E}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Saleslogix.SData.Client.Test_452", "Saleslogix.SData.Client.Test\Saleslogix.SData.Client.Test_452.csproj", "{92C27580-82D9-46FC-8E4A-9B75E6FF6C2B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Saleslogix.SData.Client_48", "Saleslogix.SData.Client\Saleslogix.SData.Client_48.csproj", "{A1A43E15-7A71-4E99-B287-04ED341860D4}"
ProjectSection(ProjectDependencies) = postProject
Expand All @@ -25,9 +20,6 @@ EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{11DC44D8-8C25-468D-9F91-8922B9BB5D42}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Saleslogix.SData.Client_452", "Saleslogix.SData.Client\Saleslogix.SData.Client_452.csproj", "{E6CFD34D-762D-47BC-AF2D-B47ED6020D2A}"
ProjectSection(ProjectDependencies) = postProject
{FEECA9B9-980E-470F-81BA-C56ABD8D520E} = {FEECA9B9-980E-470F-81BA-C56ABD8D520E}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Saleslogix.SData.Client_472", "Saleslogix.SData.Client\Saleslogix.SData.Client_472.csproj", "{17BDC943-9A2F-4E9C-B605-63491448D50F}"
ProjectSection(ProjectDependencies) = postProject
Expand Down Expand Up @@ -82,16 +74,6 @@ Global
{92C27580-82D9-46FC-8E4A-9B75E6FF6C2B}.Release|ARM.ActiveCfg = Release|Any CPU
{92C27580-82D9-46FC-8E4A-9B75E6FF6C2B}.Release|x64.ActiveCfg = Release|Any CPU
{92C27580-82D9-46FC-8E4A-9B75E6FF6C2B}.Release|x86.ActiveCfg = Release|Any CPU
{FEECA9B9-980E-470F-81BA-C56ABD8D520E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FEECA9B9-980E-470F-81BA-C56ABD8D520E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FEECA9B9-980E-470F-81BA-C56ABD8D520E}.Debug|ARM.ActiveCfg = Debug|Any CPU
{FEECA9B9-980E-470F-81BA-C56ABD8D520E}.Debug|x64.ActiveCfg = Debug|Any CPU
{FEECA9B9-980E-470F-81BA-C56ABD8D520E}.Debug|x86.ActiveCfg = Debug|Any CPU
{FEECA9B9-980E-470F-81BA-C56ABD8D520E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FEECA9B9-980E-470F-81BA-C56ABD8D520E}.Release|Any CPU.Build.0 = Release|Any CPU
{FEECA9B9-980E-470F-81BA-C56ABD8D520E}.Release|ARM.ActiveCfg = Release|Any CPU
{FEECA9B9-980E-470F-81BA-C56ABD8D520E}.Release|x64.ActiveCfg = Release|Any CPU
{FEECA9B9-980E-470F-81BA-C56ABD8D520E}.Release|x86.ActiveCfg = Release|Any CPU
{A1A43E15-7A71-4E99-B287-04ED341860D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A1A43E15-7A71-4E99-B287-04ED341860D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A1A43E15-7A71-4E99-B287-04ED341860D4}.Debug|ARM.ActiveCfg = Debug|Any CPU
Expand Down
121 changes: 121 additions & 0 deletions Saleslogix.SData.Client.Test/SDataClientTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,127 @@ namespace Saleslogix.SData.Client.Test
[TestFixture]
public class SDataClientTests
{
#region UserAgent Tests

[Test]
public void UserAgent_NotSet_UsesDefault()
{
// When UserAgent is not set at all, the default should be used.
SDataRequest capturedRequest = null;
var requestMock = new Mock<SDataRequest>(null, null, null);
requestMock.SetupAllProperties();
requestMock.Setup(x => x.GetResponse()).Returns(new SDataResponse(HttpStatusCode.OK, null, null, null, null, null, null, null, null));
var requestFactory = new Func<string, SDataRequest>(uri =>
{
capturedRequest = requestMock.Object;
return capturedRequest;
});

var client = new SDataClient("test://dummy", requestFactory);
// Do NOT set client.UserAgent - leave it at default
client.Execute(new SDataParameters { Path = "test" });

Assert.That(capturedRequest.UserAgent, Is.EqualTo(SDataConstants.UserAgent));
}

[Test]
public void UserAgent_SetToNull_FallsBackToDefault()
{
// When UserAgent is explicitly set to null, the default should be used.
SDataRequest capturedRequest = null;
var requestMock = new Mock<SDataRequest>(null, null, null);
requestMock.SetupAllProperties();
requestMock.Setup(x => x.GetResponse()).Returns(new SDataResponse(HttpStatusCode.OK, null, null, null, null, null, null, null, null));
var requestFactory = new Func<string, SDataRequest>(uri =>
{
capturedRequest = requestMock.Object;
return capturedRequest;
});

var client = new SDataClient("test://dummy", requestFactory);
client.UserAgent = null;
client.Execute(new SDataParameters { Path = "test" });

Assert.That(capturedRequest.UserAgent, Is.EqualTo(SDataConstants.UserAgent));
}

[Test]
public void UserAgent_SetToEmpty_FallsBackToDefault()
{
// When UserAgent is explicitly set to empty string, the default should be used.
SDataRequest capturedRequest = null;
var requestMock = new Mock<SDataRequest>(null, null, null);
requestMock.SetupAllProperties();
requestMock.Setup(x => x.GetResponse()).Returns(new SDataResponse(HttpStatusCode.OK, null, null, null, null, null, null, null, null));
var requestFactory = new Func<string, SDataRequest>(uri =>
{
capturedRequest = requestMock.Object;
return capturedRequest;
});

var client = new SDataClient("test://dummy", requestFactory);
client.UserAgent = "";
client.Execute(new SDataParameters { Path = "test" });

Assert.That(capturedRequest.UserAgent, Is.EqualTo(SDataConstants.UserAgent));
}

[Test]
public void UserAgent_SetToWhitespace_FallsBackToDefault()
{
// When UserAgent is explicitly set to whitespace, the default should be used.
SDataRequest capturedRequest = null;
var requestMock = new Mock<SDataRequest>(null, null, null);
requestMock.SetupAllProperties();
requestMock.Setup(x => x.GetResponse()).Returns(new SDataResponse(HttpStatusCode.OK, null, null, null, null, null, null, null, null));
var requestFactory = new Func<string, SDataRequest>(uri =>
{
capturedRequest = requestMock.Object;
return capturedRequest;
});

var client = new SDataClient("test://dummy", requestFactory);
client.UserAgent = " ";
client.Execute(new SDataParameters { Path = "test" });

Assert.That(capturedRequest.UserAgent, Is.EqualTo(SDataConstants.UserAgent));
}

[Test]
public void UserAgent_SetToCustomValue_UsesCustomValue()
{
// When UserAgent is set to a custom value, that value should be used.
SDataRequest capturedRequest = null;
var requestMock = new Mock<SDataRequest>(null, null, null);
requestMock.SetupAllProperties();
requestMock.Setup(x => x.GetResponse()).Returns(new SDataResponse(HttpStatusCode.OK, null, null, null, null, null, null, null, null));
var requestFactory = new Func<string, SDataRequest>(uri =>
{
capturedRequest = requestMock.Object;
return capturedRequest;
});

var client = new SDataClient("test://dummy", requestFactory);
client.UserAgent = "MyCustomApp/1.0";
client.Execute(new SDataParameters { Path = "test" });

Assert.That(capturedRequest.UserAgent, Is.EqualTo("MyCustomApp/1.0"));
}

[Test]
public void UserAgent_InstanceIsolation_DoesNotAffectOtherInstances()
{
// Setting UserAgent on one instance should not affect another instance.
var client1 = new SDataClient("test://dummy1");
var client2 = new SDataClient("test://dummy2");

client1.UserAgent = "CustomAgent1";

Assert.That(client1.UserAgent, Is.EqualTo("CustomAgent1"));
Assert.That(client2.UserAgent, Is.EqualTo(SDataConstants.UserAgent));
}

#endregion
[Test]
public void Execute_Test()
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
Expand All @@ -10,19 +10,21 @@
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Saleslogix.SData.Client.Test</RootNamespace>
<AssemblyName>Saleslogix.SData.Client.Test</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>..\DotNetSDataClient.snk</AssemblyOriginatorKeyFile>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\dist\Debug\Net40\</OutputPath>
<OutputPath>..\dist\Debug\Net452\</OutputPath>
<DefineConstants>DEBUG;TRACE;NET_4_0</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
Expand All @@ -31,6 +33,7 @@
<DefineConstants>TRACE;NET_4_0</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.CSharp" />
Expand All @@ -40,6 +43,38 @@
<Reference Include="nunit.framework">
<HintPath>..\dependencies\NUnit\nunit.framework.dll</HintPath>
</Reference>
<Reference Include="NUnit.VisualStudio.TestAdapter">
<HintPath>..\dependencies\NUnitTestAdapter\NUnit.VisualStudio.TestAdapter.dll</HintPath>
<Private>true</Private>
</Reference>
<Reference Include="nunit.core">
<HintPath>..\dependencies\NUnitTestAdapter\nunit.core.dll</HintPath>
<Private>true</Private>
</Reference>
<Reference Include="nunit.core.interfaces">
<HintPath>..\dependencies\NUnitTestAdapter\nunit.core.interfaces.dll</HintPath>
<Private>true</Private>
</Reference>
<Reference Include="nunit.util">
<HintPath>..\dependencies\NUnitTestAdapter\nunit.util.dll</HintPath>
<Private>true</Private>
</Reference>
<Reference Include="Mono.Cecil">
<HintPath>..\dependencies\NUnitTestAdapter\Mono.Cecil.dll</HintPath>
<Private>true</Private>
</Reference>
<Reference Include="Mono.Cecil.Mdb">
<HintPath>..\dependencies\NUnitTestAdapter\Mono.Cecil.Mdb.dll</HintPath>
<Private>true</Private>
</Reference>
<Reference Include="Mono.Cecil.Pdb">
<HintPath>..\dependencies\NUnitTestAdapter\Mono.Cecil.Pdb.dll</HintPath>
<Private>true</Private>
</Reference>
<Reference Include="Mono.Cecil.Rocks">
<HintPath>..\dependencies\NUnitTestAdapter\Mono.Cecil.Rocks.dll</HintPath>
<Private>true</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
Expand Down Expand Up @@ -94,17 +129,10 @@
<Compile Include="SDataResourceTypeDescriptionProviderTests.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Saleslogix.SData.Client\Saleslogix.SData.Client_4_0.csproj">
<Project>{FEECA9B9-980E-470F-81BA-C56ABD8D520E}</Project>
<Name>Saleslogix.SData.Client_4_0</Name>
<ProjectReference Include="..\Saleslogix.SData.Client\Saleslogix.SData.Client_452.csproj">
<Project>{e6cfd34d-762d-47bc-af2d-b47ed6020d2a}</Project>
<Name>Saleslogix.SData.Client_452</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
16 changes: 16 additions & 0 deletions Saleslogix.SData.Client/Directory.Build.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<Project>

<!--
Redirect NuGet restore output and intermediate build files for the SDK-style
_net8.0 project to an isolated folder. This prevents the shared 'obj' folder
from containing NuGet artifacts (project.assets.json, etc.), which would
otherwise cause VS 2022 to run NuGet restore validation against the old-style
.NET Framework projects in this directory and fail with:
"Your project does not reference '.NETFramework,Version=...' framework"
-->
<PropertyGroup Condition="'$(MSBuildProjectFile)' == 'Saleslogix.SData.Client_net8.0.csproj'">
<BaseIntermediateOutputPath>objnet\</BaseIntermediateOutputPath>
<MSBuildProjectExtensionsPath>$(MSBuildThisFileDirectory)objnet\</MSBuildProjectExtensionsPath>
</PropertyGroup>

</Project>
8 changes: 2 additions & 6 deletions Saleslogix.SData.Client/Framework/SDataRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public SDataRequest(string uri = null, HttpMethod method = HttpMethod.Get, objec
{
Uri = uri;
#if !PCL && !NETFX_CORE && !SILVERLIGHT
UserAgent = "DotNetSDataClient";
UserAgent = SDataConstants.UserAgent;
Timeout = 120000;
#endif
TimeoutRetryAttempts = 1;
Expand Down Expand Up @@ -444,11 +444,7 @@ private WebRequest CreateRequest(string uri, out MediaType? contentType, out obj
httpRequest.ReadWriteTimeout = Timeout;
httpRequest.KeepAlive = false;
httpRequest.ProtocolVersion = HttpVersion.Version10;

if (UserAgent != null)
{
httpRequest.UserAgent = UserAgent;
}
httpRequest.UserAgent = !string.IsNullOrWhiteSpace(UserAgent) ? UserAgent : SDataConstants.UserAgent;
#endif
if (Accept != null)
{
Expand Down
Loading
Loading