/*
* JBoss, Home of Professional Open Source
* Copyright 2008-12, Red Hat Middleware LLC, and others contributors as indicated
* by the @authors tag. All rights reserved.
* See the copyright.txt in the distribution for a
* full listing of individual contributors.
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License, v. 2.1.
* This program is distributed in the hope that it will be useful, but WITHOUT A
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License,
* v.2.1 along with this distribution; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package org.savara.protocol.export.monitor;
import static org.junit.Assert.*;
import org.savara.protocol.model.Join;
import org.savara.protocol.model.Fork;
import org.scribble.common.logging.CachedJournal;
import org.scribble.protocol.model.*;
import org.scribble.protocol.monitor.util.MonitorModelUtil;
public class ForkJoinMonitorExportVisitorTest {
@org.junit.Test
public void testSimpleForkJoin() {
ProtocolModel pm=new ProtocolModel();
Role p1=new Role();
p1.setName("p1");
Role p2=new Role();
p2.setName("p2");
Protocol p=new Protocol();
p.setLocatedRole(p1);
pm.setProtocol(p);
Interaction i1=new Interaction();
MessageSignature ms1=new MessageSignature();
ms1.setOperation("op1");
i1.setMessageSignature(ms1);
i1.getToRoles().add(p2);
p.getBlock().add(i1);
Parallel par1=new Parallel();
p.getBlock().add(par1);
Block b1=new Block();
par1.getPaths().add(b1);
Interaction i3=new Interaction();
MessageSignature ms3=new MessageSignature();
ms3.setOperation("op3");
i3.setMessageSignature(ms3);
i3.getToRoles().add(p2);
b1.add(i3);
Fork fork=new Fork();
fork.setLabel("link1");
b1.add(fork);
Block b2=new Block();
par1.getPaths().add(b2);
Join join=new Join();
join.getLabels().add("link1");
b2.add(join);
Interaction i5=new Interaction();
MessageSignature ms5=new MessageSignature();
ms5.setOperation("op5");
i5.setMessageSignature(ms5);
i5.getToRoles().add(p2);
b2.add(i5);
Interaction i6=new Interaction();
MessageSignature ms6=new MessageSignature();
ms6.setOperation("op6");
i6.setMessageSignature(ms6);
i6.setFromRole(p2);
p.getBlock().add(i6);
ForkJoinMonitorExportVisitor exporter=new ForkJoinMonitorExportVisitor();
CachedJournal journal=new CachedJournal();
exporter.setJournal(journal);
pm.visit(exporter);
if (journal.getIssues().size() > 0) {
fail("Export should not have raised any issues");
}
if (exporter.getDescription() == null) {
fail("No monitor description generated");
}
validateMonitor(exporter.getDescription(), "SimpleForkJoin");
}
@org.junit.Test
public void testMultipleForkJoin() {
ProtocolModel pm=new ProtocolModel();
Role p1=new Role();
p1.setName("p1");
Role p2=new Role();
p2.setName("p2");
Protocol p=new Protocol();
p.setLocatedRole(p1);
pm.setProtocol(p);
Interaction i1=new Interaction();
MessageSignature ms1=new MessageSignature();
ms1.setOperation("op1");
i1.setMessageSignature(ms1);
i1.getToRoles().add(p2);
p.getBlock().add(i1);
Parallel par1=new Parallel();
p.getBlock().add(par1);
Block b1=new Block();
par1.getPaths().add(b1);
Interaction i3=new Interaction();
MessageSignature ms3=new MessageSignature();
ms3.setOperation("op3");
i3.setMessageSignature(ms3);
i3.getToRoles().add(p2);
b1.add(i3);
Fork fork=new Fork();
fork.setLabel("link1");
b1.add(fork);
Block b2=new Block();
par1.getPaths().add(b2);
Join join=new Join();
join.getLabels().add("link1");
join.getLabels().add("link2");
b2.add(join);
Interaction i5=new Interaction();
MessageSignature ms5=new MessageSignature();
ms5.setOperation("op5");
i5.setMessageSignature(ms5);
i5.getToRoles().add(p2);
b2.add(i5);
Block b3=new Block();
par1.getPaths().add(b3);
Interaction i4=new Interaction();
MessageSignature ms4=new MessageSignature();
ms4.setOperation("op4");
i4.setMessageSignature(ms4);
i4.getToRoles().add(p2);
b3.add(i4);
Fork fork2=new Fork();
fork2.setLabel("link2");
b3.add(fork2);
Interaction i6=new Interaction();
MessageSignature ms6=new MessageSignature();
ms6.setOperation("op6");
i6.setMessageSignature(ms6);
i6.setFromRole(p2);
p.getBlock().add(i6);
ForkJoinMonitorExportVisitor exporter=new ForkJoinMonitorExportVisitor();
CachedJournal journal=new CachedJournal();
exporter.setJournal(journal);
pm.visit(exporter);
if (journal.getIssues().size() > 0) {
fail("Export should not have raised any issues");
}
if (exporter.getDescription() == null) {
fail("No monitor description generated");
}
validateMonitor(exporter.getDescription(), "MultipleForkJoin");
}
@org.junit.Test
public void testRepeatForkJoin() {
ProtocolModel pm=new ProtocolModel();
Role p1=new Role();
p1.setName("p1");
Role p2=new Role();
p2.setName("p2");
Protocol p=new Protocol();
p.setLocatedRole(p1);
pm.setProtocol(p);
Interaction i1=new Interaction();
MessageSignature ms1=new MessageSignature();
ms1.setOperation("op1");
i1.setMessageSignature(ms1);
i1.getToRoles().add(p2);
p.getBlock().add(i1);
Repeat repeat1=new Repeat();
p.getBlock().add(repeat1);
Parallel par1=new Parallel();
repeat1.getBlock().add(par1);
Block b1=new Block();
par1.getPaths().add(b1);
Interaction i3=new Interaction();
MessageSignature ms3=new MessageSignature();
ms3.setOperation("op3");
i3.setMessageSignature(ms3);
i3.getToRoles().add(p2);
b1.add(i3);
Fork fork=new Fork();
fork.setLabel("link1");
b1.add(fork);
Block b2=new Block();
par1.getPaths().add(b2);
Join join=new Join();
join.getLabels().add("link1");
b2.add(join);
Interaction i5=new Interaction();
MessageSignature ms5=new MessageSignature();
ms5.setOperation("op5");
i5.setMessageSignature(ms5);
i5.getToRoles().add(p2);
b2.add(i5);
Interaction i6=new Interaction();
MessageSignature ms6=new MessageSignature();
ms6.setOperation("op6");
i6.setMessageSignature(ms6);
i6.setFromRole(p2);
repeat1.getBlock().add(i6);
Interaction i7=new Interaction();
MessageSignature ms7=new MessageSignature();
ms7.setOperation("op7");
i7.setMessageSignature(ms7);
i7.setFromRole(p2);
p.getBlock().add(i7);
ForkJoinMonitorExportVisitor exporter=new ForkJoinMonitorExportVisitor();
CachedJournal journal=new CachedJournal();
exporter.setJournal(journal);
pm.visit(exporter);
if (journal.getIssues().size() > 0) {
fail("Export should not have raised any issues");
}
if (exporter.getDescription() == null) {
fail("No monitor description generated");
}
validateMonitor(exporter.getDescription(), "RepeatForkJoin");
}
protected void validateMonitor(org.scribble.protocol.monitor.model.Description pd, String filename) {
java.io.ByteArrayOutputStream os=new java.io.ByteArrayOutputStream();
String pdtext=null;
try {
MonitorModelUtil.serialize(pd, os);
pdtext = new String(os.toByteArray());
os.close();
} catch (Exception e) {
fail("Failed to serialize description associated with filename '"+filename+"'");
}
java.io.InputStream is=
ForkJoinMonitorExportVisitorTest.class.getResourceAsStream("/monitor/results/"+filename+".txt");
if (is == null) {
fail("Failed to load protocol '"+filename+"'");
}
byte[] b=null;
try {
b = new byte[is.available()];
is.read(b);
is.close();
} catch (Exception e) {
fail("Failed to load result '"+filename+": "+e);
}
String result=new String(b);
if (result.equals(pdtext) == false) {
System.out.println("["+filename+"]="+pdtext);
fail("Monitor result incorrect: was expecting (len="+result.length()+") ["+result+
"] but got (len="+pdtext.length()+") ["+pdtext+"]");
}
}
}