mirror of
https://github.com/OPCFoundation/UA-.NETStandard.git
synced 2026-10-20 00:31:32 +08:00
550 lines
20 KiB
C#
550 lines
20 KiB
C#
/* ========================================================================
|
|
* Copyright (c) 2005-2025 The OPC Foundation, Inc. All rights reserved.
|
|
*
|
|
* OPC Foundation MIT License 1.00
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person
|
|
* obtaining a copy of this software and associated documentation
|
|
* files (the "Software"), to deal in the Software without
|
|
* restriction, including without limitation the rights to use,
|
|
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the
|
|
* Software is furnished to do so, subject to the following
|
|
* conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be
|
|
* included in all copies or substantial portions of the Software.
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
* OTHER DEALINGS IN THE SOFTWARE.
|
|
*
|
|
* The complete license agreement can be found here:
|
|
* http://opcfoundation.org/License/MIT/1.00/
|
|
* ======================================================================*/
|
|
|
|
using NUnit.Framework;
|
|
|
|
namespace Opc.Ua.Client.Tests
|
|
{
|
|
/// <summary>
|
|
/// Tests for the option and state record types that are
|
|
/// source-generated or manually defined in the Client library.
|
|
/// </summary>
|
|
[TestFixture]
|
|
[Category("ClientOptions")]
|
|
[SetCulture("en-us")]
|
|
[SetUICulture("en-us")]
|
|
[Parallelizable]
|
|
public class OptionsContextTests
|
|
{
|
|
[Test]
|
|
public void BrowserOptionsDefaultValues()
|
|
{
|
|
var options = new BrowserOptions();
|
|
|
|
Assert.That(options.BrowseDirection, Is.EqualTo(BrowseDirection.Forward));
|
|
Assert.That(options.IncludeSubtypes, Is.True);
|
|
Assert.That(options.ResultMask, Is.EqualTo((uint)BrowseResultMask.All));
|
|
Assert.That(options.MaxReferencesReturned, Is.Zero);
|
|
Assert.That(options.ContinuationPointPolicy,
|
|
Is.EqualTo(ContinuationPointPolicy.Default));
|
|
Assert.That(options.MaxNodesPerBrowse, Is.Zero);
|
|
Assert.That(options.MaxBrowseContinuationPoints, Is.Zero);
|
|
Assert.That(options.NodeClassMask, Is.Zero);
|
|
Assert.That(options.ReferenceTypeId, Is.EqualTo(NodeId.Null));
|
|
Assert.That(options.RequestHeader, Is.Null);
|
|
Assert.That(options.View, Is.Null);
|
|
}
|
|
|
|
[Test]
|
|
public void BrowserOptionsWithCustomValues()
|
|
{
|
|
var options = new BrowserOptions
|
|
{
|
|
BrowseDirection = BrowseDirection.Inverse,
|
|
IncludeSubtypes = false,
|
|
MaxReferencesReturned = 100,
|
|
NodeClassMask = 0xFF,
|
|
ResultMask = 63,
|
|
ContinuationPointPolicy = ContinuationPointPolicy.Balanced,
|
|
MaxNodesPerBrowse = 50,
|
|
MaxBrowseContinuationPoints = 5,
|
|
ReferenceTypeId = new NodeId(33)
|
|
};
|
|
|
|
Assert.That(options.BrowseDirection, Is.EqualTo(BrowseDirection.Inverse));
|
|
Assert.That(options.IncludeSubtypes, Is.False);
|
|
Assert.That(options.MaxReferencesReturned, Is.EqualTo(100u));
|
|
Assert.That(options.NodeClassMask, Is.EqualTo(0xFF));
|
|
Assert.That(options.ResultMask, Is.EqualTo(63u));
|
|
Assert.That(options.ContinuationPointPolicy,
|
|
Is.EqualTo(ContinuationPointPolicy.Balanced));
|
|
Assert.That(options.MaxNodesPerBrowse, Is.EqualTo(50u));
|
|
Assert.That(options.MaxBrowseContinuationPoints, Is.EqualTo((ushort)5));
|
|
}
|
|
|
|
[Test]
|
|
public void BrowserOptionsRecordEquality()
|
|
{
|
|
var a = new BrowserOptions
|
|
{
|
|
MaxReferencesReturned = 10,
|
|
BrowseDirection = BrowseDirection.Both
|
|
};
|
|
var b = new BrowserOptions
|
|
{
|
|
MaxReferencesReturned = 10,
|
|
BrowseDirection = BrowseDirection.Both
|
|
};
|
|
|
|
Assert.That(a, Is.EqualTo(b));
|
|
Assert.That(a.GetHashCode(), Is.EqualTo(b.GetHashCode()));
|
|
}
|
|
|
|
[Test]
|
|
public void BrowserOptionsRecordInequality()
|
|
{
|
|
var a = new BrowserOptions { MaxReferencesReturned = 10 };
|
|
var b = new BrowserOptions { MaxReferencesReturned = 20 };
|
|
|
|
Assert.That(a, Is.Not.EqualTo(b));
|
|
}
|
|
|
|
[Test]
|
|
public void BrowserOptionsWithExpression()
|
|
{
|
|
var original = new BrowserOptions
|
|
{
|
|
MaxReferencesReturned = 100,
|
|
BrowseDirection = BrowseDirection.Forward
|
|
};
|
|
|
|
BrowserOptions modified = original with { MaxReferencesReturned = 200 };
|
|
|
|
Assert.That(modified.MaxReferencesReturned, Is.EqualTo(200u));
|
|
Assert.That(modified.BrowseDirection, Is.EqualTo(BrowseDirection.Forward));
|
|
Assert.That(original.MaxReferencesReturned, Is.EqualTo(100u));
|
|
}
|
|
|
|
[Test]
|
|
public void SubscriptionOptionsDefaultValues()
|
|
{
|
|
var options = new SubscriptionOptions();
|
|
|
|
Assert.That(options.DisplayName, Is.EqualTo("Subscription"));
|
|
Assert.That(options.PublishingInterval, Is.Zero);
|
|
Assert.That(options.KeepAliveCount, Is.Zero);
|
|
Assert.That(options.LifetimeCount, Is.Zero);
|
|
Assert.That(options.MaxNotificationsPerPublish, Is.Zero);
|
|
Assert.That(options.PublishingEnabled, Is.False);
|
|
Assert.That(options.Priority, Is.Zero);
|
|
Assert.That(options.TimestampsToReturn,
|
|
Is.EqualTo(TimestampsToReturn.Both));
|
|
Assert.That(options.MaxMessageCount, Is.EqualTo(10));
|
|
Assert.That(options.MinLifetimeInterval, Is.Zero);
|
|
Assert.That(options.DisableMonitoredItemCache, Is.False);
|
|
Assert.That(options.SequentialPublishing, Is.False);
|
|
Assert.That(options.RepublishAfterTransfer, Is.False);
|
|
Assert.That(options.TransferId, Is.Zero);
|
|
}
|
|
|
|
[Test]
|
|
public void SubscriptionOptionsWithCustomValues()
|
|
{
|
|
var options = new SubscriptionOptions
|
|
{
|
|
DisplayName = "TestSub",
|
|
PublishingInterval = 500,
|
|
KeepAliveCount = 10,
|
|
LifetimeCount = 30,
|
|
MaxNotificationsPerPublish = 1000,
|
|
PublishingEnabled = true,
|
|
Priority = 200,
|
|
TimestampsToReturn = TimestampsToReturn.Source,
|
|
MaxMessageCount = 50,
|
|
MinLifetimeInterval = 60000,
|
|
DisableMonitoredItemCache = true,
|
|
SequentialPublishing = true,
|
|
RepublishAfterTransfer = true,
|
|
TransferId = 42
|
|
};
|
|
|
|
Assert.That(options.DisplayName, Is.EqualTo("TestSub"));
|
|
Assert.That(options.PublishingInterval, Is.EqualTo(500));
|
|
Assert.That(options.KeepAliveCount, Is.EqualTo(10u));
|
|
Assert.That(options.LifetimeCount, Is.EqualTo(30u));
|
|
Assert.That(options.MaxNotificationsPerPublish, Is.EqualTo(1000u));
|
|
Assert.That(options.PublishingEnabled, Is.True);
|
|
Assert.That(options.Priority, Is.EqualTo((byte)200));
|
|
Assert.That(options.TimestampsToReturn,
|
|
Is.EqualTo(TimestampsToReturn.Source));
|
|
Assert.That(options.MaxMessageCount, Is.EqualTo(50));
|
|
Assert.That(options.MinLifetimeInterval, Is.EqualTo(60000u));
|
|
Assert.That(options.DisableMonitoredItemCache, Is.True);
|
|
Assert.That(options.SequentialPublishing, Is.True);
|
|
Assert.That(options.RepublishAfterTransfer, Is.True);
|
|
Assert.That(options.TransferId, Is.EqualTo(42u));
|
|
}
|
|
|
|
[Test]
|
|
public void SubscriptionOptionsRecordEquality()
|
|
{
|
|
var a = new SubscriptionOptions
|
|
{
|
|
DisplayName = "Test",
|
|
PublishingInterval = 100
|
|
};
|
|
var b = new SubscriptionOptions
|
|
{
|
|
DisplayName = "Test",
|
|
PublishingInterval = 100
|
|
};
|
|
|
|
Assert.That(a, Is.EqualTo(b));
|
|
Assert.That(a.GetHashCode(), Is.EqualTo(b.GetHashCode()));
|
|
}
|
|
|
|
[Test]
|
|
public void SubscriptionOptionsWithExpression()
|
|
{
|
|
var original = new SubscriptionOptions
|
|
{
|
|
DisplayName = "Original",
|
|
PublishingInterval = 100
|
|
};
|
|
|
|
SubscriptionOptions modified = original with { PublishingInterval = 200 };
|
|
|
|
Assert.That(modified.DisplayName, Is.EqualTo("Original"));
|
|
Assert.That(modified.PublishingInterval, Is.EqualTo(200));
|
|
}
|
|
|
|
[Test]
|
|
public void MonitoredItemOptionsDefaultValues()
|
|
{
|
|
var options = new MonitoredItemOptions();
|
|
|
|
Assert.That(options.DisplayName, Is.EqualTo("MonitoredItem"));
|
|
Assert.That(options.StartNodeId, Is.EqualTo(NodeId.Null));
|
|
Assert.That(options.RelativePath, Is.Null);
|
|
Assert.That(options.NodeClass, Is.EqualTo(NodeClass.Variable));
|
|
Assert.That(options.AttributeId, Is.EqualTo(Attributes.Value));
|
|
Assert.That(options.IndexRange, Is.Null);
|
|
Assert.That(options.Encoding, Is.EqualTo(QualifiedName.Null));
|
|
Assert.That(options.MonitoringMode,
|
|
Is.EqualTo(MonitoringMode.Reporting));
|
|
Assert.That(options.SamplingInterval, Is.EqualTo(-1));
|
|
Assert.That(options.Filter, Is.Null);
|
|
Assert.That(options.QueueSize, Is.Zero);
|
|
Assert.That(options.DiscardOldest, Is.True);
|
|
}
|
|
|
|
[Test]
|
|
public void MonitoredItemOptionsWithCustomValues()
|
|
{
|
|
var options = new MonitoredItemOptions
|
|
{
|
|
DisplayName = "Tank1.Level",
|
|
StartNodeId = new NodeId(1000, 2),
|
|
RelativePath = "Level",
|
|
NodeClass = NodeClass.Object,
|
|
AttributeId = Attributes.EventNotifier,
|
|
IndexRange = "0:9",
|
|
MonitoringMode = MonitoringMode.Sampling,
|
|
SamplingInterval = 500,
|
|
QueueSize = 10,
|
|
DiscardOldest = false
|
|
};
|
|
|
|
Assert.That(options.DisplayName, Is.EqualTo("Tank1.Level"));
|
|
Assert.That(options.StartNodeId, Is.EqualTo(new NodeId(1000, 2)));
|
|
Assert.That(options.RelativePath, Is.EqualTo("Level"));
|
|
Assert.That(options.NodeClass, Is.EqualTo(NodeClass.Object));
|
|
Assert.That(options.AttributeId, Is.EqualTo(Attributes.EventNotifier));
|
|
Assert.That(options.IndexRange, Is.EqualTo("0:9"));
|
|
Assert.That(options.MonitoringMode,
|
|
Is.EqualTo(MonitoringMode.Sampling));
|
|
Assert.That(options.SamplingInterval, Is.EqualTo(500));
|
|
Assert.That(options.QueueSize, Is.EqualTo(10u));
|
|
Assert.That(options.DiscardOldest, Is.False);
|
|
}
|
|
|
|
[Test]
|
|
public void MonitoredItemOptionsRecordEquality()
|
|
{
|
|
var a = new MonitoredItemOptions
|
|
{
|
|
DisplayName = "Item1",
|
|
SamplingInterval = 100
|
|
};
|
|
var b = new MonitoredItemOptions
|
|
{
|
|
DisplayName = "Item1",
|
|
SamplingInterval = 100
|
|
};
|
|
|
|
Assert.That(a, Is.EqualTo(b));
|
|
Assert.That(a.GetHashCode(), Is.EqualTo(b.GetHashCode()));
|
|
}
|
|
|
|
[Test]
|
|
public void MonitoredItemOptionsWithExpression()
|
|
{
|
|
var original = new MonitoredItemOptions
|
|
{
|
|
DisplayName = "Orig",
|
|
SamplingInterval = 100
|
|
};
|
|
|
|
MonitoredItemOptions modified = original with { SamplingInterval = 500 };
|
|
|
|
Assert.That(modified.DisplayName, Is.EqualTo("Orig"));
|
|
Assert.That(modified.SamplingInterval, Is.EqualTo(500));
|
|
}
|
|
|
|
[Test]
|
|
public void SessionOptionsDefaultValues()
|
|
{
|
|
var options = new SessionOptions();
|
|
|
|
Assert.That(options.SessionName, Is.Null);
|
|
Assert.That(options.Identity, Is.Null);
|
|
Assert.That(options.ConfiguredEndpoint, Is.Null);
|
|
Assert.That(options.CheckDomain, Is.False);
|
|
}
|
|
|
|
[Test]
|
|
public void SessionOptionsWithCustomValues()
|
|
{
|
|
var options = new SessionOptions
|
|
{
|
|
SessionName = "TestSession",
|
|
CheckDomain = true
|
|
};
|
|
|
|
Assert.That(options.SessionName, Is.EqualTo("TestSession"));
|
|
Assert.That(options.CheckDomain, Is.True);
|
|
}
|
|
|
|
[Test]
|
|
public void SessionOptionsRecordEquality()
|
|
{
|
|
var a = new SessionOptions { SessionName = "S1", CheckDomain = true };
|
|
var b = new SessionOptions { SessionName = "S1", CheckDomain = true };
|
|
|
|
Assert.That(a, Is.EqualTo(b));
|
|
}
|
|
|
|
[Test]
|
|
public void SessionStateInheritsFromSessionOptions()
|
|
{
|
|
var options = new SessionOptions
|
|
{
|
|
SessionName = "TestSession",
|
|
CheckDomain = true
|
|
};
|
|
|
|
var state = new SessionState(options);
|
|
|
|
Assert.That(state.SessionName, Is.EqualTo("TestSession"));
|
|
Assert.That(state.CheckDomain, Is.True);
|
|
Assert.That(state.SessionId, Is.EqualTo(NodeId.Null));
|
|
Assert.That(state.AuthenticationToken, Is.EqualTo(NodeId.Null));
|
|
}
|
|
|
|
[Test]
|
|
public void SessionStateDefaultValues()
|
|
{
|
|
var state = new SessionState();
|
|
|
|
Assert.That(state.Timestamp, Is.Not.EqualTo(default(System.DateTime)));
|
|
Assert.That(state.ServerNonce.IsNull, Is.True);
|
|
Assert.That(state.UserIdentityTokenPolicy, Is.Null);
|
|
Assert.That(state.ServerEccEphemeralKey.IsNull, Is.True);
|
|
Assert.That(state.Subscriptions.IsEmpty, Is.True);
|
|
}
|
|
|
|
[Test]
|
|
public void SessionConfigurationInheritsFromSessionState()
|
|
{
|
|
var state = new SessionState
|
|
{
|
|
SessionName = "Test",
|
|
SessionId = new NodeId(100)
|
|
};
|
|
|
|
var config = new SessionConfiguration(state);
|
|
|
|
Assert.That(config.SessionName, Is.EqualTo("Test"));
|
|
Assert.That(config.SessionId, Is.EqualTo(new NodeId(100)));
|
|
}
|
|
|
|
[Test]
|
|
public void SubscriptionStateInheritsFromOptions()
|
|
{
|
|
var options = new SubscriptionOptions
|
|
{
|
|
DisplayName = "TestSub",
|
|
PublishingInterval = 500,
|
|
PublishingEnabled = true
|
|
};
|
|
|
|
var state = new SubscriptionState(options)
|
|
{
|
|
MonitoredItems = [],
|
|
CurrentPublishingInterval = 500.0,
|
|
CurrentKeepAliveCount = 10,
|
|
CurrentLifetimeCount = 30
|
|
};
|
|
|
|
Assert.That(state.DisplayName, Is.EqualTo("TestSub"));
|
|
Assert.That(state.PublishingInterval, Is.EqualTo(500));
|
|
Assert.That(state.PublishingEnabled, Is.True);
|
|
Assert.That(state.CurrentPublishingInterval, Is.EqualTo(500.0));
|
|
Assert.That(state.CurrentKeepAliveCount, Is.EqualTo(10u));
|
|
Assert.That(state.CurrentLifetimeCount, Is.EqualTo(30u));
|
|
Assert.That(state.MonitoredItems.IsNull, Is.False);
|
|
}
|
|
|
|
[Test]
|
|
public void MonitoredItemStateInheritsFromOptions()
|
|
{
|
|
var options = new MonitoredItemOptions
|
|
{
|
|
DisplayName = "TestItem",
|
|
SamplingInterval = 200,
|
|
QueueSize = 5
|
|
};
|
|
|
|
var state = new MonitoredItemState(options)
|
|
{
|
|
ServerId = 42,
|
|
ClientId = 7,
|
|
TriggeringItemId = 0,
|
|
CacheQueueSize = 10
|
|
};
|
|
|
|
Assert.That(state.DisplayName, Is.EqualTo("TestItem"));
|
|
Assert.That(state.SamplingInterval, Is.EqualTo(200));
|
|
Assert.That(state.QueueSize, Is.EqualTo(5u));
|
|
Assert.That(state.ServerId, Is.EqualTo(42u));
|
|
Assert.That(state.ClientId, Is.EqualTo(7u));
|
|
Assert.That(state.TriggeringItemId, Is.Zero);
|
|
Assert.That(state.CacheQueueSize, Is.EqualTo(10u));
|
|
Assert.That(state.Timestamp, Is.Not.EqualTo(default(System.DateTime)));
|
|
}
|
|
|
|
[Test]
|
|
public void MonitoredItemStateCollectionClone()
|
|
{
|
|
var item1 = new MonitoredItemState
|
|
{
|
|
DisplayName = "Item1",
|
|
ServerId = 1
|
|
};
|
|
var item2 = new MonitoredItemState
|
|
{
|
|
DisplayName = "Item2",
|
|
ServerId = 2
|
|
};
|
|
var collection = new MonitoredItemStateCollection { item1, item2 };
|
|
|
|
var clone = (MonitoredItemStateCollection)collection.Clone();
|
|
|
|
Assert.That(clone, Has.Count.EqualTo(2));
|
|
Assert.That(clone[0].DisplayName, Is.EqualTo("Item1"));
|
|
Assert.That(clone[1].DisplayName, Is.EqualTo("Item2"));
|
|
}
|
|
|
|
[Test]
|
|
public void MonitoredItemStateCollectionConstructors()
|
|
{
|
|
var empty = new MonitoredItemStateCollection();
|
|
Assert.That(empty, Has.Count.EqualTo(0));
|
|
|
|
var withCapacity = new MonitoredItemStateCollection(10);
|
|
Assert.That(withCapacity, Has.Count.EqualTo(0));
|
|
|
|
var item = new MonitoredItemState { DisplayName = "X" };
|
|
var fromEnumerable = new MonitoredItemStateCollection(
|
|
[item]);
|
|
Assert.That(fromEnumerable, Has.Count.EqualTo(1));
|
|
}
|
|
|
|
[Test]
|
|
public void SubscriptionStateCollectionClone()
|
|
{
|
|
var sub = new SubscriptionState
|
|
{
|
|
DisplayName = "Sub1",
|
|
MonitoredItems = []
|
|
};
|
|
var collection = new SubscriptionStateCollection { sub };
|
|
|
|
var clone = (SubscriptionStateCollection)collection.Clone();
|
|
|
|
Assert.That(clone, Has.Count.EqualTo(1));
|
|
Assert.That(clone[0].DisplayName, Is.EqualTo("Sub1"));
|
|
}
|
|
|
|
[Test]
|
|
public void SubscriptionStateCollectionConstructors()
|
|
{
|
|
var empty = new SubscriptionStateCollection();
|
|
Assert.That(empty, Has.Count.EqualTo(0));
|
|
|
|
var withCapacity = new SubscriptionStateCollection(10);
|
|
Assert.That(withCapacity, Has.Count.EqualTo(0));
|
|
|
|
var sub = new SubscriptionState
|
|
{
|
|
DisplayName = "S",
|
|
MonitoredItems = []
|
|
};
|
|
var fromEnumerable = new SubscriptionStateCollection(
|
|
[sub]);
|
|
Assert.That(fromEnumerable, Has.Count.EqualTo(1));
|
|
}
|
|
|
|
[Test]
|
|
public void NodeSetExportOptionsDefault()
|
|
{
|
|
NodeSetExportOptions options = NodeSetExportOptions.Default;
|
|
|
|
Assert.That(options.ExportValues, Is.False);
|
|
Assert.That(options.ExportParentNodeId, Is.False);
|
|
Assert.That(options.ExportUserContext, Is.False);
|
|
}
|
|
|
|
[Test]
|
|
public void NodeSetExportOptionsComplete()
|
|
{
|
|
NodeSetExportOptions options = NodeSetExportOptions.Complete;
|
|
|
|
Assert.That(options.ExportValues, Is.True);
|
|
Assert.That(options.ExportParentNodeId, Is.True);
|
|
Assert.That(options.ExportUserContext, Is.True);
|
|
}
|
|
|
|
[Test]
|
|
public void NodeSetExportOptionsCustom()
|
|
{
|
|
var options = new NodeSetExportOptions
|
|
{
|
|
ExportValues = true,
|
|
ExportParentNodeId = false,
|
|
ExportUserContext = true
|
|
};
|
|
|
|
Assert.That(options.ExportValues, Is.True);
|
|
Assert.That(options.ExportParentNodeId, Is.False);
|
|
Assert.That(options.ExportUserContext, Is.True);
|
|
}
|
|
}
|
|
}
|