bthread_countdown_event_unittest.cpp 1.26 KB
Newer Older
gejun's avatar
gejun committed
1
// Copyright (c) 2014 Baidu, Inc.
gejun's avatar
gejun committed
2 3 4 5 6 7

// Author: Zhangyi Chen (chenzhangyi01@baidu.com)
// Date: 2016/06/03 13:25:44

#include <gtest/gtest.h>
#include <bthread/countdown_event.h>
8 9
#include "butil/atomicops.h"
#include "butil/time.h"
gejun's avatar
gejun committed
10 11 12 13

namespace {
struct Arg {
    bthread::CountdownEvent event;
14
    butil::atomic<int> num_sig;
gejun's avatar
gejun committed
15 16 17 18
};

void *signaler(void *arg) {
    Arg* a = (Arg*)arg;
19
    a->num_sig.fetch_sub(1, butil::memory_order_relaxed);
gejun's avatar
gejun committed
20 21 22 23 24 25 26 27
    a->event.signal();
    return NULL;
}

TEST(CountdonwEventTest, sanity) {
    for (int n = 1; n < 10; ++n) {
        Arg a;
        a.num_sig = n;
gejun's avatar
gejun committed
28
        a.event.reset(n);
gejun's avatar
gejun committed
29 30 31 32 33
        for (int i = 0; i < n; ++i) {
            bthread_t tid;
            ASSERT_EQ(0, bthread_start_urgent(&tid, NULL, signaler, &a));
        }
        a.event.wait();
34
        ASSERT_EQ(0, a.num_sig.load(butil::memory_order_relaxed));
gejun's avatar
gejun committed
35 36 37 38 39
    }
}

TEST(CountdonwEventTest, timed_wait) {
    bthread::CountdownEvent event;
40
    int rc = event.timed_wait(butil::milliseconds_from_now(100));
gejun's avatar
gejun committed
41 42
    ASSERT_EQ(rc, ETIMEDOUT);
    event.signal();
43
    rc = event.timed_wait(butil::milliseconds_from_now(100));
gejun's avatar
gejun committed
44 45 46
    ASSERT_EQ(rc, 0);
    bthread::CountdownEvent event1;
    event1.signal();
47
    rc = event.timed_wait(butil::milliseconds_from_now(1));
gejun's avatar
gejun committed
48 49 50
    ASSERT_EQ(rc, 0);
}
} // namespace