blob: b6f70a4810709c9fe1c8338b0c070585e9bd4c0a [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 <gtest/gtest.h>
#include <geode/Cache.hpp>
#include <geode/CacheFactory.hpp>
#include <geode/CacheListener.hpp>
#include <geode/CacheTransactionManager.hpp>
#include <geode/PoolManager.hpp>
#include <geode/RegionFactory.hpp>
#include <geode/RegionShortcut.hpp>
#include "framework/Cluster.h"
#include "framework/Framework.h"
#include "framework/Gfsh.h"
namespace {
using apache::geode::client::Cache;
using apache::geode::client::CacheableString;
using apache::geode::client::CacheFactory;
using apache::geode::client::CacheTransactionManager;
using apache::geode::client::CacheWriter;
using apache::geode::client::Region;
using apache::geode::client::RegionShortcut;
/*
* Verify that it is possible to write in region from CacheWriter listener that
* is triggered by transaction. Region is not defined on client, but only on a
* server.
*/
TEST(CacheWriterTest, WriteInRegionFromCacheWriterTriggeredByTransaction) {
Cluster cluster{
LocatorCount{1}, ServerCount{1},
CacheXMLFiles(
{std::string(getFrameworkString(FrameworkVariable::TestCacheXmlDir)) +
"/cacheWriterTransaction1.xml",
std::string(getFrameworkString(FrameworkVariable::TestCacheXmlDir)) +
"/cacheWriterTransaction1.xml"})};
cluster.start([&]() {
cluster.getGfsh()
.deploy()
.jar(getFrameworkString(FrameworkVariable::JavaObjectJarPath))
.execute();
});
CacheFactory cacheFactory;
auto cache = cacheFactory.set("log-level", "none")
.set("statistic-sampling-enabled", "false")
.create();
auto poolFactory = cache.getPoolManager().createFactory();
cluster.applyLocators(poolFactory);
auto pool = poolFactory.create("pool");
auto regionFactory = cache.createRegionFactory(RegionShortcut::CACHING_PROXY);
auto region = regionFactory.setPoolName("pool").create("partition_region");
auto transactionManager = cache.getCacheTransactionManager();
transactionManager->begin();
auto key = CacheableString::create("key1");
auto value = CacheableString::create("value1");
region->put(key, value);
transactionManager->commit();
auto v1 = std::dynamic_pointer_cast<CacheableString>(region->get("key1"));
EXPECT_EQ("value1", v1->value());
// check that CacheWriter has successfully put data in shadow_region
auto shadow_region =
regionFactory.setPoolName("pool").create("shadow_region");
auto v2 = std::dynamic_pointer_cast<CacheableString>(region->get("key1"));
EXPECT_EQ("value1", v2->value());
}
} // namespace