1   /**
2    * Logback: the generic, reliable, fast and flexible logging framework.
3    * 
4    * Copyright (C) 2000-2008, QOS.ch
5    * 
6    * This library is free software, you can redistribute it and/or modify it under
7    * the terms of the GNU Lesser General Public License as published by the Free
8    * Software Foundation.
9    */
10  package ch.qos.logback.access.sift;
11  
12  import static org.junit.Assert.assertEquals;
13  
14  import java.net.HttpURLConnection;
15  import java.net.URL;
16  import java.util.ArrayList;
17  import java.util.List;
18  
19  import org.junit.After;
20  import org.junit.Before;
21  import org.junit.Test;
22  
23  import ch.qos.logback.access.jetty.RequestLogImpl;
24  import ch.qos.logback.access.spi.AccessEvent;
25  import ch.qos.logback.access.spi.Util;
26  import ch.qos.logback.core.read.ListAppender;
27  import ch.qos.logback.core.testUtil.RandomUtil;
28  import ch.qos.logback.core.util.StatusPrinter;
29  
30  public class SiftingAppenderTest {
31    static final String PREFIX = "src/test/input/jetty/";
32    static int RANDOM_SERVER_PORT = RandomUtil.getRandomServerPort();
33  
34    JettyFixture jettyFixture;
35    RequestLogImpl rli = new RequestLogImpl();
36  
37    @Before
38    public void startServer() throws Exception {
39      jettyFixture = new JettyFixture(rli, RANDOM_SERVER_PORT);
40  
41    }
42  
43    @After
44    public void stopServer() throws Exception {
45      if (jettyFixture != null) {
46        jettyFixture.stop();
47      }
48    }
49  
50    @Test
51    public void test() throws Exception {
52      rli.setFileName(PREFIX + "sifting.xml");
53      jettyFixture.start();
54  
55  
56      StatusPrinter.print(rli);
57      invokeServer("/");
58      invokeServer("/x");
59      invokeServer("/x");
60      invokeServer("/y");
61  
62      
63      SiftingAppender siftingAppender = (SiftingAppender) rli
64          .getAppender("SIFTING");
65      List<String> keyList = siftingAppender.getAppenderTracker().keyList();
66      assertEquals(3, keyList.size());
67  
68      List<String> witnessList = new ArrayList<String>();
69      witnessList.add("NA");
70      witnessList.add("x");
71      witnessList.add("y");
72      assertEquals(witnessList, keyList);
73  
74      long now = System.currentTimeMillis();
75      {
76        ListAppender<AccessEvent> listAppender = (ListAppender<AccessEvent>) siftingAppender
77            .getAppenderTracker().get("NA", now);
78        assertEquals(1, listAppender.list.size());
79      }
80      
81      {
82        ListAppender<AccessEvent> listAppender = (ListAppender<AccessEvent>) siftingAppender
83            .getAppenderTracker().get("x", now);
84        assertEquals(2, listAppender.list.size());
85      }
86      {
87        ListAppender<AccessEvent> listAppender = (ListAppender<AccessEvent>) siftingAppender
88            .getAppenderTracker().get("y", now);
89        assertEquals(1, listAppender.list.size());
90      }
91    }
92  
93    void invokeServer(String uri) throws Exception {
94      URL url = new URL("http://localhost:" + RANDOM_SERVER_PORT + uri);
95      HttpURLConnection connection = (HttpURLConnection) url.openConnection();
96      connection.setDoInput(true);
97      Util.readToString(connection.getInputStream());
98      Thread.sleep(30);
99    }
100 }