/* Tests reading chunks at a specific offset * Returns 1 if successful, 0 if not or -1 on error */ int ewf_test_read_chunk_at_offset( libewf_handle_t *handle, size32_t chunk_size, off64_t input_offset, int input_whence, size64_t input_size, off64_t expected_offset, size64_t expected_size ) { libcerror_error_t *error = NULL; uint8_t *chunk_buffer = NULL; uint8_t *data_buffer = NULL; const char *whence_string = NULL; size_t chunk_buffer_size = 0; size_t data_buffer_size = 0; int result = 0; if( chunk_size == 0 ) { return( -1 ); } #if SIZEOF_SIZE_T < 8 if( (size_t) chunk_size > (size_t) SSIZE_MAX ) { return( -1 ); } #endif if( input_whence == SEEK_CUR ) { whence_string = "SEEK_CUR"; } else if( input_whence == SEEK_END ) { whence_string = "SEEK_END"; } else if( input_whence == SEEK_SET ) { whence_string = "SEEK_SET"; } else { whence_string = "UNKNOWN"; } fprintf( stdout, "Testing reading range with offset: %" PRIi64 ", whence: %s and size: %" PRIu64 "\t", input_offset, whence_string, input_size ); result = ewf_test_seek_offset( handle, input_offset, input_whence, expected_offset, &error ); data_buffer_size = chunk_size; data_buffer = (uint8_t *) memory_allocate( sizeof( uint8_t ) * data_buffer_size ); /* The chunk buffer should at least have a size of: chunk_size + 16 */ chunk_buffer_size = chunk_size * 2; chunk_buffer = (uint8_t *) memory_allocate( sizeof( uint8_t ) * chunk_buffer_size ); if( result == 1 ) { if( input_offset >= 0 ) { result = ewf_test_read_chunk( handle, data_buffer, data_buffer_size, chunk_buffer, chunk_buffer_size, input_size, expected_size, &error ); } } memory_free( chunk_buffer ); memory_free( data_buffer ); if( result == 1 ) { if( input_offset >= 0 ) { result = ewf_test_get_offset( handle, input_offset - ( input_offset % chunk_size ) + expected_size, &error ); } } if( result != 0 ) { fprintf( stdout, "(PASS)" ); } else { fprintf( stdout, "(FAIL)" ); } fprintf( stdout, "\n" ); if( result == -1 ) { libcerror_error_backtrace_fprint( error, stderr ); libcerror_error_free( &error ); } return( result ); }
/* Tests seeking in a handle * Returns 1 if successful, 0 if not or -1 on error */ int ewf_test_seek( libewf_handle_t *handle, size64_t media_size ) { int result = 0; if( handle == NULL ) { return( -1 ); } if( media_size > (size64_t) INT64_MAX ) { fprintf( stderr, "Media size exceeds maximum.\n" ); return( -1 ); } /* Test: SEEK_SET offset: 0 * Expected result: 0 */ result = ewf_test_seek_offset( handle, 0, SEEK_SET, 0 ); if( result != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); return( result ); } /* Test: SEEK_SET offset: <media_size> * Expected result: <media_size> */ result = ewf_test_seek_offset( handle, (off64_t) media_size, SEEK_SET, (off64_t) media_size ); if( result != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); return( result ); } /* Test: SEEK_SET offset: <media_size / 5> * Expected result: <media_size / 5> */ result = ewf_test_seek_offset( handle, (off64_t) ( media_size / 5 ), SEEK_SET, (off64_t) ( media_size / 5 ) ); if( result != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); return( result ); } /* Test: SEEK_SET offset: <media_size + 987> * Expected result: <media_size + 987> */ result = ewf_test_seek_offset( handle, (off64_t) ( media_size + 987 ), SEEK_SET, (off64_t) ( media_size + 987 ) ); if( result != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); return( result ); } /* Test: SEEK_SET offset: -987 * Expected result: -1 */ result = ewf_test_seek_offset( handle, -987, SEEK_SET, -1 ); if( result != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); return( result ); } /* Test: SEEK_CUR offset: 0 * Expected result: <media_size + 987> */ result = ewf_test_seek_offset( handle, 0, SEEK_CUR, (off64_t) ( media_size + 987 ) ); if( result != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); return( result ); } /* Test: SEEK_CUR offset: <-1 * (media_size + 987)> * Expected result: 0 */ result = ewf_test_seek_offset( handle, -1 * (off64_t) ( media_size + 987 ), SEEK_CUR, 0 ); if( result != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); return( result ); } /* Test: SEEK_CUR offset: <media_size / 3> * Expected result: <media_size / 3> */ result = ewf_test_seek_offset( handle, (off64_t) ( media_size / 3 ), SEEK_CUR, (off64_t) ( media_size / 3 ) ); if( result != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); return( result ); } if( media_size == 0 ) { /* Test: SEEK_CUR offset: <-2 * (media_size / 3)> * Expected result: 0 */ result = ewf_test_seek_offset( handle, -2 * (off64_t) ( media_size / 3 ), SEEK_CUR, 0 ); if( result != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); return( result ); } } else { /* Test: SEEK_CUR offset: <-2 * (media_size / 3)> * Expected result: -1 */ result = ewf_test_seek_offset( handle, -2 * (off64_t) ( media_size / 3 ), SEEK_CUR, -1 ); if( result != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); return( result ); } } /* Test: SEEK_END offset: 0 * Expected result: <media_size> */ result = ewf_test_seek_offset( handle, 0, SEEK_END, (off64_t) media_size ); if( result != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); return( result ); } /* Test: SEEK_END offset: <-1 * media_size> * Expected result: 0 */ result = ewf_test_seek_offset( handle, -1 * (off64_t) media_size, SEEK_END, 0 ); if( result != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); return( result ); } /* Test: SEEK_END offset: <-1 * (media_size / 4)> * Expected result: <media_size - (media_size / 4)> */ result = ewf_test_seek_offset( handle, -1 * (off64_t) ( media_size / 4 ), SEEK_END, (off64_t) media_size - (off64_t) ( media_size / 4 ) ); if( result != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); return( result ); } /* Test: SEEK_END offset: 542 * Expected result: <media_size + 542> */ result = ewf_test_seek_offset( handle, 542, SEEK_END, (off64_t) ( media_size + 542 ) ); if( result != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); return( result ); } /* Test: SEEK_END offset: <-1 * (media_size + 542)> * Expected result: -1 */ result = ewf_test_seek_offset( handle, -1 * (off64_t) ( media_size + 542 ), SEEK_END, -1 ); if( result != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); return( result ); } /* Test: UNKNOWN (88) offset: 0 * Expected result: -1 */ result = ewf_test_seek_offset( handle, 0, 88, -1 ); if( result != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); return( result ); } return( result ); }
/* Tests reading a buffers at a specific offset * Returns 1 if successful, 0 if not or -1 on error */ int ewf_test_read_buffer_at_offset( libewf_handle_t *handle, off64_t input_offset, int input_whence, size64_t input_size, off64_t expected_offset, size64_t expected_size ) { libcerror_error_t *error = NULL; uint8_t *buffer = NULL; const char *whence_string = NULL; int result = 0; if( input_whence == SEEK_CUR ) { whence_string = "SEEK_CUR"; } else if( input_whence == SEEK_END ) { whence_string = "SEEK_END"; } else if( input_whence == SEEK_SET ) { whence_string = "SEEK_SET"; } else { whence_string = "UNKNOWN"; } fprintf( stdout, "Testing reading range with offset: %" PRIi64 ", whence: %s and size: %" PRIu64 "\t", input_offset, whence_string, input_size ); buffer = (uint8_t *) memory_allocate( EWF_TEST_BUFFER_SIZE ); result = ewf_test_seek_offset( handle, input_offset, input_whence, expected_offset, &error ); if( result == 1 ) { if( input_offset >= 0 ) { result = ewf_test_read_buffer( handle, buffer, EWF_TEST_BUFFER_SIZE, input_size, expected_size, &error ); } } if( result == 1 ) { if( input_offset >= 0 ) { result = ewf_test_get_offset( handle, input_offset + expected_size, &error ); } } memory_free( buffer ); if( result != 0 ) { fprintf( stdout, "(PASS)" ); } else { fprintf( stdout, "(FAIL)" ); } fprintf( stdout, "\n" ); if( result == -1 ) { libcerror_error_backtrace_fprint( error, stderr ); libcerror_error_free( &error ); } return( result ); }