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
58
59
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
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 }