/*
* The MIT License
*
* Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package hudson.logging;
import jenkins.security.MasterToSlaveCallable;
import org.jvnet.hudson.test.Url;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import hudson.model.Computer;
import hudson.remoting.VirtualChannel;
import java.util.List;
import java.util.logging.Logger;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import static org.junit.Assert.*;
import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.Issue;
import org.jvnet.hudson.test.JenkinsRule;
/**
* @author Kohsuke Kawaguchi
*/
public class LogRecorderManagerTest {
@Rule public JenkinsRule j = new JenkinsRule();
/**
* Makes sure that the logger configuration works.
*/
@Url("http://d.hatena.ne.jp/ssogabe/20090101/1230744150")
@Test public void loggerConfig() throws Exception {
Logger logger = Logger.getLogger("foo.bar.zot");
HtmlPage page = j.createWebClient().goTo("log/levels");
HtmlForm form = page.getFormByName("configLogger");
form.getInputByName("name").setValueAttribute("foo.bar.zot");
form.getSelectByName("level").getOptionByValue("finest").setSelected(true);
j.submit(form);
assertEquals(logger.getLevel(), Level.FINEST);
}
@Issue("JENKINS-18274")
@Test public void loggingOnSlaves() throws Exception {
// TODO could also go through WebClient to assert that the config UI works
LogRecorderManager mgr = j.jenkins.getLog();
LogRecorder r1 = new LogRecorder("r1");
mgr.logRecorders.put("r1", r1);
LogRecorder.Target t = new LogRecorder.Target("ns1", Level.FINE);
r1.targets.add(t);
r1.save();
t.enable();
Computer c = j.createOnlineSlave().toComputer();
assertNotNull(c);
t = new LogRecorder.Target("ns2", Level.FINER);
r1.targets.add(t);
r1.save();
t.enable();
LogRecorder r2 = new LogRecorder("r2");
mgr.logRecorders.put("r2", r2);
t = new LogRecorder.Target("ns3", Level.FINE);
r2.targets.add(t);
r2.save();
t.enable();
VirtualChannel ch = c.getChannel();
assertNotNull(ch);
assertTrue(ch.call(new Log(Level.FINE, "ns1", "msg #1")));
assertTrue(ch.call(new Log(Level.FINER, "ns2", "msg #2")));
assertTrue(ch.call(new Log(Level.FINE, "ns3", "msg #3")));
assertFalse(ch.call(new Log(Level.FINER, "ns3", "not displayed")));
assertTrue(ch.call(new Log(Level.INFO, "ns4", "msg #4")));
assertFalse(ch.call(new Log(Level.FINE, "ns4", "not displayed")));
List<LogRecord> recs = c.getLogRecords();
assertEquals(show(recs), 4, recs.size());
recs = r1.getSlaveLogRecords().get(c);
assertNotNull(recs);
assertEquals(show(recs), 2, recs.size());
recs = r2.getSlaveLogRecords().get(c);
assertNotNull(recs);
assertEquals(show(recs), 1, recs.size());
String text = j.createWebClient().goTo("log/r1/").asText();
assertTrue(text, text.contains(c.getDisplayName()));
assertTrue(text, text.contains("msg #1"));
assertTrue(text, text.contains("msg #2"));
assertFalse(text, text.contains("msg #3"));
assertFalse(text, text.contains("msg #4"));
}
private static final class Log extends MasterToSlaveCallable<Boolean,Error> {
private final Level level;
private final String logger;
private final String message;
Log(Level level, String logger, String message) {
this.level = level;
this.logger = logger;
this.message = message;
}
@Override public Boolean call() throws Error {
Logger log = Logger.getLogger(logger);
log.log(level, message);
return log.isLoggable(level);
}
}
private static String show(List<LogRecord> recs) {
StringBuilder b = new StringBuilder();
for (LogRecord rec : recs) {
b.append('\n').append(rec.getLoggerName()).append(':').append(rec.getLevel()).append(':').append(rec.getMessage());
}
return b.toString();
}
}