int hashify_write_file(stream_t* generated_file, string_t output_filename) { bool need_update = false; stream_t* output_file = 0; int result = HASHIFY_RESULT_OK; output_file = stream_open(STRING_ARGS(output_filename), STREAM_OUT | STREAM_IN); if (!output_file) { need_update = true; output_file = stream_open(STRING_ARGS(output_filename), STREAM_OUT); if (!output_file) { log_warnf(0, WARNING_INVALID_VALUE, STRING_CONST("Unable to open output file: %.*s"), STRING_FORMAT(output_filename)); return HASHIFY_RESULT_MISSING_OUTPUT_FILE; } } if (!need_update) need_update = !uint128_equal(stream_md5(generated_file), stream_md5(output_file)); if (need_update) { char local_buffer[1024]; size_t read = 0; size_t written = 0; uint64_t total_written = 0; stream_seek(generated_file, 0, STREAM_SEEK_BEGIN); stream_seek(output_file, 0, STREAM_SEEK_BEGIN); while (!stream_eos(generated_file)) { read = stream_read(generated_file, local_buffer, 1024); if (!read) break; written = stream_write(output_file, local_buffer, read); total_written += written; if (written != read) { log_errorf(0, ERROR_SYSTEM_CALL_FAIL, STRING_CONST("Unable to write to output file '%.*s': %" PRIsize " of %" PRIsize " bytes written"), STRING_FORMAT(output_filename), written, read); result = HASHIFY_RESULT_OUTPUT_FILE_WRITE_FAIL; break; } } if (result == HASHIFY_RESULT_OK) { stream_truncate(output_file, (size_t)total_written); log_infof(0, STRING_CONST(" wrote %.*s : %" PRIu64 " bytes"), STRING_FORMAT(output_filename), total_written); } } else { log_info(0, STRING_CONST(" hash file already up to date")); } stream_deallocate(output_file); return result; }
DECLARE_TEST( app, environment ) { EXPECT_STREQ( environment_application()->name, _global_app.name ); EXPECT_STREQ( environment_application()->short_name, _global_app.short_name ); EXPECT_STREQ( environment_application()->config_dir, _global_app.config_dir ); EXPECT_TRUE( uint128_equal( environment_application()->version.version, _global_app.version.version ) ); return 0; }
DECLARE_TEST(md5, streams) { stream_t* test_stream; stream_t* unix_stream; stream_t* windows_stream; uint128_t digest, unix_digest, windows_digest; size_t ichunks; char unix_buffer[] = "tvqy0C9TO2MI7uyUqr\n\n" "QVcrmjDKDEcB3e7dpM\n\n" "bMpRv6uH0LWPjvNcNp\n" "jpkje9KYXhJjSA2TBy\n" "bTqnOPhOOZ5aWnUdgO\n" "fLapbWSZInasn1SJlk\n" "ytNFKkASDln05zw39X\n" "L8McmojqPmn41Y6CRN\n\n" "wZbKo0PZofDpbAMr1u\n" "u8GJIocbEBFzsyKo62\n" "FlQh1pjm9jBeoEJIHL\n" "v4ixQn77l4M7zbRHgJ\n" "DIVy0vvpNEzxFRyD3Z\n" "5OrJvr\n"; char windows_buffer[] = "tvqy0C9TO2MI7uyUqr\r\n\r\n" "QVcrmjDKDEcB3e7dpM\r\n\r\n" "bMpRv6uH0LWPjvNcNp\r\n" "jpkje9KYXhJjSA2TBy\r\n" "bTqnOPhOOZ5aWnUdgO\r\n" "fLapbWSZInasn1SJlk\r\n" "ytNFKkASDln05zw39X\r\n" "L8McmojqPmn41Y6CRN\r\n\r\n" "wZbKo0PZofDpbAMr1u\r\n" "u8GJIocbEBFzsyKo62\r\n" "FlQh1pjm9jBeoEJIHL\r\n" "v4ixQn77l4M7zbRHgJ\r\n" "DIVy0vvpNEzxFRyD3Z\r\n" "5OrJvr\r\n"; test_stream = buffer_stream_allocate(0, STREAM_IN | STREAM_OUT | STREAM_BINARY, 0, 0, true, true); stream_write(test_stream, digest_test_string, 2000); stream_seek(test_stream, 0, STREAM_SEEK_BEGIN); digest = stream_md5(test_stream); stream_deallocate(test_stream); EXPECT_TRUE(uint128_equal(digest, uint128_make(0x230e0a23943c7d13ULL, 0xd2ccac7ec9df4d0cULL))); unix_stream = buffer_stream_allocate((void*)unix_buffer, STREAM_IN, string_length(unix_buffer), string_length(unix_buffer), false, false); windows_stream = buffer_stream_allocate((void*)windows_buffer, STREAM_IN, string_length(windows_buffer), string_length(windows_buffer), false, false); stream_set_binary(unix_stream, false); stream_set_binary(windows_stream, false); unix_digest = stream_md5(unix_stream); windows_digest = stream_md5(windows_stream); EXPECT_TRUE(uint128_equal(unix_digest, uint128_make(0xcf32b789c7e77197ULL, 0x2bff28c36c601093ULL))); EXPECT_TRUE(uint128_equal(unix_digest, windows_digest)); stream_set_binary(unix_stream, true); stream_set_binary(windows_stream, true); stream_seek(unix_stream, 0, STREAM_SEEK_BEGIN); stream_seek(windows_stream, 0, STREAM_SEEK_BEGIN); unix_digest = stream_md5(unix_stream); windows_digest = stream_md5(windows_stream); stream_deallocate(unix_stream); stream_deallocate(windows_stream); EXPECT_TRUE(uint128_equal(unix_digest, uint128_make(0xcf32b789c7e77197ULL, 0x2bff28c36c601093ULL))); EXPECT_TRUE(uint128_equal(windows_digest, uint128_make(0xf77d63bbe1df9334ULL, 0x24d5cb05cd503e44ULL))); EXPECT_TRUE(!uint128_equal(unix_digest, windows_digest)); unix_stream = buffer_stream_allocate(nullptr, STREAM_IN | STREAM_OUT, 128 * 1024, 128 * 1024, true, true); windows_stream = buffer_stream_allocate(nullptr, STREAM_IN | STREAM_OUT, 128 * 1024, 128 * 1024, true, true); ichunks = 0; while ((ichunks+1) * 3 < 128 * 1024) { stream_write(unix_stream, STRING_CONST("a\n")); stream_write(windows_stream, STRING_CONST("a\r\n")); ++ichunks; } stream_seek(unix_stream, 0, STREAM_SEEK_BEGIN); stream_seek(windows_stream, 0, STREAM_SEEK_BEGIN); unix_digest = stream_md5(unix_stream); windows_digest = stream_md5(windows_stream); stream_deallocate(unix_stream); stream_deallocate(windows_stream); EXPECT_TRUE(uint128_equal(unix_digest, windows_digest)); return 0; }
int hashify_write_file( stream_t* generated_file, const char* output_filename ) { bool need_update = false; stream_t* output_file = 0; int result = HASHIFY_RESULT_OK; output_file = stream_open( output_filename, STREAM_OUT | STREAM_IN ); if( !output_file ) { need_update = true; output_file = stream_open( output_filename, STREAM_OUT ); if( !output_file ) { log_warnf( WARNING_BAD_DATA, "Unable to open output file: %s", output_filename ); return HASHIFY_RESULT_MISSING_OUTPUT_FILE; } } if( !need_update ) need_update = !uint128_equal( stream_md5( generated_file ), stream_md5( output_file ) ); if( need_update ) { char local_buffer[1024]; uint64_t read = 0; uint64_t written = 0; uint64_t total_written = 0; stream_seek( generated_file, 0, STREAM_SEEK_BEGIN ); stream_seek( output_file, 0, STREAM_SEEK_BEGIN ); while( !stream_eos( generated_file ) ) { read = stream_read( generated_file, local_buffer, 1024 ); if( !read ) break; written = stream_write( output_file, local_buffer, read ); total_written += written; if( written != read ) { log_errorf( ERROR_SYSTEM_CALL_FAIL, "Unable to write to output file '%s': %llu of %llu bytes written", output_filename, written, read ); result = HASHIFY_RESULT_OUTPUT_FILE_WRITE_FAIL; break; } } if( result == HASHIFY_RESULT_OK ) { stream_truncate( output_file, total_written ); log_infof( " wrote %s : %llu bytes", output_filename, total_written ); } } else { log_infof( " hash file already up to date" ); } stream_deallocate( output_file ); return result; }