blob: 06725202d8eb04be5bd55e36a1516aa0a0552a4d [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.
*/
using System;
using System.Collections.Generic;
using System.Threading;
namespace Apache.Geode.Client.UnitTests
{
using NUnit.Framework;
using Apache.Geode.DUnitFramework;
using Apache.Geode.Client.Tests;
using Apache.Geode.Client;
#region Listener
class ConflationListner<TKey, TValue> : ICacheListener<TKey, TValue>
{
#region Private members
private int m_events = 0;
private TValue m_value = default(TValue);
#endregion
public static ConflationListner<TKey, TValue> Create()
{
Util.Log(" ConflationListner Created");
return new ConflationListner<TKey, TValue>();
}
private void check(EntryEvent<TKey, TValue> ev)
{
m_events++;
TKey key = ev.Key;
TValue value = ev.NewValue;
m_value = value;
Util.Log("Region:{0}:: Key:{1}, Value:{2}", ev.Region.Name, key, value);
}
public void validate(bool conflation)
{
if (conflation)
{
string msg1 = string.Format("Conflation On: Expected 2 events but got {0}", m_events);
Assert.AreEqual(2, m_events, msg1);
}
else
{
string msg2 = string.Format("Conflation Off: Expected 5 events but got {0}", m_events);
Assert.AreEqual(5, m_events, msg2);
}
string msg3 = string.Format("Expected Value =5, Actual = {0}", m_value);
Assert.AreEqual(5, m_value, msg3);
}
#region ICacheListener Members
public virtual void AfterCreate(EntryEvent<TKey, TValue> ev)
{
check(ev);
}
public virtual void AfterUpdate(EntryEvent<TKey, TValue> ev)
{
check(ev);
}
public virtual void AfterDestroy(EntryEvent<TKey, TValue> ev) { }
public virtual void AfterInvalidate(EntryEvent<TKey, TValue> ev) { }
public virtual void AfterRegionDestroy(RegionEvent<TKey, TValue> ev) { }
public virtual void AfterRegionInvalidate(RegionEvent<TKey, TValue> ev) { }
public virtual void AfterRegionClear(RegionEvent<TKey, TValue> ev) { }
public virtual void AfterRegionLive(RegionEvent<TKey, TValue> ev)
{
Util.Log("DurableListener: Received AfterRegionLive event of region: {0}", ev.Region.Name);
}
public virtual void Close(IRegion<TKey, TValue> region) { }
public virtual void AfterRegionDisconnected(IRegion<TKey, TValue> region) { }
#endregion
}
#endregion
[TestFixture]
[Category("group1")]
[Category("unicast_only")]
[Category("generics")]
public class ThinClientConflationTests : ThinClientRegionSteps
{
#region Private members
private UnitProcess m_client1, m_client2, m_feeder;
private string[] keys = { "Key-1", "Key-2", "Key-3", "Key-4", "Key-5" };
private static string[] DurableClientIds = { "DurableClientId1", "DurableClientId2" };
static string[] Regions = { "ConflatedRegion", "NonConflatedRegion" };
private static ConflationListner<object, object> m_listener1C1, m_listener2C1, m_listener1C2, m_listener2C2;
#endregion
protected override ClientBase[] GetClients()
{
m_client1 = new UnitProcess();
m_client2 = new UnitProcess();
m_feeder = new UnitProcess();
return new ClientBase[] { m_client1, m_client2, m_feeder };
}
[TearDown]
public override void EndTest()
{
try
{
m_client1.Call(CacheHelper.Close);
m_client2.Call(CacheHelper.Close);
m_feeder.Call(CacheHelper.Close);
CacheHelper.ClearEndpoints();
}
finally
{
CacheHelper.StopJavaServers();
}
base.EndTest();
}
#region Common Functions
public void InitFeeder(string locators, int redundancyLevel)
{
CacheHelper.CreatePool<object, object>("__TESTPOOL1_", locators, (string)null, redundancyLevel, false);
CacheHelper.CreateTCRegion_Pool<object, object>(Regions[0], false, false, null,
CacheHelper.Locators, "__TESTPOOL1_", false);
CacheHelper.CreateTCRegion_Pool<object, object>(Regions[1], false, false, null,
CacheHelper.Locators, "__TESTPOOL1_", false);
}
public void InitDurableClient(int client, string locators, string conflation)
{
// Create DurableListener for first time and use same afterward.
ConflationListner<object, object> checker1 = null;
ConflationListner<object, object> checker2 = null;
string durableId = ThinClientConflationTests.DurableClientIds[client - 1];
if (client == 1)
{
ThinClientConflationTests.m_listener1C1 = ConflationListner<object, object>.Create();
ThinClientConflationTests.m_listener2C1 = ConflationListner<object, object>.Create();
checker1 = ThinClientConflationTests.m_listener1C1;
checker2 = ThinClientConflationTests.m_listener2C1;
}
else // client == 2
{
ThinClientConflationTests.m_listener1C2 = ConflationListner<object, object>.Create();
ThinClientConflationTests.m_listener2C2 = ConflationListner<object, object>.Create();
checker1 = ThinClientConflationTests.m_listener1C2;
checker2 = ThinClientConflationTests.m_listener2C2;
}
CacheHelper.InitConfigForConflation_Pool(locators, durableId, conflation);
CacheHelper.CreateTCRegion_Pool<object, object>(Regions[0], false, true, checker1,
CacheHelper.Locators, "__TESTPOOL1_", true);
CacheHelper.CreateTCRegion_Pool<object, object>(Regions[1], false, true, checker2,
CacheHelper.Locators, "__TESTPOOL1_", true);
//CacheHelper.DCache.ReadyForEvents();
IRegion<object, object> region1 = CacheHelper.GetVerifyRegion<object, object>(Regions[0]);
region1.GetSubscriptionService().RegisterAllKeys(true);
IRegion<object, object> region2 = CacheHelper.GetVerifyRegion<object, object>(Regions[1]);
region2.GetSubscriptionService().RegisterAllKeys(true);
}
public void ReadyForEvents()
{
CacheHelper.DCache.ReadyForEvents();
}
public void FeederUpdate(int keyIdx)
{
IRegion<object, object> region1 = CacheHelper.GetVerifyRegion<object, object>(Regions[0]);
region1[keys[keyIdx]] = 1;
region1[keys[keyIdx]] = 2;
region1[keys[keyIdx]] = 3;
region1[keys[keyIdx]] = 4;
region1[keys[keyIdx]] = 5;
IRegion<object, object> region2 = CacheHelper.GetVerifyRegion<object, object>(Regions[1]);
region2[keys[keyIdx]] = 1;
region2[keys[keyIdx]] = 2;
region2[keys[keyIdx]] = 3;
region2[keys[keyIdx]] = 4;
region2[keys[keyIdx]] = 5;
}
public void ClientDown()
{
CacheHelper.Close();
}
public void KillServer()
{
CacheHelper.StopJavaServer(1);
Util.Log("Cacheserver 1 stopped.");
}
public delegate void KillServerDelegate();
#endregion
public void Validate(int client, int region, bool conflate)
{
ConflationListner<object, object> checker = null;
if (client == 1)
{
if (region == 1)
checker = ThinClientConflationTests.m_listener1C1;
else
checker = ThinClientConflationTests.m_listener2C1;
}
else // client == 2
{
if (region == 1)
checker = ThinClientConflationTests.m_listener1C2;
else
checker = ThinClientConflationTests.m_listener2C2;
}
if (checker != null)
{
checker.validate(conflate);
}
else
{
Assert.Fail("Checker is NULL!");
}
}
void runConflationBasic()
{
CacheHelper.SetupJavaServers(true, "cacheserver_conflation.xml");
CacheHelper.StartJavaLocator(1, "GFELOC");
Util.Log("Locator started");
CacheHelper.StartJavaServerWithLocators(1, "GFECS1", 1);
Util.Log("Cacheserver 1 started.");
m_feeder.Call(InitFeeder, CacheHelper.Locators, 0);
Util.Log("Feeder initialized.");
//Test "true" and "false" settings
m_client1.Call(InitDurableClient, 1, CacheHelper.Locators, "true");
m_client2.Call(InitDurableClient, 2, CacheHelper.Locators, "false");
Util.Log("Clients initialized for first time.");
m_feeder.Call(FeederUpdate, 0);
Util.Log("Feeder performed first update.");
Util.Log("Client1 sending readyForEvents().");
m_client1.Call(ReadyForEvents);
Thread.Sleep(5000);
Util.Log("Validating Client 1 Region 1.");
m_client1.Call(Validate, 1, 1, true);
Util.Log("Validating Client 1 Region 2.");
m_client1.Call(Validate, 1, 2, true);
Util.Log("Client2 sending readyForEvents().");
m_client2.Call(ReadyForEvents);
Thread.Sleep(5000);
Util.Log("Validating Client 2 Region 1.");
m_client2.Call(Validate, 2, 1, false);
Util.Log("Validating Client 2 Region 1.");
m_client2.Call(Validate, 2, 2, false);
//Close Clients.
m_client1.Call(ClientDown);
m_client2.Call(ClientDown);
Util.Log("First step complete, tested true/false options.");
//Test "server" and not set settings
m_client1.Call(InitDurableClient, 1, CacheHelper.Locators, "server");
m_client2.Call(InitDurableClient, 2, CacheHelper.Locators, "");
Util.Log("Clients initialized second times.");
m_feeder.Call(FeederUpdate, 1);
Util.Log("Feeder performed second update.");
Util.Log("Client1 sending readyForEvents().");
m_client1.Call(ReadyForEvents);
Thread.Sleep(5000);
Util.Log("Validating Client 1 Region 1.");
m_client1.Call(Validate, 1, 1, true);
Util.Log("Validating Client 1 Region 2.");
m_client1.Call(Validate, 1, 2, false);
Util.Log("Client2 sending readyForEvents().");
m_client2.Call(ReadyForEvents);
Thread.Sleep(5000);
Util.Log("Validating Client 2 Region 1.");
m_client2.Call(Validate, 2, 1, true);
Util.Log("Validating Client 2 Region 2.");
m_client2.Call(Validate, 2, 2, false);
//Close Clients.
m_client1.Call(ClientDown);
m_client2.Call(ClientDown);
m_feeder.Call(ClientDown);
Util.Log("Feeder and Clients closed.");
CacheHelper.StopJavaServer(1);
Util.Log("Cacheserver 1 stopped.");
CacheHelper.StopJavaLocator(1);
Util.Log("Locator stopped");
CacheHelper.ClearLocators();
CacheHelper.ClearEndpoints();
}
[Test]
public void ConflationBasic()
{
runConflationBasic();
}
}
}