blob: bca63c6f136e186114a570ce1e7842a71413cac3 [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.Diagnostics;
using System.IO;
using System.Reflection;
using System.Threading;
namespace Apache.Geode.DUnitFramework
{
using NUnit.Framework;
/// <summary>
/// Setup the test parameters including logfile, timebomb and timeout settings
/// </summary>
public abstract class DUnitTestClass
{
public static string CurrentTestClassName
{
get
{
return m_currentTestClass.FullName;
}
}
public static string CurrentTestName
{
get
{
return m_currentTest.Name;
}
}
protected virtual string TimeoutsXML
{
get
{
return "Timeouts.xml";
}
}
protected virtual string TimeoutAttribName
{
get
{
return "timeout";
}
}
protected int m_currentTestNumber = 0;
protected Util.LogLevel m_logLevel = Util.DefaultLogLevel;
protected ClientBase[] m_clients;
private static Type m_currentTestClass;
private static MethodInfo m_currentTest;
private int m_defaultTimeoutMillis = -1;
private XmlNodeReaderWriter m_timings;
private static TimeBomb m_timeBomb = new TimeBomb();
private MethodInfo m_fixtureSetup;
private List<MethodInfo> m_tests = new List<MethodInfo>();
protected virtual void SetLogging(string logFile)
{
Util.LogFile = logFile;
Util.CurrentLogLevel = m_logLevel;
}
protected virtual void SetClientLogging(ClientBase[] clients, string logFile)
{
if (clients != null)
{
if (m_logLevel != Util.DefaultLogLevel)
{
foreach (ClientBase client in clients)
{
client.SetLogLevel(m_logLevel);
}
}
if (logFile != null)
{
foreach (ClientBase client in clients)
{
client.SetLogFile(logFile);
}
}
}
}
void SetClientLogging()
{
SetClientLogging(m_clients, Util.LogFile);
}
[TestFixtureSetUp]
public virtual void InitTests()
{
m_currentTestClass = this.GetType();
if (m_timings == null)
{
object[] attrs;
// Get the list of tests for this class and fixture setup method.
foreach (MethodInfo method in m_currentTestClass.GetMethods())
{
if (m_fixtureSetup == null)
{
attrs = method.GetCustomAttributes(
typeof(TestFixtureSetUpAttribute), true);
if (attrs != null && attrs.Length > 0)
{
m_fixtureSetup = method;
}
}
attrs = method.GetCustomAttributes(
typeof(TestAttribute), true);
if (attrs != null && attrs.Length > 0)
{
m_tests.Add(method);
}
}
m_timeBomb.SetFixtureSetup(m_fixtureSetup, this);
// Get the default timeout
string timingsFile = TimeoutsXML;
m_timings = XmlNodeReaderWriter.GetInstance(timingsFile);
try
{
string timeoutStr = m_timings.GetAttribute(
'/' + XmlNodeReaderWriter.RootNodeName, TimeoutAttribName);
if (timeoutStr != null)
{
m_defaultTimeoutMillis = int.Parse(timeoutStr) * 1000;
}
}
catch (Exception ex)
{
Util.Log("Got an exception while setting default timeout from {0}: {1}",
timingsFile, ex);
m_defaultTimeoutMillis = -1;
}
NUnitMethodComparer mComp = new NUnitMethodComparer();
m_tests.Sort(mComp);
}
SetLogging(GetClassLogFile());
m_clients = GetClients();
m_timeBomb.AddClients(m_clients);
SetClientLogging();
}
[TestFixtureTearDown]
public virtual void EndTests()
{
if (m_clients != null)
{
foreach (ClientBase client in m_clients)
{
client.Dispose();
}
}
m_timeBomb.Diffuse();
}
[SetUp]
public virtual void InitTest()
{
if (m_currentTestNumber < m_tests.Count)
{
m_currentTest = m_tests[m_currentTestNumber];
m_currentTestNumber++;
SetLogging(GetLogFile());
SetClientLogging();
int timeout = m_defaultTimeoutMillis;
if (m_defaultTimeoutMillis > 0)
{
string timingsFile = TimeoutsXML;
try
{
// Find the timeout set for this test in the Settings file.
string timeoutStr = m_timings.GetAttribute(
XmlNodeReaderWriter.GetPathForNode(m_currentTest),
TimeoutAttribName);
if (timeoutStr != null)
{
timeout = int.Parse(timeoutStr) * 1000;
}
}
catch (Exception ex)
{
Util.Log("Got an exception while setting timeout from {0}: {1}",
timingsFile, ex);
timeout = m_defaultTimeoutMillis;
}
}
else
{
timeout = Timeout.Infinite;
}
DateTime now = DateTime.Now;
Console.WriteLine("[{0}:{1}:{2}.{3}] Set the timeout to {4} secs.{5}",
now.Hour.ToString("D02"), now.Minute.ToString("D02"),
now.Second.ToString("D02"), now.Millisecond.ToString("D03"),
timeout / 1000, Environment.NewLine);
Util.Log("INIT:: Starting next test in {0} with timeout as {1} secs.",
this.GetType().FullName, timeout / 1000);
m_timeBomb.TaskName = GetTaskName();
m_timeBomb.Start(timeout);
}
}
[TearDown]
public virtual void EndTest()
{
m_timeBomb.WaitTimeout();
m_timeBomb.Diffuse();
}
protected abstract ClientBase[] GetClients();
protected virtual void AddClients(params ClientBase[] clients)
{
if (clients != null)
{
SetClientLogging(clients, GetLogFile());
m_timeBomb.AddClients(clients);
}
}
protected virtual string GetClassLogFile()
{
if (Util.DUnitLogDir == null)
{
return null;
}
return Util.DUnitLogDir + Path.DirectorySeparatorChar +
m_currentTestClass.Name + ".log";
}
protected virtual string GetLogFile()
{
if (Util.DUnitLogDir == null)
{
return null;
}
return Util.DUnitLogDir + Path.DirectorySeparatorChar +
m_currentTestClass.Name + '.' + m_currentTest.Name + ".log";
}
protected virtual string GetTaskName()
{
return m_currentTest.Name;
}
public override sealed int GetHashCode()
{
return base.GetHashCode();
}
}
public class NUnitMethodComparer : IComparer<MethodInfo>
{
#region IComparer<MethodInfo> Members
public int Compare(MethodInfo first, MethodInfo second)
{
return first.Name.CompareTo(second.Name);
}
#endregion
}
}