clicache/integration-test/TallyListenerN.cs (253 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.Threading; namespace Apache.Geode.Client.UnitTests { using Apache.Geode.DUnitFramework; using Apache.Geode.Client; //using Region = Apache.Geode.Client.IRegion<Object, Object>; class TallyListener<TKey, TVal> : CacheListenerAdapter<TKey, TVal> { #region Private members private int m_creates = 0; private int m_updates = 0; private int m_invalidates = 0; private int m_destroys = 0; private int m_clears = 0; private TKey m_lastKey = default(TKey); private TVal m_lastValue = default(TVal); private object m_callbackArg = null; private bool m_ignoreTimeout = false; private bool m_quiet = false; private bool isListenerInvoke = false; private bool isCallbackCalled = false; #endregion #region Public accessors public int Creates { get { return m_creates; } } public int Clears { get { return m_clears; } } public int Updates { get { return m_updates; } } public int Invalidates { get { return m_invalidates; } } public int Destroys { get { return m_destroys; } } public TKey LastKey { get { return m_lastKey; } } public bool IsListenerInvoked { get { return isListenerInvoke; } } public bool IsCallBackArgCalled { get { return isCallbackCalled; } } public TVal LastValue { get { return m_lastValue; } } public bool IgnoreTimeout { set { m_ignoreTimeout = value; } } public bool Quiet { set { m_quiet = value; } } public void SetCallBackArg(object callbackArg) { m_callbackArg = callbackArg; } #endregion public void CheckcallbackArg<TKey1, TVal1>(EntryEvent<TKey1, TVal1> ev) { Util.Log("TallyListenerN: Checking callback arg for EntryEvent " + "key:{0} oldval: {1} newval:{2} cbArg:{3} for region:{4} and remoteOrigin:{5}", ev.Key, ev.NewValue, ev.OldValue, ev.CallbackArgument, ev.Region.Name, ev.RemoteOrigin); if (!isListenerInvoke) isListenerInvoke = true; /* if (m_callbackArg != null) { ISerializable callbkArg1 = ev.CallbackArgument as ISerializable; ISerializable callbkArg2 = m_callbackArg as ISerializable; if (callbkArg2 != null && callbkArg2.Equals(callbkArg1)) { isCallbackCalled = true; } string callbkArg3 = ev.CallbackArgument as string; string callbkArg4 = m_callbackArg as string; if (callbkArg3 != null && callbkArg3.Equals(callbkArg4)) { isCallbackCalled = true; } } */ if (m_callbackArg != null && m_callbackArg.Equals(ev.CallbackArgument)) { isCallbackCalled = true; } } public void ResetListenerInvokation() { isListenerInvoke = false; isCallbackCalled = false; } public int ExpectCreates(int expected) { int tries = 0; while ((m_creates < expected) && (tries < 200)) { Thread.Sleep(100); tries++; } return m_creates; } public int ExpectUpdates(int expected) { int tries = 0; while ((m_updates < expected) && (tries < 200)) { Thread.Sleep(100); tries++; } return m_updates; } public int ExpectedInvalidates(int expected) { int tries = 0; while ((m_invalidates < expected) && (tries < 200)) { Thread.Sleep(100); tries++; } return m_invalidates; } public int ExpectedDestroys(int expected) { int tries = 0; while ((m_destroys < expected) && (tries < 200)) { Thread.Sleep(100); tries++; } return m_destroys; } public void ShowTallies() { Util.Log("TallyListener state: (updates = {0}, creates = {1}, invalidates = {2}, destroys = {3})", Updates,Creates, Invalidates, Destroys); } #region Logging functions that check for m_quiet private void WriteLog(string message) { if (!m_quiet) { Util.Log(message); } } private void WriteLog(string format, params object[] args) { if (!m_quiet) { Util.Log(format, args); } } public static TallyListener<TKey, TVal> Create() { return new TallyListener<TKey, TVal>(); } #endregion #region ICacheListener Members public override void AfterCreate(EntryEvent<TKey, TVal> ev) { m_creates++; m_lastKey = (TKey)ev.Key; m_lastValue = ev.NewValue; CheckcallbackArg(ev); string keyString = m_lastKey.ToString(); if (m_lastValue != null) WriteLog("TallyListener create - key = \"{0}\", value = \"{1}\"", keyString, m_lastValue.ToString()); else WriteLog("TallyListener create - key = \"{0}\", value = \"null\"", keyString); if ((!m_ignoreTimeout) && (keyString.IndexOf("timeout") >= 0)) { WriteLog("TallyListener: Sleeping 10 seconds to force a timeout."); Thread.Sleep(10000); // this should give the client cause to timeout... WriteLog("TallyListener: done sleeping.."); } } public override void AfterUpdate(EntryEvent<TKey, TVal> ev) { m_updates++; m_lastKey = (TKey)ev.Key; m_lastValue = ev.NewValue; CheckcallbackArg(ev); string keyString = m_lastKey.ToString(); if (m_lastValue != null) WriteLog("TallyListener update - key = \"{0}\", value = \"{1}\"", keyString, m_lastValue.ToString()); else WriteLog("TallyListener update - key = \"{0}\", value = \"null\"", keyString); if ((!m_ignoreTimeout) && (keyString.IndexOf("timeout") >= 0)) { WriteLog("TallyListener: Sleeping 10 seconds to force a timeout."); Thread.Sleep(10000); // this should give the client cause to timeout... WriteLog("TallyListener: done sleeping.."); } } public override void AfterDestroy(EntryEvent<TKey, TVal> ev) { WriteLog("TallyListener destroy - key = \"{0}\"", ((TKey)ev.Key).ToString()); m_destroys++; CheckcallbackArg(ev); } public override void AfterInvalidate(EntryEvent<TKey, TVal> ev) { WriteLog("TallyListener invalidate - key = \"{0}\"", ((TKey)ev.Key).ToString()); m_invalidates++; CheckcallbackArg(ev); } public override void AfterRegionDestroy(RegionEvent<TKey, TVal> ev) { } public override void AfterRegionClear(RegionEvent<TKey, TVal> ev) { m_clears++; } public override void AfterRegionInvalidate(RegionEvent<TKey, TVal> ev) { } public override void AfterRegionLive(RegionEvent<TKey, TVal> ev) { } public override void Close(IRegion<TKey, TVal> region) { } #endregion } }