blob: d11d1f2c4e61f724cd6e3fea86356f070d59792d [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 <string>
#include "fw_dunit.hpp"
#include <ace/OS.h>
#include <ace/High_Res_Timer.h>
#include <geode/PdxInstance.hpp>
#include <geode/UserFunctionExecutionException.hpp>
#include <geode/FunctionService.hpp>
#define ROOT_NAME "testThinClientPdxTests"
#define ROOT_SCOPE DISTRIBUTED_ACK
#include "ThinClientHelper.hpp"
#include "testobject/PdxClassV1.hpp"
#include "testobject/PdxClassV2.hpp"
#include "testobject/VariousPdxTypes.hpp"
#include "testobject/InvalidPdxUsage.hpp"
#include "QueryStrings.hpp"
#include "QueryHelper.hpp"
#include "Utils.hpp"
#include <geode/Query.hpp>
#include <geode/QueryService.hpp>
#include "CachePerfStats.hpp"
#include <LocalRegion.hpp>
#define CLIENT1 s1p1
#define CLIENT2 s1p2
#define LOCATOR s2p2
#define SERVER1 s2p1
using apache::geode::client::CacheableBoolean;
using apache::geode::client::CacheableVector;
using apache::geode::client::ClassCastException;
using apache::geode::client::FunctionService;
using apache::geode::client::IllegalStateException;
using apache::geode::client::UserFunctionExecutionException;
using PdxTests::PdxTypes1;
using PdxTests::PdxTypes10;
using PdxTests::PdxTypes2;
using PdxTests::PdxTypes3;
using PdxTests::PdxTypes4;
using PdxTests::PdxTypes5;
using PdxTests::PdxTypes6;
using PdxTests::PdxTypes7;
using PdxTests::PdxTypes8;
using PdxTests::PdxTypes9;
bool isLocator = false;
bool isLocalServer = false;
const char *poolNames[] = {"Pool1", "Pool2", "Pool3"};
const char *locHostPort =
CacheHelper::getLocatorHostPort(isLocator, isLocalServer, 1);
bool isPoolConfig = false; // To track if pool case is running
// const char * qRegionNames[] = { "Portfolios", "Positions", "Portfolios2",
// "Portfolios3" };
void initClient(const bool isthinClient, bool isPdxIgnoreUnreadFields,
const std::shared_ptr<Properties> &configPtr = nullptr) {
LOGINFO("isPdxIgnoreUnreadFields = %d ", isPdxIgnoreUnreadFields);
if (cacheHelper == nullptr) {
cacheHelper = new CacheHelper(isthinClient, isPdxIgnoreUnreadFields, false,
configPtr, false);
}
ASSERT(cacheHelper, "Failed to create a CacheHelper client instance.");
}
void initClient1(bool isPdxIgnoreUnreadFields = false) {
// Create just one pool and attach all regions to that.
initClient(true, isPdxIgnoreUnreadFields);
isPoolConfig = true;
createPool(poolNames[0], locHostPort, nullptr, 0, false);
createRegionAndAttachPool("DistRegionAck", USE_ACK, poolNames[0],
true /*Caching enabled*/);
LOG("StepOne complete.");
}
void initClient2(bool isPdxIgnoreUnreadFields = false) {
// Create just one pool and attach all regions to that.
initClient(true, isPdxIgnoreUnreadFields);
isPoolConfig = true;
createPool(poolNames[0], locHostPort, nullptr, 0,
true /*ClientNotification enabled*/);
createRegionAndAttachPool("DistRegionAck", USE_ACK, poolNames[0],
true /*Caching enabled*/);
LOG("StepOne complete.");
}
DUNIT_TASK_DEFINITION(SERVER1, StartLocator)
{
// starting locator 1 2
if (isLocator) {
CacheHelper::initLocator(1);
}
LOG("Locator started");
}
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(SERVER1, CreateServerWithLocator_PdxMetadataTest)
{
LOG("Starting SERVER1...");
if (isLocalServer) {
CacheHelper::initServer(1, "cacheserverPdx2.xml", locHostPort);
}
LOG("SERVER1 started");
}
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(CLIENT1, StepOnePoolLoc_PdxMetadataTest)
{
LOG("Starting Step One with Pool + Locator lists");
initClient1();
}
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(CLIENT2, StepTwoPoolLoc_PdxMetadataTest)
{
LOG("Starting Step Two with Pool + Locator");
initClient2();
}
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(CLIENT1, generateJavaPdxType)
{
auto regPtr0 = getHelper()->getRegion("DistRegionAck");
auto args = CacheableKey::create("saveAllJavaPdxTypes");
auto key = CacheableKey::create(1);
auto routingObj = CacheableVector::create();
routingObj->push_back(key);
auto funcExec = FunctionService::onRegion(regPtr0);
auto collector = funcExec.withArgs(args)
.withFilter(routingObj)
.execute("ComparePdxTypes");
ASSERT(collector != nullptr, "onRegion collector nullptr");
auto result = collector->getResult();
LOGINFO("NIL:: testTCPDXTests: result->size = %d ", result->size());
if (result == nullptr) {
ASSERT(false, "echo String : result is nullptr");
} else {
//
bool gotResult = false;
for (size_t i = 0; i < result->size(); i++) {
try {
auto boolValue = std::dynamic_pointer_cast<CacheableBoolean>(
result->operator[](i));
LOGINFO("NIL:: boolValue is %d ", boolValue->value());
bool resultVal = boolValue->value();
ASSERT(resultVal == true,
"Function should return true NIL LINE_1508");
gotResult = true;
} catch (ClassCastException &ex) {
LOG("exFuncNameSendException casting to int for arrayList arguement "
"exception.");
std::string logmsg = "";
logmsg += ex.getName();
logmsg += ": ";
logmsg += ex.what();
LOG(logmsg.c_str());
LOG(ex.getStackTrace());
LOG("exFuncNameSendException now casting to "
"UserFunctionExecutionExceptionPtr for arrayList arguement "
"exception.");
auto uFEPtr =
std::dynamic_pointer_cast<UserFunctionExecutionException>(
result->operator[](i));
ASSERT(uFEPtr != nullptr, "uFEPtr exception is nullptr");
LOGINFO("Done casting to uFEPtr");
LOGINFO("Read expected uFEPtr exception %s ",
uFEPtr->getMessage().c_str());
} catch (...) {
FAIL(
"exFuncNameSendException casting to string for bool arguement "
"Unknown exception.");
}
}
ASSERT(gotResult == true, "Function should (gotResult) return true ");
//
}
}
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(CLIENT1, putAllPdxTypes)
{
auto serializationRegistry =
CacheRegionHelper::getCacheImpl(cacheHelper->getCache().get())
->getSerializationRegistry();
try {
serializationRegistry->addPdxSerializableType(
PdxTypes1::createDeserializable);
} catch (const IllegalStateException &) {
// ignore exception
}
try {
serializationRegistry->addPdxSerializableType(
PdxTypes2::createDeserializable);
} catch (const IllegalStateException &) {
// ignore exception
}
try {
serializationRegistry->addPdxSerializableType(
PdxTypes3::createDeserializable);
} catch (const IllegalStateException &) {
// ignore exception
}
try {
serializationRegistry->addPdxSerializableType(
PdxTypes4::createDeserializable);
} catch (const IllegalStateException &) {
// ignore exception
}
try {
serializationRegistry->addPdxSerializableType(
PdxTypes5::createDeserializable);
} catch (const IllegalStateException &) {
// ignore exception
}
try {
serializationRegistry->addPdxSerializableType(
PdxTypes6::createDeserializable);
} catch (const IllegalStateException &) {
// ignore exception
}
try {
serializationRegistry->addPdxSerializableType(
PdxTypes7::createDeserializable);
} catch (const IllegalStateException &) {
// ignore exception
}
try {
serializationRegistry->addPdxSerializableType(
PdxTypes8::createDeserializable);
} catch (const IllegalStateException &) {
// ignore exception
}
try {
serializationRegistry->addPdxSerializableType(
PdxTypes9::createDeserializable);
} catch (const IllegalStateException &) {
// ignore exception
}
try {
serializationRegistry->addPdxSerializableType(
PdxTypes10::createDeserializable);
} catch (const IllegalStateException &) {
// ignore exception
}
// TODO::Uncomment it once PortfolioPdx/PositionPdx Classes are ready
// serializationRegistry->addPdxType(PdxTests.PortfolioPdx.CreateDeserializable);
// serializationRegistry->addPdxType(PdxTests.PositionPdx.CreateDeserializable);
auto regPtr0 = getHelper()->getRegion("DistRegionAck");
auto p1 = std::make_shared<PdxTypes1>();
auto keyport1 = CacheableKey::create(p1->getClassName().c_str());
regPtr0->put(keyport1, p1);
auto p2 = std::make_shared<PdxTypes2>();
auto keyport2 = CacheableKey::create(p2->getClassName().c_str());
regPtr0->put(keyport2, p2);
auto p3 = std::make_shared<PdxTypes3>();
auto keyport3 = CacheableKey::create(p3->getClassName().c_str());
regPtr0->put(keyport3, p3);
auto p4 = std::make_shared<PdxTypes4>();
auto keyport4 = CacheableKey::create(p4->getClassName().c_str());
regPtr0->put(keyport4, p4);
auto p5 = std::make_shared<PdxTypes5>();
auto keyport5 = CacheableKey::create(p5->getClassName().c_str());
regPtr0->put(keyport5, p5);
auto p6 = std::make_shared<PdxTypes6>();
auto keyport6 = CacheableKey::create(p6->getClassName().c_str());
regPtr0->put(keyport6, p6);
auto p7 = std::make_shared<PdxTypes7>();
auto keyport7 = CacheableKey::create(p7->getClassName().c_str());
regPtr0->put(keyport7, p7);
auto p8 = std::make_shared<PdxTypes8>();
auto keyport8 = CacheableKey::create(p8->getClassName().c_str());
regPtr0->put(keyport8, p8);
auto p9 = std::make_shared<PdxTypes9>();
auto keyport9 = CacheableKey::create(p9->getClassName().c_str());
regPtr0->put(keyport9, p9);
auto p10 = std::make_shared<PdxTypes10>();
auto keyport10 = CacheableKey::create(p10->getClassName().c_str());
regPtr0->put(keyport10, p10);
//
}
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(CLIENT1, verifyDotNetPdxTypes)
{
auto regPtr0 = getHelper()->getRegion("DistRegionAck");
auto args = CacheableKey::create("compareDotNETPdxTypes");
auto key = CacheableKey::create(1);
auto routingObj = CacheableVector::create();
routingObj->push_back(key);
auto funcExec = FunctionService::onRegion(regPtr0);
auto collector = funcExec.withArgs(args)
.withFilter(routingObj)
.execute("ComparePdxTypes");
ASSERT(collector != nullptr, "onRegion collector nullptr");
auto result = collector->getResult();
LOGINFO("NIL:: testTCPDXTests:verifyDotNetPdxTypes result->size = %d ",
result->size());
if (result == nullptr) {
ASSERT(false, "echo String : result is nullptr");
} else {
bool gotResult = false;
for (size_t i = 0; i < result->size(); i++) {
try {
auto boolValue = std::dynamic_pointer_cast<CacheableBoolean>(
result->operator[](i));
LOGINFO("NIL::verifyDotNetPdxTypes boolValue is %d ",
boolValue->value());
bool resultVal = boolValue->value();
ASSERT(resultVal == true,
"Function should return true NIL LINE_1508");
gotResult = true;
} catch (ClassCastException &ex) {
LOG("exFuncNameSendException casting to int for arrayList arguement "
"exception.");
std::string logmsg = "";
logmsg += ex.getName();
logmsg += ": ";
logmsg += ex.what();
LOG(logmsg.c_str());
LOG(ex.getStackTrace());
LOG("exFuncNameSendException now casting to "
"UserFunctionExecutionExceptionPtr for arrayList arguement "
"exception.");
auto uFEPtr =
std::dynamic_pointer_cast<UserFunctionExecutionException>(
result->operator[](i));
ASSERT(uFEPtr != nullptr, "uFEPtr exception is nullptr");
LOGINFO("Done casting to uFEPtr");
LOGINFO("Read expected uFEPtr exception %s ",
uFEPtr->getMessage().c_str());
} catch (...) {
FAIL(
"exFuncNameSendException casting to string for bool arguement "
"Unknown exception.");
}
}
ASSERT(gotResult == true, "Function should (gotResult) return true ");
}
}
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(CLIENT1, CloseCache1)
{
LOG("cleanProc 1...");
isPoolConfig = false;
cleanProc();
}
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(CLIENT2, CloseCache2)
{
LOG("cleanProc 2...");
isPoolConfig = false;
cleanProc();
}
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(SERVER1, CloseServer)
{
LOG("closing Server1...");
if (isLocalServer) {
CacheHelper::closeServer(1);
LOG("SERVER1 stopped");
}
}
END_TASK_DEFINITION
DUNIT_TASK_DEFINITION(LOCATOR, CloseLocator)
{
if (isLocator) {
CacheHelper::closeLocator(1);
LOG("Locator1 stopped");
}
}
END_TASK_DEFINITION
DUNIT_MAIN
{
CALL_TASK(StartLocator);
CALL_TASK(CreateServerWithLocator_PdxMetadataTest);
CALL_TASK(StepOnePoolLoc_PdxMetadataTest);
CALL_TASK(StepTwoPoolLoc_PdxMetadataTest);
CALL_TASK(generateJavaPdxType);
CALL_TASK(putAllPdxTypes);
CALL_TASK(verifyDotNetPdxTypes);
CALL_TASK(CloseCache1);
CALL_TASK(CloseCache2);
CALL_TASK(CloseServer);
CALL_TASK(CloseLocator);
}
END_MAIN