added test for reporting of dynamically created datasets, fixed bugs to get test running

pull/3/head
Stefan Feuerhahn 8 years ago
parent 10f6ee2898
commit 6ed7849a1a

@ -696,7 +696,8 @@ final class ServerAssociation {
+ getVariableAccessAttributesRequest.getName() + getVariableAccessAttributesRequest.getName()
.getDomainSpecific() .getDomainSpecific()
.getDomainID() .getDomainID()
+ " and ItemID " + getVariableAccessAttributesRequest.getName() + " and ItemID "
+ getVariableAccessAttributesRequest.getName()
.getDomainSpecific() .getDomainSpecific()
.getItemID() .getItemID()
+ " was found."); + " was found.");
@ -1304,7 +1305,7 @@ final class ServerAssociation {
} }
else if (nodeName.equals("DatSet")) { else if (nodeName.equals("DatSet")) {
if ((urcb.reserved == null || urcb.reserved == this) && !urcb.enabled) { if ((urcb.reserved == null || urcb.reserved == this) && !urcb.enabled) {
String dataSetRef = ((BdaVisibleString) fcModelNodeCopy).getStringValue(); String dataSetRef = ((BdaVisibleString) fcModelNodeCopy).getStringValue().replace('$', '.');
if (dataSetRef.isEmpty()) { if (dataSetRef.isEmpty()) {
urcb.dataSet = null; urcb.dataSet = null;
((BasicDataAttribute) modelNode).setValueFrom((BasicDataAttribute) fcModelNodeCopy); ((BasicDataAttribute) modelNode).setValueFrom((BasicDataAttribute) fcModelNodeCopy);
@ -1313,6 +1314,9 @@ final class ServerAssociation {
} }
else { else {
DataSet dataSet = serverModel.getDataSet(dataSetRef); DataSet dataSet = serverModel.getDataSet(dataSetRef);
if (dataSet == null) {
dataSet = nonPersistentDataSets.get(dataSetRef);
}
if (dataSet != null) { if (dataSet != null) {
urcb.dataSet = dataSet; urcb.dataSet = dataSet;
((BasicDataAttribute) modelNode).setValueFrom((BasicDataAttribute) fcModelNodeCopy); ((BasicDataAttribute) modelNode).setValueFrom((BasicDataAttribute) fcModelNodeCopy);

@ -91,7 +91,7 @@ public final class ServerModel extends ModelNode {
} }
void addDataSet(DataSet dataSet) { void addDataSet(DataSet dataSet) {
dataSets.put(dataSet.getReferenceStr(), dataSet); dataSets.put(dataSet.getReferenceStr().replace('$', '.'), dataSet);
for (ModelNode ld : children.values()) { for (ModelNode ld : children.values()) {
for (ModelNode ln : ld.getChildren()) { for (ModelNode ln : ld.getChildren()) {
for (Urcb urcb : ((LogicalNode) ln).getUrcbs()) { for (Urcb urcb : ((LogicalNode) ln).getUrcbs()) {

@ -0,0 +1,182 @@
package org.openmuc.openiec61850.integrationtests;
import static org.junit.Assert.assertNotNull;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.openmuc.openiec61850.BasicDataAttribute;
import org.openmuc.openiec61850.BdaFloat32;
import org.openmuc.openiec61850.ClientAssociation;
import org.openmuc.openiec61850.ClientEventListener;
import org.openmuc.openiec61850.ClientSap;
import org.openmuc.openiec61850.DataSet;
import org.openmuc.openiec61850.Fc;
import org.openmuc.openiec61850.FcModelNode;
import org.openmuc.openiec61850.Report;
import org.openmuc.openiec61850.SclParseException;
import org.openmuc.openiec61850.ServerEventListener;
import org.openmuc.openiec61850.ServerModel;
import org.openmuc.openiec61850.ServerSap;
import org.openmuc.openiec61850.ServiceError;
import org.openmuc.openiec61850.Urcb;
public class ReportingTest implements ClientEventListener {
private static final String PREEXISTING_DATASET_REFERENCE = "ied1lDevice1/LLN0$dataset1";
private static final String CREATED_DATASET_REFERENCE = "ied1lDevice1/LLN0$datasetnew";
private static final String CHANGING_SERVER_DA_REFERENCE_1 = "ied1lDevice1/MMXU1.W.phsA.cVal.mag.f";
private static final String CHANGING_SERVER_DA_REFERENCE_2 = "ied1lDevice1/DSCH1.SchdAbsTm.sptestval1";
private static final int PORT = 54321;
private static final String ICD_FILE = "src/test/resources/openiec61850sample01.icd";
private static final String URCB1_REFERENCE = "ied1lDevice1/LLN0.urcb101";
private ServerSap serverSap;
private ServerModel serverModel;
private ServerModel clientModel;
ClientAssociation clientAssociation;
private int reportCounter = 0;
@Before
public void startServerAndClient() throws SclParseException, UnknownHostException, IOException, ServiceError {
startServer();
startClient();
}
private void startClient() throws IOException, UnknownHostException, ServiceError {
ClientSap clientSap = new ClientSap();
this.clientAssociation = clientSap.associate(InetAddress.getByName("localhost"), PORT, "", this);
this.clientModel = this.clientAssociation.retrieveModel();
}
private void startServer() throws SclParseException, IOException {
final List<ServerSap> sapsFromSclFile = ServerSap.getSapsFromSclFile(ICD_FILE);
if (sapsFromSclFile.isEmpty()) {
throw new IllegalArgumentException("Could not create server sap from '" + ICD_FILE + "'.");
}
this.serverSap = sapsFromSclFile.get(0);
this.serverSap.setPort(PORT);
this.serverSap.startListening(new ServerEventListener() {
@Override
public List<ServiceError> write(List<BasicDataAttribute> arg0) {
return null;
}
@Override
public void serverStoppedListening(ServerSap arg0) {
}
});
this.serverModel = this.serverSap.getModelCopy();
}
@Test
public void reportingTest() throws ServiceError, IOException, InterruptedException {
Urcb urcb = this.clientModel.getUrcb(URCB1_REFERENCE);
assertNotNull(urcb);
this.clientAssociation.getRcbValues(urcb);
this.clientAssociation.reserveUrcb(urcb);
this.clientAssociation.enableReporting(urcb);
Thread.sleep(500);
BdaFloat32 mag = (BdaFloat32) this.serverModel.findModelNode(CHANGING_SERVER_DA_REFERENCE_1, Fc.MX);
Assert.assertNotNull(mag);
Assert.assertEquals(0, this.reportCounter);
mag.setFloat(new Float(3.0));
List<BasicDataAttribute> bdas = new ArrayList<>();
bdas.add(mag);
this.serverSap.setValues(bdas);
Thread.sleep(500);
Assert.assertEquals(1, this.reportCounter);
}
@Test
public void reportingWithCreatedDataSetTest() throws ServiceError, IOException, InterruptedException {
// BdaFloat32 clientMag = (BdaFloat32)this.clientModel.findModelNode(CHANGING_SERVER_DA_REFERENCE, Fc.MX);
FcModelNode clientMag = (FcModelNode) this.clientModel.findModelNode(CHANGING_SERVER_DA_REFERENCE_1, Fc.MX);
assertNotNull(clientMag);
List<FcModelNode> dataSetMembers = new ArrayList<>();
dataSetMembers.add(clientMag);
DataSet dataSet = new DataSet(CREATED_DATASET_REFERENCE, dataSetMembers);
this.clientAssociation.createDataSet(dataSet);
Urcb urcb = this.clientModel.getUrcb(URCB1_REFERENCE);
assertNotNull(urcb);
this.clientAssociation.getRcbValues(urcb);
Assert.assertEquals(PREEXISTING_DATASET_REFERENCE, urcb.getDatSet().getStringValue());
System.out.println("dataset: " + urcb.getDatSet().getStringValue());
this.clientAssociation.reserveUrcb(urcb);
urcb.getDatSet().setValue(CREATED_DATASET_REFERENCE);
List<ServiceError> serviceErrors = this.clientAssociation.setRcbValues(urcb, false, true, false, false, false,
false, false, false);
Assert.assertNull(serviceErrors.get(0));
this.clientAssociation.getRcbValues(urcb);
Assert.assertEquals(CREATED_DATASET_REFERENCE, urcb.getDatSet().getStringValue());
this.clientAssociation.enableReporting(urcb);
Thread.sleep(500);
BdaFloat32 mag = (BdaFloat32) this.serverModel.findModelNode(CHANGING_SERVER_DA_REFERENCE_1, Fc.MX);
Assert.assertNotNull(mag);
Assert.assertEquals(0, this.reportCounter);
mag.setFloat(new Float(3.0));
List<BasicDataAttribute> bdas = new ArrayList<>();
bdas.add(mag);
this.serverSap.setValues(bdas);
Thread.sleep(1_000);
Assert.assertEquals(1, this.reportCounter);
}
@After
public void disconnectAndStopServer() throws Exception {
if (this.serverSap != null) {
this.serverSap.stop();
}
}
@Override
public void associationClosed(IOException arg0) {
}
@Override
public void newReport(Report arg0) {
System.out.println("got a report.");
synchronized (this) {
this.reportCounter++;
}
}
}
Loading…
Cancel
Save