/**
* Copyright (C) Mellanox Technologies Ltd. 2001-2015.  ALL RIGHTS RESERVED.
*
* See file LICENSE for terms.
*/
#ifndef _UD_BASE_TEST
#define _UD_BASE_TEST

#include <uct/uct_test.h>

#include <ucs/time/time.h>
#include <ucs/datastruct/queue.h>
extern "C" {
#include <uct/ib/ud/base/ud_ep.h>
#include <uct/ib/ud/base/ud_iface.h>
}


#define TEST_UD_PROGRESS_TIMEOUT 300.0
#define TEST_UD_TIMEOUT_IN_SEC   10.0


class ud_base_test : public uct_test {
public:
    virtual void init();

    uct_ud_ep_t *ep(entity *e);

    uct_ud_ep_t *ep(entity *e, int i);

    uct_ud_iface_t *iface(entity *e);

    void connect();

    void cleanup();

    ucs_status_t tx(entity *e);

    ucs_status_t ep_flush_b(entity *e);

    ucs_status_t iface_flush_b(entity *e);

    void set_tx_win(entity *e, uct_ud_psn_t size);

    void disable_async(entity *e);

    virtual void short_progress_loop(double delta_ms=10.0) const;

protected:
    entity *m_e1, *m_e2;
    uint64_t m_dummy;
};


#define UCT_INSTANTIATE_UD_TEST_CASE(_test_case) \
    _UCT_INSTANTIATE_TEST_CASE(_test_case, ud_verbs) \
    _UCT_INSTANTIATE_TEST_CASE(_test_case, ud_mlx5)


#endif
