package jenkins.util;
import static org.junit.Assert.assertEquals;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.junit.Test;
/**
* @author Kohsuke Kawaguchi
*/
public class MarkFindingOutputStreamTest {
String mark = MarkFindingOutputStream.MARK;
String markHead = mark.substring(0, 5);
String markTail = mark.substring(5);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
MarkCountingOutputStream m = new MarkCountingOutputStream(baos);
@Test
public void findTwice() throws IOException {
write("foo"+mark+"bar"+mark);
assertCount(2);
assertOutput("foobar");
}
@Test
public void partialMatchTurnsOutToBeWrongIn2ndWrite() throws IOException {
write("bar"+markHead);
assertOutput("bar"); // at this point we should just see 'bar'
write("foo"); // this needs to write what was held off during the first write
assertCount(0);
assertOutput("bar"+markHead+"foo");
}
/**
* If a stream closes without completing a match, the partial match should be sent to the output.
*/
@Test
public void closeInTheMiddle() throws IOException {
write("foo"+ markHead);
m.close();
assertCount(0);
assertOutput("foo"+ markHead);
}
@Test
public void oneByOne() throws IOException {
m.write('1');
writeOneByOne(mark);
m.write('2');
assertCount(1);
assertOutput("12");
}
@Test
public void writeOneHoldOff() throws IOException {
writeOneByOne(markHead);
assertOutput("");
writeOneByOne("x");
assertOutput(markHead+"x");
assertCount(0);
}
private void assertOutput(String s) throws IOException {
assertEquals(s,baos.toString("UTF-8"));
}
private void assertCount(int n) {
assertEquals(n,m.count);
}
private void write(String s) throws IOException {
m.write(s.getBytes("UTF-8"));
}
private void writeOneByOne(String s) throws IOException {
for (int i=0; i< s.length(); i++)
m.write(s.charAt(i));
}
class MarkCountingOutputStream extends MarkFindingOutputStream {
int count = 0;
MarkCountingOutputStream(OutputStream base) {
super(base);
}
@Override
protected void onMarkFound() {
count++;
}
}
}