package net.codjo.broadcast.server;
import net.codjo.broadcast.common.ConnectionProvider;
import net.codjo.broadcast.common.ConnectionProviderMock;
import net.codjo.broadcast.common.Context;
import net.codjo.broadcast.common.PostBroadcaster;
import net.codjo.broadcast.common.diffuser.Diffuser;
import net.codjo.broadcast.common.diffuser.DiffuserContext;
import net.codjo.test.common.fixture.DirectoryFixture;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import junit.framework.TestCase;
/**
*
*/
public class DefaultBroadcasterTest extends TestCase {
private DirectoryFixture directoryFixture = DirectoryFixture.newTemporaryDirectoryFixture();
private File destinationFile;
private FakeDiffuser diffuser;
private FakeFileGenerator fileGenerator;
private File firstHistorisedFile;
private File secondHistorisedFile;
private Context context;
private Context initialContext;
private ConnectionProvider connectionProvider;
public void test_broadcast_NotHistorise() throws Exception {
DefaultBroadcaster broadcaster = new DefaultBroadcaster(initialContext,
fileGenerator,
destinationFile,
null,
connectionProvider);
broadcaster.broadcast(context);
assertTrue("Le fichier existe", destinationFile.exists());
assertFalse(firstHistorisedFile.exists());
assertFalse(secondHistorisedFile.exists());
}
public void test_broadcast_NotHistorise_replaced()
throws Exception {
DefaultBroadcaster broadcaster = new DefaultBroadcaster(initialContext,
fileGenerator,
destinationFile,
null,
connectionProvider);
broadcaster.broadcast(context);
long first = destinationFile.lastModified();
Thread.sleep(100);
broadcaster.broadcast(context);
long second = destinationFile.lastModified();
assertTrue("Le fichier existe", destinationFile.exists());
assertTrue("Le premier fichier est ecras�", first != second);
}
public void test_broadcast_calls_PostBroadcast()
throws Exception {
DefaultBroadcaster broadcaster = new DefaultBroadcaster(initialContext,
fileGenerator,
destinationFile,
diffuser,
connectionProvider);
FakePostBroadcast postA = new FakePostBroadcast();
FakePostBroadcast postB = new FakePostBroadcast();
List<PostBroadcaster> list = toList(postA, postB);
broadcaster.setPostBroadcaster(list);
broadcaster.broadcast(context);
assertTrue("postA", postA.isProceedCalled);
assertFalse("postA(undo)", postA.isUndoProceedCalled);
assertTrue("postB", postB.isProceedCalled);
assertFalse("postB(undo)", postB.isUndoProceedCalled);
}
public void test_broadcast_calls_PostBroadcast_Error()
throws Exception {
DefaultBroadcaster broadcaster = new DefaultBroadcaster(initialContext,
fileGenerator,
destinationFile,
diffuser,
connectionProvider);
FakePostBroadcast postA = new FakePostBroadcast();
FakePostBroadcast postB = new FakePostBroadcast(new SQLException());
List<PostBroadcaster> list = toList(postA, postB);
broadcaster.setPostBroadcaster(list);
try {
broadcaster.broadcast(context);
}
catch (Exception e) {
// Normal car un postB echoue.
}
assertTrue("postA", postA.isProceedCalled);
assertTrue("postA(undo)", postA.isUndoProceedCalled);
assertTrue("postB", postB.isProceedCalled);
assertFalse("postB(undo)", postB.isUndoProceedCalled);
}
public void test_broadcast_calls_withDiffuser()
throws Exception {
DefaultBroadcaster broadcaster = new DefaultBroadcaster(initialContext,
fileGenerator,
destinationFile,
diffuser,
connectionProvider);
broadcaster.broadcast(context);
assertEquals(fileGenerator.isCalled, true);
assertEquals(diffuser.isCalled, true);
}
public void test_broadcast_calls_withoutDiffuser()
throws Exception {
DefaultBroadcaster broadcaster = new DefaultBroadcaster(initialContext,
fileGenerator,
destinationFile,
null,
connectionProvider);
broadcaster.broadcast(context);
assertEquals(fileGenerator.isCalled, true);
}
public void test_broadcast_historise() throws Exception {
DefaultBroadcaster broadcaster = new DefaultBroadcaster(initialContext,
fileGenerator,
destinationFile,
null,
connectionProvider);
broadcaster.setHistoriseFile(true);
broadcaster.broadcast(context);
broadcaster.broadcast(context);
assertEquals("Le premier fichier existe", firstHistorisedFile.exists(), true);
assertEquals("Le deuxieme fichier existe", secondHistorisedFile.exists(), true);
assertEquals("Deuxieme fichier est historise", secondHistorisedFile.getName(),
"TU_BOBO_" + toDay() + "001" + ".txt");
}
public void test_realDestinationFileName_withHistoric()
throws Exception {
DefaultBroadcaster broadcaster = new DefaultBroadcaster(initialContext,
fileGenerator,
destinationFile,
null,
connectionProvider);
broadcaster.setHistoriseFile(true);
assertEquals("Historise, donc avec la date dans le nom",
broadcaster.realDestinationFileName(broadcaster.getDestinationFile(context)),
"TU_BOBO_" + toDay() + ".txt");
}
public void test_realDestinationFileName_withHistoric_NoSuffix()
throws Exception {
DefaultBroadcaster broadcaster = new DefaultBroadcaster(initialContext,
fileGenerator,
new File("Bobo"),
null,
connectionProvider);
broadcaster.setHistoriseFile(true);
assertEquals("Historise, donc avec la date dans le nom",
broadcaster.realDestinationFileName(broadcaster.getDestinationFile(context)),
"Bobo_" + toDay());
}
public void test_realDestinationFileName_withoutHistoric()
throws Exception {
DefaultBroadcaster broadcaster = new DefaultBroadcaster(initialContext,
fileGenerator,
destinationFile,
null,
connectionProvider);
assertEquals("Non historiser, donc le meme nom",
broadcaster.realDestinationFileName(broadcaster.getDestinationFile(context)),
"TU_BOBO.txt");
}
@Override
protected void setUp() throws Exception {
fileGenerator = new FakeFileGenerator();
diffuser = new FakeDiffuser();
directoryFixture.doSetUp();
destinationFile = new File(directoryFixture, "TU_BOBO.txt");
firstHistorisedFile = new File(directoryFixture, "TU_BOBO_" + toDay() + ".txt");
secondHistorisedFile = new File(directoryFixture, "TU_BOBO_" + toDay() + "001" + ".txt");
context = new Context();
initialContext = new Context();
connectionProvider = new ConnectionProviderMock();
}
private String toDay() {
return new SimpleDateFormat("yyyy-MM-dd").format(new java.util.Date());
}
@Override
protected void tearDown() throws java.lang.Exception {
directoryFixture.doTearDown();
}
private List<PostBroadcaster> toList(FakePostBroadcast postA, FakePostBroadcast postB) {
List<PostBroadcaster> list = new ArrayList<PostBroadcaster>();
list.add(postA);
list.add(postB);
return list;
}
private static final class FakeDiffuser implements Diffuser {
boolean isCalled = false;
public void diffuse(DiffuserContext ctxt, File file) {
isCalled = true;
}
}
private static final class FakeFileGenerator implements FileGenerator {
File generatedFile;
boolean isCalled = false;
public File generate(Context context, Connection connection) throws IOException {
generatedFile = File.createTempFile("ORBIS_TU_", null);
generatedFile.deleteOnExit();
isCalled = true;
return generatedFile;
}
}
private static final class FakePostBroadcast implements PostBroadcaster {
SQLException exception = null;
boolean isProceedCalled = false;
boolean isUndoProceedCalled = false;
FakePostBroadcast() {
}
FakePostBroadcast(SQLException exception) {
this.exception = exception;
}
public void proceed(Context context, Connection connection)
throws SQLException {
isProceedCalled = true;
if (exception != null) {
throw exception;
}
}
public void undoProceed(Context ctxt, Connection connection) {
isUndoProceedCalled = true;
}
}
}