Skip to content

Commit

Permalink
feat(sdr): add AsvSdrHelper.cs tests (command & mission items)
Browse files Browse the repository at this point in the history
  • Loading branch information
asvol committed Nov 8, 2023
1 parent a2081b7 commit f2e4a87
Show file tree
Hide file tree
Showing 5 changed files with 115 additions and 9 deletions.
4 changes: 2 additions & 2 deletions src/Asv.Mavlink.Test/Microservices/AsvSdr/AsvSdrExTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -564,7 +564,7 @@ public async Task Check_For_Correct_CurrentRecordSetTag_Behavior()
return Task.FromResult(MavResult.MavResultAccepted);
};

var nameArray = new byte[AsvSdrHelper.RecordTagValueMaxLength];
var nameArray = new byte[AsvSdrHelper.RecordTagValueLength];
var mavResult = await asvSdrClientEx.CurrentRecordSetTag("test", AsvSdrRecordTagType.AsvSdrRecordTagTypeString8, nameArray, CancellationToken.None);
Assert.True(mavResult == MavResult.MavResultAccepted);
}
Expand Down Expand Up @@ -642,7 +642,7 @@ await Assert.ThrowsAsync<ArgumentException>(async () =>
public async Task Check_For_Incorrect_CurrentRecordSetTag_Tag_Name()
{
var (asvSdrClientEx, asvSdrServerEx) = await SetUpConnection();
var nameArray = new byte[AsvSdrHelper.RecordTagValueMaxLength];
var nameArray = new byte[AsvSdrHelper.RecordTagValueLength];

await Assert.ThrowsAsync<Exception>( async () =>
{
Expand Down
101 changes: 101 additions & 0 deletions src/Asv.Mavlink.Test/Microservices/AsvSdr/AsvSdrHelperTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,107 @@ public void Check_command_conversion_for_set_tag(string nameIn, AsvSdrRecordTagT
Assert.Equal(rawValueIn, rawValueOut);
}

[Theory]
[InlineData(AsvSdrSystemControlAction.AsvSdrSystemControlActionReboot)]
[InlineData(AsvSdrSystemControlAction.AsvSdrSystemControlActionShutdown)]
public void Check_mission_conversion_for_system_control_action(AsvSdrSystemControlAction action)
{
var input = new MissionItemIntPayload();
var buffer = new byte[input.GetByteSize()];
var inputSpan = new Span<byte>(buffer);
AsvSdrHelper.SetArgsForSdrSystemControlAction(input, action);
input.Serialize(ref inputSpan);
var output = new MissionItemIntPayload();
var outputSpan = new ReadOnlySpan<byte>(buffer);
output.Deserialize(ref outputSpan);
var outputServerItem = AsvSdrHelper.Convert(output);
AsvSdrHelper.GetArgsForSdrSystemControlAction(outputServerItem, out var actionOut);
Assert.Equal(action,actionOut);
}
[Theory]
[InlineData(AsvSdrSystemControlAction.AsvSdrSystemControlActionReboot)]
[InlineData(AsvSdrSystemControlAction.AsvSdrSystemControlActionShutdown)]
public void Check_command_conversion_for_system_control_action(AsvSdrSystemControlAction action)
{
var input = new CommandLongPayload();
var buffer = new byte[input.GetByteSize()];
var inputSpan = new Span<byte>(buffer);
AsvSdrHelper.SetArgsForSdrSystemControlAction(input, action);
input.Serialize(ref inputSpan);
var output = new CommandLongPayload();
var outputSpan = new ReadOnlySpan<byte>(buffer);
output.Deserialize(ref outputSpan);
AsvSdrHelper.GetArgsForSdrSystemControlAction(output, out var actionOut);
Assert.Equal(action,actionOut);
}

[Theory]
[InlineData(0)]
[InlineData(10)]
public void Check_command_conversion_for_start_mission(ushort missionIndex)
{
var input = new CommandLongPayload();
var buffer = new byte[input.GetByteSize()];
var inputSpan = new Span<byte>(buffer);
AsvSdrHelper.SetArgsForSdrStartMission(input, missionIndex);
input.Serialize(ref inputSpan);
var output = new CommandLongPayload();
var outputSpan = new ReadOnlySpan<byte>(buffer);
output.Deserialize(ref outputSpan);
AsvSdrHelper.GetArgsForSdrStartMission(output, out var missionIndexOut);
Assert.Equal(missionIndex,missionIndexOut);
}

[Fact]
public void Check_command_conversion_for_stop_mission()
{
var input = new CommandLongPayload();
var buffer = new byte[input.GetByteSize()];
var inputSpan = new Span<byte>(buffer);
AsvSdrHelper.SetArgsForSdrStopMission(input);
input.Serialize(ref inputSpan);
var output = new CommandLongPayload();
var outputSpan = new ReadOnlySpan<byte>(buffer);
output.Deserialize(ref outputSpan);
AsvSdrHelper.GetArgsForSdrStopMission(output);
}

[Theory]
[InlineData(0)]
[InlineData(uint.MaxValue)]
public void Check_mission_conversion_for_sdr_delay(uint delayMs)
{
var input = new MissionItemIntPayload();
var buffer = new byte[input.GetByteSize()];
var inputSpan = new Span<byte>(buffer);
AsvSdrHelper.SetArgsForSdrDelay(input, delayMs);
input.Serialize(ref inputSpan);
var output = new MissionItemIntPayload();
var outputSpan = new ReadOnlySpan<byte>(buffer);
output.Deserialize(ref outputSpan);
var outputServerItem = AsvSdrHelper.Convert(output);
AsvSdrHelper.GetArgsForSdrDelay(outputServerItem, out var delayMsOut);
Assert.Equal(delayMs,delayMsOut);
}


[Theory]
[InlineData(0)]
[InlineData(ushort.MaxValue)]
public void Check_mission_conversion_for_wait_vehicle(ushort index)
{
var input = new MissionItemIntPayload();
var buffer = new byte[input.GetByteSize()];
var inputSpan = new Span<byte>(buffer);
AsvSdrHelper.SetArgsForSdrWaitVehicleWaypoint(input, index);
input.Serialize(ref inputSpan);
var output = new MissionItemIntPayload();
var outputSpan = new ReadOnlySpan<byte>(buffer);
output.Deserialize(ref outputSpan);
var outputServerItem = AsvSdrHelper.Convert(output);
AsvSdrHelper.GetArgsForSdrWaitVehicleWaypoint(outputServerItem, out var indexOut);
Assert.Equal(index,indexOut);
}



Expand Down
12 changes: 8 additions & 4 deletions src/Asv.Mavlink/Microservices/AsvSdr/AsvSdrHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace Asv.Mavlink;

public static class AsvSdrHelper
{
public const int RecordTagValueMaxLength = 8;
public const int RecordTagValueLength = 8;

public const int RecordNameMaxLength = 28;
private const string RecordNameRegexString = "^[A-Za-z][A-Za-z0-9_\\- +]{2,28}$";
Expand Down Expand Up @@ -224,6 +224,8 @@ public static void GetArgsForSdrStopRecord(CommandLongPayload payload)
public static void SetArgsForSdrCurrentRecordSetTag(CommandLongPayload item, string tagName, AsvSdrRecordTagType type, byte[] rawValue)
{
CheckTagName(tagName);
if (rawValue.Length != RecordTagValueLength)
throw new ArgumentException(nameof(rawValue), $"Tag value array must be {RecordTagValueLength} bytes length");
var nameArray = new byte[RecordTagNameMaxLength];
MavlinkTypesHelper.SetString(nameArray, tagName);
item.Command = (V2.Common.MavCmd)MavCmd.MavCmdAsvSdrSetRecordTag;
Expand All @@ -238,6 +240,8 @@ public static void SetArgsForSdrCurrentRecordSetTag(CommandLongPayload item, str
public static void SetArgsForSdrCurrentRecordSetTag(MissionItemIntPayload payload,string tagName, AsvSdrRecordTagType type, byte[] rawValue)
{
CheckTagName(tagName);
if (rawValue.Length != RecordTagValueLength)
throw new ArgumentException(nameof(rawValue), $"Tag value array must be {RecordTagValueLength} bytes length");
var nameArray = new byte[RecordTagNameMaxLength];
MavlinkTypesHelper.SetString(nameArray, tagName);
payload.Command = (V2.Common.MavCmd)MavCmd.MavCmdAsvSdrSetRecordTag;
Expand All @@ -263,7 +267,7 @@ public static void GetArgsForSdrCurrentRecordSetTag(CommandLongPayload item, out
BitConverter.GetBytes(item.Param5).CopyTo(nameArray,12);
tagName = MavlinkTypesHelper.GetString(nameArray);
CheckTagName(tagName);
valueArray = new byte[RecordTagValueMaxLength];
valueArray = new byte[RecordTagValueLength];
BitConverter.GetBytes(item.Param6).CopyTo(valueArray,0);
BitConverter.GetBytes(item.Param7).CopyTo(valueArray,4);
}
Expand All @@ -280,7 +284,7 @@ public static void GetArgsForSdrCurrentRecordSetTag(ServerMissionItem item, out
BitConverter.GetBytes(item.X).CopyTo(nameArray,12);
tagName = MavlinkTypesHelper.GetString(nameArray);
CheckTagName(tagName);
valueArray = new byte[RecordTagValueMaxLength];
valueArray = new byte[RecordTagValueLength];
BitConverter.GetBytes(item.Y).CopyTo(valueArray,0);
BitConverter.GetBytes(item.Z).CopyTo(valueArray,4);
}
Expand Down Expand Up @@ -404,7 +408,7 @@ public static void GetArgsForSdrDelay(ServerMissionItem item,out uint delayMs)
public static void SetArgsForSdrWaitVehicleWaypoint(MissionItemIntPayload item,ushort index)
{
item.Command = (V2.Common.MavCmd)MavCmd.MavCmdAsvSdrWaitVehicleWaypoint;
item.Param1 = BitConverter.ToSingle(BitConverter.GetBytes(index));
item.Param1 = BitConverter.ToSingle(BitConverter.GetBytes((uint)index));
item.Param2 = Single.NaN;
item.Param3 = Single.NaN;
item.Param4 = Single.NaN;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ public async Task<MavResult> StopRecord(CancellationToken cancel)
public async Task<MavResult> CurrentRecordSetTag(string tagName, AsvSdrRecordTagType type, byte[] rawValue , CancellationToken cancel)
{
using var cs = CancellationTokenSource.CreateLinkedTokenSource(DisposeCancel, cancel);

var result = await _commandClient.CommandLong(item=>AsvSdrHelper.SetArgsForSdrCurrentRecordSetTag(item,tagName,type,rawValue), cs.Token).ConfigureAwait(false);
return result.Result;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,9 @@ public static async Task CurrentRecordSetTagAndCheckResult(this IAsvSdrClientEx

public static Task<MavResult> CurrentRecordSetTag(this IAsvSdrClientEx src, string tagName, string value, CancellationToken cancel)
{
if (value.Length > AsvSdrHelper.RecordTagValueMaxLength)
throw new Exception($"Tag string value is too long. Max length is {AsvSdrHelper.RecordTagValueMaxLength}");
var nameArray = new byte[AsvSdrHelper.RecordTagValueMaxLength];
if (value.Length > AsvSdrHelper.RecordTagValueLength)
throw new Exception($"Tag string value is too long. Max length is {AsvSdrHelper.RecordTagValueLength}");
var nameArray = new byte[AsvSdrHelper.RecordTagValueLength];
MavlinkTypesHelper.SetString(nameArray,value);
return src.CurrentRecordSetTag(tagName, AsvSdrRecordTagType.AsvSdrRecordTagTypeString8, nameArray, cancel);
}
Expand Down

0 comments on commit f2e4a87

Please sign in to comment.