void test_noop_decision_on_failure(void **state)
{
    (void)state;

    size_t DEFAULT_UPLOAD_VOLUME_THRESHOLD = 8 * 1024;
    size_t DEFAULT_UPLOAD_COUNT_THRESHOLD  = 64;

    kaa_error_t error_code = ext_log_upload_strategy_change_strategy(strategy,
            KAA_LOG_UPLOAD_VOLUME_STRATEGY);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);

    error_code = ext_log_upload_strategy_set_threshold_volume(strategy, DEFAULT_UPLOAD_VOLUME_THRESHOLD);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);
    error_code = ext_log_upload_strategy_set_threshold_count(strategy, DEFAULT_UPLOAD_COUNT_THRESHOLD);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);

    error_code = ext_log_upload_strategy_on_failure(NULL, NO_APPENDERS_CONFIGURED);
    ASSERT_NOT_EQUAL(error_code, KAA_ERR_NONE);

    error_code = ext_log_upload_strategy_on_failure(strategy, NO_APPENDERS_CONFIGURED);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);

    test_log_storage_context_t log_storage_context;

    log_storage_context.total_size = DEFAULT_UPLOAD_VOLUME_THRESHOLD;
    log_storage_context.record_count = DEFAULT_UPLOAD_COUNT_THRESHOLD;
    ext_log_upload_decision_t upload_decision = ext_log_upload_strategy_decide(strategy,
            &log_storage_context);
    ASSERT_EQUAL(upload_decision, NOOP);
}
void test_upload_decision_by_count(void **state)
{
    (void)state;

    size_t DEFAULT_UPLOAD_COUNT_THRESHOLD  = 64;

    kaa_error_t error_code = ext_log_upload_strategy_change_strategy(strategy, KAA_LOG_UPLOAD_BY_RECORD_COUNT);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);

    error_code = ext_log_upload_strategy_set_threshold_count(strategy, DEFAULT_UPLOAD_COUNT_THRESHOLD);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);

    test_log_storage_context_t log_storage_context;

    log_storage_context.total_size = 0;
    log_storage_context.record_count = DEFAULT_UPLOAD_COUNT_THRESHOLD - 1;
    ext_log_upload_decision_t upload_decision = ext_log_upload_strategy_decide(strategy,
            &log_storage_context);
    ASSERT_EQUAL(upload_decision, NOOP);

    log_storage_context.total_size = 0;
    log_storage_context.record_count = DEFAULT_UPLOAD_COUNT_THRESHOLD;
    upload_decision = ext_log_upload_strategy_decide(strategy, &log_storage_context);
    ASSERT_EQUAL(upload_decision, UPLOAD);

    log_storage_context.total_size = 0;
    log_storage_context.record_count = DEFAULT_UPLOAD_COUNT_THRESHOLD + 1;
    upload_decision = ext_log_upload_strategy_decide(strategy, &log_storage_context);
    ASSERT_EQUAL(upload_decision, UPLOAD);
}
void test_upload_decision_by_timeout(void **state)
{
    (void)state;

    size_t DEFAULT_UPLOAD_TIMEOUT_THRESHOLD  = 1;// in sec.

    kaa_error_t error_code = ext_log_upload_strategy_change_strategy(strategy,
            KAA_LOG_UPLOAD_BY_TIMEOUT_STRATEGY);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);

    error_code = ext_log_upload_strategy_set_upload_timeout(strategy, DEFAULT_UPLOAD_TIMEOUT_THRESHOLD);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);

    test_log_storage_context_t log_storage_context;

    log_storage_context.total_size = 0;
    log_storage_context.record_count = 0;
    log_storage_context.upload_timeout = DEFAULT_UPLOAD_TIMEOUT_THRESHOLD;
    ext_log_upload_decision_t upload_decision = ext_log_upload_strategy_decide(strategy,
            &log_storage_context);
    ASSERT_EQUAL(upload_decision, NOOP);

    log_storage_context.upload_timeout = DEFAULT_UPLOAD_TIMEOUT_THRESHOLD + 1;

    sleep(DEFAULT_UPLOAD_TIMEOUT_THRESHOLD);

    upload_decision = ext_log_upload_strategy_decide(strategy, &log_storage_context);
    ASSERT_EQUAL(upload_decision, UPLOAD);
}
void test_upload_decision_by_volume(void **state)
{
    (void)state;

    size_t DEFAULT_UPLOAD_VOLUME_THRESHOLD = 8 * 1024;

    kaa_error_t error_code = ext_log_upload_strategy_change_strategy(strategy,
            KAA_LOG_UPLOAD_BY_STORAGE_SIZE);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);

    error_code = ext_log_upload_strategy_set_threshold_volume(strategy, DEFAULT_UPLOAD_VOLUME_THRESHOLD);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);

    test_log_storage_context_t log_storage_context;

    log_storage_context.total_size = DEFAULT_UPLOAD_VOLUME_THRESHOLD - 1;
    log_storage_context.record_count = 0;
    ext_log_upload_decision_t upload_decision = ext_log_upload_strategy_decide(strategy,
            &log_storage_context);
    ASSERT_EQUAL(upload_decision, NOOP);

    log_storage_context.total_size = DEFAULT_UPLOAD_VOLUME_THRESHOLD;
    log_storage_context.record_count = 0;
    upload_decision = ext_log_upload_strategy_decide(strategy, &log_storage_context);
    ASSERT_EQUAL(upload_decision, UPLOAD);

    log_storage_context.total_size = DEFAULT_UPLOAD_VOLUME_THRESHOLD + 1;
    log_storage_context.record_count = 0;
    upload_decision = ext_log_upload_strategy_decide(strategy, &log_storage_context);
    ASSERT_EQUAL(upload_decision, UPLOAD);
}
void test_upload_decision_by_timeout(void)
{
    KAA_TRACE_IN(logger);

    kaa_error_t error_code = KAA_ERR_NONE;

    size_t DEFAULT_UPLOAD_TIMEOUT_THRESHOLD  = 1;// in sec.

    error_code = ext_log_upload_strategy_change_strategy(strategy, KAA_LOG_UPLOAD_BY_TIMEOUT_STRATEGY);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);

    error_code = ext_log_upload_strategy_set_upload_timeout(strategy, DEFAULT_UPLOAD_TIMEOUT_THRESHOLD);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);

    test_log_storage_context_t log_storage_context;
    ext_log_upload_decision_t upload_decision = NOOP;

    log_storage_context.total_size = 0;
    log_storage_context.record_count = 0;
    log_storage_context.upload_timeout = DEFAULT_UPLOAD_TIMEOUT_THRESHOLD;
    upload_decision = ext_log_upload_strategy_decide(strategy, &log_storage_context);
    ASSERT_EQUAL(upload_decision, NOOP);

    log_storage_context.upload_timeout = DEFAULT_UPLOAD_TIMEOUT_THRESHOLD + 1;

    usleep(1000 * 1000);

    upload_decision = ext_log_upload_strategy_decide(strategy, &log_storage_context);
    ASSERT_EQUAL(upload_decision, UPLOAD);

    KAA_TRACE_OUT(logger);
}
void test_set_upload_timeout(void **state)
{
    (void)state;
    (void)state;

    size_t DEFAULT_UPLOAD_TIMEOUT = 2 * 60;

    kaa_error_t error_code = ext_log_upload_strategy_change_strategy(strategy,
            KAA_LOG_UPLOAD_VOLUME_STRATEGY);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);

    error_code = ext_log_upload_strategy_set_upload_timeout(strategy, DEFAULT_UPLOAD_TIMEOUT);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);

    ASSERT_EQUAL(ext_log_upload_strategy_get_timeout(strategy), DEFAULT_UPLOAD_TIMEOUT);
}
void test_set_batch_size(void)
{
    KAA_TRACE_IN(logger);

    kaa_error_t error_code = KAA_ERR_NONE;

    size_t DEFAULT_BATCH_SIZE = 8 * 1024;

    error_code = ext_log_upload_strategy_change_strategy(strategy, KAA_LOG_UPLOAD_VOLUME_STRATEGY);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);

    error_code = ext_log_upload_strategy_set_batch_size(strategy, DEFAULT_BATCH_SIZE);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);

    ASSERT_EQUAL(ext_log_upload_strategy_get_bucket_size(strategy), DEFAULT_BATCH_SIZE);

    KAA_TRACE_OUT(logger);
}
void test_set_upload_timeout(void)
{
    KAA_TRACE_IN(logger);

    kaa_error_t error_code = KAA_ERR_NONE;

    size_t DEFAULT_UPLOAD_TIMEOUT = 2 * 60;

    error_code = ext_log_upload_strategy_change_strategy(strategy, KAA_LOG_UPLOAD_VOLUME_STRATEGY);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);

    error_code = ext_log_upload_strategy_set_upload_timeout(strategy, DEFAULT_UPLOAD_TIMEOUT);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);

    ASSERT_EQUAL(ext_log_upload_strategy_get_timeout(strategy), DEFAULT_UPLOAD_TIMEOUT);

    KAA_TRACE_OUT(logger);
}
void test_upload_decision_on_failure(void)
{
    KAA_TRACE_IN(logger);

    kaa_error_t error_code = KAA_ERR_NONE;

    size_t DEFAULT_RETRY_PERIOD            = 2;
    size_t DEFAULT_UPLOAD_VOLUME_THRESHOLD = 8 * 1024;
    size_t DEFAULT_UPLOAD_COUNT_THRESHOLD  = 64;

    error_code = ext_log_upload_strategy_change_strategy(strategy, KAA_LOG_UPLOAD_VOLUME_STRATEGY);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);

    error_code = ext_log_upload_strategy_set_threshold_volume(strategy, DEFAULT_UPLOAD_VOLUME_THRESHOLD);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);
    error_code = ext_log_upload_strategy_set_threshold_count(strategy, DEFAULT_UPLOAD_COUNT_THRESHOLD);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);
    error_code = ext_log_upload_strategy_set_upload_retry_period(strategy, DEFAULT_RETRY_PERIOD);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);

    error_code = ext_log_upload_strategy_on_failure(strategy, NO_APPENDERS_CONFIGURED);
    ASSERT_EQUAL(error_code, KAA_ERR_NONE);

    test_log_storage_context_t log_storage_context;
    ext_log_upload_decision_t upload_decision = NOOP;

    log_storage_context.total_size = DEFAULT_UPLOAD_VOLUME_THRESHOLD;
    log_storage_context.record_count = DEFAULT_UPLOAD_COUNT_THRESHOLD;
    upload_decision = ext_log_upload_strategy_decide(strategy, &log_storage_context);
    ASSERT_EQUAL(upload_decision, NOOP);

    sleep(DEFAULT_RETRY_PERIOD);

    log_storage_context.total_size = DEFAULT_UPLOAD_VOLUME_THRESHOLD;
    log_storage_context.record_count = DEFAULT_UPLOAD_COUNT_THRESHOLD;
    upload_decision = ext_log_upload_strategy_decide(strategy, &log_storage_context);
    ASSERT_EQUAL(upload_decision, UPLOAD);

    KAA_TRACE_OUT(logger);
}