package com.neverwinterdp.scribengin.scribecommitlog; import java.io.IOException; import java.lang.reflect.Field; import java.security.NoSuchAlgorithmException; //import junit.framework.Test; //import junit.framework.TestCase; //import junit.framework.TestSuite; import org.junit.Test; //import org.junit.Ignore; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import com.neverwinterdp.scribengin.commitlog.ScribeCommitLog; import com.neverwinterdp.scribengin.commitlog.ScribeLogEntry; public class ScribeCommitLogTest { private static String COMMIT_LOG_PATH = "/scribeTestCommit.log"; //@Ignore @Test public void testRecord() { try { ScribeCommitLog log = ScribeCommitLogTestFactory.instance().build(); log.record(11, 22, "/src/path/data.111", "/dest/path/data.222"); //fs is close log = ScribeCommitLogTestFactory.instance().build(); log.read(); ScribeLogEntry entry = log.getLatestEntry(); System.out.println(">>>> " + entry.getDestPath()); } catch (IOException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } finally { ScribeCommitLogTestFactory.instance().deleteCommitLog(); } } //@Ignore @Test public void testZeroEntry() { try { ScribeCommitLog log = ScribeCommitLogTestFactory.instance().build(); log.read(); ScribeLogEntry entry = log.getLatestEntry(); assert( entry == null); } catch (IOException e) { e.printStackTrace(); } finally { ScribeCommitLogTestFactory.instance().deleteCommitLog(); } } //@Ignore @Test public void testOneEntry() { try { ScribeCommitLog log = ScribeCommitLogTestFactory.instance().build(); log.record(11, 22, "/src/path/data.1", "/dest/path/data.1"); //fs is close log = ScribeCommitLogTestFactory.instance().build(); log.read(); ScribeLogEntry entry = log.getLatestEntry(); assert(entry.getStartOffset() == 11); assert(entry.getEndOffset() == 22); entry = log.getLatestEntry(); assert (entry == null); } catch (IOException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } finally { ScribeCommitLogTestFactory.instance().deleteCommitLog(); } } //@Ignore @Test public void testTwoEntry() { try { ScribeCommitLog log = ScribeCommitLogTestFactory.instance().build(); log.record(11, 22, "/src/path/data.1", "/dest/path/data.1"); //fs is close log = ScribeCommitLogTestFactory.instance().build(); log.record(23, 33, "/src/path/data.2", "/dest/path/data.2"); //fs is close log = ScribeCommitLogTestFactory.instance().build(); log.read(); ScribeLogEntry entry = log.getLatestEntry(); assert(entry.getStartOffset() == 23); assert(entry.getEndOffset() == 33); entry = log.getLatestEntry(); assert(entry.getStartOffset() == 11); assert(entry.getEndOffset() == 22); } catch (IOException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } finally { ScribeCommitLogTestFactory.instance().deleteCommitLog(); } } //@Ignore @Test public void testInvalidChecksum__TwoEntries() { try { ScribeCommitLog log = ScribeCommitLogTestFactory.instance().build(); log.record(11, 22, "/src/path/data.1", "/dest/path/data.1"); //fs is close log = ScribeCommitLogTestFactory.instance().build(); //log.record(23, 33, "/src/path/data.2", "/dest/path/data.2"); //fs is close ScribeLogEntry badEntry = new ScribeLogEntry(23, 33, "/src/path/data.1", "/dest/path/data.1"); Field field = ScribeLogEntry.class.getDeclaredField("checksum"); field.setAccessible(true); byte[] badCheckSum = "DEADBEEF".getBytes(); field.set(badEntry, badCheckSum); FSDataOutputStream os; Field fsField = ScribeCommitLog.class.getDeclaredField("fs"); fsField.setAccessible(true); FileSystem fs; fs = (FileSystem) fsField.get(log); if (fs.exists(new Path(COMMIT_LOG_PATH))) { os = fs.append(new Path(COMMIT_LOG_PATH)); } else { os = fs.create(new Path(COMMIT_LOG_PATH)); } String jsonStr = ScribeLogEntry.toJson(badEntry); os.write(jsonStr.getBytes()); os.write('\n'); try { os.close(); } catch (IOException e) { } log = ScribeCommitLogTestFactory.instance().build(); log.read(); ScribeLogEntry logEntry = log.getLatestEntry(); assert(logEntry.getEndOffset() == 33); assert(logEntry.isCheckSumValid() == false); } catch (IOException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } finally { ScribeCommitLogTestFactory.instance().deleteCommitLog(); } } private void _testInvalidChecksumImp( boolean withNewline ) { try { ScribeCommitLog log = ScribeCommitLogTestFactory.instance().build(); log.record(11, 22, "/src/path/data.1", "/dest/path/data.1"); //fs is close log = ScribeCommitLogTestFactory.instance().build(); ScribeCommitLogTestFactory.instance().addCorruptedEntry( log, 23, 33, "/src/path/data.2", "/dest/path/data.2", true); log.read(); ScribeLogEntry logEntry = log.getLatestEntry(); assert(logEntry.isCheckSumValid() == false); assert(logEntry.getSrcPath().equals("/src/path/data.2")); assert(logEntry.getDestPath().equals("/dest/path/data.2")); logEntry = log.getLatestEntry(); // read the next entry assert(logEntry.isCheckSumValid() == true); assert(logEntry.getStartOffset() == 11); assert(logEntry.getEndOffset() == 22); } catch (IOException e) { e.printStackTrace(); assert(false); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); assert(false); } finally { ScribeCommitLogTestFactory.instance().deleteCommitLog(); } } //@Ignore @Test public void testInvalidChecksum__with_newline() { _testInvalidChecksumImp(true); } //@Ignore @Test public void testInvalidChecksum__without_newline() { _testInvalidChecksumImp(false); } }