void verify_retry_results(wa::storage::retry_policy policy, web::http::status_code primary_status_code, web::http::status_code secondary_status_code, wa::storage::location_mode mode, std::function<std::chrono::milliseconds (int)> allowed_delta, std::vector<wa::storage::retry_info> expected_retry_info_list) { auto initial_location = get_initial_location(mode); auto next_location = get_next_location(mode, initial_location); wa::storage::operation_context op_context; wa::storage::request_result result(utility::datetime::utc_now(), initial_location, web::http::http_response(initial_location == wa::storage::storage_location::secondary ? secondary_status_code : primary_status_code), false); int retry_count = 0; for (auto iter = expected_retry_info_list.cbegin(); iter != expected_retry_info_list.cend(); ++iter) { auto retry_info = policy.evaluate(wa::storage::retry_context(retry_count++, result, next_location, mode), op_context); CHECK(retry_info.should_retry()); CHECK(iter->target_location() == retry_info.target_location()); CHECK(iter->updated_location_mode() == retry_info.updated_location_mode()); CHECK_CLOSE(iter->retry_interval().count(), retry_info.retry_interval().count(), allowed_delta(retry_count).count()); std::this_thread::sleep_for(retry_info.retry_interval()); result = wa::storage::request_result(utility::datetime::utc_now(), retry_info.target_location(), web::http::http_response(retry_info.target_location() == wa::storage::storage_location::secondary ? secondary_status_code : primary_status_code), false); mode = retry_info.updated_location_mode(); next_location = get_next_location(mode, next_location); } auto retry_info = policy.evaluate(wa::storage::retry_context(retry_count++, result, next_location, mode), op_context); CHECK(!retry_info.should_retry()); }
static int action_ant(t_ant *root, t_ant *tmp, t_pos *pos, t_ia *ia) { if (tmp == root) return (ia->curr_loop ? printf("\n") : SUCCESS); if (tmp->location == pos->end) return (delete_node(root, tmp, pos, ia)); tmp->location = get_next_location(pos, tmp, ia); if (ia->curr_loop == 0) ia->recovery_mode = check_recovery(tmp); if (tmp->location != tmp->previous) printf(++(ia->curr_loop) == 1 ? "P%d-%s" : " P%d-%s", tmp->nb, tmp->location->name); return (action_ant(root, tmp->next, pos, ia)); }