View Javadoc

1   /*
2    * $Id: GWESBasicTest.java 1540 2011-08-17 13:30:37Z hoheisel $
3    *
4    * Copyright (c) 2007
5    * Fraunhofer Institute for Computer Architecture and Software Technology
6    * See http://www.first.fraunhofer.de for more details.
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   * <code>
31   * maven -Dtestcase=net.kwfgrid.gwes.GWESBasicTest test:single
32   * </code>
33   *
34   * @author Andreas Hoheisel
35   *         (<a href="http://www.andreas-hoheisel.de">www.andreas-hoheisel.de</a>)
36   * @version $Id: GWESBasicTest.java 1540 2011-08-17 13:30:37Z hoheisel $
37   */
38  public final class GWESBasicTest extends LocalGWESAbstractTestCase {
39  
40      static Logger logger = Logger.getLogger(GWESBasicTest.class);
41  
42      /**
43       * Create the test case.
44       *
45       * @param testName name of the test case
46       */
47      public GWESBasicTest(String testName) throws LoggingException {
48          super(testName);
49      }
50  
51      /**
52       * @return the suite of tests being tested
53       */
54      public static Test suite() {
55          return new TestSuite(GWESBasicTest.class);
56      }
57  
58      /**
59       * Test GWES.remove(), GWES.getWorkflowIDs
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       * Test GWES.setProperty(), GWES.getProperty(), GWES.getProperties(), GWES.getData(), GWES.getWorkflowStatusArray()
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         // check occurrence sequence
103         Assert.assertEquals("Occurrence sequence", "t1 t1",sequence);
104 
105         // check outputData place
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         // check hasBeenSorted place
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         // check parameter place
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         // check start place
130         data = gwes.getData(workflowID,"start", userID);
131         Assert.assertEquals("Number of tokens on start place",0,data.length);
132     }
133 
134     /**
135      * Test GWES.setDescription(), GWES.getDescription()
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         // test addition of two distributions
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         // no more true because of expSmooth
184         //Assert.assertEquals("distributions",true,d1.equals(duration));
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         // test with only one node
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 //    public void testTransformDGRDL() throws DatabaseException, JDOMException, IOException {
222 //        System.setProperty( "javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl");
223 ////        XSLTransformer transformer = new XSLTransformer(getClass().getResourceAsStream("/dgrdl.xsl"));
224 //        XSLTransformer transformer = new XSLTransformer("gwes/src/conf/dgrdl.xsl");
225 //        String xml = readfile("examples/dgrdl/hardware_medigrid-srv.gwdg.de.xml");
226 //        Document html = transformer.transform(JdomString.string2workflowDocument(xml,false,false));
227 //        logger.info(JdomString.document2string(html));
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         // add additional place and transition to workflow
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      * End of public test classes.
272      * ********************************************************************************************
273      */
274 
275 }