package org.intracetest.gui;
import java.util.ArrayList;
import java.util.List;
import org.intrace.client.gui.helper.TraceFilterThread;
import org.intrace.client.gui.helper.TraceFilterThread.FilterCallback;
import org.intrace.client.gui.helper.TraceFilterThread.TimeSource;
import org.intrace.client.gui.helper.TraceFilterThread.TraceFilterProgressHandler;
import org.intrace.client.gui.helper.TraceFilterThread.TraceTextHandler;
import junit.framework.TestCase;
public class TraceFilterThreadTest extends TestCase
{
public void testFilterThread() throws InterruptedException
{
final String[] setTextHolder = new String[1];
final String[] appendTextHolder = new String[1];
final int[] displayedHolder = new int[1];
final int[] totalHolder = new int[1];
TraceTextHandler textHandler = new TraceTextHandler()
{
@Override
public void setText(String traceText)
{
setTextHolder[0] = traceText;
}
@Override
public void setStatus(int displayed, int total)
{
displayedHolder[0] = displayed;
totalHolder[0] = total;
}
@Override
public void appendText(String traceText)
{
appendTextHolder[0] = traceText;
}
};
TraceFilterThread filter = new TraceFilterThread(textHandler);
final long[] timeSource = new long[1];
TimeSource time = new TimeSource()
{
@Override
public long currentTimeMillis()
{
return timeSource[0];
}
};
filter.time = time;
FilterCallback cb = new FilterCallback()
{
@Override
public synchronized void callback()
{
this.notifyAll();
}
};
filter.cb = cb;
// Add a single line, this is buffered
synchronized (cb)
{
filter.addSystemTraceLine("System line 1");
cb.wait();
}
assertEquals(0, displayedHolder[0]);
assertEquals(0, totalHolder[0]);
assertTrue(appendTextHolder[0],
appendTextHolder[0] == null);
assertTrue(setTextHolder[0],
setTextHolder[0] == null);
// Wait for a little bit and write another line
appendTextHolder[0] = null;
setTextHolder[0] = null;
timeSource[0] += 1000;
synchronized (cb)
{
filter.addSystemTraceLine("System line 2");
cb.wait();
}
timeSource[0] += 1000;
assertEquals(2, displayedHolder[0]);
assertEquals(2, totalHolder[0]);
assertTrue(appendTextHolder[0],
appendTextHolder[0].contains("System line"));
assertTrue(setTextHolder[0],
setTextHolder[0] == null);
// Clear trace
appendTextHolder[0] = null;
setTextHolder[0] = null;
synchronized (cb)
{
filter.setClearTrace();
cb.wait();
}
assertEquals(0, displayedHolder[0]);
assertEquals(0, totalHolder[0]);
assertTrue(appendTextHolder[0],
appendTextHolder[0] == null);
assertTrue(setTextHolder[0],
setTextHolder[0].equals(""));
// Append normal trace line 1, 1b
appendTextHolder[0] = null;
setTextHolder[0] = null;
synchronized (cb)
{
filter.addTraceLine("Line 1");
cb.wait();
}
synchronized (cb)
{
filter.addTraceLine("Line 1b");
cb.wait();
}
// Append normal trace line 2
timeSource[0] += 1000;
synchronized (cb)
{
filter.addTraceLine("Line 2");
cb.wait();
}
timeSource[0] += 1000;
assertEquals(3, displayedHolder[0]);
assertEquals(3, totalHolder[0]);
assertTrue(appendTextHolder[0],
appendTextHolder[0].contains("Line 2"));
assertTrue(setTextHolder[0],
setTextHolder[0] == null);
// Filter trace
appendTextHolder[0] = null;
setTextHolder[0] = null;
TraceFilterProgressHandler progress = new TraceFilterProgressHandler()
{
@Override
public synchronized boolean setProgress(int percent)
{
if (percent == 100)
{
this.notifyAll();
}
return false;
}
@Override
public List<String> getIncludePattern()
{
List<String> include = new ArrayList<String>();
include.add("1");
return include;
}
@Override
public List<String> getExcludePattern()
{
List<String> exclude = new ArrayList<String>();
exclude.add("1b");
return exclude;
}
@Override
public boolean discardFiltered()
{
return false;
}
};
// do filtering and wait until we have finished
synchronized (progress)
{
filter.applyFilter(progress);
progress.wait();
}
assertEquals(1, displayedHolder[0]);
assertEquals(3, totalHolder[0]);
assertTrue(appendTextHolder[0],
appendTextHolder[0] == null);
assertTrue(setTextHolder[0],
setTextHolder[0].contains("Line 1"));
}
}