From 36c8db5d0f8bacfe2a34c080c0db74e90f3c2589 Mon Sep 17 00:00:00 2001 From: Olivier Dion <olivier.dion@polymtl.ca> Date: Mon, 10 May 2021 11:39:35 -0400 Subject: [PATCH] test/unitTest/Makefile.am: Remove ut_channel See commit a760dd17ce1301f61020dcf2f36a2ce07f56d57f Gitlab: #545 Change-Id: I46c5f0ee2cff9cc98c5611747ae7f1d6893aace5 --- test/unitTest/Makefile.am | 6 - test/unitTest/channel/testChannel.cpp | 226 -------------------------- 2 files changed, 232 deletions(-) delete mode 100644 test/unitTest/channel/testChannel.cpp diff --git a/test/unitTest/Makefile.am b/test/unitTest/Makefile.am index a19f97bb23..6f6e2b9cbb 100644 --- a/test/unitTest/Makefile.am +++ b/test/unitTest/Makefile.am @@ -33,12 +33,6 @@ ut_scheduler_LDADD = @OPENDHT_LIBS@ check_PROGRAMS += ut_base64 ut_base64_SOURCES = base64/base64.cpp -# -# channel -# -check_PROGRAMS += ut_channel -ut_channel_SOURCES = channel/testChannel.cpp - # # map_utils # diff --git a/test/unitTest/channel/testChannel.cpp b/test/unitTest/channel/testChannel.cpp deleted file mode 100644 index 61417c5e10..0000000000 --- a/test/unitTest/channel/testChannel.cpp +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright (C) 2004-2021 Savoir-faire Linux Inc. - * - * Author: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <cppunit/TestAssert.h> -#include <cppunit/TestFixture.h> -#include <cppunit/extensions/HelperMacros.h> - -#include <future> -#include <algorithm> - -#include "test_runner.h" - -#include "channel.h" - -namespace jami { namespace test { - -// During a receive operation we should not wait more than this timeout, -// otherwise it would indicate a thread starvation. -static const std::chrono::seconds timeout {1}; - -class ChannelTest : public CppUnit::TestFixture { -public: - static std::string name() { return "channel"; } - -private: - void emptyStateTest(); - void sendTest(); - void receiveTest(); - void simpleUnlimitedTest(); - void flushTest(); - void dinningPhilosophersTest(); - - CPPUNIT_TEST_SUITE(ChannelTest); - CPPUNIT_TEST(emptyStateTest); - CPPUNIT_TEST(sendTest); - CPPUNIT_TEST(receiveTest); - CPPUNIT_TEST(simpleUnlimitedTest); - CPPUNIT_TEST(flushTest); - CPPUNIT_TEST(dinningPhilosophersTest); - CPPUNIT_TEST_SUITE_END(); -}; - -CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(ChannelTest, ChannelTest::name()); - -//============================================================================== - -void -ChannelTest::emptyStateTest() -{ - Channel<int, 1> limited_channel; - Channel<int> unlimited_channel; - - CPPUNIT_ASSERT(limited_channel.empty()); - CPPUNIT_ASSERT(limited_channel.size() == 0); - CPPUNIT_ASSERT(unlimited_channel.empty()); - CPPUNIT_ASSERT(unlimited_channel.size() == 0); - - CPPUNIT_ASSERT_THROW(limited_channel.receive(timeout), jami::ChannelEmpty); - CPPUNIT_ASSERT_THROW(unlimited_channel.receive(timeout), jami::ChannelEmpty); -} - -void -ChannelTest::sendTest() -{ - Channel<int, 2> limited_channel; - Channel<int> unlimited_channel; - - // First insert - limited_channel.send(42); - CPPUNIT_ASSERT(!limited_channel.empty()); - CPPUNIT_ASSERT_EQUAL(1ul, limited_channel.size()); - - unlimited_channel.send(999); - CPPUNIT_ASSERT(!unlimited_channel.empty()); - CPPUNIT_ASSERT_EQUAL(1ul, unlimited_channel.size()); - - // Second insert - limited_channel.send(123456789); - CPPUNIT_ASSERT(!limited_channel.empty()); - CPPUNIT_ASSERT_EQUAL(2ul, limited_channel.size()); - - unlimited_channel.send(-1); - CPPUNIT_ASSERT(!unlimited_channel.empty()); - CPPUNIT_ASSERT_EQUAL(2ul, unlimited_channel.size()); -} - -void -ChannelTest::receiveTest() -{ - Channel<int> channel; - int first = 1, second = 2, third = 3; - - channel.send(first); - channel.send(second); - CPPUNIT_ASSERT(!channel.empty() && 2ul == channel.size()); - - int v = 0; - CPPUNIT_ASSERT_NO_THROW(channel.receive(v, timeout)); - CPPUNIT_ASSERT_EQUAL(v, first); - CPPUNIT_ASSERT_EQUAL(1ul, channel.size()); - CPPUNIT_ASSERT(!channel.empty()); - CPPUNIT_ASSERT_NO_THROW(channel.receive(v, timeout)); - CPPUNIT_ASSERT_EQUAL(v, second); - CPPUNIT_ASSERT_EQUAL(0ul, channel.size()); - CPPUNIT_ASSERT(channel.empty()); - - channel.send(third); - CPPUNIT_ASSERT(!channel.empty() && 1ul == channel.size()); - v = channel.receive(); - CPPUNIT_ASSERT_EQUAL(v, third); - CPPUNIT_ASSERT_EQUAL(0ul, channel.size()); - CPPUNIT_ASSERT(channel.empty()); -} - -void -ChannelTest::simpleUnlimitedTest() -{ - Channel<int> c; - std::array<int, 3> values = {1, 2, 3}; - c.send(&values[0], values.size()); // this API exists only for unlimited-version -} - -void -ChannelTest::flushTest() -{ - Channel<int> c; - c.send(1); c.send(1); c.send(1); - CPPUNIT_ASSERT(!c.empty() && 3ul == c.size()); - - auto queue = c.flush(); - bool correct = true; - while (!queue.empty()) { - correct &= queue.front() == 1; - queue.pop(); - } - CPPUNIT_ASSERT_MESSAGE("invalid items returned by Channel::flush()", correct); - CPPUNIT_ASSERT(c.empty()); - CPPUNIT_ASSERT_EQUAL(0ul, c.size()); -} - -//============================================================================== - -// Classical concurrential problem: dinning philosophers -// https://en.wikipedia.org/wiki/Dining_philosophers_problem - -template <int N> -struct DinningTable -{ - // Per-fork pick-up order channel (entry = philosopher #) - Channel<int> pickUpChannels[N]; - - // Per-fork put-down order channel (entry = philosopher #) - Channel<int> putDownChannels[N]; -}; - -template <int N> -void -philosopher_job(DinningTable<N>& table, int i) -{ - // Think -> pick-up Left+Right forks -> eat -> put-down forks - - if (i) { - table.pickUpChannels[i].send_emplace(i); - table.pickUpChannels[(i + 1) % N].send_emplace(i); - } else { - // For the fist one, we swap fork picking order - table.pickUpChannels[(i + 1) % N].send_emplace(i); - table.pickUpChannels[i].send_emplace(i); - } - - table.putDownChannels[i].send_emplace(i); - table.putDownChannels[(i + 1) % N].send_emplace(i); -} - -template <int N> -void -fork_job(DinningTable<N>& table, int i) -{ - // A fork wait to be pick-up first, then to be put-down - table.pickUpChannels[i].receive(timeout); - table.putDownChannels[i].receive(timeout); - - // In this configuration a fork could be used twice at least - table.pickUpChannels[i].receive(timeout); - table.putDownChannels[i].receive(timeout); -} - -void -ChannelTest::dinningPhilosophersTest() -{ - constexpr int N = 5; // For the classical description of the problem - DinningTable<N> table; - - // Dress-up the table first :-) - std::future<void> forks[N]; - for (int i = 0; i < N; i++) - forks[i] = std::async(std::launch::async, - [&table, i]{ fork_job<N>(table, i); }); - - // Then invite philosophers... - std::future<void> philosophers[N]; - for (int i = 0; i < N; i++) - philosophers[i] = std::async(std::launch::async, - [&table, i]{ philosopher_job<N>(table, i); }); -} - -}} // namespace jami::test - -RING_TEST_RUNNER(jami::test::ChannelTest::name()); -- GitLab