blob: c3205fe8f3e1dee89490f119db39831231a1222e [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.Threading;
namespace Apache.Geode.Client.UnitTests
{
using NUnit.Framework;
using Apache.Geode.DUnitFramework;
using Apache.Geode.Client.Tests;
using Apache.Geode.Client;
using GIRegion = Apache.Geode.Client.IRegion<int, object>;
using System.Collections.Generic;
public class CallbackListener : CacheListenerAdapter<int, object>
{
int m_creates;
int m_updates;
int m_invalidates;
int m_destroys;
int m_regionInvalidate;
int m_regionDestroy;
int m_regionClear;
object m_callbackArg;
#region Getters
public int Creates
{
get { return m_creates; }
}
public int Updates
{
get { return m_updates; }
}
public int Invalidates
{
get { return m_invalidates; }
}
public int Destroys
{
get { return m_destroys; }
}
public int RegionInvalidates
{
get { return m_regionInvalidate; }
}
public int RegionDestroys
{
get { return m_regionDestroy; }
}
public int RegionClear
{
get { return m_regionClear; }
}
public object CallbackArg
{
get { return m_callbackArg; }
}
#endregion
public void SetCallbackArg(object callbackArg)
{
m_callbackArg = callbackArg;
}
private void check(object eventCallback, ref int updateCount)
{
Log.Fine("check..");
if (eventCallback != null)
{
string callbackArg = eventCallback as string;
if (callbackArg != null)
{
string cs = m_callbackArg as string;
if (cs != null)
{
if (callbackArg == cs)
{
Log.Fine("value matched");
updateCount++;
}
else
Log.Fine("value matched NOT");
}
}
else
{
Log.Fine("Callbackarg is not cacheable string");
Portfolio pfCallback = eventCallback as Portfolio;
if (pfCallback != null)
{
Portfolio pf = m_callbackArg as Portfolio;
if (pf != null)
{
if (pf.Pkid == pfCallback.Pkid && pfCallback.ArrayNull == null
&& pfCallback.ArrayZeroSize != null && pfCallback.ArrayZeroSize.Length == 0)
{
Log.Fine("value matched");
updateCount++;
}
}
}
}
}
}
private void checkCallbackArg(EntryEvent<int, object> entryEvent, ref int updateCount)
{
check(entryEvent.CallbackArgument, ref updateCount);
}
private void checkCallbackArg(RegionEvent<int, object> regionEvent, ref int updateCount)
{
check(regionEvent.CallbackArgument, ref updateCount);
}
#region CacheListener Members
public override void AfterCreate(EntryEvent<int, object> ev)
{
checkCallbackArg(ev, ref m_creates);
}
public override void AfterUpdate(EntryEvent<int, object> ev)
{
checkCallbackArg(ev, ref m_updates);
}
public override void AfterInvalidate(EntryEvent<int, object> ev)
{
checkCallbackArg(ev, ref m_invalidates);
}
public override void AfterDestroy(EntryEvent<int, object> ev)
{
checkCallbackArg(ev, ref m_destroys);
}
public override void AfterRegionInvalidate(RegionEvent<int, object> rev)
{
checkCallbackArg(rev, ref m_regionInvalidate);
}
public override void AfterRegionDestroy(RegionEvent<int, object> rev)
{
checkCallbackArg(rev, ref m_regionDestroy);
}
public override void AfterRegionClear(RegionEvent<int, object> rev)
{
checkCallbackArg(rev, ref m_regionClear);
}
#endregion
}
[TestFixture]
[Category("generics")]
public class ThinClientCallbackArg : ThinClientRegionSteps
{
private TallyWriter<int, object> m_writer;
private TallyListener<int, object> m_listener;
private CallbackListener m_callbackListener;
RegionOperation o_region;
private UnitProcess m_client1, m_client2;
int key0 = 12;
object m_callbackarg = "Gemstone's Callback";
protected override ClientBase[] GetClients()
{
m_client1 = new UnitProcess();
m_client2 = new UnitProcess();
return new ClientBase[] { m_client1, m_client2 };
}
public void CreateRegion(string locators,
bool caching, bool listener, bool writer)
{
if (listener)
{
m_listener = new TallyListener<int, object>();
}
else
{
m_listener = null;
}
GIRegion region = null;
region = CacheHelper.CreateTCRegion_Pool<int, object>(RegionName, true, caching,
m_listener, locators, "__TESTPOOL1_", true);
if (listener)
m_listener.SetCallBackArg(key0);
if (writer)
{
m_writer = new TallyWriter<int, object>();
}
else
{
m_writer = null;
}
if (writer)
{
AttributesMutator<int, object> at = region.AttributesMutator;
at.SetCacheWriter(m_writer);
m_writer.SetCallBackArg(key0);
}
}
public void CreateRegion2(string locators,
bool caching, bool listener, bool writer)
{
CallbackListener callbackLis = null;
if (listener)
{
m_callbackListener = new CallbackListener();
m_callbackListener.SetCallbackArg(m_callbackarg);
callbackLis = m_callbackListener;
}
else
{
m_listener = null;
}
GIRegion region = null;
region = CacheHelper.CreateTCRegion_Pool<int, object>(RegionName, true, caching,
callbackLis, locators, "__TESTPOOL1_", true);
CacheHelper.DCache.TypeRegistry.RegisterType(Portfolio.CreateDeserializable, 8);
CacheHelper.DCache.TypeRegistry.RegisterType(Position.CreateDeserializable, 7);
}
public void ValidateLocalListenerWriterData()
{
Thread.Sleep(2000);
Assert.AreEqual(true, m_writer.IsWriterInvoked, "Writer should be invoked");
Assert.AreEqual(true, m_listener.IsListenerInvoked, "Listener should be invoked");
Assert.AreEqual(true, m_writer.IsCallBackArgCalled, "Writer CallbackArg should be invoked");
Assert.AreEqual(true, m_listener.IsCallBackArgCalled, "Listener CallbackArg should be invoked");
m_listener.ShowTallies();
m_writer.ShowTallies();
}
public void ValidateEvents()
{
Assert.AreEqual(15, m_writer.Creates, "Should be 10 creates");
Assert.AreEqual(15, m_listener.Creates, "Should be 10 creates");
Assert.AreEqual(15, m_writer.Updates, "Should be 5 updates");
Assert.AreEqual(15, m_listener.Updates, "Should be 5 updates");
Assert.AreEqual(0, m_writer.Invalidates, "Should be 0 invalidates");
Assert.AreEqual(5, m_listener.Invalidates, "Should be 5 invalidates");
Assert.AreEqual(10, m_writer.Destroys, "Should be 10 destroys"); // 5 destroys + 5 removes
Assert.AreEqual(10, m_listener.Destroys, "Should be 10 destroys"); // 5 destroys + 5 removes
}
public void CallOp()
{
o_region = new RegionOperation(RegionName);
o_region.PutOp(5, key0);
Thread.Sleep(1000); // let the events reach at other end.
o_region.PutOp(5, key0);
Thread.Sleep(1000);
o_region.InvalidateOp(5, key0);
Thread.Sleep(1000);
o_region.DestroyOp(5, key0);
Thread.Sleep(1000); // let the events reach at other end.
o_region.PutOp(5, key0);
Thread.Sleep(1000);
o_region.RemoveOp(5, key0);
Thread.Sleep(1000);
}
void RegisterPdxType8()
{
CacheHelper.DCache.TypeRegistry.RegisterPdxType(PdxTests.PdxTypes8.CreateDeserializable);
}
void runCallbackArgTest()
{
CacheHelper.SetupJavaServers(true, "cacheserver_notify_subscription.xml");
CacheHelper.StartJavaLocator(1, "GFELOC");
Util.Log("Locator started");
CacheHelper.StartJavaServerWithLocators(1, "GFECS1", 1);
Util.Log("Cacheserver 1 started.");
Util.Log("Creating region in client1, no-ack, cache-enabled, with listener and writer");
m_client1.Call(CreateRegion, CacheHelper.Locators,
true, true, true);
m_client1.Call(RegisterAllKeys, new string[] { RegionName });
Util.Log("Creating region in client2 , no-ack, cache-enabled, with listener and writer");
m_client2.Call(CreateRegion, CacheHelper.Locators,
true, true, true);
m_client2.Call(RegisterAllKeys, new string[] { RegionName });
m_client2.Call(RegisterPdxType8);
m_client1.Call(CallOp);
m_client1.Call(ValidateLocalListenerWriterData);
m_client1.Call(ValidateEvents);
m_client1.Call(CacheHelper.Close);
m_client2.Call(CacheHelper.Close);
CacheHelper.StopJavaServer(1);
Util.Log("Cacheserver 1 stopped.");
CacheHelper.StopJavaLocator(1);
Util.Log("Locator stopped");
CacheHelper.ClearLocators();
CacheHelper.ClearEndpoints();
}
private bool m_isSet = false;
public void SetCallbackArg()
{
if (!m_isSet)
{
m_isSet = true;
m_callbackarg = new Portfolio(1, 1);
}
}
public void TestCreatesAndUpdates()
{
o_region = new RegionOperation(RegionName);
o_region.Region.Add("Key-1", "Val-1", m_callbackarg);
o_region.Region.Put("Key-1", "NewVal-1", m_callbackarg);
Thread.Sleep(10000);
}
public void TestInvalidates()
{
o_region = new RegionOperation(RegionName);
o_region.Region.GetLocalView().Add(1234, 1234, m_callbackarg);
o_region.Region.GetLocalView().Add(12345, 12345, m_callbackarg);
o_region.Region.GetLocalView().Add(12346, 12346, m_callbackarg);
o_region.Region.GetLocalView().Put(1234, "Val-1", m_callbackarg);
o_region.Region.GetLocalView().Invalidate(1234, m_callbackarg);
Assert.AreEqual(o_region.Region.GetLocalView().Remove(12345, 12345, m_callbackarg), true, "Result of remove should be true, as this value exists locally.");
Assert.AreEqual(o_region.Region.GetLocalView().ContainsKey(12345), false, "containsKey should be false");
Assert.AreEqual(o_region.Region.GetLocalView().Remove(12346, m_callbackarg), true, "Result of remove should be true, as this value exists locally.");
Assert.AreEqual(o_region.Region.GetLocalView().ContainsKey(12346), false, "containsKey should be false");
o_region.Region.Invalidate("Key-1", m_callbackarg);
o_region.Region.InvalidateRegion(m_callbackarg);
}
public void TestDestroy()
{
o_region = new RegionOperation(RegionName);
o_region.Region.Remove("Key-1", m_callbackarg);
//o_region.Region.DestroyRegion(m_callbackarg);
}
public void TestRemove()
{
o_region = new RegionOperation(RegionName);
o_region.Region.Remove("Key-1", "NewVal-1", m_callbackarg);
o_region.Region.DestroyRegion(m_callbackarg);
}
public void TestlocalClear()
{
o_region = new RegionOperation(RegionName);
o_region.Region.GetLocalView().Clear(m_callbackarg);
}
public void TestValidate()
{
Thread.Sleep(10000);
Assert.AreEqual(5, m_callbackListener.Creates, "Should be 5 creates");
Assert.AreEqual(3, m_callbackListener.Updates, "Should be 3 update");
Assert.AreEqual(2, m_callbackListener.Invalidates, "Should be 2 invalidate");
Assert.AreEqual(4, m_callbackListener.Destroys, "Should be 4 destroy");
Assert.AreEqual(1, m_callbackListener.RegionInvalidates, "Should be 1 region invalidates");
Assert.AreEqual(1, m_callbackListener.RegionDestroys, "Should be 1 regiondestroy");
Assert.AreEqual(1, m_callbackListener.RegionClear, "Should be 1 RegionClear");
}
void runCallbackArgTest2(int callbackArgChange)
{
if (callbackArgChange == 1)
{
//change now custom type
m_callbackarg = new Portfolio(1, 1);
m_client1.Call(SetCallbackArg);
m_client2.Call(SetCallbackArg);
}
m_callbackListener = new CallbackListener();
m_callbackListener.SetCallbackArg(m_callbackarg);
CacheHelper.SetupJavaServers(true, "cacheserver_notify_subscription5N.xml");
CacheHelper.StartJavaLocator(1, "GFELOC");
Util.Log("Locator started");
CacheHelper.StartJavaServerWithLocators(1, "GFECS1", 1);
Util.Log("Cacheserver 1 started.");
Util.Log("Creating region in client1, no-ack, cache-enabled, with listener and writer");
m_client1.Call(CreateRegion2, CacheHelper.Locators,
true, true, false);
m_client1.Call(RegisterAllKeys, new string[] { RegionName });
Util.Log("Creating region in client2 , no-ack, cache-enabled, with listener and writer");
m_client2.Call(CreateRegion2, CacheHelper.Locators,
true, false, false);
m_client2.Call(TestCreatesAndUpdates);
m_client1.Call(TestInvalidates);
m_client2.Call(TestDestroy);
m_client2.Call(TestCreatesAndUpdates);
m_client1.Call(TestlocalClear);
m_client2.Call(TestRemove);
m_client1.Call(TestValidate);
m_client1.Call(CacheHelper.Close);
m_client2.Call(CacheHelper.Close);
CacheHelper.StopJavaServer(1);
Util.Log("Cacheserver 1 stopped.");
CacheHelper.StopJavaLocator(1);
Util.Log("Locator stopped");
CacheHelper.ClearLocators();
CacheHelper.ClearEndpoints();
}
private bool isRegistered = false;
public void registerDefaultCacheableType()
{
if (!isRegistered)
{
CacheHelper.DCache.TypeRegistry.RegisterType(DefaultType.CreateDeserializable, 4);
isRegistered = true;
}
}
public void CallOp2()
{
o_region = new RegionOperation(RegionName);
DefaultType dc = new DefaultType(true);
o_region.Region.Put("key-1", dc, null);
Thread.Sleep(1000); // let the events reach at other end.
}
public void ValidateData()
{
o_region = new RegionOperation(RegionName);
DefaultType dc = (DefaultType)o_region.Region.Get("key-1", null);
Assert.AreEqual(dc.CBool, true, "bool is not equal");
Assert.AreEqual(dc.CInt, 1000, "int is not equal");
int[] cia = dc.CIntArray;
Assert.IsNotNull(cia, "Int array is null");
Assert.AreEqual(3, cia.Length, "Int array are not three");
string[] csa = dc.CStringArray;
Assert.IsNotNull(csa, "String array is null");
Assert.AreEqual(2, csa.Length, "String array length is not two");
Assert.AreEqual(dc.CFileName, "geode.txt", "Cacheable filename is not equal");
/*
Assert.IsNotNull(dc.CHashSet, "hashset is null");
Assert.AreEqual(2, dc.CHashSet.Count, "hashset size is not two");
* */
Assert.IsNotNull(dc.CHashMap, "hashmap is null");
Assert.AreEqual(1, dc.CHashMap.Count, "hashmap size is not one");
//Assert.IsNotNull(dc.CDate, "Date is null");
Assert.IsNotNull(dc.CVector);
Assert.AreEqual(2, dc.CVector.Count, "Vector size is not two");
//Assert.IsNotNull(dc.CObject);
//Assert.AreEqual("key", ((CustomSerializableObject)dc.CObject).key, "Object key is not same");
//Assert.AreEqual("value", ((CustomSerializableObject)dc.CObject).value, "Object value is not same");
}
void runCallbackArgTest3()
{
CacheHelper.SetupJavaServers(true, "cacheserver_notify_subscription6.xml");
CacheHelper.StartJavaLocator(1, "GFELOC");
Util.Log("Locator started");
CacheHelper.StartJavaServerWithLocators(1, "GFECS1", 1);
Util.Log("Cacheserver 1 started.");
Util.Log("Creating region in client1, no-ack, cache-enabled, with listener and writer");
m_client1.Call(CreateRegion, CacheHelper.Locators,
true, false, false);
// m_client1.Call(RegisterAllKeys, new string[] { RegionName });
Util.Log("Creating region in client2 , no-ack, cache-enabled, with listener and writer");
m_client2.Call(CreateRegion, CacheHelper.Locators,
true, false, false);
m_client1.Call(registerDefaultCacheableType);
m_client2.Call(registerDefaultCacheableType);
m_client2.Call(RegisterAllKeys, new string[] { RegionName });
m_client1.Call(CallOp2);
m_client2.Call(ValidateData);
m_client1.Call(CacheHelper.Close);
m_client2.Call(CacheHelper.Close);
CacheHelper.StopJavaServer(1);
Util.Log("Cacheserver 1 stopped.");
CacheHelper.StopJavaLocator(1);
Util.Log("Locator stopped");
CacheHelper.ClearLocators();
CacheHelper.ClearEndpoints();
}
public void TestRemoveAll()
{
o_region = new RegionOperation(RegionName);
ICollection<object> keys = new LinkedList<object>();
for(int i =0; i< 10; i++)
{
o_region.Region["Key-"+i] = "Value-"+i;
keys.Add("Key-" + i);
}
o_region.Region.RemoveAll(keys, m_callbackarg);
}
public void TestPutAll()
{
o_region = new RegionOperation(RegionName);
Dictionary<Object, Object> entryMap = new Dictionary<Object, Object>();
for (Int32 item = 0; item < 10; item++)
{
int K = item;
string value = item.ToString();
entryMap.Add(K, value);
}
o_region.Region.PutAll(entryMap, TimeSpan.FromSeconds(15), m_callbackarg);
}
public void TestGetAll()
{
o_region = new RegionOperation(RegionName);
List<Object> keys = new List<Object>();
for (int item = 0; item < 10; item++)
{
Object K = item;
keys.Add(K);
}
Dictionary<Object, Object> values = new Dictionary<Object, Object>();
o_region.Region.GetAll(keys.ToArray(), values, null, true, m_callbackarg);
Dictionary<Object, Object>.Enumerator enumerator = values.GetEnumerator();
while (enumerator.MoveNext())
{
Util.Log("Values after getAll with CallBack Key = {0} Value = {1} ", enumerator.Current.Key.ToString(), enumerator.Current.Value.ToString());
}
}
public void TestValidateRemoveAllCallback()
{
Thread.Sleep(10000);
Assert.AreEqual(10, m_callbackListener.Destroys, "Should be 10 destroy");
}
public void TestValidatePutAllCallback()
{
Thread.Sleep(10000);
Assert.AreEqual(10, m_callbackListener.Creates, "Should be 10 creates");
Assert.AreEqual("Gemstone's Callback", m_callbackListener.CallbackArg, "CallBackArg for putAll should be same");
}
void runPutAllCallbackArgTest()
{
m_callbackListener = new CallbackListener();
m_callbackListener.SetCallbackArg(m_callbackarg);
CacheHelper.SetupJavaServers(true, "cacheserver_notify_subscription5N.xml");
CacheHelper.StartJavaLocator(1, "GFELOC");
Util.Log("Locator started");
CacheHelper.StartJavaServerWithLocators(1, "GFECS1", 1);
Util.Log("Cacheserver 1 started.");
Util.Log("Creating region in client1, no-ack, cache-enabled, with listener and writer");
m_client1.Call(CreateRegion2, CacheHelper.Locators,
true, true, false);
m_client1.Call(RegisterAllKeys, new string[] { RegionName });
Util.Log("RegisterAllKeys completed..");
Util.Log("Creating region in client2 , no-ack, cache-enabled, with listener and writer");
m_client2.Call(CreateRegion2, CacheHelper.Locators,
true, false, false);
Util.Log("CreateRegion2 completed..");
m_client2.Call(TestPutAll);
Util.Log("TestPutAll completed..");
m_client1.Call(TestValidatePutAllCallback);
Util.Log("TestValidatePutAllCallback completed..");
m_client2.Call(TestGetAll);
Util.Log("TestGetAll completed..");
m_client1.Call(CacheHelper.Close);
m_client2.Call(CacheHelper.Close);
CacheHelper.StopJavaServer(1);
Util.Log("Cacheserver 1 stopped.");
CacheHelper.StopJavaLocator(1);
Util.Log("Locator stopped");
CacheHelper.ClearLocators();
CacheHelper.ClearEndpoints();
}
void runRemoveAllCallbackArgTest()
{
m_callbackListener = new CallbackListener();
m_callbackListener.SetCallbackArg(m_callbackarg);
CacheHelper.SetupJavaServers(true, "cacheserver_notify_subscription5N.xml");
CacheHelper.StartJavaLocator(1, "GFELOC");
Util.Log("Locator started");
CacheHelper.StartJavaServerWithLocators(1, "GFECS1", 1);
Util.Log("Cacheserver 1 started.");
Util.Log("Creating region in client1, no-ack, cache-enabled, with listener and writer");
m_client1.Call(CreateRegion2, CacheHelper.Locators,
true, true, false);
m_client1.Call(RegisterAllKeys, new string[] { RegionName });
Util.Log("RegisterAllKeys completed..");
Util.Log("Creating region in client2 , no-ack, cache-enabled, with listener and writer");
m_client2.Call(CreateRegion2,CacheHelper.Locators,
true, false, false);
Util.Log("CreateRegion2 completed..");
m_client2.Call(TestRemoveAll);
Util.Log("TestRemoveAll completed..");
m_client1.Call(TestValidateRemoveAllCallback);
Util.Log("TestValidateRemoveAllCallback completed..");
m_client1.Call(CacheHelper.Close);
m_client2.Call(CacheHelper.Close);
CacheHelper.StopJavaServer(1);
Util.Log("Cacheserver 1 stopped.");
CacheHelper.StopJavaLocator(1);
Util.Log("Locator stopped");
CacheHelper.ClearLocators();
CacheHelper.ClearEndpoints();
}
[TearDown]
public override void EndTest()
{
base.EndTest();
}
[Test]
public void ThinClientCallbackArgTest()
{
runCallbackArgTest();
}
[Test]
public void ThinClientCallbackArgTest2()
{
for (int i = 0; i < 2; i++)
{
runCallbackArgTest2(i);
}
}
[Test]
public void ThinClientCallbackArgTest3()
{
runCallbackArgTest3();
}
[Test]
public void RemoveAllCallbackArgTest()
{
runRemoveAllCallbackArgTest();
}
[Test]
public void PutAllCallbackArgTest()
{
runPutAllCallbackArgTest();
}
}
}