From 7ca46f321cd308182148a7e053928e309ecfee66 Mon Sep 17 00:00:00 2001 From: Yaroslav Fedyna Date: Sun, 24 May 2026 11:37:31 +0300 Subject: [PATCH 1/6] lab1 --- .github/workflows/sonarcloud.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml index e784069..73fa9dc 100644 --- a/.github/workflows/sonarcloud.yml +++ b/.github/workflows/sonarcloud.yml @@ -37,6 +37,8 @@ on: permissions: pull-requests: read # allows SonarCloud to decorate PRs with analysis results + contents: read + jobs: sonar-check: @@ -56,8 +58,8 @@ jobs: dotnet tool install --global dotnet-sonarscanner echo "$env:USERPROFILE\.dotnet\tools" >> $env:GITHUB_PATH dotnet sonarscanner begin ` - /k:"ppanchen_NetSdrClient" ` - /o:"ppanchen" ` + /k:"slavik22_ReengineeringCourse" ` + /o:"slavik22" ` /d:sonar.token="${{ secrets.SONAR_TOKEN }}" ` /d:sonar.cs.opencover.reportsPaths="**/coverage.xml" ` /d:sonar.cpd.cs.minimumTokens=40 ` From 4fb8cef3e61254a5c037a63fda488a5813e58210 Mon Sep 17 00:00:00 2001 From: Yaroslav Fedyna Date: Sun, 24 May 2026 11:58:31 +0300 Subject: [PATCH 2/6] lab2 --- NetSdrClientApp/Messages/NetSdrMessageHelper.cs | 8 +------- NetSdrClientApp/NetSdrClient.cs | 8 -------- NetSdrClientApp/Networking/ITcpClient.cs | 9 +-------- NetSdrClientApp/Networking/TcpClientWrapper.cs | 9 +-------- NetSdrClientApp/Networking/UdpClientWrapper.cs | 5 +---- 5 files changed, 4 insertions(+), 35 deletions(-) diff --git a/NetSdrClientApp/Messages/NetSdrMessageHelper.cs b/NetSdrClientApp/Messages/NetSdrMessageHelper.cs index 0d69b4d..43ee883 100644 --- a/NetSdrClientApp/Messages/NetSdrMessageHelper.cs +++ b/NetSdrClientApp/Messages/NetSdrMessageHelper.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection.PortableExecutable; -using System.Text; -using System.Threading.Tasks; - + namespace NetSdrClientApp.Messages { //TODO: analyze possible use of [StructLayout] for better performance and readability diff --git a/NetSdrClientApp/NetSdrClient.cs b/NetSdrClientApp/NetSdrClient.cs index b0a7c05..022acc1 100644 --- a/NetSdrClientApp/NetSdrClient.cs +++ b/NetSdrClientApp/NetSdrClient.cs @@ -1,14 +1,6 @@ using NetSdrClientApp.Messages; using NetSdrClientApp.Networking; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Channels; -using System.Threading.Tasks; using static NetSdrClientApp.Messages.NetSdrMessageHelper; -using static System.Runtime.InteropServices.JavaScript.JSType; namespace NetSdrClientApp { diff --git a/NetSdrClientApp/Networking/ITcpClient.cs b/NetSdrClientApp/Networking/ITcpClient.cs index 3470b5d..e779e95 100644 --- a/NetSdrClientApp/Networking/ITcpClient.cs +++ b/NetSdrClientApp/Networking/ITcpClient.cs @@ -1,11 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static System.Runtime.InteropServices.JavaScript.JSType; - -namespace NetSdrClientApp.Networking +namespace NetSdrClientApp.Networking { public interface ITcpClient { diff --git a/NetSdrClientApp/Networking/TcpClientWrapper.cs b/NetSdrClientApp/Networking/TcpClientWrapper.cs index 1f37e2e..2d4e555 100644 --- a/NetSdrClientApp/Networking/TcpClientWrapper.cs +++ b/NetSdrClientApp/Networking/TcpClientWrapper.cs @@ -1,12 +1,5 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Net.Http; -using System.Net.Sockets; +using System.Net.Sockets; using System.Text; -using System.Threading; -using System.Threading.Tasks; namespace NetSdrClientApp.Networking { diff --git a/NetSdrClientApp/Networking/UdpClientWrapper.cs b/NetSdrClientApp/Networking/UdpClientWrapper.cs index 31e0b79..04091a0 100644 --- a/NetSdrClientApp/Networking/UdpClientWrapper.cs +++ b/NetSdrClientApp/Networking/UdpClientWrapper.cs @@ -1,10 +1,7 @@ -using System; -using System.Net; +using System.Net; using System.Net.Sockets; using System.Security.Cryptography; using System.Text; -using System.Threading; -using System.Threading.Tasks; public class UdpClientWrapper : IUdpClient { From 4634d91465069786ad79dae6fc8154f3a06b376f Mon Sep 17 00:00:00 2001 From: Yaroslav Fedyna Date: Sun, 24 May 2026 12:38:14 +0300 Subject: [PATCH 3/6] chore: add coverlet.msbuild for OpenCover report generation --- NetSdrClientAppTests/NetSdrClientAppTests.csproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NetSdrClientAppTests/NetSdrClientAppTests.csproj b/NetSdrClientAppTests/NetSdrClientAppTests.csproj index 3cbc46a..eb99533 100644 --- a/NetSdrClientAppTests/NetSdrClientAppTests.csproj +++ b/NetSdrClientAppTests/NetSdrClientAppTests.csproj @@ -11,6 +11,10 @@ + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + From 726d635e925494b031e2b9c4b0242077086f48fb Mon Sep 17 00:00:00 2001 From: Yaroslav Fedyna Date: Sun, 24 May 2026 12:38:18 +0300 Subject: [PATCH 4/6] ci: enable test coverage step in SonarCloud workflow --- .github/workflows/sonarcloud.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml index 73fa9dc..49217c6 100644 --- a/.github/workflows/sonarcloud.yml +++ b/.github/workflows/sonarcloud.yml @@ -72,13 +72,13 @@ jobs: run: dotnet restore NetSdrClient.sln - name: Build run: dotnet build NetSdrClient.sln -c Release --no-restore - #- name: Tests with coverage (OpenCover) - # run: | - # dotnet test NetSdrClientAppTests/NetSdrClientAppTests.csproj -c Release --no-build ` - # /p:CollectCoverage=true ` - # /p:CoverletOutput=TestResults/coverage.xml ` - # /p:CoverletOutputFormat=opencover - # shell: pwsh + - name: Tests with coverage (OpenCover) + run: | + dotnet test NetSdrClientAppTests/NetSdrClientAppTests.csproj -c Release --no-build ` + /p:CollectCoverage=true ` + /p:CoverletOutput=TestResults/coverage.xml ` + /p:CoverletOutputFormat=opencover + shell: pwsh # 3) END: SonarScanner - name: SonarScanner End run: dotnet sonarscanner end /d:sonar.token="${{ secrets.SONAR_TOKEN }}" From 064336d741d0dd50ab394f963f4ae003b30a3e60 Mon Sep 17 00:00:00 2001 From: Yaroslav Fedyna Date: Sun, 24 May 2026 12:38:22 +0300 Subject: [PATCH 5/6] fix: cast ushort to int before Enum.IsDefined to match enum underlying type --- NetSdrClientApp/Messages/NetSdrMessageHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NetSdrClientApp/Messages/NetSdrMessageHelper.cs b/NetSdrClientApp/Messages/NetSdrMessageHelper.cs index 43ee883..b1b3469 100644 --- a/NetSdrClientApp/Messages/NetSdrMessageHelper.cs +++ b/NetSdrClientApp/Messages/NetSdrMessageHelper.cs @@ -77,7 +77,7 @@ public static bool TranslateMessage(byte[] msg, out MsgTypes type, out ControlIt msgEnumarable = msgEnumarable.Skip(_msgControlItemLength); msgLength -= _msgControlItemLength; - if (Enum.IsDefined(typeof(ControlItemCodes), value)) + if (Enum.IsDefined(typeof(ControlItemCodes), (int)value)) { itemCode = (ControlItemCodes)value; } From f726d15f6b308b3a26044ed8d8306b95983c4cc5 Mon Sep 17 00:00:00 2001 From: Yaroslav Fedyna Date: Sun, 24 May 2026 12:38:26 +0300 Subject: [PATCH 6/6] test: add 5 unit tests for NetSdrClient and NetSdrMessageHelper --- NetSdrClientAppTests/NetSdrClientTests.cs | 24 +++++++++++ .../NetSdrMessageHelperTests.cs | 40 +++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/NetSdrClientAppTests/NetSdrClientTests.cs b/NetSdrClientAppTests/NetSdrClientTests.cs index ad00c4f..b52e77e 100644 --- a/NetSdrClientAppTests/NetSdrClientTests.cs +++ b/NetSdrClientAppTests/NetSdrClientTests.cs @@ -115,5 +115,29 @@ public async Task StopIQTest() Assert.That(_client.IQStarted, Is.False); } + [Test] + public async Task StopIQNoConnectionTest() + { + // act — no ConnectAsync, so Connected is false + await _client.StopIQAsync(); + + // assert + _tcpMock.Verify(tcp => tcp.SendMessageAsync(It.IsAny()), Times.Never); + _tcpMock.VerifyGet(tcp => tcp.Connected, Times.AtLeastOnce); + } + + [Test] + public async Task ChangeFrequencyAsyncTest() + { + // arrange + await ConnectAsyncTest(); // 3 setup messages + + // act + await _client.ChangeFrequencyAsync(20_000_000, 1); + + // assert — 4th SendMessageAsync for frequency change + _tcpMock.Verify(tcp => tcp.SendMessageAsync(It.IsAny()), Times.Exactly(4)); + } + //TODO: cover the rest of the NetSdrClient code here } diff --git a/NetSdrClientAppTests/NetSdrMessageHelperTests.cs b/NetSdrClientAppTests/NetSdrMessageHelperTests.cs index b40fff7..285b694 100644 --- a/NetSdrClientAppTests/NetSdrMessageHelperTests.cs +++ b/NetSdrClientAppTests/NetSdrMessageHelperTests.cs @@ -64,6 +64,46 @@ public void GetDataItemMessageTest() Assert.That(parametersBytes.Count(), Is.EqualTo(parametersLength)); } + [Test] + public void TranslateMessageRoundTripTest() + { + // arrange — build a SetControlItem message then parse it back + var parameters = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05 }; + var msg = NetSdrMessageHelper.GetControlItemMessage( + NetSdrMessageHelper.MsgTypes.SetControlItem, + NetSdrMessageHelper.ControlItemCodes.ReceiverFrequency, + parameters); + + // act + bool success = NetSdrMessageHelper.TranslateMessage(msg, + out var type, out var itemCode, out _, out var body); + + // assert + Assert.That(success, Is.True); + Assert.That(type, Is.EqualTo(NetSdrMessageHelper.MsgTypes.SetControlItem)); + Assert.That(itemCode, Is.EqualTo(NetSdrMessageHelper.ControlItemCodes.ReceiverFrequency)); + Assert.That(body, Is.EqualTo(parameters)); + } + + [Test] + public void GetSamples16BitReturnsCorrectCountTest() + { + // 6 bytes → 3 samples of 16 bits + var body = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 }; + + var samples = NetSdrMessageHelper.GetSamples(16, body).ToList(); + + Assert.That(samples.Count, Is.EqualTo(3)); + } + + [Test] + public void GetSamplesThrowsForOversizedBitsTest() + { + // 40 bits / 8 = 5 bytes > 4 → ArgumentOutOfRangeException + Assert.Throws(() => + NetSdrMessageHelper.GetSamples(40, new byte[8]).ToList()); + } + //TODO: add more NetSdrMessageHelper tests } } \ No newline at end of file