View Javadoc
1   package ch.qos.logback.core.rolling;
2   
3   import static ch.qos.logback.core.CoreConstants.FA_FILENAME_COLLISION_MAP;
4   import static ch.qos.logback.core.testUtil.CoreTestConstants.OUTPUT_DIR_PREFIX;
5   
6   import java.util.Map;
7   
8   import org.junit.After;
9   import org.junit.Assert;
10  import org.junit.Before;
11  import org.junit.Test;
12  
13  import ch.qos.logback.core.Context;
14  import ch.qos.logback.core.ContextBase;
15  import ch.qos.logback.core.FileAppender;
16  import ch.qos.logback.core.encoder.NopEncoder;
17  import ch.qos.logback.core.status.Status;
18  import ch.qos.logback.core.testUtil.RandomUtil;
19  import ch.qos.logback.core.testUtil.StatusChecker;
20  import ch.qos.logback.core.util.StatusPrinter;
21  
22  public class CollisionDetectionTest {
23  
24      Context context = new ContextBase();
25      StatusChecker statusChecker = new StatusChecker(context);
26      int diff = RandomUtil.getPositiveInt();
27      protected String randomOutputDir = OUTPUT_DIR_PREFIX + diff + "/";
28  
29      @Before
30      public void setUp() throws Exception {
31      }
32  
33      @After
34      public void tearDown() throws Exception {
35      }
36  
37      FileAppender<String> buildFileAppender(String name, String filenameSuffix) {
38          FileAppender<String> fileAppender = new FileAppender<String>();
39          fileAppender.setName(name);
40          fileAppender.setContext(context);
41          fileAppender.setFile(randomOutputDir + filenameSuffix);
42          fileAppender.setEncoder(new NopEncoder<String>());
43          return fileAppender;
44      }
45  
46      RollingFileAppender<String> buildRollingFileAppender(String name, String filenameSuffix, String patternSuffix) {
47          RollingFileAppender<String> rollingFileAppender = new RollingFileAppender<String>();
48          rollingFileAppender.setName(name);
49          rollingFileAppender.setContext(context);
50          rollingFileAppender.setFile(randomOutputDir + filenameSuffix);
51          rollingFileAppender.setEncoder(new NopEncoder<String>());
52  
53          TimeBasedRollingPolicy<String> tbrp = new TimeBasedRollingPolicy<String>();
54          tbrp.setContext(context);
55          tbrp.setFileNamePattern(randomOutputDir + patternSuffix);
56          tbrp.setParent(rollingFileAppender);
57          // tbrp.timeBasedFileNamingAndTriggeringPolicy = new
58          // DefaultTimeBasedFileNamingAndTriggeringPolicy<Object>();
59          // tbrp.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(givenTime);
60          rollingFileAppender.setRollingPolicy(tbrp);
61          tbrp.start();
62  
63          return rollingFileAppender;
64      }
65  
66      @Test
67      public void collisionImpossibleForSingleAppender() {
68          FileAppender<String> fileAppender = buildFileAppender("FA", "collisionImpossibleForSingleAppender");
69          fileAppender.start();
70          statusChecker.assertIsErrorFree();
71  
72      }
73  
74      @Test
75      public void appenderStopShouldClearEntryInCollisionMap() {
76          String key = "FA";
77          FileAppender<String> fileAppender = buildFileAppender(key, "collisionImpossibleForSingleAppender");
78          fileAppender.start();
79          assertCollisionMapHasEntry(FA_FILENAME_COLLISION_MAP, key);
80          fileAppender.stop();
81          assertCollisionMapHasNoEntry(FA_FILENAME_COLLISION_MAP, key);
82          statusChecker.assertIsErrorFree();
83  
84      }
85  
86      private void assertCollisionMapHasEntry(String mapName, String key) {
87          @SuppressWarnings("unchecked")
88          Map<String, ?> map = (Map<String, ?>) context.getObject(mapName);
89          Assert.assertNotNull(map);
90          Assert.assertNotNull(map.get(key));
91      }
92  
93      private void assertCollisionMapHasNoEntry(String mapName, String key) {
94          @SuppressWarnings("unchecked")
95          Map<String, ?> map = (Map<String, ?>) context.getObject(mapName);
96          Assert.assertNotNull(map);
97          Assert.assertNull(map.get(key));
98      }
99  
100     @Test
101     public void collisionWithTwoFileAppenders() {
102         String suffix = "collisionWithToFileAppenders";
103 
104         FileAppender<String> fileAppender1 = buildFileAppender("FA1", suffix);
105         fileAppender1.start();
106 
107         FileAppender<String> fileAppender2 = buildFileAppender("FA2", suffix);
108         fileAppender2.start();
109         statusChecker.assertContainsMatch(Status.ERROR, "'File' option has the same value");
110         // StatusPrinter.print(context);
111     }
112 
113     @Test
114     public void collisionWith_FA_RFA() {
115         String suffix = "collisionWith_FA_RFA";
116 
117         FileAppender<String> fileAppender1 = buildFileAppender("FA", suffix);
118         fileAppender1.start();
119 
120         RollingFileAppender<String> rollingfileAppender = buildRollingFileAppender("RFA", suffix, "bla-%d.log");
121         rollingfileAppender.start();
122         StatusPrinter.print(context);
123         statusChecker.assertContainsMatch(Status.ERROR, "'File' option has the same value");
124     }
125 
126     @Test
127     public void collisionWith_2RFA() {
128         String suffix = "collisionWith_2RFA";
129 
130         RollingFileAppender<String> rollingfileAppender1 = buildRollingFileAppender("RFA1", suffix, "bla-%d.log");
131         rollingfileAppender1.start();
132         RollingFileAppender<String> rollingfileAppender2 = buildRollingFileAppender("RFA1", suffix, "bla-%d.log");
133         rollingfileAppender2.start();
134 
135         StatusPrinter.print(context);
136         statusChecker.assertContainsMatch(Status.ERROR, "'FileNamePattern' option has the same value");
137     }
138 
139 }