Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 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
17 changes: 4 additions & 13 deletions Stack/Opc.Ua.Types/Encoders/BinaryDecoder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -687,14 +687,10 @@ public DataValue ReadDataValue(string fieldName)
if ((encodingByte & (byte)DataValueEncodingBits.SourceTimestamp) != 0)
{
value.SourceTimestamp = ReadDateTime(null);
if (hasPicoseconds)
{
sourcePicoseconds = ReadUInt16(null);
}
}
else if (hasPicoseconds)
if (hasPicoseconds)
{
_ = ReadUInt16(null);
sourcePicoseconds = ReadUInt16(null);
}
value.SourcePicoseconds = sourcePicoseconds;

Expand All @@ -703,17 +699,12 @@ public DataValue ReadDataValue(string fieldName)
if ((encodingByte & (byte)DataValueEncodingBits.ServerTimestamp) != 0)
{
value.ServerTimestamp = ReadDateTime(null);
if (hasPicoseconds)
{
serverPicoseconds = ReadUInt16(null);
}
}
else if (hasPicoseconds)
if (hasPicoseconds)
{
_ = ReadUInt16(null);
serverPicoseconds = ReadUInt16(null);
}
value.ServerPicoseconds = serverPicoseconds;

return value;
}

Expand Down
37 changes: 16 additions & 21 deletions Stack/Opc.Ua.Types/Encoders/BinaryEncoder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -838,7 +838,6 @@ public void WriteVariant(string fieldName, Variant value)
/// </summary>
public void WriteDataValue(string fieldName, DataValue value)
{
// check for null.
if (value == null)
{
WriteByte(null, 0);
Expand All @@ -861,21 +860,19 @@ public void WriteDataValue(string fieldName, DataValue value)
if (value.SourceTimestamp != DateTime.MinValue)
{
encoding |= (byte)DataValueEncodingBits.SourceTimestamp;

if (value.SourcePicoseconds != 0)
{
encoding |= (byte)DataValueEncodingBits.SourcePicoseconds;
}
}
if (value.SourcePicoseconds != 0)
{
encoding |= (byte)DataValueEncodingBits.SourcePicoseconds;
}

if (value.ServerTimestamp != DateTime.MinValue)
{
encoding |= (byte)DataValueEncodingBits.ServerTimestamp;

if (value.ServerPicoseconds != 0)
{
encoding |= (byte)DataValueEncodingBits.ServerPicoseconds;
}
}
if (value.ServerPicoseconds != 0)
{
encoding |= (byte)DataValueEncodingBits.ServerPicoseconds;
}

// write the encoding.
Expand All @@ -895,21 +892,19 @@ public void WriteDataValue(string fieldName, DataValue value)
if ((encoding & (byte)DataValueEncodingBits.SourceTimestamp) != 0)
{
WriteDateTime(null, value.SourceTimestamp);

if ((encoding & (byte)DataValueEncodingBits.SourcePicoseconds) != 0)
{
WriteUInt16(null, value.SourcePicoseconds);
}
}
if ((encoding & (byte)DataValueEncodingBits.SourcePicoseconds) != 0)
{
WriteUInt16(null, value.SourcePicoseconds);
}

if ((encoding & (byte)DataValueEncodingBits.ServerTimestamp) != 0)
{
WriteDateTime(null, value.ServerTimestamp);

if ((encoding & (byte)DataValueEncodingBits.ServerPicoseconds) != 0)
{
WriteUInt16(null, value.ServerPicoseconds);
}
}
if ((encoding & (byte)DataValueEncodingBits.ServerPicoseconds) != 0)
{
WriteUInt16(null, value.ServerPicoseconds);
}
}

Expand Down
97 changes: 97 additions & 0 deletions Tests/Opc.Ua.Core.Tests/Types/Encoders/EncoderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,103 @@ public class EncoderTests : EncoderCommon
private static readonly string[] s_valueArray = ["1", "2", "3", "4", "5"];
private static readonly int[] s_valueArray0 = [2, 3, 10];

/// <summary>
/// Verify encode and decode of a default built in type
/// value as Variant in a DataValue.
/// </summary>
[Theory]
[Category("BuiltInType")]
public void EncodeDataValueWithoutValueProperty()
{
var dataValue = new DataValue() { SourcePicoseconds = 1 };
EncodeDataValueWithoutValuePropertyTest(dataValue);
dataValue = new DataValue() { SourceTimestamp = new DateTime(2001, 01, 01).ToUniversalTime() };
EncodeDataValueWithoutValuePropertyTest(dataValue);
dataValue = new DataValue() { ServerTimestamp = new DateTime(2001, 01, 02).ToUniversalTime() };
EncodeDataValueWithoutValuePropertyTest(dataValue);
dataValue = new DataValue() { ServerPicoseconds = 2 };
EncodeDataValueWithoutValuePropertyTest(dataValue);
dataValue = new DataValue() { StatusCode = StatusCodes.BadNotImplemented };
EncodeDataValueWithoutValuePropertyTest(dataValue);
dataValue = new DataValue() { SourceTimestamp = new DateTime(2001, 01, 03).ToUniversalTime(), SourcePicoseconds = 3 };
EncodeDataValueWithoutValuePropertyTest(dataValue);
dataValue = new DataValue() { SourceTimestamp = new DateTime(2001, 01, 04).ToUniversalTime(), ServerPicoseconds = 4 };
EncodeDataValueWithoutValuePropertyTest(dataValue);
dataValue = new DataValue() { ServerTimestamp = new DateTime(2001, 01, 05).ToUniversalTime(), ServerPicoseconds = 5 };
EncodeDataValueWithoutValuePropertyTest(dataValue);
dataValue = new DataValue() { ServerTimestamp = new DateTime(2001, 01, 06).ToUniversalTime(), SourcePicoseconds = 6 };
EncodeDataValueWithoutValuePropertyTest(dataValue);
dataValue = new DataValue()
{
ServerTimestamp = new DateTime(2001, 01, 07).ToUniversalTime(),
ServerPicoseconds = 7,
SourceTimestamp = new DateTime(2001, 01, 08).ToUniversalTime(),
SourcePicoseconds = 8,
StatusCode = StatusCodes.BadNotFound
};
EncodeDataValueWithoutValuePropertyTest(dataValue);
}


private void EncodeDataValueWithoutValuePropertyTest(DataValue dataValue)
{
var encoderType = EncodingType.Binary;
var builtInType = BuiltInType.Null;
var memoryStreamType = MemoryStreamType.MemoryStream;
var jsonEncodingType = JsonEncodingType.Reversible;
string encodeInfo = $"Encoder: {encoderType} Type:{builtInType}";
TestContext.Out.WriteLine(encodeInfo);
DataValue expected = dataValue;
Assert.IsNotNull(expected, "Expected DataValue is Null, " + encodeInfo);

string formatted = null;
DataValue result = null;
byte[] buffer;
using (MemoryStream encoderStream = CreateEncoderMemoryStream(memoryStreamType))
{
using (
IEncoder encoder = CreateEncoder(
encoderType,
Context,
encoderStream,
typeof(DataValue),
jsonEncodingType))
{
encoder.WriteDataValue("DataValue", expected);
}
buffer = encoderStream.ToArray();
}

switch (encoderType)
{
case EncodingType.Json:
formatted = PrettifyAndValidateJson(buffer);
break;
case EncodingType.Xml:
formatted = PrettifyAndValidateXml(buffer);
break;
}

using (var decoderStream = new MemoryStream(buffer))
using (IDecoder decoder = CreateDecoder(
encoderType,
Context,
decoderStream,
typeof(DataValue)))
{
result = decoder.ReadDataValue("DataValue");
}

Assert.IsNotNull(result, "Resulting DataValue is Null, " + encodeInfo);
expected.Value
= AdjustExpectedBoundaryValues(encoderType, builtInType, expected.Value);
// currently: Pico are lost
Assert.AreEqual(expected, result, encodeInfo);
Assert.IsTrue(
Utils.IsEqual(expected, result),
"Opc.Ua.Utils.IsEqual failed to compare expected and result. " + encodeInfo);
}

/// <summary>
/// Verify encode and decode of a default built in type
/// value as Variant in a DataValue.
Expand Down
Loading