PageRenderTime 48ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/jboss-as-7.1.1.Final/logging/src/test/java/org/jboss/as/logging/LoggingOperationsSubsystemTestCase.java

#
Java | 298 lines | 187 code | 56 blank | 55 comment | 20 complexity | 9db070ca78d342a9f23d55fb96c9c622 MD5 | raw file
Possible License(s): LGPL-2.1, Apache-2.0
  1. /*
  2. * JBoss, Home of Professional Open Source.
  3. * Copyright 2011, Red Hat Middleware LLC, and individual contributors
  4. * as indicated by the @author tags. See the copyright.txt file in the
  5. * distribution for a full listing of individual contributors.
  6. *
  7. * This is free software; you can redistribute it and/or modify it
  8. * under the terms of the GNU Lesser General Public License as
  9. * published by the Free Software Foundation; either version 2.1 of
  10. * the License, or (at your option) any later version.
  11. *
  12. * This software is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with this software; if not, write to the Free
  19. * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  20. * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  21. */
  22. package org.jboss.as.logging;
  23. import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.RESULT;
  24. import static org.junit.Assert.assertEquals;
  25. import static org.junit.Assert.assertFalse;
  26. import static org.junit.Assert.assertTrue;
  27. import java.io.File;
  28. import java.util.HashMap;
  29. import java.util.LinkedList;
  30. import java.util.List;
  31. import java.util.Map;
  32. import org.apache.commons.io.FileUtils;
  33. import org.jboss.as.subsystem.test.AbstractSubsystemTest;
  34. import org.jboss.as.subsystem.test.KernelServices;
  35. import org.jboss.dmr.ModelNode;
  36. import org.jboss.logging.Logger;
  37. import org.jboss.logging.Logger.Level;
  38. import org.junit.BeforeClass;
  39. import org.junit.Ignore;
  40. import org.junit.Test;
  41. /**
  42. *
  43. * @author <a href="kabir.khan@jboss.com">Kabir Khan</a>
  44. */
  45. public class LoggingOperationsSubsystemTestCase extends AbstractSubsystemTest {
  46. private static File logDir;
  47. static {
  48. System.setProperty("java.util.logging.manager", "org.jboss.logmanager.LogManager");
  49. }
  50. private static final Logger log = Logger.getLogger(LoggingOperationsSubsystemTestCase.class.getName());
  51. public LoggingOperationsSubsystemTestCase() {
  52. super(LoggingExtension.SUBSYSTEM_NAME, new LoggingExtension());
  53. }
  54. @BeforeClass
  55. public static void setupLoggingDir() {
  56. logDir = new File("target/logs");
  57. logDir.mkdirs();
  58. for (String name : logDir.list()) {
  59. new File(logDir, name).delete();
  60. }
  61. System.setProperty("jboss.server.log.dir", logDir.getAbsolutePath());
  62. }
  63. @Test
  64. public void testChangeRootLogLevel() throws Exception {
  65. KernelServices kernelServices = installInController(readResource("/operations.xml"));
  66. // add new file loger so we can track logged messages
  67. File logFile = new File(logDir, "test-fh.log");
  68. if (logFile.exists()) assertTrue(logFile.delete());
  69. addFileHandler(kernelServices, "test-logger", "TRACE", logFile, true);
  70. Level[] levels = new Logger.Level[] {Level.ERROR, Level.WARN,
  71. Level.INFO, Level.DEBUG, Level.TRACE};
  72. Map<Level, Integer> levelOrd = new HashMap<Level,Integer>();
  73. levelOrd.put(Level.FATAL, 0);
  74. levelOrd.put(Level.ERROR, 1);
  75. levelOrd.put(Level.WARN, 2);
  76. levelOrd.put(Level.INFO, 3);
  77. levelOrd.put(Level.DEBUG, 4);
  78. levelOrd.put(Level.TRACE, 5);
  79. // log messages on all levels with different root logger level settings
  80. for(Level level : levels) {
  81. // change root log level
  82. ModelNode op = createOpNode("subsystem=logging/root-logger=ROOT", "change-root-log-level");
  83. op.get("level").set(level.name());
  84. ModelNode ret = kernelServices.executeOperation(op);
  85. // log a message
  86. for (Logger.Level lvl : Logger.Level.values()) {
  87. log.log(lvl, "RootLoggerTestCaseTST " + level);
  88. }
  89. }
  90. // stop logger
  91. removeFileHandler(kernelServices, "test-logger", true);
  92. // go through loggeded messages - test that with each root logger level settings
  93. // message with equal priority and also messags with all higher
  94. // priorities were logged
  95. boolean[][] logFound = new boolean[levelOrd.size()][levelOrd.size()];
  96. List<String> logLines = FileUtils.readLines(logFile);
  97. for(String line : logLines) {
  98. if (! line.contains("RootLoggerTestCaseTST")) continue; // not our log
  99. String[] lWords = line.split(" +");
  100. try {
  101. Level lineLogLevel = Level.valueOf(lWords[1]);
  102. Level rootLogLevel = Level.valueOf(lWords[5]);
  103. int ll = levelOrd.get(lineLogLevel);
  104. int rl = levelOrd.get(rootLogLevel);
  105. assertTrue(ll <= rl);
  106. logFound[ll][rl] = true;
  107. } catch (Exception e) {
  108. throw new Exception("Unexpected log:" + line);
  109. }
  110. }
  111. for(Level level : levels) {
  112. int rl = levelOrd.get(level);
  113. for(int ll = 0; ll <= rl; ll++) assertTrue(logFound[ll][rl]);
  114. }
  115. }
  116. @Test
  117. @Ignore("AS7-2385")
  118. public void testSetRootLogger() throws Exception {
  119. KernelServices kernelServices = installInController(readResource("/operations.xml"));
  120. // add new file loger so we can test root logger change
  121. File logFile = new File(logDir, "test-fh.log");
  122. if (logFile.exists()) assertTrue(logFile.delete());
  123. addFileHandler(kernelServices, "test-logger", "TRACE", logFile, false);
  124. // read root logger
  125. ModelNode op = createOpNode("subsystem=logging", "read-attribute");
  126. op.get("name").set("root-logger");
  127. ModelNode rootLogger = kernelServices.executeOperation(op);
  128. List<String> handlers = modelNodeAsStringList(rootLogger.get("handlers"));
  129. // set new root logger
  130. op = createOpNode("subsystem=logging", "set-root-logger");
  131. op.get("level").set(rootLogger.get("level"));
  132. for(String handler : handlers) op.get("handlers").add(handler);
  133. op.get("handlers").add("test-logger");
  134. kernelServices.executeOperation(op);
  135. // log a message
  136. for (Logger.Level lvl : Logger.Level.values())
  137. log.log(lvl, "Test123");
  138. // revert root logger
  139. op = createOpNode("subsystem=logging", "set-root-logger");
  140. op.get("level").set(rootLogger.get("level"));
  141. op.get("handlers").set(rootLogger.get("handlers"));
  142. kernelServices.executeOperation(op);
  143. // remove file handler
  144. removeFileHandler(kernelServices, "test-logger", false);
  145. // check that root logger were changed - file logger was registered
  146. String log = FileUtils.readFileToString(logFile);
  147. assertTrue(log.contains("Test123."));
  148. // remove log file
  149. assertTrue(logFile.delete());
  150. }
  151. @Test
  152. public void testAddRemoveFileHandler() throws Exception {
  153. KernelServices kernelServices = installInController(readResource("/operations.xml"));
  154. File logFile = new File(logDir, "test-fh.log");
  155. if (logFile.exists()) assertTrue(logFile.delete());
  156. // add file handler
  157. ModelNode op = createOpNode("subsystem=logging/file-handler=test-fh", "add");
  158. op.get("name").set("test-fh");
  159. op.get("level").set("INFO");
  160. op.get("file").get("path").set(logFile.getAbsolutePath());
  161. kernelServices.executeOperation(op);
  162. // register it with root logger
  163. op = createOpNode("subsystem=logging/root-logger=ROOT", "root-logger-assign-handler");
  164. op.get("name").set("test-fh");
  165. kernelServices.executeOperation(op);
  166. // check it is listed in root-logger
  167. op = createOpNode("subsystem=logging/root-logger=ROOT", "read-attribute");
  168. op.get("name").set("handlers");
  169. ModelNode handlers = kernelServices.executeOperation(op).require(RESULT);
  170. List<String> loggers = modelNodeAsStringList(handlers);
  171. assertTrue(loggers.contains("test-fh"));
  172. for (Logger.Level level : Logger.Level.values()) {
  173. log.log(level, "Test123");
  174. }
  175. // deregister handler from logger
  176. op = createOpNode("subsystem=logging/root-logger=ROOT", "root-logger-unassign-handler");
  177. op.get("name").set("test-fh");
  178. kernelServices.executeOperation(op);
  179. // check it is not listed in root-logger
  180. op = createOpNode("subsystem=logging/root-logger=ROOT", "read-attribute");
  181. op.get("name").set("handlers");
  182. handlers = kernelServices.executeOperation(op);
  183. loggers = modelNodeAsStringList(handlers);
  184. assertFalse(loggers.contains("test-fh"));
  185. // remove handler
  186. op = createOpNode("subsystem=logging/file-handler=test-fh", "remove");
  187. kernelServices.executeOperation(op);
  188. // check generated log file
  189. assertTrue(FileUtils.readFileToString(logFile).contains("Test123"));
  190. // verify that the logger is stopped, no more logs are comming to the file
  191. long checksum = FileUtils.checksumCRC32(logFile);
  192. for (Logger.Level level : Logger.Level.values()) {
  193. log.log(level, "Test123");
  194. }
  195. assertEquals(checksum, FileUtils.checksumCRC32(logFile));
  196. // remove log file
  197. assertTrue(logFile.delete());
  198. }
  199. private void addFileHandler(KernelServices kernelServices, String name, String level, File file, boolean assign) throws Exception {
  200. // add file handler
  201. ModelNode op = createOpNode("subsystem=logging/file-handler=" + name, "add");
  202. op.get("name").set(name);
  203. op.get("level").set(level);
  204. op.get("file").get("path").set(file.getAbsolutePath());
  205. kernelServices.executeOperation(op);
  206. if (!assign) return;
  207. // register it with root logger
  208. op = createOpNode("subsystem=logging/root-logger=ROOT", "root-logger-assign-handler");
  209. op.get("name").set(name);
  210. kernelServices.executeOperation(op);
  211. }
  212. private void removeFileHandler(KernelServices kernelServices, String name, boolean unassign) throws Exception {
  213. if (unassign) {
  214. // deregister handler from logger
  215. ModelNode op = createOpNode("subsystem=logging/root-logger=ROOT", "root-logger-unassign-handler");
  216. op.get("name").set(name);
  217. kernelServices.executeOperation(op);
  218. }
  219. // remove handler
  220. ModelNode op = createOpNode("subsystem=logging/file-handler=" + name, "remove");
  221. kernelServices.executeOperation(op);
  222. }
  223. public static ModelNode createOpNode(String address, String operation) {
  224. ModelNode op = new ModelNode();
  225. // set address
  226. ModelNode list = op.get("address").setEmptyList();
  227. if (address != null) {
  228. String [] pathSegments = address.split("/");
  229. for (String segment : pathSegments) {
  230. String[] elements = segment.split("=");
  231. list.add(elements[0], elements[1]);
  232. }
  233. }
  234. op.get("operation").set(operation);
  235. return op;
  236. }
  237. private static List<String> modelNodeAsStringList(ModelNode node) {
  238. List<String> ret = new LinkedList<String>();
  239. for (ModelNode n : node.asList()) ret.add(n.asString());
  240. return ret;
  241. }
  242. }