/*
* Copyright 2014 LinkedIn Corp.
*
* 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 azkaban.trigger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import static org.junit.Assert.*;
import azkaban.utils.Props;
public class TriggerManagerTest {
private TriggerLoader triggerLoader;
@Before
public void setup() throws TriggerException, TriggerManagerException {
triggerLoader = new MockTriggerLoader();
}
@After
public void tearDown() {
}
@Ignore @Test
public void triggerManagerSimpleTest() throws TriggerManagerException {
Props props = new Props();
props.put("trigger.scan.interval", 4000);
TriggerManager triggerManager =
new TriggerManager(props, triggerLoader, null);
triggerManager.registerCheckerType(ThresholdChecker.type,
ThresholdChecker.class);
triggerManager.registerActionType(DummyTriggerAction.type,
DummyTriggerAction.class);
ThresholdChecker.setVal(1);
triggerManager.insertTrigger(
createDummyTrigger("test1", "triggerLoader", 10), "testUser");
List<Trigger> triggers = triggerManager.getTriggers();
assertTrue(triggers.size() == 1);
Trigger t1 = triggers.get(0);
t1.setResetOnTrigger(false);
triggerManager.updateTrigger(t1, "testUser");
ThresholdChecker checker1 =
(ThresholdChecker) t1.getTriggerCondition().getCheckers().values()
.toArray()[0];
assertTrue(t1.getSource().equals("triggerLoader"));
Trigger t2 =
createDummyTrigger("test2: add new trigger", "addNewTriggerTest", 20);
triggerManager.insertTrigger(t2, "testUser");
ThresholdChecker checker2 =
(ThresholdChecker) t2.getTriggerCondition().getCheckers().values()
.toArray()[0];
ThresholdChecker.setVal(15);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
assertTrue(checker1.isCheckerMet() == false);
assertTrue(checker2.isCheckerMet() == false);
assertTrue(checker1.isCheckerReset() == false);
assertTrue(checker2.isCheckerReset() == false);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
assertTrue(checker1.isCheckerMet() == true);
assertTrue(checker2.isCheckerMet() == false);
assertTrue(checker1.isCheckerReset() == false);
assertTrue(checker2.isCheckerReset() == false);
ThresholdChecker.setVal(25);
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
assertTrue(checker1.isCheckerMet() == true);
assertTrue(checker1.isCheckerReset() == false);
assertTrue(checker2.isCheckerReset() == true);
triggers = triggerManager.getTriggers();
assertTrue(triggers.size() == 1);
}
public static class MockTriggerLoader implements TriggerLoader {
private Map<Integer, Trigger> triggers = new HashMap<Integer, Trigger>();
private int idIndex = 0;
@Override
public void addTrigger(Trigger t) throws TriggerLoaderException {
t.setTriggerId(idIndex++);
triggers.put(t.getTriggerId(), t);
}
@Override
public void removeTrigger(Trigger s) throws TriggerLoaderException {
triggers.remove(s.getTriggerId());
}
@Override
public void updateTrigger(Trigger t) throws TriggerLoaderException {
triggers.put(t.getTriggerId(), t);
}
@Override
public List<Trigger> loadTriggers() {
return new ArrayList<Trigger>(triggers.values());
}
@Override
public Trigger loadTrigger(int triggerId) throws TriggerLoaderException {
// TODO Auto-generated method stub
return null;
}
@Override
public List<Trigger> getUpdatedTriggers(long lastUpdateTime)
throws TriggerLoaderException {
// TODO Auto-generated method stub
return null;
}
}
private Trigger createDummyTrigger(String message, String source,
int threshold) {
Map<String, ConditionChecker> checkers =
new HashMap<String, ConditionChecker>();
ConditionChecker checker =
new ThresholdChecker(ThresholdChecker.type, threshold);
checkers.put(checker.getId(), checker);
List<TriggerAction> actions = new ArrayList<TriggerAction>();
TriggerAction act = new DummyTriggerAction(message);
actions.add(act);
String expr = checker.getId() + ".eval()";
Condition triggerCond = new Condition(checkers, expr);
Condition expireCond = new Condition(checkers, expr);
Trigger fakeTrigger = new Trigger.TriggerBuilder("azkaban",
source,
triggerCond,
expireCond,
actions).build();
fakeTrigger.setResetOnTrigger(true);
fakeTrigger.setResetOnExpire(true);
return fakeTrigger;
}
// public class MockCheckerLoader extends CheckerTypeLoader{
//
// @Override
// public void init(Props props) {
// checkerToClass.put(ThresholdChecker.type, ThresholdChecker.class);
// }
// }
//
// public class MockActionLoader extends ActionTypeLoader {
// @Override
// public void init(Props props) {
// actionToClass.put(DummyTriggerAction.type, DummyTriggerAction.class);
// }
// }
}