callback_count++;
}
+static int dropped_logs_counter = 0;
+void callback_dropped_log_increment(const struct compression_entry *ce, void *user_data)
+{
+ dropped_logs_counter++;
+}
+
char good_compressible_input[4096] = {0, };
char weak_compressible_input[4096];
log_compressed_storage_free(s1);
}
+void test_storage_resize_extend_no_logs()
+{
+ log_compressed_storage *storage = log_compressed_storage_create(123, "storydzus", g_algo);
+ assert(log_compressed_storage_get_capacity(storage) == 123);
+
+ log_compressed_storage_resize(storage, 456);
+ assert(log_compressed_storage_get_capacity(storage) == 456);
+
+ log_compressed_storage_free(storage);
+}
+
+void test_storage_resize_extend_then_shrink()
+{
+ unsigned int storage_capacity = 1;
+ log_compressed_storage *storage = log_compressed_storage_create(storage_capacity, "storydzus", g_algo);
+ assert(log_compressed_storage_get_capacity(storage) == storage_capacity);
+
+ /* try adding a log above the storage's capacity */
+ char log[] = "log and some extra characters";
+ /* min legal log_len to compress for fastlz is 16, miniz accepts any len */
+ size_t log_len = strlen(log);
+
+ log_compressed_storage_reader *reader = log_compressed_storage_new_reader(storage, false, false, callback_dropped_log_increment, NULL);
+ assert(log_compressed_storage_reader_is_new_entry_available(reader) == false);
+
+ dropped_logs_counter = 0;
+ assert(log_compressed_storage_add_new_entry(storage, log, log_len) == true);
+ assert(dropped_logs_counter == 1);
+ assert(log_compressed_storage_reader_is_new_entry_available(reader) == false);
+
+ /* resize the storage fit the log */
+ log_compressed_storage_resize(storage, storage_capacity + log_len);
+ dropped_logs_counter = 0;
+ assert(log_compressed_storage_add_new_entry(storage, log, log_len) == true);
+ assert(dropped_logs_counter == 0);
+ assert(log_compressed_storage_reader_is_new_entry_available(reader) == true);
+
+ /* check if storage shrinks */
+ dropped_logs_counter = 0;
+ log_compressed_storage_resize(storage, 1);
+ assert(dropped_logs_counter == 1);
+ assert(log_compressed_storage_reader_is_new_entry_available(reader) == false);
+
+ log_compressed_storage_free(storage);
+}
+
+void test_storage_resize_partial_shrink()
+{
+ char log[] = "some random text";
+ size_t log_len = strlen(log);
+
+ size_t log_num_to_add = 5;
+ unsigned int storage_capacity = log_num_to_add * log_len;
+ log_compressed_storage *storage = log_compressed_storage_create(storage_capacity, "storydzus", g_algo);
+ assert(log_compressed_storage_get_capacity(storage) == storage_capacity);
+
+ log_compressed_storage_reader *reader = log_compressed_storage_new_reader(storage, false, false, callback_dropped_log_increment, NULL);
+ assert(log_compressed_storage_reader_is_new_entry_available(reader) == false);
+ dropped_logs_counter = 0;
+
+ size_t log_size_after_comp;
+ /* add some logs */
+ for (int i = 0; i < log_num_to_add; i++) {
+ assert(log_compressed_storage_add_new_entry(storage, log, log_len) == true);
+ assert(log_compressed_storage_reader_is_new_entry_available(reader) == true);
+ /* determine log size after applying compression, every log has the same contents */
+ if (i == 0)
+ log_size_after_comp = log_compressed_storage_get_usage(storage);
+ }
+ assert(dropped_logs_counter == 0);
+
+ /* shrink the storage */
+ size_t new_log_num = 3;
+ unsigned int new_storage_capacity = new_log_num * log_size_after_comp;
+ log_compressed_storage_resize(storage, new_storage_capacity);
+ assert(log_compressed_storage_get_capacity(storage) == new_storage_capacity);
+
+ assert(dropped_logs_counter == 2);
+
+ log_compressed_storage_free(storage);
+}
+
+void test_storage_resize_extend_with_logs()
+{
+ char log[] = "some random text";
+ size_t log_len = strlen(log);
+
+ size_t log_num_to_add = 5;
+ unsigned int storage_capacity = log_num_to_add * log_len;
+ log_compressed_storage *storage = log_compressed_storage_create(storage_capacity, "storydzus", g_algo);
+ assert(log_compressed_storage_get_capacity(storage) == storage_capacity);
+
+ log_compressed_storage_reader *reader = log_compressed_storage_new_reader(storage, false, false, callback_dropped_log_increment, NULL);
+ assert(log_compressed_storage_reader_is_new_entry_available(reader) == false);
+ dropped_logs_counter = 0;
+
+ /* add some logs */
+ for (int i = 0; i < log_num_to_add; i++) {
+ assert(log_compressed_storage_add_new_entry(storage, log, log_len) == true);
+ assert(log_compressed_storage_reader_is_new_entry_available(reader) == true);
+ }
+ assert(dropped_logs_counter == 0);
+
+ /* extend the storage */
+ size_t new_max_log_num = 8;
+ unsigned int new_storage_capacity = new_max_log_num * log_len;
+ log_compressed_storage_resize(storage, new_storage_capacity);
+ assert(log_compressed_storage_get_capacity(storage) == new_storage_capacity);
+
+ assert(dropped_logs_counter == 0);
+
+ log_compressed_storage_free(storage);
+}
+
+void test_storage_resize_large_buffer()
+{
+ unsigned int storage_capacity = 333333;
+ log_compressed_storage *storage = log_compressed_storage_create(storage_capacity, "storydzus", g_algo);
+ assert(log_compressed_storage_get_capacity(storage) == storage_capacity);
+
+ /* some extra characters to meet fastlz min buffer length limit to compress */
+ char log[] = "foobarbazsomeextra";
+ while (log_compressed_storage_get_usage(storage) < 300000)
+ log_compressed_storage_add_new_entry(storage, log, strlen(log));
+
+ log_compressed_storage_new_reader(storage, false, false, callback_dropped_log_increment, NULL);
+ dropped_logs_counter = 0;
+
+ unsigned int resize_capacity = 222222;
+ log_compressed_storage_resize(storage, resize_capacity);
+ assert(dropped_logs_counter > 0);
+ assert(log_compressed_storage_get_usage(storage) <= resize_capacity);
+
+ log_compressed_storage_free(storage);
+}
+
+void test_storage_resize_shrink_with_no_logs()
+{
+ log_compressed_storage *storage = log_compressed_storage_create(2, "storydzus", g_algo);
+ assert(log_compressed_storage_get_capacity(storage) == 2);
+
+ log_compressed_storage_resize(storage, 1);
+ assert(log_compressed_storage_get_capacity(storage) == 1);
+
+ log_compressed_storage_free(storage);
+}
+
static size_t get_good_size_fastlz() {
char buffer [FASTLZ_NEEDED_OUTPUT_SIZE(sizeof good_compressible_input)];
return fastlz_compress(good_compressible_input, sizeof good_compressible_input, buffer);
test_get_usage();
test_monitor();
test_naming();
+ test_storage_resize_extend_no_logs();
+ test_storage_resize_extend_then_shrink();
+ test_storage_resize_partial_shrink();
+ test_storage_resize_extend_with_logs();
+ test_storage_resize_large_buffer();
+ test_storage_resize_shrink_with_no_logs();
}
return 0;