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.core.appender;
11  
12  import static org.junit.Assert.assertEquals;
13  import static org.junit.Assert.assertFalse;
14  import static org.junit.Assert.assertTrue;
15  
16  import java.io.File;
17  import java.util.List;
18  import java.util.Random;
19  
20  import org.junit.Test;
21  
22  import ch.qos.logback.core.AppenderBase;
23  import ch.qos.logback.core.Context;
24  import ch.qos.logback.core.ContextBase;
25  import ch.qos.logback.core.FileAppender;
26  import ch.qos.logback.core.layout.DummyLayout;
27  import ch.qos.logback.core.layout.NopLayout;
28  import ch.qos.logback.core.status.Status;
29  import ch.qos.logback.core.status.StatusManager;
30  import ch.qos.logback.core.util.Constants;
31  import ch.qos.logback.core.util.FileUtil;
32  
33  public class FileAppenderTest extends AbstractAppenderTest<Object> {
34  
35    int diff = new Random().nextInt(100);
36    Context context = new ContextBase();
37  
38    protected AppenderBase<Object> getAppender() {
39      return new FileAppender<Object>();
40    }
41  
42    protected AppenderBase<Object> getConfiguredAppender() {
43      FileAppender<Object> appender = new FileAppender<Object>();
44      appender.setLayout(new NopLayout<Object>());
45      appender.setFile("temp.log");
46      appender.setName("temp.log");
47      appender.setContext(context);
48      appender.start();
49      return appender;
50    }
51  
52    @Test
53    public void smoke() {
54      String filename = Constants.OUTPUT_DIR_PREFIX + "temp.log";
55  
56      FileAppender<Object> appender = new FileAppender<Object>();
57      appender.setLayout(new DummyLayout<Object>());
58      appender.setAppend(false);
59      appender.setFile(filename);
60      appender.setName("temp.log");
61      appender.setContext(context);
62      appender.start();
63      appender.doAppend(new Object());
64      appender.stop();
65  
66      File file = new File(filename);
67      assertTrue(file.exists());
68      assertTrue("failed to delete " + file.getAbsolutePath(), file.delete());
69    }
70  
71    @Test
72    public void testCreateParentFolders() {
73      String filename = Constants.OUTPUT_DIR_PREFIX + "/fat" + diff
74          + "/testing.txt";
75      File file = new File(filename);
76      FileAppender<Object> appender = new FileAppender<Object>();
77      appender.setLayout(new DummyLayout<Object>());
78      appender.setAppend(false);
79      appender.setFile(filename);
80      appender.setName("testCreateParentFolders");
81      appender.setContext(context);
82      appender.start();
83      appender.doAppend(new Object());
84      appender.stop();
85      assertFalse(FileUtil.mustCreateParentDirectories(file));
86      assertTrue(file.exists());
87  
88      // cleanup
89      assertTrue("failed to delete " + file.getAbsolutePath(), file.delete());
90      File parent = file.getParentFile();
91      assertTrue("failed to delete " + parent.getAbsolutePath(), parent.delete());
92    }
93  
94    @Test
95    public void testPrudentModeLogicalImplications() {
96      String filename = Constants.OUTPUT_DIR_PREFIX + diff + "testing.txt";
97      File file = new File(filename);
98      FileAppender<Object> appender = new FileAppender<Object>();
99      appender.setLayout(new DummyLayout<Object>());
100     appender.setFile(filename);
101     appender.setName("testPrudentMode");
102     appender.setContext(context);
103 
104     appender.setAppend(false);
105     appender.setImmediateFlush(false);
106     appender.setBufferedIO(true);
107     appender.setPrudent(true);
108     appender.start();
109 
110     assertTrue(appender.getImmediateFlush());
111     assertTrue(appender.isAppend());
112     assertFalse(appender.isBufferedIO());
113 
114     StatusManager sm = context.getStatusManager();
115     assertEquals(Status.WARN, sm.getLevel());
116     List<Status> statusList = sm.getCopyOfStatusList();
117     assertTrue("Expecting status list size to be larger than 3, but was "
118         + statusList.size(), statusList.size() > 3);
119     String msg1 = statusList.get(1).getMessage();
120 
121     assertTrue("Got message [" + msg1 + "]", msg1
122         .startsWith("Setting \"Append\" property"));
123     
124     appender.doAppend(new Object());
125     appender.stop();
126     assertTrue(file.exists());
127     assertTrue("failed to delete " + file.getAbsolutePath(), file.delete());
128   }
129 }