@@ -90,8 +90,8 @@ public class LogbackHelper { | |||
return consoleAppender; | |||
} | |||
public Logger configureLogger(LoggerContext loggerContext, String loggerName, Level level) { | |||
Logger logger = loggerContext.getLogger(loggerName); | |||
public Logger configureLogger(String loggerName, Level level) { | |||
Logger logger = getRootContext().getLogger(loggerName); | |||
logger.setLevel(level); | |||
return logger; | |||
} |
@@ -102,9 +102,7 @@ public class LogbackHelperTest { | |||
@Test | |||
public void configureLogger() { | |||
LoggerContext ctx = underTest.getRootContext(); | |||
Logger logger = underTest.configureLogger(ctx, "my_logger", Level.WARN); | |||
Logger logger = underTest.configureLogger("my_logger", Level.WARN); | |||
assertThat(logger.getLevel()).isEqualTo(Level.WARN); | |||
assertThat(logger.getName()).isEqualTo("my_logger"); |
@@ -37,7 +37,7 @@ public class SearchLogging { | |||
ctx.reset(); | |||
ConsoleAppender<ILoggingEvent> consoleAppender = helper.newConsoleAppender(ctx, "CONSOLE", LOG_FORMAT, null); | |||
Logger rootLogger = helper.configureLogger(ctx, Logger.ROOT_LOGGER_NAME, Level.INFO); | |||
Logger rootLogger = helper.configureLogger(Logger.ROOT_LOGGER_NAME, Level.INFO); | |||
rootLogger.addAppender(consoleAppender); | |||
return ctx; | |||
} |
@@ -20,6 +20,7 @@ | |||
package org.sonar.server.app; | |||
import com.google.common.base.Throwables; | |||
import java.io.File; | |||
import org.apache.catalina.LifecycleException; | |||
import org.apache.catalina.core.StandardContext; | |||
import org.apache.catalina.startup.Tomcat; | |||
@@ -28,8 +29,6 @@ import org.sonar.api.utils.log.Loggers; | |||
import org.sonar.process.ProcessProperties; | |||
import org.sonar.process.Props; | |||
import java.io.File; | |||
class EmbeddedTomcat { | |||
private final Props props; | |||
@@ -60,7 +59,7 @@ class EmbeddedTomcat { | |||
webappContext = Webapp.configure(tomcat, props); | |||
try { | |||
tomcat.start(); | |||
new StartupLogs(props, Loggers.get(getClass())).log(tomcat); | |||
new TomcatStartupLogs(props, Loggers.get(getClass())).log(tomcat); | |||
} catch (LifecycleException e) { | |||
Throwables.propagate(e); | |||
} |
@@ -31,12 +31,13 @@ import org.sonar.process.LogbackHelper; | |||
import org.sonar.process.Props; | |||
import org.sonar.server.computation.log.CeLogDenyFilter; | |||
import org.sonar.server.computation.log.CeLogging; | |||
import org.sonar.server.platform.ServerLogging; | |||
/** | |||
* Configure logback for web server process. Logs must be written to console, which is | |||
* forwarded to file logs/sonar.log by the app master process. | |||
*/ | |||
class WebLogging { | |||
class ServerProcessLogging { | |||
private static final String LOG_FORMAT = "%d{yyyy.MM.dd HH:mm:ss} %-5level web[%logger{20}] %msg%n"; | |||
public static final String LOG_LEVEL_PROPERTY = "sonar.log.level"; | |||
@@ -49,7 +50,7 @@ class WebLogging { | |||
helper.enableJulChangePropagation(ctx); | |||
configureAppender(ctx, props); | |||
configureLevels(ctx, props); | |||
configureLevels(props); | |||
// Configure java.util.logging, used by Tomcat, in order to forward to slf4j | |||
LogManager.getLogManager().reset(); | |||
@@ -64,17 +65,7 @@ class WebLogging { | |||
} | |||
private void configureLevels(LoggerContext ctx, Props props) { | |||
// override level of some loggers | |||
helper.configureLogger(ctx, "rails", Level.WARN); | |||
helper.configureLogger(ctx, "org.apache.ibatis", Level.WARN); | |||
helper.configureLogger(ctx, "java.sql", Level.WARN); | |||
helper.configureLogger(ctx, "java.sql.ResultSet", Level.WARN); | |||
helper.configureLogger(ctx, "org.sonar.MEASURE_FILTER", Level.WARN); | |||
helper.configureLogger(ctx, "org.elasticsearch", Level.INFO); | |||
helper.configureLogger(ctx, "org.elasticsearch.node", Level.INFO); | |||
helper.configureLogger(ctx, "org.elasticsearch.http", Level.INFO); | |||
helper.configureLogger(ctx, "ch.qos.logback", Level.WARN); | |||
private void configureLevels(Props props) { | |||
String levelCode = props.value(LOG_LEVEL_PROPERTY, "INFO"); | |||
Level level; | |||
if ("TRACE".equals(levelCode)) { | |||
@@ -86,6 +77,6 @@ class WebLogging { | |||
} else { | |||
throw MessageException.of(String.format("Unsupported log level: %s. Please check property %s", levelCode, LOG_LEVEL_PROPERTY)); | |||
} | |||
helper.configureLogger(ctx, Logger.ROOT_LOGGER_NAME, level); | |||
ServerLogging.configureLevels(helper, level); | |||
} | |||
} |
@@ -26,12 +26,12 @@ import org.apache.coyote.http11.AbstractHttp11JsseProtocol; | |||
import org.sonar.api.utils.log.Logger; | |||
import org.sonar.process.Props; | |||
class StartupLogs { | |||
class TomcatStartupLogs { | |||
private final Logger log; | |||
private final Props props; | |||
StartupLogs(Props props, Logger log) { | |||
TomcatStartupLogs(Props props, Logger log) { | |||
this.props = props; | |||
this.log = log; | |||
} |
@@ -61,7 +61,7 @@ public class WebServer implements Monitored { | |||
public static void main(String[] args) throws Exception { | |||
ProcessEntryPoint entryPoint = ProcessEntryPoint.createForArguments(args); | |||
Props props = entryPoint.getProps(); | |||
new WebLogging().configure(props); | |||
new ServerProcessLogging().configure(props); | |||
WebServer server = new WebServer(props); | |||
entryPoint.launch(server); | |||
} |
@@ -0,0 +1,83 @@ | |||
/* | |||
* SonarQube, open source software quality management tool. | |||
* Copyright (C) 2008-2014 SonarSource | |||
* mailto:contact AT sonarsource DOT com | |||
* | |||
* SonarQube is free software; you can redistribute it and/or | |||
* modify it under the terms of the GNU Lesser General Public | |||
* License as published by the Free Software Foundation; either | |||
* version 3 of the License, or (at your option) any later version. | |||
* | |||
* SonarQube is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
* Lesser General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Lesser General Public License | |||
* along with this program; if not, write to the Free Software Foundation, | |||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||
*/ | |||
package org.sonar.server.platform; | |||
import ch.qos.logback.classic.Level; | |||
import ch.qos.logback.classic.Logger; | |||
import com.google.common.base.Preconditions; | |||
import com.google.common.collect.ImmutableSet; | |||
import java.io.File; | |||
import java.util.Set; | |||
import org.slf4j.LoggerFactory; | |||
import org.sonar.api.config.Settings; | |||
import org.sonar.api.server.ServerSide; | |||
import org.sonar.process.LogbackHelper; | |||
import org.sonar.process.ProcessProperties; | |||
@ServerSide | |||
public class ServerLogging { | |||
public static final Set<Level> ALLOWED_ROOT_LOG_LEVELS = ImmutableSet.of(Level.TRACE, Level.DEBUG, Level.INFO); | |||
private final LogbackHelper helper = new LogbackHelper(); | |||
private final Settings settings; | |||
public ServerLogging(Settings settings) { | |||
this.settings = settings; | |||
} | |||
public void changeLevel(Level level) { | |||
configureLevels(helper, level); | |||
LoggerFactory.getLogger(ServerLogging.class).info("Level of logs changed to {}", level); | |||
} | |||
public static void configureLevels(LogbackHelper helper, Level level) { | |||
Preconditions.checkArgument(ALLOWED_ROOT_LOG_LEVELS.contains(level), "Allowed log levels are %s", ALLOWED_ROOT_LOG_LEVELS); | |||
helper.configureLogger(Logger.ROOT_LOGGER_NAME, level); | |||
helper.configureLogger("rails", Level.WARN); | |||
helper.configureLogger("org.apache.ibatis", Level.WARN); | |||
helper.configureLogger("java.sql", Level.WARN); | |||
helper.configureLogger("java.sql.ResultSet", Level.WARN); | |||
helper.configureLogger("org.sonar.MEASURE_FILTER", Level.WARN); | |||
helper.configureLogger("org.elasticsearch", Level.INFO); | |||
helper.configureLogger("org.elasticsearch.node", Level.INFO); | |||
helper.configureLogger("org.elasticsearch.http", Level.INFO); | |||
helper.configureLogger("ch.qos.logback", Level.WARN); | |||
helper.configureLogger("org.apache.catalina", Level.INFO); | |||
helper.configureLogger("org.apache.coyote", Level.INFO); | |||
helper.configureLogger("org.apache.jasper", Level.INFO); | |||
helper.configureLogger("org.apache.tomcat", Level.INFO); | |||
} | |||
/** | |||
* The directory that contains log files. May not exist. | |||
*/ | |||
public File getLogsDir() { | |||
return new File(settings.getString(ProcessProperties.PATH_LOGS)); | |||
} | |||
/** | |||
* The file sonar.log, may not exist. | |||
*/ | |||
public File getCurrentLogFile() { | |||
return new File(getLogsDir(), "sonar.log"); | |||
} | |||
} |
@@ -166,6 +166,7 @@ import org.sonar.server.permission.PermissionService; | |||
import org.sonar.server.permission.PermissionUpdater; | |||
import org.sonar.server.permission.ws.PermissionsWsModule; | |||
import org.sonar.server.platform.BackendCleanup; | |||
import org.sonar.server.platform.ServerLogging; | |||
import org.sonar.server.platform.SettingsChangeNotifier; | |||
import org.sonar.server.platform.monitoring.DatabaseMonitor; | |||
import org.sonar.server.platform.monitoring.EsMonitor; | |||
@@ -173,9 +174,11 @@ import org.sonar.server.platform.monitoring.JvmPropertiesMonitor; | |||
import org.sonar.server.platform.monitoring.PluginsMonitor; | |||
import org.sonar.server.platform.monitoring.SonarQubeMonitor; | |||
import org.sonar.server.platform.monitoring.SystemMonitor; | |||
import org.sonar.server.platform.ws.ChangeLogLevelAction; | |||
import org.sonar.server.platform.ws.DbMigrationStatusAction; | |||
import org.sonar.server.platform.ws.InfoAction; | |||
import org.sonar.server.platform.ws.L10nWs; | |||
import org.sonar.server.platform.ws.LogsAction; | |||
import org.sonar.server.platform.ws.MigrateDbAction; | |||
import org.sonar.server.platform.ws.RestartAction; | |||
import org.sonar.server.platform.ws.ServerWs; | |||
@@ -668,6 +671,7 @@ public class PlatformLevel4 extends PlatformLevel { | |||
TypeValidationModule.class, | |||
// System | |||
ServerLogging.class, | |||
RestartAction.class, | |||
InfoAction.class, | |||
UpgradesAction.class, | |||
@@ -680,6 +684,8 @@ public class PlatformLevel4 extends PlatformLevel { | |||
JvmPropertiesMonitor.class, | |||
DatabaseMonitor.class, | |||
MigrateDbAction.class, | |||
LogsAction.class, | |||
ChangeLogLevelAction.class, | |||
DbMigrationStatusAction.class, | |||
// Plugins WS |
@@ -0,0 +1,62 @@ | |||
/* | |||
* SonarQube, open source software quality management tool. | |||
* Copyright (C) 2008-2014 SonarSource | |||
* mailto:contact AT sonarsource DOT com | |||
* | |||
* SonarQube is free software; you can redistribute it and/or | |||
* modify it under the terms of the GNU Lesser General Public | |||
* License as published by the Free Software Foundation; either | |||
* version 3 of the License, or (at your option) any later version. | |||
* | |||
* SonarQube is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
* Lesser General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Lesser General Public License | |||
* along with this program; if not, write to the Free Software Foundation, | |||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||
*/ | |||
package org.sonar.server.platform.ws; | |||
import ch.qos.logback.classic.Level; | |||
import org.sonar.api.server.ws.Request; | |||
import org.sonar.api.server.ws.Response; | |||
import org.sonar.api.server.ws.WebService; | |||
import org.sonar.api.web.UserRole; | |||
import org.sonar.server.platform.ServerLogging; | |||
import org.sonar.server.user.UserSession; | |||
public class ChangeLogLevelAction implements SystemWsAction { | |||
private static final String PARAM_LEVEL = "level"; | |||
private final UserSession userSession; | |||
private final ServerLogging logging; | |||
public ChangeLogLevelAction(UserSession userSession, ServerLogging logging) { | |||
this.userSession = userSession; | |||
this.logging = logging; | |||
} | |||
@Override | |||
public void define(WebService.NewController controller) { | |||
WebService.NewAction newAction = controller.createAction("change_log_level") | |||
.setDescription("Changes temporarily level of logs. New level is not persistent and is lost " + | |||
"when restarting server.") | |||
.setSince("5.2") | |||
.setHandler(this); | |||
newAction.createParam(PARAM_LEVEL) | |||
.setDescription("The new level. Warning - DEBUG and TRACE have performance impacts.") | |||
.setPossibleValues(ServerLogging.ALLOWED_ROOT_LOG_LEVELS) | |||
.setRequired(true); | |||
} | |||
@Override | |||
public void handle(Request wsRequest, Response wsResponse) { | |||
userSession.checkGlobalPermission(UserRole.ADMIN); | |||
logging.changeLevel(Level.toLevel(wsRequest.mandatoryParam(PARAM_LEVEL))); | |||
wsResponse.noContent(); | |||
} | |||
} |
@@ -0,0 +1,59 @@ | |||
/* | |||
* SonarQube, open source software quality management tool. | |||
* Copyright (C) 2008-2014 SonarSource | |||
* mailto:contact AT sonarsource DOT com | |||
* | |||
* SonarQube is free software; you can redistribute it and/or | |||
* modify it under the terms of the GNU Lesser General Public | |||
* License as published by the Free Software Foundation; either | |||
* version 3 of the License, or (at your option) any later version. | |||
* | |||
* SonarQube is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
* Lesser General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Lesser General Public License | |||
* along with this program; if not, write to the Free Software Foundation, | |||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||
*/ | |||
package org.sonar.server.platform.ws; | |||
import java.io.File; | |||
import org.apache.commons.io.FileUtils; | |||
import org.sonar.api.server.ws.Request; | |||
import org.sonar.api.server.ws.Response; | |||
import org.sonar.api.server.ws.WebService; | |||
import org.sonar.api.web.UserRole; | |||
import org.sonar.server.platform.ServerLogging; | |||
import org.sonar.server.plugins.MimeTypes; | |||
import org.sonar.server.user.UserSession; | |||
public class LogsAction implements SystemWsAction { | |||
private final UserSession userSession; | |||
private final ServerLogging serverLogging; | |||
public LogsAction(UserSession userSession, ServerLogging serverLogging) { | |||
this.userSession = userSession; | |||
this.serverLogging = serverLogging; | |||
} | |||
@Override | |||
public void define(WebService.NewController controller) { | |||
controller.createAction("logs") | |||
.setDescription("System logs in plain-text format. Requires system administration permission.") | |||
.setSince("5.2") | |||
.setHandler(this); | |||
} | |||
@Override | |||
public void handle(Request wsRequest, Response wsResponse) throws Exception { | |||
userSession.checkGlobalPermission(UserRole.ADMIN); | |||
wsResponse.stream().setMediaType(MimeTypes.TXT); | |||
File file = serverLogging.getCurrentLogFile(); | |||
if (file.exists()) { | |||
FileUtils.copyFile(file, wsResponse.stream().output()); | |||
} | |||
} | |||
} |
@@ -38,13 +38,13 @@ import org.sonar.process.Props; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
public class WebLoggingTest { | |||
public class ServerProcessLoggingTest { | |||
@Rule | |||
public TemporaryFolder temp = new TemporaryFolder(); | |||
Props props = new Props(new Properties()); | |||
WebLogging underTest = new WebLogging(); | |||
ServerProcessLogging underTest = new ServerProcessLogging(); | |||
/** | |||
* Path to data dir must be set for Compute Engine logging. |
@@ -19,6 +19,7 @@ | |||
*/ | |||
package org.sonar.server.app; | |||
import java.util.Properties; | |||
import org.apache.catalina.connector.Connector; | |||
import org.apache.catalina.startup.Tomcat; | |||
import org.apache.coyote.http11.AbstractHttp11JsseProtocol; | |||
@@ -27,17 +28,18 @@ import org.mockito.Mockito; | |||
import org.sonar.api.utils.log.Logger; | |||
import org.sonar.process.Props; | |||
import java.util.Properties; | |||
import static org.junit.Assert.fail; | |||
import static org.mockito.Mockito.*; | |||
import static org.mockito.Mockito.mock; | |||
import static org.mockito.Mockito.verify; | |||
import static org.mockito.Mockito.verifyNoMoreInteractions; | |||
import static org.mockito.Mockito.when; | |||
public class StartupLogsTest { | |||
Tomcat tomcat = mock(Tomcat.class, Mockito.RETURNS_DEEP_STUBS); | |||
Logger logger = mock(Logger.class); | |||
Props props = new Props(new Properties()); | |||
StartupLogs underTest = new StartupLogs(props, logger); | |||
TomcatStartupLogs underTest = new TomcatStartupLogs(props, logger); | |||
@Test | |||
public void logAjp() { |
@@ -0,0 +1,85 @@ | |||
/* | |||
* SonarQube, open source software quality management tool. | |||
* Copyright (C) 2008-2014 SonarSource | |||
* mailto:contact AT sonarsource DOT com | |||
* | |||
* SonarQube is free software; you can redistribute it and/or | |||
* modify it under the terms of the GNU Lesser General Public | |||
* License as published by the Free Software Foundation; either | |||
* version 3 of the License, or (at your option) any later version. | |||
* | |||
* SonarQube is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
* Lesser General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Lesser General Public License | |||
* along with this program; if not, write to the Free Software Foundation, | |||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||
*/ | |||
package org.sonar.server.platform; | |||
import ch.qos.logback.classic.Level; | |||
import ch.qos.logback.classic.Logger; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import org.apache.commons.io.FileUtils; | |||
import org.junit.Rule; | |||
import org.junit.Test; | |||
import org.junit.rules.ExpectedException; | |||
import org.junit.rules.TemporaryFolder; | |||
import org.sonar.api.config.Settings; | |||
import org.sonar.process.LogbackHelper; | |||
import org.sonar.process.ProcessProperties; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
import static org.mockito.Mockito.mock; | |||
import static org.mockito.Mockito.verify; | |||
public class ServerLoggingTest { | |||
@Rule | |||
public TemporaryFolder temp = new TemporaryFolder(); | |||
@Rule | |||
public ExpectedException expectedException = ExpectedException.none(); | |||
Settings settings = new Settings(); | |||
ServerLogging underTest = new ServerLogging(settings); | |||
@Test | |||
public void getLogsDir() throws IOException { | |||
File dir = temp.newFolder(); | |||
settings.setProperty(ProcessProperties.PATH_LOGS, dir.getAbsolutePath()); | |||
assertThat(underTest.getLogsDir()).isEqualTo(dir); | |||
} | |||
@Test | |||
public void getCurrentLogFile() throws IOException { | |||
File dir = temp.newFolder(); | |||
File logFile = new File(dir, "sonar.log"); | |||
FileUtils.touch(logFile); | |||
settings.setProperty(ProcessProperties.PATH_LOGS, dir.getAbsolutePath()); | |||
assertThat(underTest.getCurrentLogFile()).isEqualTo(logFile); | |||
} | |||
@Test | |||
public void configureLevels() { | |||
LogbackHelper logbackHelper = mock(LogbackHelper.class); | |||
ServerLogging.configureLevels(logbackHelper, Level.TRACE); | |||
verify(logbackHelper).configureLogger(Logger.ROOT_LOGGER_NAME, Level.TRACE); | |||
verify(logbackHelper).configureLogger("java.sql", Level.WARN); | |||
} | |||
@Test | |||
public void configureLevels_unsupported_level() { | |||
expectedException.expect(IllegalArgumentException.class); | |||
expectedException.expectMessage("Allowed log levels are [TRACE, DEBUG, INFO]"); | |||
LogbackHelper logbackHelper = mock(LogbackHelper.class); | |||
ServerLogging.configureLevels(logbackHelper, Level.ERROR); | |||
} | |||
} |
@@ -0,0 +1,83 @@ | |||
/* | |||
* SonarQube, open source software quality management tool. | |||
* Copyright (C) 2008-2014 SonarSource | |||
* mailto:contact AT sonarsource DOT com | |||
* | |||
* SonarQube is free software; you can redistribute it and/or | |||
* modify it under the terms of the GNU Lesser General Public | |||
* License as published by the Free Software Foundation; either | |||
* version 3 of the License, or (at your option) any later version. | |||
* | |||
* SonarQube is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
* Lesser General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Lesser General Public License | |||
* along with this program; if not, write to the Free Software Foundation, | |||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||
*/ | |||
package org.sonar.server.platform.ws; | |||
import ch.qos.logback.classic.Level; | |||
import org.junit.Rule; | |||
import org.junit.Test; | |||
import org.junit.rules.ExpectedException; | |||
import org.sonar.api.web.UserRole; | |||
import org.sonar.server.exceptions.ForbiddenException; | |||
import org.sonar.server.platform.ServerLogging; | |||
import org.sonar.server.tester.UserSessionRule; | |||
import org.sonar.server.ws.WsActionTester; | |||
import static org.mockito.Mockito.mock; | |||
import static org.mockito.Mockito.verify; | |||
public class ChangeLogLevelActionTest { | |||
@Rule | |||
public UserSessionRule userSession = UserSessionRule.standalone(); | |||
@Rule | |||
public ExpectedException expectedException = ExpectedException.none(); | |||
ServerLogging serverLogging = mock(ServerLogging.class); | |||
ChangeLogLevelAction underTest = new ChangeLogLevelAction(userSession, serverLogging); | |||
WsActionTester actionTester = new WsActionTester(underTest); | |||
@Test | |||
public void change_level() { | |||
userSession.setGlobalPermissions(UserRole.ADMIN); | |||
actionTester.newRequest() | |||
.setParam("level", "DEBUG") | |||
.setMethod("POST") | |||
.execute(); | |||
verify(serverLogging).changeLevel(Level.DEBUG); | |||
} | |||
@Test | |||
public void fail_if_bad_level() { | |||
expectedException.expect(IllegalArgumentException.class); | |||
userSession.setGlobalPermissions(UserRole.ADMIN); | |||
actionTester.newRequest() | |||
.setParam("level", "ERROR") | |||
.setMethod("POST") | |||
.execute(); | |||
} | |||
@Test | |||
public void fail_if_missing_level() { | |||
expectedException.expect(IllegalArgumentException.class); | |||
userSession.setGlobalPermissions(UserRole.ADMIN); | |||
actionTester.newRequest() | |||
.setMethod("POST") | |||
.execute(); | |||
} | |||
@Test | |||
public void requires_admin_permission() { | |||
expectedException.expect(ForbiddenException.class); | |||
actionTester.newRequest().setMethod("POST").execute(); | |||
} | |||
} |
@@ -0,0 +1,88 @@ | |||
/* | |||
* SonarQube, open source software quality management tool. | |||
* Copyright (C) 2008-2014 SonarSource | |||
* mailto:contact AT sonarsource DOT com | |||
* | |||
* SonarQube is free software; you can redistribute it and/or | |||
* modify it under the terms of the GNU Lesser General Public | |||
* License as published by the Free Software Foundation; either | |||
* version 3 of the License, or (at your option) any later version. | |||
* | |||
* SonarQube is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
* Lesser General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Lesser General Public License | |||
* along with this program; if not, write to the Free Software Foundation, | |||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||
*/ | |||
package org.sonar.server.platform.ws; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import org.apache.commons.io.FileUtils; | |||
import org.junit.Rule; | |||
import org.junit.Test; | |||
import org.junit.rules.ExpectedException; | |||
import org.junit.rules.TemporaryFolder; | |||
import org.sonar.api.web.UserRole; | |||
import org.sonar.server.exceptions.ForbiddenException; | |||
import org.sonar.server.platform.ServerLogging; | |||
import org.sonar.server.plugins.MimeTypes; | |||
import org.sonar.server.tester.UserSessionRule; | |||
import org.sonar.server.ws.TestResponse; | |||
import org.sonar.server.ws.WsActionTester; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
import static org.mockito.Mockito.mock; | |||
import static org.mockito.Mockito.when; | |||
public class LogsActionTest { | |||
@Rule | |||
public UserSessionRule userSession = UserSessionRule.standalone(); | |||
@Rule | |||
public TemporaryFolder temp = new TemporaryFolder(); | |||
@Rule | |||
public ExpectedException expectedException = ExpectedException.none(); | |||
ServerLogging serverLogging = mock(ServerLogging.class); | |||
LogsAction underTest = new LogsAction(userSession, serverLogging); | |||
WsActionTester actionTester = new WsActionTester(underTest); | |||
@Test | |||
public void get_logs() throws IOException { | |||
userSession.setGlobalPermissions(UserRole.ADMIN); | |||
File file = temp.newFile(); | |||
FileUtils.write(file, "{logs}"); | |||
when(serverLogging.getCurrentLogFile()).thenReturn(file); | |||
TestResponse response = actionTester.newRequest().execute(); | |||
assertThat(response.getMediaType()).isEqualTo(MimeTypes.TXT); | |||
assertThat(response.getInput()).isEqualTo("{logs}"); | |||
} | |||
@Test | |||
public void get_empty_logs_if_file_does_not_exist() throws IOException { | |||
userSession.setGlobalPermissions(UserRole.ADMIN); | |||
File file = temp.newFile(); | |||
file.delete(); | |||
when(serverLogging.getCurrentLogFile()).thenReturn(file); | |||
TestResponse response = actionTester.newRequest().execute(); | |||
assertThat(response.getMediaType()).isEqualTo(MimeTypes.TXT); | |||
assertThat(response.getInput()).isEqualTo(""); | |||
} | |||
@Test | |||
public void requires_admin_permission() { | |||
expectedException.expect(ForbiddenException.class); | |||
actionTester.newRequest().execute(); | |||
} | |||
} |