1 Reply Latest reply on Jul 20, 2011 9:02 AM by michael.wagner

    jBPM JUnit tests are failing

    michael.wagner

      Hi,

       

      I have downloaded the junit tests from:

      http://sourceforge.net/projects/jbpm/files/jBPM%205/jbpm-5.1.0.Final/jbpm-5.1.0.Final-examples.zip/download

       

      First: big thank you for providing so many unit tests! Makes is absolutly clear how to use the api.

       

      Running JBPM2UnitTests.java gives me always one failure in testTimerStart:

       

      junit.framework.AssertionFailedError: expected:<5> but was:<4>
      

       

      "Correcting" the value to 4 gives a failure in testTimerStartCron:

       

      junit.framework.AssertionFailedError: expected:<5> but was:<6>
      

       

      "Correcting" the value here to 6 gives no more failures any more.

       

           public void testTimerStartCron() throws Exception {
              KnowledgeBase kbase = createKnowledgeBase("BPMN2-TimerStartCron.bpmn2");
                StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
                final List list = new ArrayList();
                ksession.addEventListener(new DefaultProcessEventListener() {
                     public void afterProcessStarted(ProcessStartedEvent event) {
                          list.add(event.getProcessInstance().getId());
                     }
                });
                Thread.sleep(500);
              for (int i = 0; i < 5; i++) {
                   ksession.fireAllRules();
                   Thread.sleep(1000);
              }
              assertEquals(6, list.size());
          }
          
          public void testTimerStart() throws Exception {
              KnowledgeBase kbase = createKnowledgeBase("BPMN2-TimerStart.bpmn2");
                StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
                final List list = new ArrayList();
                ksession.addEventListener(new DefaultProcessEventListener() {
                     public void afterProcessStarted(ProcessStartedEvent event) {
                          list.add(event.getProcessInstance().getId());
                     }
                });
                Thread.sleep(250);
                assertEquals(0, list.size());
              for (int i = 0; i < 5; i++) {
                   ksession.fireAllRules();
                   Thread.sleep(500);
              }
              assertEquals(4, list.size());
          }
       
      

       

      Besides that I cannot understand the values by reading the code: what I definitively do not understand is: how can somebody write tests depending on a "Thread.sleep"? Are there no events one could wait for? This gives a situation which is not deterministic! This is because time is not processor time.

       

      Please tell me how the junit tests in these cases could be re-written in a deterministic way.

       

      We are in an automotive area and cannot affort to run software which can not be testet in a deterministic way.

       

      Michael

        • 1. Re: jBPM JUnit tests are failing
          michael.wagner

          Just getting more confused. If I increase the "sleep", the "list" increases, too:

           

              public void testTimerStart() throws Exception {
                  KnowledgeBase kbase = createKnowledgeBase("BPMN2-TimerStart.bpmn2");
                    StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
                    final List list = new ArrayList();
                    ksession.addEventListener(new DefaultProcessEventListener() {
                         public void afterProcessStarted(ProcessStartedEvent event) {
                              list.add(event.getProcessInstance().getId());
                         }
                    });
                    Thread.sleep(250);
                    assertEquals(0, list.size());
                  for (int i = 0; i < 5; i++) {
                       ksession.fireAllRules();
                       Thread.sleep(500);
                  }
                  // the longer the time is the more process instances are in "list"
                      Thread.sleep(3500);
                  assertEquals(5, list.size());
              }
           
          

           

           

          junit.framework.AssertionFailedError: expected:<5> but was:<9>