archivelib 0.2.0

An implementaton of the Greenleaf ArchiveLib compression/decompression algorithm
Documentation
#[macro_use]
mod utils;

check_decompress_matches! {
  run_offset_run_length_gt_15(
    [
      0x30, 0x30, 0x7C, 0xEB, 0xFB, 0xC5, 0xDB, 0x1E, 0xFF, 0x88, 0x00, 0x00, 0x21, 0x24, 0x9D, 0x9D,
      0xEE, 0xEF, 0xD9, 0xF5, 0xB7, 0x32, 0xE6, 0xF0, 0x2D, 0x78, 0x11, 0xB9, 0x7F, 0x25, 0xE0, 0xD7,
      0x6E, 0x5C, 0xCD, 0xCC, 0xF7, 0xB7, 0xDD, 0xEF, 0x64, 0x81, 0x00, 0x02, 0x04, 0x1F, 0xDF, 0xE9,
      0xEF, 0x66, 0xDF, 0xC9, 0x78, 0xD9, 0xA0, 0xE7,
    ],
    [
      0xE3, 0xE3, 0xE3, 0xE3, 0x07, 0x07, 0x07, 0x07,
    ]
  );
  single_byte_wrong(
    *include_bytes!("data/corner_cases/single_byte_wrong.in"),
    *include_bytes!("data/corner_cases/single_byte_wrong.out")
  );
  incorrect_btree1_error_1(
    // cbf13d89be6fb3c9621e47f22f74ce69cdf73c63
    *include_bytes!("data/corner_cases/pytest_failure_1.in"),
    *include_bytes!("data/corner_cases/pytest_failure_1.out")
  );
  incorrect_btree1_error_2(
    // e3d4875cdc9236dee2621e924a205b9dd3e8469d
    *include_bytes!("data/corner_cases/pytest_failure_2.in"),
    *include_bytes!("data/corner_cases/pytest_failure_2.out")
  );
  incorrect_btree1_error_3(
    // 25f76ced735657189060713f36b314f35a033118
    *include_bytes!("data/corner_cases/pytest_failure_3.in"),
    *include_bytes!("data/corner_cases/pytest_failure_3.out")
  );
  run_offset_assertion_failure(
    [
      0x30, 0x30, 0x7C, 0xEB, 0xFB, 0xC5, 0xDB, 0x1E, 0xFF, 0x88, 0x00, 0x00, 0x21, 0x24, 0x9D,
      0x9D, 0xEE, 0xEF, 0xD9, 0xF5, 0xB7, 0x32, 0xE6, 0xF0, 0x2D, 0x78, 0x11, 0xB9, 0x7F, 0x25,
      0xE0, 0xD7, 0x6E, 0x5C, 0xCD, 0xCC, 0xF7, 0xB7, 0xDD, 0xEF, 0x64, 0x81, 0x00, 0x02, 0x04,
      0x1F, 0xDF, 0xE9, 0xEF, 0x66, 0xDF, 0xC9, 0x78, 0xD9, 0xAC, 0x2C, 0xDD, 0x1A, 0x43, 0x30,
    ],
    [
      0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
    ]
  );
}

#[test]
fn slice_index_starts_after_ends() {
  let input = [0x27, 0x27, 0x30, 0x48];

  match archivelib::do_decompress(&input) {
    Err(e) => assert_eq!("Binary tree error: Type1", e),
    Ok(v) => panic!("Should have failed with BTE1; instead got {:?}", v),
  }
}

#[test]
fn short_file_a2_errors_when_trying_to_write_out_of_array_bounds() {
  // SHA1: 10687feb9716c9502d9a40fdfe3bb339055c8651
  // This test case doesn't error in the system library the same way because the system library
  // happily writes out of bounds without aborting.
  let input = [0xA2];
  match archivelib::do_decompress(&input) {
    Err(e) => assert_eq!("Invariant Failure", e),
    Ok(v) => panic!("Should have failed with BTE1; instead got {:?}", v),
  }
}

#[test]
fn attempt_to_add_with_overflow_in_expand() {
  // SHA1: 4623dfacad1a3cfddcb67b1c9747c10a2c6eb5fd
  // The system library detects that the requested output size is over it's limit.
  let input = [0x00, 0x00, 0x00, 0x00, 0x10, 0xe0, 0x00];
  match archivelib::do_decompress(&input) {
    Err(e) => assert_eq!("IOError: failed to write whole buffer", e),
    Ok(v) => panic!("Should have failed with IOError; instead got {:?}", v),
  }
}