|
17 | 17 |
|
18 | 18 | package org.apache.log4jna.nt; |
19 | 19 |
|
| 20 | +import java.nio.file.Path; |
| 21 | +import java.nio.file.Paths; |
| 22 | + |
20 | 23 | import junit.framework.TestCase; |
21 | 24 |
|
22 | 25 | import org.apache.log4j.BasicConfigurator; |
23 | 26 | import org.apache.log4j.Level; |
24 | 27 | import org.apache.log4j.LogManager; |
25 | 28 | import org.apache.log4j.Logger; |
26 | 29 |
|
| 30 | +import com.sun.jna.platform.win32.Advapi32Util; |
27 | 31 | import com.sun.jna.platform.win32.Advapi32Util.EventLogIterator; |
28 | 32 | import com.sun.jna.platform.win32.Advapi32Util.EventLogRecord; |
29 | 33 | import com.sun.jna.platform.win32.Advapi32Util.EventLogType; |
30 | 34 | import com.sun.jna.platform.win32.Kernel32; |
31 | 35 | import com.sun.jna.platform.win32.WinNT; |
| 36 | +import com.sun.jna.platform.win32.WinReg; |
32 | 37 |
|
33 | 38 | /** |
34 | 39 | * |
35 | 40 | * Win32EventLogAppender tests. |
36 | 41 | * |
37 | 42 | * @author Curt Arnold |
38 | 43 | * @author <a href="mailto:dblock@dblock.org">Daniel Doubrovkine</a> |
| 44 | + * @author <a href="mailto:tony@niemira.com">Tony Niemira</a> |
| 45 | + * |
39 | 46 | */ |
40 | 47 | public class Win32EventLogAppenderTest extends TestCase { |
41 | 48 |
|
| 49 | + // If the events from this test need to be observed in the Windows Event |
| 50 | + // Logger then ensure the Win32EventlogAppender.dll can be found at this |
| 51 | + // location, or change as appropriate |
| 52 | + private static String _eventLogAppenderDLL = "c:\\windows\\temp\\Win32EventlogAppender.dll"; |
| 53 | + |
42 | 54 | private Logger _logger = null; |
43 | | - |
| 55 | + private Win32EventLogAppender _eventLogAppender = null; |
| 56 | + |
44 | 57 | public void setUp() { |
45 | | - BasicConfigurator.configure(new Win32EventLogAppender(null, null, "Log4jnaTest")); |
46 | | - _logger = Logger.getLogger(Win32EventLogAppenderTest.class); |
| 58 | + _eventLogAppender = new Win32EventLogAppender(); |
| 59 | + _eventLogAppender.setSource("Log4jnaTest"); |
| 60 | + _eventLogAppender.setApplication("Log4jnaApplicationTest"); |
| 61 | + _eventLogAppender.setCategoryMessageFile(_eventLogAppenderDLL); |
| 62 | + _eventLogAppender.setEventMessageFile(_eventLogAppenderDLL); |
| 63 | + BasicConfigurator.configure(_eventLogAppender); |
| 64 | + _logger = Logger.getLogger(Win32EventLogAppenderTest.class); |
47 | 65 | } |
48 | | - |
49 | | - /** |
50 | | - * Clean up configuration after each test. |
51 | | - */ |
| 66 | + |
52 | 67 | public void tearDown() { |
53 | 68 | LogManager.shutdown(); |
54 | 69 | } |
55 | 70 |
|
56 | 71 | public void testDebugEvent() { |
57 | | - String message = "log4jna debug message @ " + Kernel32.INSTANCE.GetTickCount(); |
| 72 | + String message = "log4jna debug message @ " |
| 73 | + + Kernel32.INSTANCE.GetTickCount(); |
58 | 74 | _logger.debug(message); |
59 | 75 | expectEvent(message, Level.DEBUG, EventLogType.Informational); |
60 | 76 | } |
61 | | - |
| 77 | + |
62 | 78 | public void testInfoEvent() { |
63 | | - String message = "log4jna info message @ " + Kernel32.INSTANCE.GetTickCount(); |
| 79 | + String message = "log4jna info message @ " |
| 80 | + + Kernel32.INSTANCE.GetTickCount(); |
64 | 81 | _logger.info(message); |
65 | | - expectEvent(message, Level.INFO, EventLogType.Informational); |
| 82 | + expectEvent(message, Level.INFO, EventLogType.Informational); |
66 | 83 | } |
67 | | - |
| 84 | + |
68 | 85 | public void testWarnEvent() { |
69 | | - String message = "log4jna warn message @ " + Kernel32.INSTANCE.GetTickCount(); |
| 86 | + String message = "log4jna warn message @ " |
| 87 | + + Kernel32.INSTANCE.GetTickCount(); |
70 | 88 | _logger.warn(message); |
71 | | - expectEvent(message, Level.WARN, EventLogType.Warning); |
| 89 | + expectEvent(message, Level.WARN, EventLogType.Warning); |
72 | 90 | } |
73 | | - |
| 91 | + |
74 | 92 | public void testFatalEvent() { |
75 | | - String message = "log4jna fatal message @ " + Kernel32.INSTANCE.GetTickCount(); |
| 93 | + String message = "log4jna fatal message @ " |
| 94 | + + Kernel32.INSTANCE.GetTickCount(); |
76 | 95 | _logger.log(Level.FATAL, message); |
77 | | - expectEvent(message, Level.FATAL, EventLogType.Error); |
| 96 | + expectEvent(message, Level.FATAL, EventLogType.Error); |
78 | 97 | } |
79 | | - |
80 | | - /* |
81 | | - public void testException() { |
82 | | - String message = "log4jna exception message @ " + Kernel32.INSTANCE.GetTickCount(); |
83 | | - _logger.debug(message, new Exception("testing exception")); |
84 | | - expectEvent(message, Level.DEBUG, EventLogType.Informational); |
| 98 | + |
| 99 | + public void testRegistryValues() { |
| 100 | + String eventSourceKeyPath = "SYSTEM\\CurrentControlSet\\Services\\EventLog\\" |
| 101 | + + _eventLogAppender.getApplication() + "\\" + _eventLogAppender.getSource(); |
| 102 | + |
| 103 | + String eventMessageFileInRegistry = Advapi32Util |
| 104 | + .registryGetStringValue(WinReg.HKEY_LOCAL_MACHINE, |
| 105 | + eventSourceKeyPath, "EventMessageFile"); |
| 106 | + |
| 107 | + Path eventMessageFileGiven = Paths.get(_eventLogAppenderDLL); |
| 108 | + assertEquals(eventMessageFileInRegistry, |
| 109 | + eventMessageFileGiven.toString()); |
| 110 | + |
| 111 | + String categoryMessageFileInRegistry = Advapi32Util |
| 112 | + .registryGetStringValue(WinReg.HKEY_LOCAL_MACHINE, |
| 113 | + eventSourceKeyPath, "CategoryMessageFile"); |
| 114 | + |
| 115 | + Path categoryMessageFileGiven = Paths.get(_eventLogAppenderDLL); |
| 116 | + assertEquals(categoryMessageFileInRegistry, |
| 117 | + categoryMessageFileGiven.toString()); |
85 | 118 | } |
86 | | - */ |
87 | | - |
88 | | - private void expectEvent(String message, Level level, EventLogType eventLogType) { |
89 | | - EventLogIterator iter = new EventLogIterator(null, "Log4jnaTest", WinNT.EVENTLOG_BACKWARDS_READ); |
| 119 | + |
| 120 | + /* |
| 121 | + * public void testException() { String message = |
| 122 | + * "log4jna exception message @ " + Kernel32.INSTANCE.GetTickCount(); |
| 123 | + * _logger.debug(message, new Exception("testing exception")); |
| 124 | + * expectEvent(message, Level.DEBUG, EventLogType.Informational); } |
| 125 | + */ |
| 126 | + |
| 127 | + private void expectEvent(String message, Level level, |
| 128 | + EventLogType eventLogType) { |
| 129 | + EventLogIterator iter = new EventLogIterator(null, "Log4jnaTest", |
| 130 | + WinNT.EVENTLOG_BACKWARDS_READ); |
90 | 131 | try { |
91 | 132 | assertTrue(iter.hasNext()); |
92 | 133 | EventLogRecord record = iter.next(); |
93 | | - assertEquals("Log4jna", record.getSource()); |
94 | | - assertEquals(eventLogType, record.getType()); |
| 134 | + assertEquals("Log4jnaTest", record.getSource()); |
| 135 | + |
| 136 | + assertEquals(eventLogType, record.getType()); |
95 | 137 | assertEquals(1, record.getRecord().NumStrings.intValue()); |
96 | 138 | assertNull(record.getData()); |
97 | | - String fullMessage = level + " " + Win32EventLogAppenderTest.class.getCanonicalName() + " - " + message; |
98 | | - String eventMessage = record.getStrings()[0].trim(); |
| 139 | + |
| 140 | + // The full message includes a level and the full class name |
| 141 | + String fullMessage = level + " " |
| 142 | + + Win32EventLogAppenderTest.class.getCanonicalName() |
| 143 | + + " - " + message; |
| 144 | + |
| 145 | + // The event message has the location tacked on the front |
| 146 | + StringBuilder eventMessage = new StringBuilder(); |
| 147 | + for (int i = 0; i < record.getStrings().length; i++) { |
| 148 | + eventMessage.append(record.getStrings()[i].trim()); |
| 149 | + } |
| 150 | + |
| 151 | + System.out.println(eventMessage.toString()); |
| 152 | + |
99 | 153 | int levelMarker = eventMessage.indexOf(level.toString()); |
100 | | - assertTrue("missing level marker in '" + eventMessage + "'", levelMarker >= 0); |
101 | | - String eventMessageWithoutLocation = eventMessage.substring(levelMarker); |
| 154 | + assertTrue("missing level marker in '" + eventMessage + "'", |
| 155 | + levelMarker >= 0); |
| 156 | + String eventMessageWithoutLocation = eventMessage |
| 157 | + .substring(levelMarker); |
102 | 158 | assertEquals(fullMessage, eventMessageWithoutLocation); |
103 | | - System.out.println(record.getStrings()[0]); |
104 | 159 | } finally { |
105 | 160 | iter.close(); |
106 | 161 | } |
|
0 commit comments