package com.google.gerrit.acceptance.ssh; import static com.google.common.truth.Truth.assertThat; import com.google.common.collect.Iterables; import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.UseSsh; import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.extensions.registration.RegistrationHandle; import com.google.gerrit.server.logging.LoggingContext; import com.google.gerrit.server.logging.RequestId; import com.google.gerrit.server.project.CreateProjectArgs; import com.google.gerrit.server.validators.ProjectCreationValidationListener; import com.google.gerrit.server.validators.ValidationException; import com.google.inject.Inject; import org.junit.After; import org.junit.Before; import org.junit.Test; @UseSsh public class SshTraceIT extends AbstractDaemonTest { @Inject private DynamicSet projectCreationValidationListeners; private TraceValidatingProjectCreationValidationListener projectCreationListener; private RegistrationHandle projectCreationListenerRegistrationHandle; @Before public void setup() { projectCreationListener = new TraceValidatingProjectCreationValidationListener(); projectCreationListenerRegistrationHandle = projectCreationValidationListeners.add(projectCreationListener); } @After public void cleanup() { projectCreationListenerRegistrationHandle.remove(); } @Test public void sshCallWithoutTrace() throws Exception { adminSshSession.exec("gerrit create-project new1"); adminSshSession.assertSuccess(); assertThat(projectCreationListener.traceId).isNull(); assertThat(projectCreationListener.foundTraceId).isFalse(); assertThat(projectCreationListener.isLoggingForced).isFalse(); } @Test public void sshCallWithTrace() throws Exception { adminSshSession.exec("gerrit create-project --trace new2"); // The trace ID is written to stderr. adminSshSession.assertFailure(RequestId.Type.TRACE_ID.name()); assertThat(projectCreationListener.traceId).isNotNull(); assertThat(projectCreationListener.foundTraceId).isTrue(); assertThat(projectCreationListener.isLoggingForced).isTrue(); } @Test public void sshCallWithTraceAndProvidedTraceId() throws Exception { adminSshSession.exec("gerrit create-project --trace --trace-id issue/123 new3"); // The trace ID is written to stderr. adminSshSession.assertFailure(RequestId.Type.TRACE_ID.name()); assertThat(projectCreationListener.traceId).isEqualTo("issue/123"); assertThat(projectCreationListener.foundTraceId).isTrue(); assertThat(projectCreationListener.isLoggingForced).isTrue(); } @Test public void sshCallWithTraceIdAndWithoutTraceFails() throws Exception { adminSshSession.exec("gerrit create-project --trace-id issue/123 new3"); adminSshSession.assertFailure("A trace ID can only be set if --trace was specified."); } private static class TraceValidatingProjectCreationValidationListener implements ProjectCreationValidationListener { String traceId; Boolean foundTraceId; Boolean isLoggingForced; @Override public void validateNewProject(CreateProjectArgs args) throws ValidationException { this.traceId = Iterables.getFirst(LoggingContext.getInstance().getTagsAsMap().get("TRACE_ID"), null); this.foundTraceId = traceId != null; this.isLoggingForced = LoggingContext.getInstance().shouldForceLogging(null, null, false); } } }