/* Tests the libvshadow_error_free function * Returns 1 if successful or 0 if not */ int vshadow_test_error_free( void ) { /* Test invocation of function only */ libvshadow_error_free( NULL ); return( 1 ); }
/* Tests libvshadow_store_seek_offset * Returns 1 if successful, 0 if not or -1 on error */ int vshadow_test_seek_offset( libvshadow_store_t *store, off64_t input_offset, int input_whence, off64_t expected_offset ) { libvshadow_error_t *error = NULL; off64_t result_offset = 0; int result = 0; if( store == NULL ) { return( -1 ); } result_offset = libvshadow_store_seek_offset( store, input_offset, input_whence, &error ); if( expected_offset != result_offset ) { fprintf( stderr, "Unexpected result offset: %" PRIi64 "\n", result_offset ); } else { result = 1; } if( error != NULL ) { if( result != 1 ) { libvshadow_error_backtrace_fprint( error, stderr ); } libvshadow_error_free( &error ); } return( result ); }
/* Tests libvshadow_store_read_buffer * Returns 1 if successful, 0 if not or -1 on error */ int vshadow_test_read_buffer( libvshadow_store_t *store, size64_t input_size, size64_t expected_size ) { uint8_t buffer[ VSHADOW_TEST_READ_BUFFER_SIZE ]; libvshadow_error_t *error = NULL; size64_t remaining_size = 0; size64_t result_size = 0; size_t read_size = 0; ssize_t read_count = 0; int result = 0; if( store == NULL ) { return( -1 ); } remaining_size = input_size; while( remaining_size > 0 ) { read_size = VSHADOW_TEST_READ_BUFFER_SIZE; if( remaining_size < (size64_t) read_size ) { read_size = (size_t) remaining_size; } read_count = libvshadow_store_read_buffer( store, buffer, read_size, &error ); if( read_count < 0 ) { break; } remaining_size -= (size64_t) read_count; result_size += (size64_t) read_count; if( read_count != (ssize_t) read_size ) { break; } } if( expected_size != result_size ) { fprintf( stderr, "Unexpected read count: %" PRIu64 "\n", result_size ); } else { result = 1; } if( error != NULL ) { if( result != 1 ) { libvshadow_error_backtrace_fprint( error, stderr ); } libvshadow_error_free( &error ); } return( result ); }
/* Tests libvshadow_store_read_buffer_at_offset * Returns 1 if successful, 0 if not or -1 on error */ int vshadow_test_read_buffer_at_offset( libvshadow_store_t *store, off64_t input_offset, size64_t input_size, off64_t expected_offset, size64_t expected_size ) { uint8_t buffer[ VSHADOW_TEST_READ_BUFFER_SIZE ]; libvshadow_error_t *error = NULL; off64_t result_offset = 0; size64_t remaining_size = 0; size64_t result_size = 0; size_t read_size = 0; ssize_t read_count = 0; int result = 0; if( store == NULL ) { return( -1 ); } remaining_size = input_size; fprintf( stdout, "Testing reading buffer at offset: %" PRIi64 " with size: %" PRIu64 "\t", input_offset, input_size ); while( remaining_size > 0 ) { read_size = VSHADOW_TEST_READ_BUFFER_SIZE; if( remaining_size < (size64_t) read_size ) { read_size = (size_t) remaining_size; } read_count = libvshadow_store_read_buffer_at_offset( store, buffer, read_size, input_offset, &error ); if( read_count < 0 ) { break; } input_offset += (size64_t) read_count; remaining_size -= (size64_t) read_count; result_size += (size64_t) read_count; if( read_count != (ssize_t) read_size ) { break; } } if( libvshadow_store_get_offset( store, &result_offset, &error ) != 1 ) { result = -1; } if( expected_offset != result_offset ) { fprintf( stderr, "Unexpected offset: %" PRIi64 "\n", result_offset ); } else if( expected_size != result_size ) { fprintf( stderr, "Unexpected read count: %" PRIu64 "\n", result_size ); } else { result = 1; } if( result == 1 ) { fprintf( stdout, "(PASS)" ); } else { fprintf( stdout, "(FAIL)" ); } fprintf( stdout, "\n" ); if( error != NULL ) { if( result != 1 ) { libvshadow_error_backtrace_fprint( error, stderr ); } libvshadow_error_free( &error ); } return( result ); }
/* Tests libvshadow_store_seek_offset * Returns 1 if successful, 0 if not or -1 on error */ int vshadow_test_seek_offset( libvshadow_store_t *store, off64_t input_offset, int input_whence, off64_t output_offset ) { libvshadow_error_t *error = NULL; const char *whence_string = NULL; off64_t result_offset = 0; int result = 0; if( store == NULL ) { return( -1 ); } 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 seek of offset: %" PRIi64 " and whence: %s\t", input_offset, whence_string ); result_offset = libvshadow_store_seek_offset( store, input_offset, input_whence, &error ); if( result_offset == output_offset ) { result = 1; } if( result != 0 ) { fprintf( stdout, "(PASS)" ); } else { fprintf( stdout, "(FAIL)" ); } fprintf( stdout, "\n" ); if( error != NULL) { if( result != 1 ) { libvshadow_error_backtrace_fprint( error, stderr ); } libvshadow_error_free( &error ); } return( result ); }
int main( int argc, char * const argv[] ) #endif { libvshadow_error_t *error = NULL; libvshadow_store_t *store = NULL; libvshadow_volume_t *volume = NULL; size64_t volume_size = 0; int number_of_stores = 0; if( argc < 2 ) { fprintf( stderr, "Missing filename.\n" ); return( EXIT_FAILURE ); } #if defined( HAVE_DEBUG_OUTPUT ) && defined( VSHADOW_TEST_SEEK_VERBOSE ) libvshadow_notify_set_verbose( 1 ); libvshadow_notify_set_stream( stderr, NULL ); #endif /* Initialization */ if( libvshadow_volume_initialize( &volume, &error ) != 1 ) { fprintf( stderr, "Unable to create volume.\n" ); goto on_error; } #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) if( libvshadow_volume_open_wide( volume, argv[ 1 ], LIBVSHADOW_OPEN_READ, &error ) != 1 ) #else if( libvshadow_volume_open( volume, argv[ 1 ], LIBVSHADOW_OPEN_READ, &error ) != 1 ) #endif { fprintf( stderr, "Unable to open volume.\n" ); goto on_error; } if( libvshadow_volume_get_number_of_stores( volume, &number_of_stores, &error ) != 1 ) { fprintf( stderr, "Unable to retrieve number of stores.\n" ); goto on_error; } if( libvshadow_volume_get_store( volume, number_of_stores - 1, &store, &error ) != 1 ) { fprintf( stderr, "Unable to retrieve store: %d.\n", number_of_stores - 1 ); goto on_error; } if( libvshadow_volume_get_size( volume, &volume_size, &error ) != 1 ) { fprintf( stderr, "Unable to retrieve volume size.\n" ); goto on_error; } if( volume_size > (size64_t) INT64_MAX ) { fprintf( stderr, "Volume size exceeds maximum.\n" ); goto on_error; } /* Test: SEEK_SET offset: 0 * Expected result: 0 */ if( vshadow_test_seek_offset( store, 0, SEEK_SET, 0 ) != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); goto on_error; } /* Test: SEEK_SET offset: <volume_size> * Expected result: <volume_size> */ if( vshadow_test_seek_offset( store, (off64_t) volume_size, SEEK_SET, (off64_t) volume_size ) != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); goto on_error; } /* Test: SEEK_SET offset: <volume_size / 5> * Expected result: <volume_size / 5> */ if( vshadow_test_seek_offset( store, (off64_t) ( volume_size / 5 ), SEEK_SET, (off64_t) ( volume_size / 5 ) ) != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); goto on_error; } /* Test: SEEK_SET offset: <volume_size + 987> * Expected result: <volume_size + 987> */ if( vshadow_test_seek_offset( store, (off64_t) ( volume_size + 987 ), SEEK_SET, (off64_t) ( volume_size + 987 ) ) != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); goto on_error; } /* Test: SEEK_SET offset: -987 * Expected result: -1 */ if( vshadow_test_seek_offset( store, -987, SEEK_SET, -1 ) != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); goto on_error; } /* Test: SEEK_CUR offset: 0 * Expected result: <volume_size + 987> */ if( vshadow_test_seek_offset( store, 0, SEEK_CUR, (off64_t) ( volume_size + 987 ) ) != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); goto on_error; } /* Test: SEEK_CUR offset: <-1 * (volume_size + 987)> * Expected result: 0 */ if( vshadow_test_seek_offset( store, -1 * (off64_t) ( volume_size + 987 ), SEEK_CUR, 0 ) != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); goto on_error; } /* Test: SEEK_CUR offset: <volume_size / 3> * Expected result: <volume_size / 3> */ if( vshadow_test_seek_offset( store, (off64_t) ( volume_size / 3 ), SEEK_CUR, (off64_t) ( volume_size / 3 ) ) != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); goto on_error; } if( volume_size == 0 ) { /* Test: SEEK_CUR offset: <-2 * (volume_size / 3)> * Expected result: 0 */ if( vshadow_test_seek_offset( store, -2 * (off64_t) ( volume_size / 3 ), SEEK_CUR, 0 ) != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); goto on_error; } } else { /* Test: SEEK_CUR offset: <-2 * (volume_size / 3)> * Expected result: -1 */ if( vshadow_test_seek_offset( store, -2 * (off64_t) ( volume_size / 3 ), SEEK_CUR, -1 ) != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); goto on_error; } } /* Test: SEEK_END offset: 0 * Expected result: <volume_size> */ if( vshadow_test_seek_offset( store, 0, SEEK_END, (off64_t) volume_size ) != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); goto on_error; } /* Test: SEEK_END offset: <-1 * volume_size> * Expected result: 0 */ if( vshadow_test_seek_offset( store, -1 * (off64_t) volume_size, SEEK_END, 0 ) != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); goto on_error; } /* Test: SEEK_END offset: <-1 * (volume_size / 4)> * Expected result: <volume_size - (volume_size / 4)> */ if( vshadow_test_seek_offset( store, -1 * (off64_t) ( volume_size / 4 ), SEEK_END, (off64_t) volume_size - (off64_t) ( volume_size / 4 ) ) != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); goto on_error; } /* Test: SEEK_END offset: 542 * Expected result: <volume_size + 542> */ if( vshadow_test_seek_offset( store, 542, SEEK_END, (off64_t) ( volume_size + 542 ) ) != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); goto on_error; } /* Test: SEEK_END offset: <-1 * (volume_size + 542)> * Expected result: -1 */ if( vshadow_test_seek_offset( store, -1 * (off64_t) ( volume_size + 542 ), SEEK_END, -1 ) != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); goto on_error; } /* Test: UNKNOWN (88) offset: 0 * Expected result: -1 */ if( vshadow_test_seek_offset( store, 0, 88, -1 ) != 1 ) { fprintf( stderr, "Unable to test seek offset.\n" ); goto on_error; } /* Clean up */ if( libvshadow_store_free( &store, &error ) != 1 ) { fprintf( stderr, "Unable to free store.\n" ); goto on_error; } if( libvshadow_volume_close( volume, &error ) != 0 ) { fprintf( stderr, "Unable to close volume.\n" ); goto on_error; } if( libvshadow_volume_free( &volume, &error ) != 1 ) { fprintf( stderr, "Unable to free volume.\n" ); goto on_error; } return( EXIT_SUCCESS ); on_error: if( error != NULL ) { libvshadow_error_backtrace_fprint( error, stderr ); libvshadow_error_free( &error ); } if( store != NULL ) { libvshadow_store_free( &store, NULL ); } if( volume != NULL ) { libvshadow_volume_close( volume, NULL ); libvshadow_volume_free( &volume, NULL ); } return( EXIT_FAILURE ); }