blob: e6da087cb535c2df7216bdfbee65b67f9ba14265 [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.
*/
#pragma once
#ifndef GEODE_INTEGRATION_TEST_THINCLIENTDISTOPS2_H_
#define GEODE_INTEGRATION_TEST_THINCLIENTDISTOPS2_H_
#include "fw_dunit.hpp"
#include <ace/OS.h>
#include <string>
#include <vector>
#define ROOT_NAME "ThinClientDistOps2"
#define ROOT_SCOPE DISTRIBUTED_ACK
#include "ThinClientHelper.hpp"
#define CLIENT1 s1p1
#define CLIENT2 s1p2
#define SERVER1 s2p1
#define SERVER2 s2p2
namespace { // NOLINT(google-build-namespaces)
using apache::geode::client::CacheableInt32;
using apache::geode::client::CacheableInt64;
using apache::geode::client::CacheableKey;
using apache::geode::client::CacheableString;
using apache::geode::client::CacheHelper;
using apache::geode::client::CacheServerException;
using apache::geode::client::EntryExistsException;
using apache::geode::client::IllegalArgumentException;
using apache::geode::client::Properties;
static bool isLocalServer = false;
static bool isLocator = false;
static int numberOfLocators = 0;
const char* poolName = "__TEST_POOL1__";
const char* locatorsG =
CacheHelper::getLocatorHostPort(isLocator, isLocalServer, numberOfLocators);
#include "LocatorHelper.hpp"
#define verifyEntry(a, b, c, d) _verifyEntry(a, b, c, d, __LINE__)
void _verifyEntry(const std::string& name, const char* key, const char* val,
bool checkLocal, int line) {
char logmsg[1024];
sprintf(logmsg, "verifyEntry() called from %d.\n", line);
LOG(logmsg);
_verifyEntry(name, key, val, false, checkLocal);
LOG("Entry verified.");
}
const char* _keys[] = {"Key-1", "Key-2", "Key-3", "Key-4"};
const char* _vals[] = {"Value-1", "Value-2", "Value-3", "Value-4"};
const char* _nvals[] = {"New Value-1", "New Value-2", "New Value-3",
"New Value-4"};
const char* _regionNames[] = {"DistRegionAck", "DistRegionNoAck"};
DUNIT_TASK_DEFINITION(SERVER1, CreateServer1)
{
if (isLocalServer) CacheHelper::initServer(1);
LOG("SERVER1 started");
}
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(SERVER2, CreateServer2And3)
{
if (isLocalServer) CacheHelper::initServer(2);
if (isLocalServer) CacheHelper::initServer(3);
LOG("SERVER23 started");
}
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(SERVER2, CreateServer2And3_Locator)
{
if (isLocalServer) CacheHelper::initServer(2, nullptr, locatorsG);
if (isLocalServer) CacheHelper::initServer(3, nullptr, locatorsG);
LOG("SERVER23 started");
}
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(CLIENT1, CreateClient1Regions_Pooled_Locator)
{
initClientWithPool(true, "__TEST_POOL1__", locatorsG, nullptr, nullptr, 0,
true);
createPooledRegion(_regionNames[0], USE_ACK, locatorsG, poolName);
createPooledRegion(_regionNames[1], NO_ACK, locatorsG, poolName);
LOG("CreateClient1Regions complete.");
}
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(CLIENT2, CreateClient2Regions_Pooled_Locator)
{
initClientWithPool(true, "__TEST_POOL1__", locatorsG, nullptr, nullptr, 0,
true);
createPooledRegion(_regionNames[0], USE_ACK, locatorsG, poolName);
createPooledRegion(_regionNames[1], NO_ACK, locatorsG, poolName);
LOG("CreateClient1Regions complete.");
}
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(CLIENT1, CreateClient1Entries)
{
createEntry(_regionNames[0], _keys[0], _vals[0]);
createEntry(_regionNames[1], _keys[2], _vals[2]);
LOG("CreateClient1Entries complete.");
}
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(CLIENT2, CreateClient2Entries)
{
doNetsearch(_regionNames[0], _keys[0], _vals[0]);
doNetsearch(_regionNames[1], _keys[2], _vals[2]);
createEntry(_regionNames[0], _keys[1], _vals[1]);
createEntry(_regionNames[1], _keys[3], _vals[3]);
LOG("CreateClient2Entries complete.");
}
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(CLIENT1, UpdateClient1Entry)
{
doNetsearch(_regionNames[0], _keys[1], _vals[1]);
doNetsearch(_regionNames[1], _keys[3], _vals[3]);
updateEntry(_regionNames[0], _keys[0], _nvals[0]);
updateEntry(_regionNames[1], _keys[2], _nvals[2]);
LOG("UpdateClient1Entry complete.");
}
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(CLIENT2, UpdateClient2Entry)
{
doNetsearch(_regionNames[0], _keys[0], _vals[0], false);
doNetsearch(_regionNames[1], _keys[2], _vals[2], false);
updateEntry(_regionNames[0], _keys[1], _nvals[1]);
updateEntry(_regionNames[1], _keys[3], _nvals[3]);
LOG("UpdateClient2Entry complete.");
}
END_TASK_DEFINITION
// Test for getAll
DUNIT_TASK_DEFINITION(CLIENT1, Client1GetAll)
{
auto reg0 = getHelper()->getRegion(_regionNames[0]);
std::vector<std::shared_ptr<CacheableKey>> keys0;
auto key0 = CacheableString::create(_keys[0]);
auto key1 = CacheableString::create(_keys[1]);
// re-create region with caching enabled
reg0->localDestroyRegion();
reg0 = nullptr;
getHelper()->createPooledRegion(regionNames[0], USE_ACK, nullptr,
"__TEST_POOL1__", true, true);
reg0 = getHelper()->getRegion(_regionNames[0]);
// check for IllegalArgumentException for empty key list
keys0.clear();
try {
reg0->getAll(keys0);
FAIL("Expected IllegalArgumentException");
} catch (const IllegalArgumentException&) {
LOG("Got expected IllegalArgumentException");
}
keys0.push_back(key0);
keys0.push_back(key1);
{
auto values = reg0->getAll(keys0);
ASSERT(values.size() == 2, "Expected 2 values");
auto val0 = std::dynamic_pointer_cast<CacheableString>(values[key0]);
auto val1 = std::dynamic_pointer_cast<CacheableString>(values[key1]);
ASSERT(strcmp(_nvals[0], val0->value().c_str()) == 0,
"Got unexpected value");
ASSERT(strcmp(_nvals[1], val1->value().c_str()) == 0,
"Got unexpected value");
}
// for second region invalidate only one key to have a partial get
// from java server
auto reg1 = getHelper()->getRegion(_regionNames[1]);
auto key2 = CacheableString::create(_keys[2]);
auto key3 = CacheableString::create(_keys[3]);
reg1->localInvalidate(key2);
std::vector<std::shared_ptr<CacheableKey>> keys1;
keys1.push_back(key2);
keys1.push_back(key3);
{
auto values = reg1->getAll(keys1);
ASSERT(values.size() == 2, "Expected 2 values");
auto val2 = std::dynamic_pointer_cast<CacheableString>(values[key2]);
auto val3 = std::dynamic_pointer_cast<CacheableString>(values[key3]);
ASSERT(strcmp(_nvals[2], val2->value().c_str()) == 0,
"Got unexpected value");
ASSERT(strcmp(_vals[3], val3->value().c_str()) == 0,
"Got unexpected value");
}
// also check that the region is properly populated
ASSERT(reg1->size() == 2, "Expected 2 entries in the region");
auto regEntries = reg1->entries(false);
ASSERT(regEntries.size() == 2, "Expected 2 entries in the region.entries");
verifyEntry(_regionNames[1], _keys[2], _nvals[2], true);
verifyEntry(_regionNames[1], _keys[3], _vals[3], true);
// also check with nullptr values that region is properly populated
{
reg1->localInvalidate(key3);
auto values = reg1->getAll(keys1);
// now check that the region is properly populated
ASSERT(reg1->size() == 2, "Expected 2 entries in the region");
regEntries = reg1->entries(false);
ASSERT(regEntries.size() == 2,
"Expected 2 entries in the region.entries");
verifyEntry(_regionNames[1], _keys[2], _nvals[2], true);
verifyEntry(_regionNames[1], _keys[3], _nvals[3], true);
}
}
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(CLIENT1, Client1GetAll_Pool)
{
{
auto reg0 = getHelper()->getRegion(_regionNames[0]);
std::vector<std::shared_ptr<CacheableKey>> keys0;
auto key0 = CacheableString::create(_keys[0]);
auto key1 = CacheableString::create(_keys[1]);
getHelper()->createRegionAndAttachPool(_regionNames[0], USE_ACK,
poolName);
reg0 = getHelper()->getRegion(_regionNames[0]);
// check for IllegalArgumentException for empty key list
keys0.clear();
try {
reg0->getAll(keys0);
FAIL("Expected IllegalArgumentException");
} catch (const IllegalArgumentException&) {
LOG("Got expected IllegalArgumentException");
}
keys0.push_back(key0);
keys0.push_back(key1);
auto values = reg0->getAll(keys0);
ASSERT(values.size() == 2, "Expected 2 values");
auto val0 = std::dynamic_pointer_cast<CacheableString>(values[key0]);
auto val1 = std::dynamic_pointer_cast<CacheableString>(values[key1]);
ASSERT(strcmp(_nvals[0], val0->value().c_str()) == 0,
"Got unexpected value");
ASSERT(strcmp(_nvals[1], val1->value().c_str()) == 0,
"Got unexpected value");
}
{
// for second region invalidate only one key to have a partial get
// from java server
auto reg1 = getHelper()->getRegion(_regionNames[1]);
auto key2 = CacheableString::create(_keys[2]);
auto key3 = CacheableString::create(_keys[3]);
reg1->localInvalidate(key2);
std::vector<std::shared_ptr<CacheableKey>> keys1;
keys1.push_back(key2);
keys1.push_back(key3);
auto values = reg1->getAll(keys1);
ASSERT(values.size() == 2, "Expected 2 values");
auto val2 = std::dynamic_pointer_cast<CacheableString>(values[key2]);
auto val3 = std::dynamic_pointer_cast<CacheableString>(values[key3]);
ASSERT(strcmp(_nvals[2], val2->value().c_str()) == 0,
"Got unexpected value");
ASSERT(strcmp(_vals[3], val3->value().c_str()) == 0,
"Got unexpected value");
// also check that the region is properly populated
ASSERT(reg1->size() == 2, "Expected 2 entries in the region");
auto regEntries = reg1->entries(false);
ASSERT(regEntries.size() == 2,
"Expected 2 entries in the region.entries");
verifyEntry(_regionNames[1], _keys[2], _nvals[2], true);
verifyEntry(_regionNames[1], _keys[3], _vals[3], true);
// also check with nullptr values that region is properly populated
reg1->localInvalidate(key3);
reg1->getAll(keys1);
// now check that the region is properly populated
ASSERT(reg1->size() == 2, "Expected 2 entries in the region");
regEntries = reg1->entries(false);
ASSERT(regEntries.size() == 2,
"Expected 2 entries in the region.entries");
verifyEntry(_regionNames[1], _keys[2], _nvals[2], true);
verifyEntry(_regionNames[1], _keys[3], _nvals[3], true);
}
}
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(CLIENT1, CloseCache1)
{ cleanProc(); }
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(CLIENT2, CloseCache2)
{ cleanProc(); }
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(SERVER1, CloseServer1)
{
if (isLocalServer) {
CacheHelper::closeServer(1);
LOG("SERVER1 stopped");
}
}
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(SERVER2, CloseServer2)
{
if (isLocalServer) {
CacheHelper::closeServer(2);
LOG("SERVER2 stopped");
}
if (isLocalServer) {
CacheHelper::closeServer(3);
LOG("SERVER3 stopped");
}
}
END_TASK_DEFINITION
} // namespace
#endif // GEODE_INTEGRATION_TEST_THINCLIENTDISTOPS2_H_