blob: f86d7051ff12e7db124d6f79f16d45a07ae50d62 [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.Collections;
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 Region = Apache.Geode.Client.IRegion<Object, Object>;
public class MyAppDomainResultCollector<TResult> : IResultCollector<TResult>
{
#region Private members
private bool m_resultReady = false;
ICollection<TResult> m_results = null;
private int m_addResultCount = 0;
private int m_getResultCount = 0;
private int m_endResultCount = 0;
#endregion
public int GetAddResultCount()
{
return m_addResultCount;
}
public int GetGetResultCount()
{
return m_getResultCount;
}
public int GetEndResultCount()
{
return m_endResultCount;
}
public MyAppDomainResultCollector()
{
m_results = new List<TResult>();
}
public void AddResult(TResult result)
{
Util.Log("MyAppDomainResultCollector " + result + " : " + result.GetType());
m_addResultCount++;
m_results.Add(result);
}
public ICollection<TResult> GetResult()
{
return GetResult(TimeSpan.FromSeconds(50));
}
public ICollection<TResult> GetResult(TimeSpan timeout)
{
m_getResultCount++;
lock (this) {
if (!m_resultReady) {
if (timeout > TimeSpan.Zero) {
if (!Monitor.Wait(this, timeout)) {
throw new FunctionExecutionException("Timeout waiting for result.");
}
} else {
throw new FunctionExecutionException("Results not ready.");
}
}
}
return m_results;
}
public void EndResults()
{
m_endResultCount++;
lock (this) {
m_resultReady = true;
Monitor.Pulse(this);
}
}
public void ClearResults(/*bool unused*/)
{
m_results.Clear();
m_addResultCount = 0;
m_getResultCount = 0;
m_endResultCount = 0;
m_resultReady = false;
}
}
[TestFixture]
[Category("group3")]
[Category("unicast_only")]
[Category("generics")]
public class ThinClientAppDomainFunctionExecutionTests : ThinClientRegionSteps
{
#region Private members
private static string[] FunctionExecutionRegionNames = { "partition_region", "partition_region1" };
private static string poolName = "__TEST_POOL1__";
private static string serverGroup = "ServerGroup1";
private static string QERegionName = "partition_region";
private static string OnServerHAExceptionFunction = "OnServerHAExceptionFunction";
private static string OnServerHAShutdownFunction = "OnServerHAShutdownFunction";
#endregion
protected override ClientBase[] GetClients()
{
return new ClientBase[] { };
}
[TestFixtureSetUp]
public override void InitTests()
{
Util.Log("InitTests: AppDomain: " + AppDomain.CurrentDomain.Id);
CacheHelper.Init();
}
[TearDown]
public override void EndTest()
{
Util.Log("EndTest: AppDomain: " + AppDomain.CurrentDomain.Id);
try
{
CacheHelper.ClearEndpoints();
CacheHelper.ClearLocators();
}
finally
{
CacheHelper.StopJavaServers();
CacheHelper.StopJavaLocators();
}
base.EndTest();
}
public void createRegionAndAttachPool(string regionName, string poolName)
{
CacheHelper.CreateTCRegion_Pool<object, object>(regionName, true, true, null, null, poolName, false, serverGroup);
}
public void createPool(string name, string locators, string serverGroup,
int redundancy, bool subscription, bool prSingleHop, bool threadLocal = false)
{
CacheHelper.CreatePool<object, object>(name, locators, serverGroup, redundancy, subscription, prSingleHop, threadLocal);
}
public void OnServerHAStepOne()
{
Region region = CacheHelper.GetVerifyRegion<object, object>(QERegionName);
for (int i = 0; i < 34; i++)
{
region["KEY--" + i] = "VALUE--" + i;
}
object[] routingObj = new object[17];
ArrayList args1 = new ArrayList();
int j = 0;
for (int i = 0; i < 34; i++)
{
if (i % 2 == 0) continue;
routingObj[j] = "KEY--" + i;
j++;
}
Util.Log("routingObj count= {0}.", routingObj.Length);
for (int i = 0; i < routingObj.Length; i++)
{
Console.WriteLine("routingObj[{0}]={1}.", i, (string)routingObj[i]);
args1.Add(routingObj[i]);
}
//test data independant function execution with result onServer
Pool/*<TKey, TValue>*/ pool = CacheHelper.DCache.GetPoolManager().Find(poolName);
Apache.Geode.Client.Execution<object> exc = FunctionService<object>.OnServer(pool);
Assert.IsTrue(exc != null, "onServer Returned NULL");
IResultCollector<object> rc = exc.WithArgs<ArrayList>(args1).Execute(OnServerHAExceptionFunction, TimeSpan.FromSeconds(15));
ICollection<object> executeFunctionResult = rc.GetResult();
List<object> resultList = new List<object>();
Console.WriteLine("executeFunctionResult.Length = {0}", executeFunctionResult.Count);
foreach (List<object> item in executeFunctionResult)
{
foreach (object item2 in item)
{
resultList.Add(item2);
}
}
Util.Log("on region: result count= {0}.", resultList.Count);
Assert.IsTrue(resultList.Count == 17, "result count check failed");
for (int i = 0; i < resultList.Count; i++)
{
Util.Log("on region:get:result[{0}]={1}.", i, (string)resultList[i]);
Assert.IsTrue(((string)resultList[i]) != null, "onServer Returned NULL");
}
rc = exc.WithArgs<ArrayList>(args1).Execute(OnServerHAShutdownFunction, TimeSpan.FromSeconds(15));
ICollection<object> executeFunctionResult1 = rc.GetResult();
List<object> resultList1 = new List<object>();
foreach (List<object> item in executeFunctionResult1)
{
foreach (object item2 in item)
{
resultList1.Add(item2);
}
}
Util.Log("on region: result count= {0}.", resultList1.Count);
Console.WriteLine("resultList1.Count = {0}", resultList1.Count);
Assert.IsTrue(resultList1.Count == 17, "result count check failed");
for (int i = 0; i < resultList1.Count; i++)
{
Util.Log("on region:get:result[{0}]={1}.", i, (string)resultList1[i]);
Assert.IsTrue(((string)resultList1[i]) != null, "onServer Returned NULL");
}
// Bring down the region
//region.LocalDestroyRegion();
}
[Test]
public void OnServerHAExecuteFunction()
{
Util.Log("OnServerHAExecuteFunction: AppDomain: " + AppDomain.CurrentDomain.Id);
CacheHelper.SetupJavaServers(true, "func_cacheserver1_pool.xml",
"func_cacheserver2_pool.xml", "func_cacheserver3_pool.xml");
CacheHelper.StartJavaLocator(1, "GFELOC");
Util.Log("Locator 1 started.");
CacheHelper.StartJavaServerWithLocators(1, "GFECS1", 1);
Util.Log("Cacheserver 1 started.");
CacheHelper.StartJavaServerWithLocators(2, "GFECS2", 1);
Util.Log("Cacheserver 2 started.");
CacheHelper.StartJavaServerWithLocators(3, "GFECS3", 1);
Util.Log("Cacheserver 3 started.");
createPool(poolName, CacheHelper.Locators, serverGroup, 1, true, true, /*threadLocal*/true);
createRegionAndAttachPool(QERegionName, poolName);
Util.Log("Client 1 (pool locator) regions created");
OnServerHAStepOne();
Close();
Util.Log("Client 1 closed");
CacheHelper.StopJavaServer(1);
Util.Log("Cacheserver 1 stopped.");
CacheHelper.StopJavaServer(2);
Util.Log("Cacheserver 2 stopped.");
CacheHelper.StopJavaServer(3);
Util.Log("Cacheserver 3 stopped.");
CacheHelper.StopJavaLocator(1);
Util.Log("Locator 1 stopped.");
CacheHelper.ClearEndpoints();
CacheHelper.ClearLocators();
}
}
}