/**
* Copyright 2016-2017 Linagora, Université Joseph Fourier, Floralis
*
* The present code is developed in the scope of the joint LINAGORA -
* Université Joseph Fourier - Floralis research program and is designated
* as a "Result" pursuant to the terms and conditions of the LINAGORA
* - Université Joseph Fourier - Floralis research program. Each copyright
* holder of Results enumerated here above fully & independently holds complete
* ownership of the complete Intellectual Property rights applicable to the whole
* of said Results, and may freely exploit it in any manner which does not infringe
* the moral rights of the other copyright holders.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.roboconf.dm.internal.api.impl.beans;
import java.util.List;
import net.roboconf.core.autonomic.Rule;
import net.roboconf.core.internal.tests.TestApplication;
import org.junit.Assert;
import org.junit.Test;
/**
* @author Vincent Zurczak - Linagora
*/
public class AutonomicApplicationContextTest {
@Test
public void testBasics() {
TestApplication app = new TestApplication();
AutonomicApplicationContext ctx = new AutonomicApplicationContext( app );
Assert.assertEquals( app.getName(), ctx.toString());
Assert.assertEquals( 0, ctx.ruleNameToRule.size());
Assert.assertEquals( 0, ctx.eventNameToLastRecordTime.size());
Assert.assertEquals( 0, ctx.ruleNameToLastExecution.size());
Assert.assertEquals( 0, ctx.ruleNameToLastTrigger.size());
Assert.assertEquals( 0, ctx.vmCount.get());
ctx.recordPreExecution( "rule1" );
Assert.assertEquals( 0, ctx.ruleNameToRule.size());
Assert.assertEquals( 0, ctx.eventNameToLastRecordTime.size());
Assert.assertEquals( 1, ctx.ruleNameToLastExecution.size());
Assert.assertNotNull( ctx.ruleNameToLastExecution.get( "rule1" ));
Assert.assertEquals( 0, ctx.ruleNameToLastTrigger.size());
Assert.assertEquals( 0, ctx.vmCount.get());
}
@Test
public void testFindRulesToExecute_noRule() throws Exception {
TestApplication app = new TestApplication();
AutonomicApplicationContext ctx = new AutonomicApplicationContext( app );
Assert.assertEquals( 0, ctx.ruleNameToRule.size());
Assert.assertEquals( 0, ctx.eventNameToLastRecordTime.size());
Assert.assertEquals( 0, ctx.ruleNameToLastExecution.size());
Assert.assertEquals( 0, ctx.ruleNameToLastTrigger.size());
Assert.assertEquals( 0, ctx.vmCount.get());
Assert.assertEquals( 0, ctx.findRulesToExecute().size());
Assert.assertEquals( 0, ctx.ruleNameToRule.size());
Assert.assertEquals( 0, ctx.eventNameToLastRecordTime.size());
Assert.assertEquals( 0, ctx.ruleNameToLastExecution.size());
Assert.assertEquals( 0, ctx.ruleNameToLastTrigger.size());
Assert.assertEquals( 0, ctx.vmCount.get());
}
@Test
public void testFindRulesToExecute_oneRuleButNoMatchingEvent() throws Exception {
// Setup
TestApplication app = new TestApplication();
AutonomicApplicationContext ctx = new AutonomicApplicationContext( app );
Rule rule = new Rule();
rule.setEventName( "event" );
rule.setRuleName( "r" );
ctx.ruleNameToRule.put( rule.getRuleName(), rule );
ctx.registerEvent( "other-event-1" );
ctx.registerEvent( "other-event-2" );
// Check
Assert.assertEquals( 1, ctx.ruleNameToRule.size());
Assert.assertEquals( 2, ctx.eventNameToLastRecordTime.size());
Assert.assertEquals( 0, ctx.ruleNameToLastExecution.size());
Assert.assertEquals( 0, ctx.ruleNameToLastTrigger.size());
Assert.assertEquals( 0, ctx.vmCount.get());
Assert.assertEquals( 0, ctx.findRulesToExecute().size());
Assert.assertEquals( 1, ctx.ruleNameToRule.size());
Assert.assertEquals( 2, ctx.eventNameToLastRecordTime.size());
Assert.assertEquals( 0, ctx.ruleNameToLastExecution.size());
Assert.assertEquals( 0, ctx.ruleNameToLastTrigger.size());
Assert.assertEquals( 0, ctx.vmCount.get());
}
@Test
public void testFindRulesToExecute_matchingRule() throws Exception {
// Setup
TestApplication app = new TestApplication();
AutonomicApplicationContext ctx = new AutonomicApplicationContext( app );
Rule rule1 = new Rule();
rule1.setEventName( "event1" );
rule1.setRuleName( "r1" );
ctx.ruleNameToRule.put( rule1.getRuleName(), rule1 );
Rule rule2 = new Rule();
rule2.setEventName( "event2" );
rule2.setRuleName( "r2" );
ctx.ruleNameToRule.put( rule2.getRuleName(), rule2 );
ctx.registerEvent( "other-event-1" );
ctx.registerEvent( "other-event-2" );
ctx.registerEvent( "event1" );
// Check
Assert.assertEquals( 2, ctx.ruleNameToRule.size());
Assert.assertEquals( 3, ctx.eventNameToLastRecordTime.size());
Assert.assertEquals( 0, ctx.ruleNameToLastExecution.size());
Assert.assertEquals( 0, ctx.ruleNameToLastTrigger.size());
Assert.assertEquals( 0, ctx.vmCount.get());
List<Rule> rules = ctx.findRulesToExecute();
Assert.assertEquals( 1, rules.size());
Assert.assertEquals( rule1, rules.get( 0 ));
Assert.assertEquals( 2, ctx.ruleNameToRule.size());
Assert.assertEquals( 3, ctx.eventNameToLastRecordTime.size());
Assert.assertEquals( 0, ctx.ruleNameToLastExecution.size());
Assert.assertEquals( 1, ctx.ruleNameToLastTrigger.size());
Assert.assertNotNull( ctx.ruleNameToLastTrigger.get( rule1.getRuleName()));
Assert.assertEquals( 0, ctx.vmCount.get());
// If we find the rules to execute, we should not have any rule
// since the event was already read.
Assert.assertEquals( 0, ctx.findRulesToExecute().size());
Assert.assertEquals( 2, ctx.ruleNameToRule.size());
Assert.assertEquals( 3, ctx.eventNameToLastRecordTime.size());
Assert.assertEquals( 0, ctx.ruleNameToLastExecution.size());
Assert.assertEquals( 1, ctx.ruleNameToLastTrigger.size());
Assert.assertNotNull( ctx.ruleNameToLastTrigger.get( rule1.getRuleName()));
Assert.assertEquals( 0, ctx.vmCount.get());
// If we register the event with another time stamp, the rule should be listed again.
// We also add a new event for another rule.
ctx.registerEvent( "event1" );
ctx.registerEvent( "event2" );
rules = ctx.findRulesToExecute();
Assert.assertEquals( 2, rules.size());
Assert.assertTrue( rules.contains( rule1 ));
Assert.assertTrue( rules.contains( rule2 ));
Assert.assertEquals( 2, ctx.ruleNameToRule.size());
Assert.assertEquals( 4, ctx.eventNameToLastRecordTime.size());
Assert.assertEquals( 0, ctx.ruleNameToLastExecution.size());
Assert.assertEquals( 2, ctx.ruleNameToLastTrigger.size());
Assert.assertNotNull( ctx.ruleNameToLastTrigger.get( rule1.getRuleName()));
Assert.assertNotNull( ctx.ruleNameToLastTrigger.get( rule2.getRuleName()));
Assert.assertEquals( 0, ctx.vmCount.get());
// No new event => no rule found.
Assert.assertEquals( 0, ctx.findRulesToExecute().size());
}
@Test
public void testFindRulesToExecute_matchingRule_withDelayBetweenExecutions() throws Exception {
// Setup
TestApplication app = new TestApplication();
AutonomicApplicationContext ctx = new AutonomicApplicationContext( app );
Rule rule1 = new Rule();
rule1.setEventName( "event1" );
rule1.setRuleName( "r1" );
rule1.setDelayBetweenSucceedingInvocations( 1 );
ctx.ruleNameToRule.put( rule1.getRuleName(), rule1 );
ctx.recordPreExecution( rule1.getRuleName());
ctx.registerEvent( "event1" );
// Check: the delay is not over, the rule is ignored
Assert.assertEquals( 1, ctx.ruleNameToRule.size());
Assert.assertEquals( 1, ctx.eventNameToLastRecordTime.size());
Assert.assertEquals( 1, ctx.ruleNameToLastExecution.size());
Assert.assertEquals( 0, ctx.ruleNameToLastTrigger.size());
Assert.assertEquals( 0, ctx.vmCount.get());
List<Rule> rules = ctx.findRulesToExecute();
Assert.assertEquals( 0, rules.size());
Assert.assertEquals( 1, ctx.ruleNameToRule.size());
Assert.assertEquals( 1, ctx.eventNameToLastRecordTime.size());
Assert.assertEquals( 1, ctx.ruleNameToLastExecution.size());
Assert.assertEquals( 0, ctx.ruleNameToLastTrigger.size());
Assert.assertEquals( 0, ctx.vmCount.get());
// Wait the delay
Thread.sleep( 1010 );
// Now, the rule should be found
rules = ctx.findRulesToExecute();
Assert.assertEquals( 1, rules.size());
Assert.assertEquals( rule1, rules.get( 0 ));
Assert.assertEquals( 1, ctx.ruleNameToRule.size());
Assert.assertEquals( 1, ctx.eventNameToLastRecordTime.size());
Assert.assertEquals( 1, ctx.ruleNameToLastExecution.size());
Assert.assertEquals( 1, ctx.ruleNameToLastTrigger.size());
Assert.assertNotNull( ctx.ruleNameToLastTrigger.get( rule1.getRuleName()));
Assert.assertEquals( 0, ctx.vmCount.get());
// If we execute it again, it will be skipped because the original event was already processed for this rule.
Assert.assertEquals( 0, ctx.findRulesToExecute().size());
}
@Test
public void testFindRulesToExecute_matchingRule_withTimingWindow() throws Exception {
// Setup
TestApplication app = new TestApplication();
AutonomicApplicationContext ctx = new AutonomicApplicationContext( app );
Rule rule1 = new Rule();
rule1.setEventName( "event1" );
rule1.setRuleName( "r1" );
rule1.setTimingWindow( 1 );
ctx.ruleNameToRule.put( rule1.getRuleName(), rule1 );
ctx.registerEvent( "event1" );
// Check: no registered time stamp, the rule is found
Assert.assertEquals( 1, ctx.ruleNameToRule.size());
Assert.assertEquals( 1, ctx.eventNameToLastRecordTime.size());
Assert.assertEquals( 0, ctx.ruleNameToLastExecution.size());
Assert.assertEquals( 0, ctx.ruleNameToLastTrigger.size());
Assert.assertEquals( 0, ctx.vmCount.get());
List<Rule> rules = ctx.findRulesToExecute();
Assert.assertEquals( 1, rules.size());
Assert.assertEquals( rule1, rules.get( 0 ));
Assert.assertEquals( 1, ctx.ruleNameToRule.size());
Assert.assertEquals( 1, ctx.eventNameToLastRecordTime.size());
Assert.assertEquals( 0, ctx.ruleNameToLastExecution.size());
Assert.assertEquals( 1, ctx.ruleNameToLastTrigger.size());
Assert.assertNotNull( ctx.ruleNameToLastTrigger.get( rule1.getRuleName()));
Assert.assertEquals( 0, ctx.vmCount.get());
// Create a new similar event, but after the timing window.
// The time window is not over, the rule will be ignored
ctx.registerEvent( "event1" );
Thread.sleep( 1010 );
Assert.assertEquals( 0, ctx.findRulesToExecute().size());
// Register a more recent event, it should be picked up.
ctx.registerEvent( "event1" );
rules = ctx.findRulesToExecute();
Assert.assertEquals( 1, rules.size());
Assert.assertEquals( rule1, rules.get( 0 ));
Assert.assertEquals( 1, ctx.ruleNameToRule.size());
Assert.assertEquals( 1, ctx.eventNameToLastRecordTime.size());
Assert.assertEquals( 0, ctx.ruleNameToLastExecution.size());
Assert.assertEquals( 1, ctx.ruleNameToLastTrigger.size());
Assert.assertNotNull( ctx.ruleNameToLastTrigger.get( rule1.getRuleName()));
Assert.assertEquals( 0, ctx.vmCount.get());
// If we execute it again, it will be skipped because the original event was already processed for this rule.
Assert.assertEquals( 0, ctx.findRulesToExecute().size());
}
}