@Test
 public void testHBColumnMultiVersion() {
   Double[] testNumbers = new Double[] {3.14159, 2.71828, 0.0};
   for (Double n : testNumbers) {
     // Written as unversioned, read as versioned
     Result result = hbMapper.writeValueAsResult(new CrawlNoVersion("key").setF1(n));
     Crawl versioned = hbMapper.readValue(result, Crawl.class);
     NavigableMap<Long, Double> columnHistory = versioned.getF1();
     assertEquals("Column history size mismatch", 1, columnHistory.size());
     assertEquals(
         String.format(
             "Inconsistency between %s and %s",
             HBColumn.class.getSimpleName(), HBColumnMultiVersion.class.getSimpleName()),
         n,
         columnHistory.lastEntry().getValue());
     // Written as versioned, read as unversioned
     Result result1 =
         hbMapper.writeValueAsResult(
             new Crawl("key")
                 .addF1(Double.MAX_VALUE)
                 .addF1(Double.MAX_VALUE)
                 .addF1(Double.MAX_VALUE)
                 .addF1(n));
     CrawlNoVersion unversioned = hbMapper.readValue(result1, CrawlNoVersion.class);
     Double f1 = unversioned.getF1();
     assertEquals(
         String.format(
             "Inconsistency between %s and %s",
             HBColumnMultiVersion.class.getSimpleName(), HBColumn.class.getSimpleName()),
         n,
         f1);
   }
 }
 @Test
 public void testEmptyPuts() {
   Put nullPut = null, emptyPut = new Put(), putWithBlankRowKey = new Put(new byte[] {});
   Citizen nullCitizen = hbMapper.readValue(nullPut, Citizen.class);
   assertNull("Null Put object should return null", nullCitizen);
   Citizen emptyCitizen = hbMapper.readValue(emptyPut, Citizen.class);
   assertNull("Empty Put object should return null", emptyCitizen);
   assertNull(hbMapper.readValue(putWithBlankRowKey, Citizen.class));
 }
 @Test
 public void testEmptyResults() {
   Result nullResult = null,
       emptyResult = new Result(),
       resultWithBlankRowKey = new Result(new ImmutableBytesWritable(new byte[] {}));
   Citizen nullCitizen = hbMapper.readValue(nullResult, Citizen.class);
   assertNull("Null Result object should return null", nullCitizen);
   Citizen emptyCitizen = hbMapper.readValue(emptyResult, Citizen.class);
   assertNull("Empty Result object should return null", emptyCitizen);
   assertNull(hbMapper.readValue(resultWithBlankRowKey, Citizen.class));
 }
 public void testResultWithRow(HBRecord p) {
   long start, end;
   Result result = hbMapper.writeValueAsResult(Arrays.asList(p)).get(0);
   ImmutableBytesWritable rowKey = Util.strToIbw(p.composeRowKey());
   start = System.currentTimeMillis();
   Citizen pFromResult = hbMapper.readValue(rowKey, result, Citizen.class);
   end = System.currentTimeMillis();
   assertEquals("Data mismatch after deserialization from Result+Row", p, pFromResult);
   System.out.printf("Time taken for Result+Row->POJO = %dms%n%n", end - start);
 }
 public void testPutWithRow(HBRecord p) {
   long start, end;
   Put put = hbMapper.writeValueAsPut(p);
   ImmutableBytesWritable rowKey = Util.strToIbw(p.composeRowKey());
   start = System.currentTimeMillis();
   Citizen pFromPut = hbMapper.readValue(rowKey, put, Citizen.class);
   end = System.currentTimeMillis();
   assertEquals("Data mismatch after deserialization from Put", p, pFromPut);
   System.out.printf("Time taken for Put->POJO = %dms%n%n", end - start);
 }
 public void testResult(HBRecord p) {
   long start, end;
   start = System.currentTimeMillis();
   Result result = hbMapper.writeValueAsResult(p);
   end = System.currentTimeMillis();
   System.out.printf("Time taken for POJO->Result = %dms%n", end - start);
   start = System.currentTimeMillis();
   Citizen pFromResult = hbMapper.readValue(result, Citizen.class);
   end = System.currentTimeMillis();
   assertEquals("Data mismatch after deserialization from Result", p, pFromResult);
   System.out.printf("Time taken for Result->POJO = %dms%n%n", end - start);
 }
  @Test
  public void testUninstantiatableClass() {
    try {
      hbMapper.readValue(someResult, UninstantiatableClass.class);
      fail(
          "If class can't be instantiated, a "
              + ObjectNotInstantiatableException.class.getName()
              + " was expected");
    } catch (ObjectNotInstantiatableException e) {

    }
  }
 public void testPut(HBRecord p) {
   long start, end;
   start = System.currentTimeMillis();
   Put put = hbMapper.writeValueAsPut(Arrays.asList(p)).get(0);
   end = System.currentTimeMillis();
   System.out.printf("Time taken for POJO->Put = %dms%n", end - start);
   start = System.currentTimeMillis();
   Citizen pFromPut = hbMapper.readValue(put, Citizen.class);
   end = System.currentTimeMillis();
   assertEquals("Data mismatch after deserialization from Put", p, pFromPut);
   System.out.printf("Time taken for Put->POJO = %dms%n%n", end - start);
 }
 @Test
 public void testInvalidRowKey() {
   Citizen e = TestObjects.validObjs.get(0);
   try {
     hbMapper.readValue("invalid row key", hbMapper.writeValueAsPut(e), Citizen.class);
     fail("Invalid row key should've thrown " + RowKeyCouldNotBeParsedException.class.getName());
   } catch (RowKeyCouldNotBeParsedException ex) {
     System.out.println(
         "For a simulate HBase row with invalid row key, below Exception was thrown as expected:\n"
             + ex.getMessage()
             + "\n");
   }
 }
 @Test
 public void testInvalidClasses() {
   Set<String> exceptionMessages = new HashSet<String>();
   for (Triplet<HBRecord, String, Class<? extends IllegalArgumentException>> p :
       invalidRecordsAndErrorMessages) {
     HBRecord record = p.getValue0();
     Class recordClass = record.getClass();
     assertFalse(
         "Object mapper couldn't detect invalidity of class " + recordClass.getName(),
         hbMapper.isValid(recordClass));
     String errorMessage =
         p.getValue1()
             + " ("
             + recordClass.getName()
             + ") should have thrown an "
             + IllegalArgumentException.class.getName();
     String exMsgObjToResult = null,
         exMsgObjToPut = null,
         exMsgResultToObj = null,
         exMsgPutToObj = null;
     try {
       hbMapper.writeValueAsResult(record);
       fail(errorMessage + " while converting bean to Result");
     } catch (IllegalArgumentException ex) {
       assertEquals(
           "Mismatch in type of exception thrown for " + recordClass.getSimpleName(),
           p.getValue2(),
           ex.getClass());
       exMsgObjToResult = ex.getMessage();
     }
     try {
       hbMapper.writeValueAsPut(record);
       fail(errorMessage + " while converting bean to Put");
     } catch (IllegalArgumentException ex) {
       assertEquals(
           "Mismatch in type of exception thrown for " + recordClass.getSimpleName(),
           p.getValue2(),
           ex.getClass());
       exMsgObjToPut = ex.getMessage();
     }
     try {
       hbMapper.readValue(someResult, recordClass);
       fail(errorMessage + " while converting Result to bean");
     } catch (IllegalArgumentException ex) {
       assertEquals(
           "Mismatch in type of exception thrown for " + recordClass.getSimpleName(),
           p.getValue2(),
           ex.getClass());
       exMsgResultToObj = ex.getMessage();
     }
     try {
       hbMapper.readValue(
           new ImmutableBytesWritable(someResult.getRow()), someResult, recordClass);
       fail(errorMessage + " while converting Result to bean");
     } catch (IllegalArgumentException ex) {
       assertEquals(
           "Mismatch in type of exception thrown for " + recordClass.getSimpleName(),
           p.getValue2(),
           ex.getClass());
     }
     try {
       hbMapper.readValue(somePut, recordClass);
       fail(errorMessage + " while converting Put to bean");
     } catch (IllegalArgumentException ex) {
       assertEquals(
           "Mismatch in type of exception thrown for " + recordClass.getSimpleName(),
           p.getValue2(),
           ex.getClass());
       exMsgPutToObj = ex.getMessage();
     }
     try {
       hbMapper.readValue(new ImmutableBytesWritable(somePut.getRow()), somePut, recordClass);
       fail(errorMessage + " while converting row key and Put combo to bean");
     } catch (IllegalArgumentException ex) {
       assertEquals("Mismatch in type of exception thrown", p.getValue2(), ex.getClass());
     }
     assertEquals(
         "Validation for 'conversion to Result' and 'conversion to Put' differ in code path",
         exMsgObjToResult,
         exMsgObjToPut);
     assertEquals(
         "Validation for 'conversion from Result' and 'conversion from Put' differ in code path",
         exMsgResultToObj,
         exMsgPutToObj);
     assertEquals(
         "Validation for 'conversion from bean' and 'conversion to bean' differ in code path",
         exMsgObjToResult,
         exMsgResultToObj);
     System.out.printf(
         "%s threw below Exception as expected:\n%s\n%n", p.getValue1(), exMsgObjToResult);
     if (!exceptionMessages.add(exMsgObjToPut)) {
       fail("Same error message for different invalid inputs");
     }
   }
 }