clicache/integration-test/ThinClientDeltaTestFailing.cs (523 lines of code) (raw):

/* * 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.IO; using System.Threading; #pragma warning disable 618 namespace Apache.Geode.Client.UnitTests { using NUnit.Framework; using Apache.Geode.DUnitFramework; using Apache.Geode.Client.Tests; using Apache.Geode.Client; using DeltaEx = Apache.Geode.Client.Tests.DeltaEx; namespace failing { public class CqDeltaListener<TKey, TResult> : ICqListener<TKey, TResult> { public CqDeltaListener() { m_deltaCount = 0; m_valueCount = 0; } public void OnEvent(CqEvent<TKey, TResult> aCqEvent) { byte[] deltaValue = aCqEvent.getDeltaValue(); DeltaTestImpl newValue = new DeltaTestImpl(); DataInput input = CacheHelper.DCache.CreateDataInput(deltaValue); newValue.FromDelta(input); if (newValue.GetIntVar() == 5) { m_deltaCount++; } DeltaTestImpl fullObject = (DeltaTestImpl)(object)aCqEvent.getNewValue(); if (fullObject.GetIntVar() == 5) { m_valueCount++; } } public void OnError(CqEvent<TKey, TResult> aCqEvent) { } public void Close() { } public int GetDeltaCount() { return m_deltaCount; } public int GetValueCount() { return m_valueCount; } private int m_deltaCount; private int m_valueCount; } public class DeltaTestAD : IDelta, IDataSerializable { private int _deltaUpdate; private string _staticData; public static DeltaTestAD Create() { return new DeltaTestAD(); } public DeltaTestAD() { _deltaUpdate = 1; _staticData = "Data which don't get updated"; } #region IDelta Members public void FromDelta(DataInput input) { _deltaUpdate = input.ReadInt32(); } public bool HasDelta() { _deltaUpdate++; bool isDelta = (_deltaUpdate % 2) == 1; Util.Log("In DeltaTestAD.HasDelta _deltaUpdate:" + _deltaUpdate + " : isDelta:" + isDelta); return isDelta; } public void ToDelta(DataOutput output) { output.WriteInt32(_deltaUpdate); } #endregion #region IDataSerializable Members public void FromData(DataInput input) { _deltaUpdate = input.ReadInt32(); _staticData = input.ReadUTF(); } public UInt64 ObjectSize { get { return (uint)(4 + _staticData.Length); } } public void ToData(DataOutput output) { output.WriteInt32(_deltaUpdate); output.WriteUTF(_staticData); } public int DeltaUpdate { get { return _deltaUpdate; } set { _deltaUpdate = value; } } #endregion } [Ignore("broken")] [TestFixture] [Category("group1")] [Category("unicast_only")] [Category("generics")] public class ThinClientDeltaTest : ThinClientRegionSteps { #region Private members private UnitProcess m_client1, m_client2; private CqDeltaListener<object, DeltaTestImpl> myCqListener; #endregion protected override ClientBase[] GetClients() { m_client1 = new UnitProcess(); m_client2 = new UnitProcess(); return new ClientBase[] { m_client1, m_client2 }; } [TestFixtureTearDown] public override void EndTests() { CacheHelper.StopJavaServers(); base.EndTests(); } [TearDown] public override void EndTest() { try { CacheHelper.ClearEndpoints(); CacheHelper.ClearLocators(); } finally { CacheHelper.StopJavaServers(); CacheHelper.StopJavaLocators(); } base.EndTest(); } public void createLRURegionAndAttachPool(string regionName, string poolName) { CacheHelper.CreateLRUTCRegion_Pool<object, object>(regionName, true, true, null, null, poolName, false, 3); } public void createRegionAndAttachPool(string regionName, string poolName, bool cloningEnabled) { CacheHelper.CreateTCRegion_Pool<object, object>(regionName, true, true, null, null, poolName, false, false, cloningEnabled); } public void createPool(string name, string locators, string serverGroup, int redundancy, bool subscription) { CacheHelper.CreatePool<object, object>(name, locators, serverGroup, redundancy, subscription); } void DoNotificationWithDelta() { try { CacheHelper.DCache.TypeRegistry.RegisterType(DeltaEx.create, 1); } catch (IllegalStateException) { //do nothig. } string cKey = m_keys[0]; DeltaEx val = new DeltaEx(); IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck"); reg[cKey] = val; val.SetDelta(true); reg[cKey] = val; string cKey1 = m_keys[1]; DeltaEx val1 = new DeltaEx(); reg[cKey1] = val1; val1.SetDelta(true); reg[cKey1] = val1; DeltaEx.ToDeltaCount = 0; DeltaEx.ToDataCount = 0; } void DoNotificationWithDefaultCloning() { string cKey = m_keys[0]; DeltaTestImpl val = new DeltaTestImpl(); IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck"); reg[cKey] = val; val.SetIntVar(2); val.SetDelta(true); reg[cKey] = val; javaobject.PdxDelta pd = new javaobject.PdxDelta(1001); for (int i = 0; i < 10; i++) { reg["pdxdelta"] = pd; } } void DoNotificationWithDeltaLRU() { try { CacheHelper.DCache.TypeRegistry.RegisterType(DeltaEx.create, 1); } catch (IllegalStateException) { //do nothig. } string cKey1 = "key1"; string cKey2 = "key2"; string cKey3 = "key3"; string cKey4 = "key4"; string cKey5 = "key5"; string cKey6 = "key6"; DeltaEx val1 = new DeltaEx(); DeltaEx val2 = new DeltaEx(); IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck"); reg[cKey1] = val1; reg[cKey2] = val1; reg[cKey3] = val1; reg[cKey4] = val1; reg[cKey5] = val1; reg[cKey6] = val1; val2.SetDelta(true); reg[cKey1] = val2; DeltaEx.ToDeltaCount = 0; DeltaEx.ToDataCount = 0; } void DoExpirationWithDelta() { try { CacheHelper.DCache.TypeRegistry.RegisterType(DeltaEx.create, 1); } catch (IllegalStateException) { //do nothig. } DeltaEx val1 = new DeltaEx(); IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck"); reg[1] = val1; // Sleep 10 seconds to allow expiration of entry in client 2 Thread.Sleep(10000); val1.SetDelta(true); reg[1] = val1; DeltaEx.ToDeltaCount = 0; DeltaEx.ToDataCount = 0; } void DoCqWithDelta() { string cKey1 = "key1"; IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck"); DeltaTestImpl value = new DeltaTestImpl(); reg[cKey1] = value; value.SetIntVar(5); value.SetDelta(true); reg[cKey1] = value; } void initializeDeltaClientAD() { try { CacheHelper.DCache.TypeRegistry.RegisterType(DeltaTestAD.Create, 151); } catch (IllegalStateException) { //do nothng } } void DoDeltaAD_C1_1() { DeltaTestAD val = new DeltaTestAD(); IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck"); reg.GetSubscriptionService().RegisterAllKeys(); Util.Log("clientAD1 put"); reg[1] = val; Util.Log("clientAD1 put done"); } void DoDeltaAD_C2_1() { IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck"); Util.Log("clientAD2 get"); DeltaTestAD val = (DeltaTestAD)reg[1]; Assert.AreEqual(2, val.DeltaUpdate); Util.Log("clientAD2 get done"); reg[1] = val; Util.Log("clientAD2 put done"); javaobject.PdxDelta pd = new javaobject.PdxDelta(1001); for (int i = 0; i < 10; i++) { reg["pdxdelta"] = pd; } } void DoDeltaAD_C1_afterC2Put() { Thread.Sleep(15000); DeltaTestAD val = null; IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck"); Util.Log("client fetching entry from local cache"); val = (DeltaTestAD)reg.GetEntry(1).Value; Assert.IsNotNull(val); Assert.AreEqual(3, val.DeltaUpdate); Util.Log("done"); System.Threading.Thread.Sleep(5000); //Assert.Greater(javaobject.PdxDelta.GotDelta, 7, "this should have received delta"); javaobject.PdxDelta pd = (javaobject.PdxDelta)(reg.GetLocalView()["pdxdelta"]); Assert.Greater(pd.Delta, 7, "this should have received delta"); } void runDeltaWithAppdomian(bool cloningenable) { CacheHelper.SetupJavaServers(true, "cacheserver_with_deltaAD.xml"); CacheHelper.StartJavaLocator(1, "GFELOC1"); CacheHelper.StartJavaServerWithLocators(1, "GFECS5", 1); string regionName = "DistRegionAck"; // if (usePools) { //CacheHelper.CreateTCRegion_Pool_AD("DistRegionAck", false, false, null, null, CacheHelper.Locators, "__TEST_POOL1__", false, false, false); m_client1.Call(CacheHelper.CreateTCRegion_Pool_AD1, regionName, false, true, CacheHelper.Locators, (string)"__TEST_POOL1__", true, cloningenable); m_client2.Call(CacheHelper.CreateTCRegion_Pool_AD1, regionName, false, true, CacheHelper.Locators, (string)"__TEST_POOL1__", false, cloningenable); // m_client1.Call(createPool, "__TEST_POOL1__", CacheHelper.Locators, (string)null, 0, false); // m_client1.Call(createRegionAndAttachPool, "DistRegionAck", "__TEST_POOL1__"); } m_client1.Call(initializeDeltaClientAD); m_client2.Call(initializeDeltaClientAD); m_client1.Call(DoDeltaAD_C1_1); m_client2.Call(DoDeltaAD_C2_1); m_client1.Call(DoDeltaAD_C1_afterC2Put); m_client1.Call(Close); m_client2.Call(Close); CacheHelper.StopJavaServer(1); CacheHelper.StopJavaLocator(1); CacheHelper.ClearEndpoints(); CacheHelper.ClearLocators(); } void registerClassCl2() { try { CacheHelper.DCache.TypeRegistry.RegisterType(DeltaEx.create, 1); } catch (IllegalStateException) { //do nothing } IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck"); reg.GetSubscriptionService().RegisterRegex(".*"); AttributesMutator<object, object> attrMutator = reg.AttributesMutator; attrMutator.SetCacheListener(new SimpleCacheListener<object, object>()); } void registerClassDeltaTestImpl() { try { CacheHelper.DCache.TypeRegistry.RegisterType(DeltaTestImpl.CreateDeserializable, 0x1E); } catch (IllegalStateException) { // ARB: ignore exception caused by type reregistration. } DeltaTestImpl.ResetDataCount(); Thread.Sleep(2000); IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck"); try { reg.GetSubscriptionService().RegisterRegex(".*"); } catch (Exception) { // ARB: ignore regex exception for missing notification channel. } } void registerCq() { Pool thePool = CacheHelper.DCache.GetPoolManager().Find("__TEST_POOL1__"); QueryService cqService = null; cqService = thePool.GetQueryService(); CqAttributesFactory<object, DeltaTestImpl> attrFac = new CqAttributesFactory<object, DeltaTestImpl>(); myCqListener = new CqDeltaListener<object, DeltaTestImpl>(); attrFac.AddCqListener(myCqListener); CqAttributes<object, DeltaTestImpl> cqAttr = attrFac.Create(); CqQuery<object, DeltaTestImpl> theQuery = cqService.NewCq("select * from /DistRegionAck d where d.intVar > 4", cqAttr, false); theQuery.Execute(); } void VerifyDeltaCount() { Thread.Sleep(1000); Util.Log("Total Data count" + DeltaEx.FromDataCount); Util.Log("Total Data count" + DeltaEx.FromDeltaCount); if (DeltaEx.FromDataCount != 3) Assert.Fail("Count of fromData called should be 3 "); if (DeltaEx.FromDeltaCount != 2) Assert.Fail("Count of fromDelta called should be 2 "); if (SimpleCacheListener<object, object>.isSuccess == false) Assert.Fail("Listener failure"); SimpleCacheListener<object, object>.isSuccess = false; if (DeltaEx.CloneCount != 2) Assert.Fail("Clone count should be 2, is " + DeltaEx.CloneCount); DeltaEx.FromDataCount = 0; DeltaEx.FromDeltaCount = 0; DeltaEx.CloneCount = 0; } void VerifyCloning() { Thread.Sleep(1000); string cKey = m_keys[0]; IRegion<object, object> reg = CacheHelper.GetRegion<object, object>("DistRegionAck"); DeltaTestImpl val = reg[cKey] as DeltaTestImpl; if (val.GetIntVar() != 2) Assert.Fail("Int value after cloning should be 2, is " + val.GetIntVar()); if (DeltaTestImpl.GetFromDataCount() != 2) Assert.Fail("After cloning, fromDataCount should have been 2, is " + DeltaTestImpl.GetFromDataCount()); if (DeltaTestImpl.GetToDataCount() != 1) Assert.Fail("After cloning, toDataCount should have been 1, is " + DeltaTestImpl.GetToDataCount()); System.Threading.Thread.Sleep(5000); //Assert.Greater(javaobject.PdxDelta.GotDelta, 7, "this should have received delta"); javaobject.PdxDelta pd = (javaobject.PdxDelta)(reg.GetLocalView()["pdxdelta"]); Assert.Greater(pd.Delta, 7, "this should have received delta"); } void VerifyDeltaCountLRU() { Thread.Sleep(1000); if (DeltaEx.FromDataCount != 8) { Util.Log("DeltaEx.FromDataCount = " + DeltaEx.FromDataCount); Util.Log("DeltaEx.FromDeltaCount = " + DeltaEx.FromDeltaCount); Assert.Fail("Count should have been 8. 6 for common put and two when pulled from database and deserialized"); } if (DeltaEx.FromDeltaCount != 1) { Util.Log("DeltaEx.FromDeltaCount = " + DeltaEx.FromDeltaCount); Assert.Fail("Count should have been 1"); } DeltaEx.FromDataCount = 0; DeltaEx.FromDeltaCount = 0; } void VerifyCqDeltaCount() { // Wait for Cq event processing in listener Thread.Sleep(1000); if (myCqListener.GetDeltaCount() != 1) { Assert.Fail("Delta from CQ event does not have expected value"); } if (myCqListener.GetValueCount() != 1) { Assert.Fail("Value from CQ event is incorrect"); } } void VerifyExpirationDeltaCount() { Thread.Sleep(1000); if (DeltaEx.FromDataCount != 2) Assert.Fail("Count should have been 2."); if (DeltaEx.FromDeltaCount != 0) Assert.Fail("Count should have been 0."); DeltaEx.FromDataCount = 0; DeltaEx.FromDeltaCount = 0; } void runNotificationWithDelta() { CacheHelper.SetupJavaServers(true, "cacheserver_with_delta.xml"); CacheHelper.StartJavaLocator(1, "GFELOC1"); CacheHelper.StartJavaServerWithLocators(1, "GFECS5", 1); m_client1.Call(createPool, "__TEST_POOL1__", CacheHelper.Locators, (string)null, 0, true); m_client1.Call(createRegionAndAttachPool, "DistRegionAck", "__TEST_POOL1__", true); m_client2.Call(createPool, "__TEST_POOL1__", CacheHelper.Locators, (string)null, 0, true); m_client2.Call(createRegionAndAttachPool, "DistRegionAck", "__TEST_POOL1__", true); m_client2.Call(registerClassCl2); m_client1.Call(DoNotificationWithDelta); m_client2.Call(VerifyDeltaCount); m_client1.Call(Close); m_client2.Call(Close); CacheHelper.StopJavaServer(1); CacheHelper.StopJavaLocator(1); CacheHelper.ClearEndpoints(); CacheHelper.ClearLocators(); } void runNotificationWithDefaultCloning() { CacheHelper.SetupJavaServers(true, "cacheserver_with_delta_test_impl.xml"); CacheHelper.StartJavaLocator(1, "GFELOC1"); CacheHelper.StartJavaServerWithLocators(1, "GFECS5", 1); m_client1.Call(createPool, "__TEST_POOL1__", CacheHelper.Locators, (string)null, 0, true); m_client1.Call(createRegionAndAttachPool, "DistRegionAck", "__TEST_POOL1__", true); m_client2.Call(createPool, "__TEST_POOL1__", CacheHelper.Locators, (string)null, 0, true); m_client2.Call(createRegionAndAttachPool, "DistRegionAck", "__TEST_POOL1__", true); m_client1.Call(registerClassDeltaTestImpl); m_client2.Call(registerClassDeltaTestImpl); m_client1.Call(DoNotificationWithDefaultCloning); m_client2.Call(VerifyCloning); m_client1.Call(Close); m_client2.Call(Close); CacheHelper.StopJavaServer(1); CacheHelper.StopJavaLocator(1); CacheHelper.ClearEndpoints(); CacheHelper.ClearLocators(); } void runNotificationWithDeltaWithOverFlow() { CacheHelper.SetupJavaServers(true, "cacheserver_with_delta.xml"); CacheHelper.StartJavaLocator(1, "GFELOC1"); CacheHelper.StartJavaServerWithLocators(1, "GFECS1", 1); m_client1.Call(createPool, "__TEST_POOL1__", CacheHelper.Locators, (string)null, 0, true); m_client1.Call(createLRURegionAndAttachPool, "DistRegionAck", "__TEST_POOL1__"); m_client2.Call(createPool, "__TEST_POOL1__", CacheHelper.Locators, (string)null, 0, true); m_client2.Call(createLRURegionAndAttachPool, "DistRegionAck", "__TEST_POOL1__"); m_client2.Call(registerClassCl2); m_client1.Call(DoNotificationWithDeltaLRU); m_client2.Call(VerifyDeltaCountLRU); m_client1.Call(Close); m_client2.Call(Close); CacheHelper.StopJavaServer(1); CacheHelper.StopJavaLocator(1); CacheHelper.ClearEndpoints(); CacheHelper.ClearLocators(); } //#region Tests [Test] public void PutWithDeltaADWithCloning() { runDeltaWithAppdomian(true); } [Test] public void NotificationWithDelta() { runNotificationWithDelta(); } [Test] public void NotificationWithDefaultCloning() { runNotificationWithDefaultCloning(); } [Test] public void NotificationWithDeltaWithOverFlow() { runNotificationWithDeltaWithOverFlow(); } //#endregion } } }