package hudson.plugins.tfs.commands;
import com.microsoft.tfs.core.clients.versioncontrol.specs.version.ChangesetVersionSpec;
import hudson.model.TaskListener;
import hudson.plugins.tfs.model.ExtraSettings;
import hudson.plugins.tfs.model.MockableVersionControlClient;
import hudson.plugins.tfs.model.Server;
import hudson.plugins.tfs.model.WebProxySettings;
import hudson.remoting.Callable;
import hudson.util.Secret;
import hudson.util.SecretOverride;
import org.apache.commons.collections.IteratorUtils;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.PrintStream;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public abstract class AbstractCallableCommandTest {
protected Server server;
protected MockableVersionControlClient vcc;
protected TaskListener listener;
protected ByteArrayOutputStream outputStream;
@Before
public void configureDefaultMocks() {
server = mock(Server.class);
vcc = mock(MockableVersionControlClient.class);
listener = mock(TaskListener.class);
outputStream = new ByteArrayOutputStream();
when(server.getVersionControlClient()).thenReturn(vcc);
when(server.getListener()).thenReturn(listener);
when(listener.getLogger()).thenReturn(new PrintStream(outputStream));
}
protected void assertLog(final String... expectedLines) throws IOException {
final byte[] outputBytes = outputStream.toByteArray();
final ByteArrayInputStream inputStream = new ByteArrayInputStream(outputBytes);
final InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
final BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
final Iterator<String> expectedIterator = IteratorUtils.arrayIterator(expectedLines);
String line;
int lineCounter = 1;
while ((line = bufferedReader.readLine()) != null) {
if (expectedIterator.hasNext()) {
final String expected = expectedIterator.next();
Assert.assertEquals("Lines differ at line #" + lineCounter + ".", expected, line);
} else {
Assert.fail("Log contained more lines than expected.");
}
}
Assert.assertFalse("Log contained less lines than expected.", expectedIterator.hasNext());
}
protected abstract AbstractCallableCommand createCommand(final ServerConfigurationProvider serverConfig);
@Test public void verifySerializable() throws IOException {
final ServerConfigurationProvider server = new ServerConfigurationProvider() {
public String getUrl() {
return null;
}
public String getUserName() {
return null;
}
public String getUserPassword() {
return null;
}
public TaskListener getListener() {
return null;
}
public WebProxySettings getWebProxySettings() {
final List<Pattern> patterns = Arrays.asList(
Pattern.compile(".+\\.com"),
Pattern.compile(".+\\.org")
);
final Secret secret;
final SecretOverride secretOverride = new SecretOverride();
try {
secret = Secret.fromString("password");
}
finally {
try {
secretOverride.close();
}
catch (final IOException ignored) {
}
}
return new WebProxySettings("localhost", 8080, patterns, "user", secret);
}
@Override
public ExtraSettings getExtraSettings() {
return ExtraSettings.DEFAULT;
}
};
final AbstractCallableCommand command = createCommand(server);
final Callable<?, Exception> callable = command.getCallable();
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(callable);
}
}