blob: 747630567c120a85bc69af44fc68f5f23afb540c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <boost/test/unit_test.hpp>
#include <boost/bind.hpp>
#include <ignite/ignition.h>
#include <ignite/thin/ignite_client_configuration.h>
#include <ignite/thin/ignite_client.h>
#include <test_utils.h>
using namespace ignite::thin;
using namespace boost::unit_test;
class IgniteClientTestSuiteFixture
{
public:
IgniteClientTestSuiteFixture()
{
// No-op.
}
~IgniteClientTestSuiteFixture()
{
ignite::Ignition::StopAll(false);
}
/**
* Wait for connections.
* @return True if condition was met, false if timeout has been reached.
*/
bool WaitForConnections(size_t expected, int32_t timeout = 5000)
{
return ignite_test::WaitForCondition(
boost::bind(&IgniteClientTestSuiteFixture::CheckActiveConnections, this, expected),
timeout);
}
/**
* Check that if client started with given configuration and connection limit then the actual number of active
* connections is equal to the expected value.
*
* @param cfg Client configuration.
* @param limit Limit to set
* @param expect Expected connections number.
*/
void CheckConnectionsNum(IgniteClientConfiguration &cfg, uint32_t limit, size_t expect)
{
cfg.SetConnectionsLimit(limit);
IgniteClient client = IgniteClient::Start(cfg);
BOOST_CHECK(WaitForConnections(expect));
BOOST_CHECK_EQUAL(GetActiveConnections(), expect);
}
/**
* Check number of active connections.
*
* @param expect connections to expect.
* @return @c true on success.
*/
bool CheckActiveConnections(size_t expect)
{
return GetActiveConnections() == expect;
}
/**
* Get Number of active connections.
*
* @return Number of active connections.
*/
static size_t GetActiveConnections()
{
size_t connected = ignite_test::GetLineOccurrencesInFile("logs/ignite-log-0.txt", "Client connected");
size_t disconnected = ignite_test::GetLineOccurrencesInFile("logs/ignite-log-0.txt", "Client disconnected");
return connected - disconnected;
}
/**
* Start node with logging.
*
* @param id Node id. Used to identify node and log.
*/
ignite::Ignite StartNodeWithLog(const std::string& id)
{
std::string nodeName = "ServerNode" + id;
return ignite_test::StartCrossPlatformServerNode("with-logging-0.xml", nodeName.c_str());
}
};
BOOST_FIXTURE_TEST_SUITE(IgniteClientTestSuite, IgniteClientTestSuiteFixture)
BOOST_AUTO_TEST_CASE(IgniteClientConnection)
{
ignite::Ignite serverNode = ignite_test::StartCrossPlatformServerNode("cache.xml", "ServerNode");
IgniteClientConfiguration cfg;
cfg.SetEndPoints("127.0.0.1:11110");
IgniteClient::Start(cfg);
}
BOOST_AUTO_TEST_CASE(IgniteClientConnectionFailover)
{
ignite::Ignite serverNode = ignite_test::StartCrossPlatformServerNode("cache.xml", "ServerNode");
IgniteClientConfiguration cfg;
cfg.SetEndPoints("127.0.0.1:11109..11111");
IgniteClient::Start(cfg);
}
BOOST_AUTO_TEST_CASE(IgniteClientConnectionLimit)
{
ignite::common::DeletePath("logs");
ignite::Ignite serverNode0 = StartNodeWithLog("0");
ignite::Ignite serverNode1 = StartNodeWithLog("1");
ignite::Ignite serverNode2 = StartNodeWithLog("2");
IgniteClientConfiguration cfg;
cfg.SetEndPoints("127.0.0.1:11110,127.0.0.1:11111,127.0.0.1:11112");
CheckConnectionsNum(cfg, 0, 3);
CheckConnectionsNum(cfg, 1, 1);
CheckConnectionsNum(cfg, 2, 2);
CheckConnectionsNum(cfg, 3, 3);
CheckConnectionsNum(cfg, 4, 3);
CheckConnectionsNum(cfg, 100500, 3);
}
BOOST_AUTO_TEST_SUITE_END()