libiec61850/dotnet/tests/Test.cs

460 lines
12 KiB
C#
Raw Permalink Normal View History

using NUnit.Framework;
using System;
using IEC61850.Common;
using IEC61850.Client;
using IEC61850.Server;
using System.Collections.Generic;
using System.Threading;
namespace tests
{
[TestFixture ()]
public class Test
{
[Test ()]
public void TestCase ()
{
var val = new MmsValue (10.0f);
Assert.AreEqual (10.0f, val.ToFloat ());
}
[Test ()]
public void MmsValueBitString ()
{
var val = MmsValue.NewBitString(10);
Assert.AreEqual (MmsType.MMS_BIT_STRING, val.GetType());
Assert.AreEqual (10, val.Size());
val.BitStringFromUInt32(7);
Assert.AreEqual(7, val.BitStringToUInt32());
Assert.AreEqual(true, val.GetBit(0));
Assert.AreEqual(true, val.GetBit(1));
Assert.AreEqual(true, val.GetBit(2));
Assert.AreEqual(false, val.GetBit(3));
Assert.AreEqual(false, val.GetBit(9));
Assert.AreEqual(false, val.GetBit(10));
val.SetBit(3, true);
Assert.AreEqual(true, val.GetBit(3));
Assert.AreEqual(15, val.BitStringToUInt32());
val.SetBit(3, false);
Assert.AreEqual(7, val.BitStringToUInt32());
}
[Test()]
public void MmsValueOctetString ()
{
var val = MmsValue.NewOctetString(20);
Assert.AreEqual (0, val.Size());
Assert.AreEqual (20, val.MaxSize());
byte[] octetString = val.getOctetString();
Assert.AreEqual (0, octetString.Length);
octetString = new byte[5];
octetString[0] = 0x11;
octetString[1] = 0x12;
octetString[2] = 0x13;
octetString[3] = 0x14;
octetString[4] = 0x15;
val.setOctetString(octetString);
Assert.AreEqual(5, val.Size());
byte[] secondOctetString = val.getOctetString();
Assert.AreEqual(octetString, secondOctetString);
}
2016-01-18 11:33:25 +01:00
[Test ()]
public void MmsValueFloat()
{
var val = new MmsValue ((float) 1234.5678);
Assert.AreEqual (val.ToFloat (), (float)1234.5678);
val.SetFloat ((float) 0.1234);
Assert.AreEqual (val.ToFloat (), (float) 0.1234);
Assert.AreEqual (val.ToDouble (), (double) 0.1234, (double) 0.0001);
}
[Test ()]
public void MmsValueDouble()
{
var val = new MmsValue ((double) 1234.5678);
Assert.AreEqual (val.ToDouble (), (double)1234.5678);
val.SetDouble ((double) 0.1234);
Assert.AreEqual (val.ToDouble (), (double) 0.1234);
Assert.AreEqual (val.ToFloat (), (float)0.1234);
}
[Test ()]
public void Timestamps()
{
Timestamp timestamp = new Timestamp ();
Assert.IsTrue (timestamp.LeapSecondKnown);
Assert.IsFalse (timestamp.ClockFailure);
Assert.IsFalse (timestamp.ClockNotSynchronized);
timestamp.LeapSecondKnown = false;
Assert.IsFalse (timestamp.LeapSecondKnown);
timestamp.ClockFailure = true;
Assert.IsTrue (timestamp.ClockFailure);
timestamp.ClockNotSynchronized = true;
Assert.IsTrue (timestamp.ClockNotSynchronized);
Assert.AreEqual (0, timestamp.SubsecondPrecision);
timestamp.SubsecondPrecision = 10;
Assert.AreEqual (10, timestamp.SubsecondPrecision);
}
[Test ()]
public void CreateModelFromNonExistingFile()
{
IedModel iedModel = ConfigFileParser.CreateModelFromConfigFile ("test.cfg");
Assert.IsNull (iedModel);
}
[Test ()]
public void CreateModelFromFile()
{
IedModel iedModel = ConfigFileParser.CreateModelFromConfigFile ("../../model.cfg");
Assert.NotNull (iedModel);
}
[Test ()]
public void StartStopSimpleServer()
{
IedModel iedModel = ConfigFileParser.CreateModelFromConfigFile ("../../model.cfg");
IedServer iedServer = new IedServer (iedModel);
Assert.NotNull (iedServer);
iedServer.Start (10002);
Assert.IsTrue (iedServer.IsRunning ());
iedServer.Stop ();
Assert.IsFalse (iedServer.IsRunning ());
iedServer.Destroy ();
}
[Test ()]
public void ConnectToServer()
{
IedModel iedModel = ConfigFileParser.CreateModelFromConfigFile ("../../model.cfg");
IedServer iedServer = new IedServer (iedModel);
iedServer.Start (10002);
IedConnection connection = new IedConnection ();
connection.Connect ("localhost", 10002);
List<string> list = connection.GetServerDirectory ();
Assert.IsNotEmpty (list);
Assert.AreEqual (list.ToArray () [0], "simpleIOGenericIO");
iedServer.Stop ();
iedServer.Destroy ();
}
2016-01-18 11:33:25 +01:00
[Test ()]
public void ReadNonExistingObject()
{
IedModel iedModel = ConfigFileParser.CreateModelFromConfigFile ("../../model.cfg");
IedServer iedServer = new IedServer (iedModel);
iedServer.Start (10002);
IedConnection connection = new IedConnection ();
connection.Connect ("localhost", 10002);
MmsValue value = connection.ReadValue ("simpleIOGenericIO/GGIO1.SPCSO1.stVal", FunctionalConstraint.MX);
Assert.IsNotNull (value);
Assert.AreEqual (MmsType.MMS_DATA_ACCESS_ERROR, value.GetType ());
iedServer.Stop ();
iedServer.Destroy ();
}
[Test ()]
public void AccessDataModelServerSide()
{
IedModel iedModel = ConfigFileParser.CreateModelFromConfigFile ("../../model.cfg");
ModelNode modelNode = iedModel.GetModelNodeByShortObjectReference ("GenericIO/GGIO1.AnIn1");
Assert.IsTrue (modelNode.GetType ().Equals (typeof(DataObject)));
modelNode = iedModel.GetModelNodeByShortObjectReference ("GenericIO/GGIO1.AnIn1.mag.f");
2016-10-17 12:30:45 +02:00
Assert.IsTrue (modelNode.GetType ().Equals (typeof(IEC61850.Server.DataAttribute)));
Assert.IsNotNull (modelNode);
}
[Test ()]
public void AccessDataModelClientServer()
{
IedModel iedModel = ConfigFileParser.CreateModelFromConfigFile ("../../model.cfg");
ModelNode ind1 = iedModel.GetModelNodeByShortObjectReference ("GenericIO/GGIO1.Ind1.stVal");
2016-10-17 12:30:45 +02:00
Assert.IsTrue (ind1.GetType ().Equals (typeof(IEC61850.Server.DataAttribute)));
IedServer iedServer = new IedServer (iedModel);
iedServer.Start (10002);
2016-10-17 12:30:45 +02:00
iedServer.UpdateBooleanAttributeValue((IEC61850.Server.DataAttribute) ind1, true);
IedConnection connection = new IedConnection ();
connection.Connect ("localhost", 10002);
bool stVal = connection.ReadBooleanValue ("simpleIOGenericIO/GGIO1.Ind1.stVal", FunctionalConstraint.ST);
Assert.IsTrue (stVal);
2016-10-17 12:30:45 +02:00
iedServer.UpdateBooleanAttributeValue((IEC61850.Server.DataAttribute) ind1, false);
stVal = connection.ReadBooleanValue ("simpleIOGenericIO/GGIO1.Ind1.stVal", FunctionalConstraint.ST);
Assert.IsFalse (stVal);
connection.Abort ();
iedServer.Stop ();
iedServer.Destroy ();
}
[Test()]
public void ControlWriteAccessToServer()
{
IedModel iedModel = ConfigFileParser.CreateModelFromConfigFile ("../../model.cfg");
2016-10-17 12:30:45 +02:00
IEC61850.Server.DataAttribute opDlTmms = (IEC61850.Server.DataAttribute) iedModel.GetModelNodeByShortObjectReference("GenericIO/PDUP1.OpDlTmms.setVal");
IEC61850.Server.DataAttribute rsDlTmms = (IEC61850.Server.DataAttribute)iedModel.GetModelNodeByShortObjectReference ("GenericIO/PDUP1.RsDlTmms.setVal");
IedServer iedServer = new IedServer (iedModel);
int opDlTmmsValue = 0;
2016-10-17 12:30:45 +02:00
iedServer.HandleWriteAccess (opDlTmms, delegate(IEC61850.Server.DataAttribute dataAttr, MmsValue value, ClientConnection con, object parameter) {
opDlTmmsValue = value.ToInt32();
2016-11-28 19:27:08 +01:00
return MmsDataAccessError.SUCCESS;
}, null);
2016-10-17 12:30:45 +02:00
iedServer.HandleWriteAccess (rsDlTmms, delegate(IEC61850.Server.DataAttribute dataAttr, MmsValue value, ClientConnection con, object parameter) {
if (value.ToInt32() > 1000)
2016-11-28 19:27:08 +01:00
return MmsDataAccessError.OBJECT_VALUE_INVALID;
else
2016-11-28 19:27:08 +01:00
return MmsDataAccessError.SUCCESS;
}, null);
iedServer.Start (10002);
IedConnection connection = new IedConnection ();
connection.Connect ("localhost", 10002);
connection.WriteValue ("simpleIOGenericIO/PDUP1.OpDlTmms.setVal", FunctionalConstraint.SP, new MmsValue ((int)1234));
try {
connection.WriteValue ("simpleIOGenericIO/PDUP1.RsDlTmms.setVal", FunctionalConstraint.SP, new MmsValue ((int)1234));
}
catch (IedConnectionException e) {
Assert.AreEqual (IedClientError.IED_ERROR_OBJECT_VALUE_INVALID, e.GetIedClientError());
}
connection.WriteValue ("simpleIOGenericIO/PDUP1.RsDlTmms.setVal", FunctionalConstraint.SP, new MmsValue ((int)999));
MmsValue rsDlTmmsValue = iedServer.GetAttributeValue (rsDlTmms);
Assert.AreEqual (999, rsDlTmmsValue.ToInt32 ());
connection.Abort ();
iedServer.Stop ();
Assert.AreEqual ((int) 1234, opDlTmmsValue);
iedServer.Destroy ();
}
[Test()]
public void WriteAccessPolicy()
{
IedModel iedModel = ConfigFileParser.CreateModelFromConfigFile ("../../model.cfg");
2016-10-17 12:30:45 +02:00
IEC61850.Server.DataAttribute opDlTmms = (IEC61850.Server.DataAttribute) iedModel.GetModelNodeByShortObjectReference("GenericIO/PDUP1.OpDlTmms.setVal");
IEC61850.Server.DataAttribute rsDlTmms = (IEC61850.Server.DataAttribute)iedModel.GetModelNodeByShortObjectReference("GenericIO/PDUP1.RsDlTmms.setVal");
IedServer iedServer = new IedServer (iedModel);
2016-10-17 12:30:45 +02:00
iedServer.HandleWriteAccess (opDlTmms, delegate(IEC61850.Server.DataAttribute dataAttr, MmsValue value, ClientConnection con, object parameter) {
2016-11-28 19:27:08 +01:00
return MmsDataAccessError.SUCCESS;
}, null);
iedServer.Start (10002);
IedConnection connection = new IedConnection ();
connection.Connect ("localhost", 10002);
connection.WriteValue ("simpleIOGenericIO/PDUP1.RsDlTmms.setVal", FunctionalConstraint.SP, new MmsValue ((int)1234));
iedServer.SetWriteAccessPolicy (FunctionalConstraint.SP, AccessPolicy.ACCESS_POLICY_DENY);
connection.WriteValue ("simpleIOGenericIO/PDUP1.OpDlTmms.setVal", FunctionalConstraint.SP, new MmsValue ((int)1234));
try {
connection.WriteValue ("simpleIOGenericIO/PDUP1.RsDlTmms.setVal", FunctionalConstraint.SP, new MmsValue ((int)999));
}
catch (IedConnectionException e) {
Assert.AreEqual (IedClientError.IED_ERROR_ACCESS_DENIED, e.GetIedClientError());
}
MmsValue rsDlTmmsValue = iedServer.GetAttributeValue (rsDlTmms);
Assert.AreEqual (1234, rsDlTmmsValue.ToInt32 ());
connection.Abort ();
iedServer.Stop ();
iedServer.Destroy ();
}
[Test()]
public void ControlHandler()
{
IedModel iedModel = ConfigFileParser.CreateModelFromConfigFile ("../../model.cfg");
DataObject spcso1 = (DataObject)iedModel.GetModelNodeByShortObjectReference ("GenericIO/GGIO1.SPCSO1");
Assert.IsNotNull (spcso1);
int handlerCalled = 0;
IedServer iedServer = new IedServer (iedModel);
iedServer.SetControlHandler (spcso1, delegate(DataObject controlObject, object parameter, MmsValue ctlVal, bool test) {
handlerCalled++;
return ControlHandlerResult.OK;
}, null);
iedServer.Start (10002);
IedConnection connection = new IedConnection ();
connection.Connect ("localhost", 10002);
ControlObject controlClient = connection.CreateControlObject ("simpleIOGenericIO/GGIO1.SPCSO1");
Assert.IsNotNull (controlClient);
controlClient.Operate (true);
connection.Abort ();
Assert.AreEqual (1, handlerCalled);
iedServer.Stop ();
iedServer.Destroy ();
}
[Test()]
public void ConnectionHandler()
{
IedModel iedModel = ConfigFileParser.CreateModelFromConfigFile ("../../model.cfg");
int handlerCalled = 0;
int connectionCount = 0;
IedServer iedServer = new IedServer (iedModel);
string ipAddress = null;
iedServer.SetConnectionIndicationHandler(delegate(IedServer server, ClientConnection clientConnection, bool connected, object parameter) {
handlerCalled++;
if (connected)
connectionCount++;
else
connectionCount--;
ipAddress = clientConnection.GetPeerAddress();
}, null);
iedServer.Start (10002);
IedConnection con1 = new IedConnection ();
con1.Connect ("localhost", 10002);
Assert.AreEqual (1, handlerCalled);
Assert.AreEqual (1, connectionCount);
IedConnection con2 = new IedConnection ();
con2.Connect ("localhost", 10002);
Assert.AreEqual (2, handlerCalled);
Assert.AreEqual (2, connectionCount);
con1.Abort ();
con2.Abort ();
Assert.AreEqual (4, handlerCalled);
Assert.AreEqual (0, connectionCount);
Assert.AreEqual ("127.0.0.1:", ipAddress.Substring (0, 10));
iedServer.Stop ();
}
}
}