1   package ch.qos.logback.classic.boolex;
2   
3   import static org.junit.Assert.assertFalse;
4   import static org.junit.Assert.assertTrue;
5   import static org.junit.Assert.fail;
6   
7   import org.junit.Test;
8   import org.slf4j.MarkerFactory;
9   
10  import ch.qos.logback.classic.Level;
11  import ch.qos.logback.classic.Logger;
12  import ch.qos.logback.classic.LoggerContext;
13  import ch.qos.logback.classic.pattern.ConverterTest;
14  import ch.qos.logback.classic.spi.LoggingEvent;
15  import ch.qos.logback.core.boolex.EvaluationException;
16  import ch.qos.logback.core.boolex.JaninoEventEvaluatorBase;
17  import ch.qos.logback.core.boolex.Matcher;
18  
19  public class JaninoEventEvaluatorTest  {
20  
21    LoggerContext loggerContext = new LoggerContext();
22    Logger logger = loggerContext.getLogger(ConverterTest.class);
23  
24    Matcher matcherX = new Matcher();
25  
26    public JaninoEventEvaluatorTest() {
27      matcherX.setName("x");
28      matcherX.setRegex("^Some\\s.*");
29      matcherX.start();
30  
31    }
32  
33    LoggingEvent makeLoggingEvent(Exception ex) {
34      LoggingEvent e = new LoggingEvent(
35          ch.qos.logback.core.pattern.FormattingConverter.class.getName(),
36          logger, Level.INFO, "Some message", ex, null);
37      return e;
38    }
39  
40    @Test
41    public void testBasic() throws Exception {
42      JaninoEventEvaluator jee = new JaninoEventEvaluator();
43      jee.setExpression("message.equals(\"Some message\")");
44      jee.setContext(loggerContext);
45      jee.start();
46  
47      LoggingEvent event = makeLoggingEvent(null);
48      //System.out.println(event);
49      assertTrue(jee.evaluate(event));
50    }
51  
52    @Test
53    public void testLevel() throws Exception {
54      JaninoEventEvaluator jee = new JaninoEventEvaluator();
55      jee.setExpression("level > DEBUG");
56      jee.setContext(loggerContext);
57      jee.start();
58  
59      LoggingEvent event = makeLoggingEvent(null);
60      //System.out.println(event);
61      assertTrue(jee.evaluate(event));
62    }
63  
64    @Test
65    public void testtimeStamp() throws Exception {
66      JaninoEventEvaluator jee = new JaninoEventEvaluator();
67      jee.setExpression("timeStamp > 10");
68      jee.setContext(loggerContext);
69      jee.start();
70  
71      LoggingEvent event = makeLoggingEvent(null);
72      assertTrue(jee.evaluate(event));
73    }
74  
75    @Test
76    public void testWithMatcher() throws Exception {
77  
78      JaninoEventEvaluator jee = new JaninoEventEvaluator();
79      jee.setExpression("x.matches(message)");
80      jee.setContext(loggerContext);
81      jee.addMatcher(matcherX);
82      jee.start();
83  
84      LoggingEvent event = makeLoggingEvent(null);
85      assertTrue(jee.evaluate(event));
86    }
87  
88    @Test
89    public void testMarker() throws Exception {
90      JaninoEventEvaluator jee = new JaninoEventEvaluator();
91      jee.setExpression("marker.contains(\"BLUE\")");
92      jee.setContext(loggerContext);
93      jee.addMatcher(matcherX);
94      jee.start();
95  
96      LoggingEvent event = makeLoggingEvent(null);
97      event.setMarker(MarkerFactory.getMarker("BLUE"));
98      assertTrue(jee.evaluate(event));
99    }
100 
101   @Test
102   public void testWithNullMarker() throws Exception {
103     JaninoEventEvaluator jee = new JaninoEventEvaluator();
104     jee.setExpression("marker.contains(\"BLUE\")");
105     jee.setContext(loggerContext);
106     jee.addMatcher(matcherX);
107     jee.start();
108 
109     LoggingEvent event = makeLoggingEvent(null);
110     try {
111       jee.evaluate(event);
112       fail("We should not reach this point");
113     } catch (EvaluationException ee) {
114 
115     }
116   }
117 
118   @Test
119   public void testComplex() throws Exception {
120 
121     JaninoEventEvaluator jee = new JaninoEventEvaluator();
122     jee
123         .setExpression("level >= INFO && x.matches(message) && marker.contains(\"BLUE\")");
124     jee.setContext(loggerContext);
125     jee.addMatcher(matcherX);
126     jee.start();
127 
128     LoggingEvent event = makeLoggingEvent(null);
129     event.setMarker(MarkerFactory.getMarker("BLUE"));
130     assertTrue(jee.evaluate(event));
131   }
132 
133   /**
134    * check that evaluator with bogis exp does not start
135    * 
136    * @throws Exception
137    */
138   @Test
139   public void testBogusExp1() {
140 
141     JaninoEventEvaluator jee = new JaninoEventEvaluator();
142     jee.setExpression("mzzzz.get(\"key\").equals(null)");
143     jee.setContext(loggerContext);
144     jee.setName("bogus");
145     jee.start();
146 
147     assertFalse(jee.isStarted());
148 
149     // StatusPrinter.print(loggerContext);
150     // LoggingEvent event = makeLoggingEvent(null);
151     // event.setMarker(MarkerFactory.getMarker("BLUE"));
152     //    
153     // jee.evaluate(event);
154   }
155 
156   // check that eval stops after errors
157   @Test
158   public void testBogusExp2() {
159 
160     JaninoEventEvaluator jee = new JaninoEventEvaluator();
161     jee.setExpression("mdc.get(\"keyXN89\").equals(null)");
162     jee.setContext(loggerContext);
163     jee.setName("bogus");
164     jee.start();
165 
166     assertTrue(jee.isStarted());
167 
168     LoggingEvent event = makeLoggingEvent(null);
169 
170     for (int i = 0; i < JaninoEventEvaluatorBase.ERROR_THRESHOLD; i++) {
171       try {
172         jee.evaluate(event);
173         fail("should throw an exception");
174       } catch (EvaluationException e) {
175       }
176     }
177     // after a few attempts the evaluator should stop
178     assertFalse(jee.isStarted());
179 
180   }
181 
182   static final long LEN = 10 * 1000;
183 
184   // with 6 parameters 400 nanos
185   // with 7 parameters 460 nanos (all levels + selected fields from
186   // LoggingEvent)
187   // with 10 parameters 510 nanos (all levels + fields)
188   void loop(JaninoEventEvaluator jee, String msg) throws Exception {
189     LoggingEvent event = makeLoggingEvent(null);
190     //final long start = System.nanoTime();
191     for (int i = 0; i < LEN; i++) {
192       jee.evaluate(event);
193     }
194     //final long end = System.nanoTime();
195     //System.out.println(msg + (end - start) / LEN + " nanos");
196   }
197 
198   @Test
199   public void testLoop1() throws Exception {
200     JaninoEventEvaluator jee = new JaninoEventEvaluator();
201     jee.setExpression("timeStamp > 10");
202     jee.setContext(loggerContext);
203     jee.start();
204 
205     loop(jee, "timestamp > 10]: ");
206   }
207 
208   @Test
209   public void testLoop2() throws Exception {
210     JaninoEventEvaluator jee = new JaninoEventEvaluator();
211     jee.setExpression("x.matches(message)");
212     jee.setContext(loggerContext);
213     jee.addMatcher(matcherX);
214     jee.start();
215 
216     loop(jee, "x.matches(message): ");
217   }
218 
219 }