1
2
3
4
5
6
7
8
9 package net.kwfgrid.gwes;
10
11 import net.kwfgrid.gwes.exception.*;
12 import org.apache.log4j.Logger;
13 import org.jaxen.JaxenException;
14 import org.jdom.JDOMException;
15 import junit.framework.Test;
16 import junit.framework.TestSuite;
17 import junit.framework.Assert;
18
19 import java.io.IOException;
20 import java.util.List;
21 import java.util.Map;
22 import java.util.HashMap;
23
24 import net.kwfgrid.gwes.workflowanalyzer.LongDistribution;
25 import net.kwfgrid.gwes.prorater.Node;
26 import net.kwfgrid.gwes.prorater.RecurrentProrater;
27 import net.kwfgrid.gworkflowdl.structure.WorkflowFormatException;
28
29
30
31
32
33
34
35
36
37
38 public final class GWESBasicTest extends LocalGWESAbstractTestCase {
39
40 static Logger logger = Logger.getLogger(GWESBasicTest.class);
41
42
43
44
45
46
47 public GWESBasicTest(String testName) throws LoggingException {
48 super(testName);
49 }
50
51
52
53
54 public static Test suite() {
55 return new TestSuite(GWESBasicTest.class);
56 }
57
58
59
60
61 public void testRemoveWorkflow() throws IOException, NoSuchWorkflowException, WorkflowSecurityException, StateTransitionException, WorkflowFormatException, InterruptedException, DatabaseException, JaxenException, JDOMException, LoggingException, GWESException {
62 String gworkflowdl = testGWES("examples/controlflow/gworkflowdl_test.xml", WorkflowStatus.STATUS_COMPLETED);
63 String sequence = extractOccurrenceSequence(gworkflowdl);
64 Assert.assertEquals("Occurrence sequence", "t",sequence);
65 String[] workflowIDs = gwes.getWorkflowIDs(1, userID);
66 Assert.assertEquals("WorkflowID",workflowID,workflowIDs[0]);
67 gwes.remove(workflowID, 1, userID);
68 workflowIDs = gwes.getWorkflowIDs(1, userID);
69 Assert.assertEquals("WorkflowIDs", 0, workflowIDs.length);
70 }
71
72
73
74
75 public void testWorkflowProperites() throws IOException, NoSuchWorkflowException, WorkflowSecurityException, StateTransitionException, WorkflowFormatException, InterruptedException, DatabaseException, LoggingException, GWESException {
76 testGWES("examples/controlflow/gworkflowdl_test.xml", WorkflowStatus.STATUS_COMPLETED);
77 String[][] ps = gwes.getProperties(workflowID, userID);
78 for (int i=0; i<ps.length; i++) {
79 logger.info(ps[i][0]+"=\""+ps[i][1]+"\"");
80 }
81 Assert.assertTrue("Workflow Properties",ps.length>=13);
82
83 gwes.setProperty(workflowID,"testname","testvalue", userID);
84 String value = gwes.getProperty(workflowID,"testname", userID);
85 logger.info("value="+value);
86 Assert.assertEquals("Value", "testvalue", value);
87
88 String[] data = gwes.getData(workflowID,"end", userID);
89 Assert.assertEquals("Number of tokens on end place",1,data.length);
90 Assert.assertEquals("Token on end place","<control>true</control>",data[0]);
91
92 String[][] gwa = gwes.getWorkflowStatusArray(1, userID);
93 Assert.assertEquals("Length of workflow status array",1,gwa.length);
94 Assert.assertEquals("Number of values in workflow status array",13,gwa[0].length);
95 Assert.assertEquals("Workflow Status","status=COMPLETED",gwa[0][1]);
96 }
97
98 public void testRunWorkflow() throws IOException, NoSuchWorkflowException, WorkflowSecurityException, StateTransitionException, WorkflowFormatException, InterruptedException, DatabaseException, JaxenException, JDOMException, LoggingException, GWESException {
99 String gworkflowdl = testGWES("examples/controlflow/gworkflowdl_test_2-0.gwdl", WorkflowStatus.STATUS_COMPLETED);
100 String sequence = extractOccurrenceSequence(gworkflowdl);
101
102
103 Assert.assertEquals("Occurrence sequence", "t1 t1",sequence);
104
105
106 String[] data = gwes.getData(workflowID,"outputData", userID);
107 Assert.assertEquals("Number of tokens on outputData place",2,data.length);
108 Assert.assertEquals("Token[0] on outputData place","<data xmlns=\"http://www.gridworkflow.org/gworkflowdl\">\r\n" +
109 " <params xmlns=\"\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"xsd:string\">readme</params>\r\n" +
110 " <value xmlns=\"\">true</value>\r\n" +
111 "</data>",data[0]);
112 Assert.assertEquals("Token[1] on outputData place","<data xmlns=\"http://www.gridworkflow.org/gworkflowdl\">\r\n" +
113 " <params xmlns=\"\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"xsd:string\">readme</params>\r\n" +
114 " <value xmlns=\"\">true</value>\r\n" +
115 "</data>",data[1]);
116
117
118 data = gwes.getData(workflowID,"hasBeenSorted", userID);
119 Assert.assertEquals("Number of tokens on hasBeenSorted place",1,data.length);
120 Assert.assertEquals("Token[0] on hasBeenSorted place","<control>true</control>" ,data[0]);
121
122
123 data = gwes.getData(workflowID,"parameter", userID);
124 Assert.assertEquals("Number of tokens on parameter place",1,data.length);
125 Assert.assertEquals("Token[0] on parameter place","<data xmlns=\"http://www.gridworkflow.org/gworkflowdl\">\r\n" +
126 " <param xmlns=\"\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"xsd:string\">readme</param>\r\n" +
127 "</data>",data[0]);
128
129
130 data = gwes.getData(workflowID,"start", userID);
131 Assert.assertEquals("Number of tokens on start place",0,data.length);
132 }
133
134
135
136
137 public void testDescription() throws IOException, NoSuchWorkflowException, WorkflowSecurityException, StateTransitionException, WorkflowFormatException, InterruptedException, DatabaseException, LoggingException, GWESException {
138 testGWES("examples/controlflow/gworkflowdl_test.xml", WorkflowStatus.STATUS_COMPLETED);
139 String dold = gwes.getDescription(workflowID, userID);
140 logger.info("old description=\""+dold+"\"");
141 Assert.assertEquals("Workflow Description", "Test workflow", dold);
142 String dnew = "Test workflow 2";
143 gwes.setDescription(workflowID,dnew, userID);
144 String d = gwes.getDescription(workflowID, userID);
145 logger.info("new description=\""+d+"\"");
146 Assert.assertEquals("Workflow Description", dnew, d);
147 }
148
149 public void testWorkflowStatistics() throws CloneNotSupportedException {
150 LongDistribution duration = new LongDistribution();
151 logger.info(duration);
152 duration.put(1);
153 logger.info(duration);
154 duration.put(1);
155 logger.info(duration);
156 duration.put(10);
157 logger.info(duration);
158 LongDistribution d1 = (LongDistribution) duration.clone();
159 duration.put(13);
160 logger.info(duration);
161 Assert.assertEquals("number",4,duration.getNumber());
162 Assert.assertEquals("mean",6.25,duration.getMean(),0.000001);
163 Assert.assertEquals("stdDeviation",6.184658,duration.getStdDeviation(),0.000001);
164 Assert.assertEquals("expSmooth",6.49,duration.getExpSmooth(),0.000001);
165 Assert.assertEquals("min",1,duration.getMin());
166 Assert.assertEquals("max",13,duration.getMax());
167 double sumSquare = (duration.getNumber() - 1) * duration.getStdDeviation() * duration.getStdDeviation() + duration.getNumber() * duration.getMean() * duration.getMean();
168 logger.info("sumSquare calculated from deviation: "+sumSquare);
169 logger.info("sumSquare calculated from values: "+duration.getSumSquare());
170 Assert.assertEquals("sumSquare",sumSquare,duration.getSumSquare(),0.000001);
171
172 duration.put(27);
173
174
175 LongDistribution d2 = new LongDistribution();
176 d2.put(13);
177 d2.put(27);
178 logger.info("d1: "+d1);
179 logger.info("d2: "+d2);
180 d1.add(d2);
181 logger.info("created by addition : "+d1);
182 logger.info("created from scratch: "+duration);
183
184
185 }
186
187 public void testProratorQualityClustering() throws DatabaseException {
188 Map<String,Node> nodes = new HashMap();
189 for (int i=0; i<10; i++) {
190 String host="host"+i;
191 net.kwfgrid.gwes.prorater.Node node = new Node(host);
192 node.setQuality(((float)i)/10f);
193 nodes.put(host,node);
194 }
195 List<Node> nc = RecurrentProrater.generateClusteredRandomDistribution(nodes);
196 Assert.assertEquals("nc.size()", 10, nc.size());
197 Assert.assertTrue("nc[0]", nc.get(0).quality>0.6);
198 Assert.assertTrue("nc[1]", nc.get(1).quality>0.6);
199 Assert.assertTrue("nc[2]", nc.get(2).quality>0.6);
200
201 Assert.assertTrue("nc[3]", nc.get(3).quality>0.3);
202 Assert.assertTrue("nc[4]", nc.get(4).quality>0.3);
203 Assert.assertTrue("nc[5]", nc.get(5).quality>0.3);
204
205 Assert.assertTrue("nc[6]", nc.get(6).quality<0.4);
206 Assert.assertTrue("nc[7]", nc.get(7).quality<0.4);
207 Assert.assertTrue("nc[8]", nc.get(8).quality<0.4);
208
209 Assert.assertEquals("nc[9]", 0.0f, nc.get(9).quality);
210
211
212 nodes.clear();
213 Node node = new Node("only1");
214 node.setQuality(0.9f);
215 nodes.put("only1",node);
216 nc = RecurrentProrater.generateClusteredRandomDistribution(nodes);
217 Assert.assertEquals("nc.size()", 1, nc.size());
218 Assert.assertEquals("nc[9]", 0.9f, nc.get(0).quality);
219 }
220
221
222
223
224
225
226
227
228
229
230 public void testUpdateWorkflowDescription() throws IOException, WorkflowFormatException, WorkflowSecurityException, NoSuchWorkflowException, DatabaseException, StateTransitionException, InterruptedException, JaxenException, JDOMException, LoggingException, GWESException {
231 String gworkflowdl = testGWES("examples/controlflow/gworkflowdl_breakpoint.xml", WorkflowStatus.STATUS_SUSPENDED);
232
233 int i0 = gworkflowdl.lastIndexOf("</place>")+8;
234 int i1 = gworkflowdl.lastIndexOf("</transition>")+13;
235 StringBuffer buffer = new StringBuffer();
236 buffer.append(gworkflowdl.subSequence(0,i0));
237 buffer.append("\n <place ID=\"realend\"/>");
238 buffer.append(gworkflowdl.subSequence(i0,i1));
239 buffer.append("\n <transition ID=\"t3\">\n" +
240 " <inputPlace placeID=\"end\" />\n" +
241 " <outputPlace placeID=\"realend\" />\n" +
242 " </transition>");
243 buffer.append(gworkflowdl.subSequence(i1,gworkflowdl.length()));
244 String gworkflowdl2 = buffer.toString();
245 gwes.setWorkflowDescription(workflowID, gworkflowdl2, userID);
246 int status = gwes.getStatus(workflowID, userID);
247 Assert.assertEquals("status of updated workflow", WorkflowStatus.STATUS_SUSPENDED, status);
248 gwes.resume(workflowID, userID);
249 status = gwes.waitForStatusChangeToCompletedOrTerminated(workflowID, userID);
250 Assert.assertEquals("final status of updated workflow", WorkflowStatus.STATUS_COMPLETED, status);
251 String gworkflowdl3 = gwes.getWorkflowDescription(workflowID, userID);
252 logger.info(gworkflowdl3);
253 String sequence = extractOccurrenceSequence(gworkflowdl3);
254 Assert.assertEquals("Occurrence sequence", "t1 t2 t3",sequence);
255 }
256
257 public void testUpdateCompletedWorkflowDescription() throws WorkflowFormatException, WorkflowSecurityException, NoSuchWorkflowException, IOException, DatabaseException, StateTransitionException, InterruptedException, LoggingException, GWESException {
258 String gworkflowdl = testGWES("examples/controlflow/gworkflowdl_test.xml", WorkflowStatus.STATUS_COMPLETED);
259 boolean test = false;
260 try {
261 gwes.setWorkflowDescription(workflowID, gworkflowdl, userID);
262 } catch (StateTransitionException e) {
263 logger.info("Expected exception (everything is OK):" + e);
264 test = true;
265 }
266 Assert.assertEquals("StateTransitionException", true, test);
267 }
268
269
270
271
272
273
274
275 }