libdb/test/csharp/SecondaryQueueDatabaseTest.cs
2012-11-14 16:35:20 -05:00

215 lines
5.5 KiB
C#

/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2009, 2012 Oracle and/or its affiliates. All rights reserved.
*
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading;
using System.Xml;
using NUnit.Framework;
using BerkeleyDB;
namespace CsharpAPITest
{
[TestFixture]
public class SecondaryQueueDatabaseTest : CSharpTestFixture
{
[TestFixtureSetUp]
public void SetUpTestFixture()
{
testFixtureName = "SecondaryQueueDatabaseTest";
base.SetUpTestfixture();
}
/*
* Tests to all Open() share the same configuration in
* AllTestData.xml.
*/
[Test]
public void TestOpen()
{
testName = "TestOpen";
SetUpTest(true);
string dbFileName = testHome + "/" + testName + ".db";
string dbSecFileName = testHome + "/" +
testName + "_sec.db";
OpenSecQueueDB(testFixtureName, "TestOpen",
dbFileName, dbSecFileName);
}
public void OpenSecQueueDB(string className,
string funName, string dbFileName, string dbSecFileName)
{
XmlElement xmlElem = Configuration.TestSetUp(
className, funName);
// Open a primary queue database.
QueueDatabaseConfig primaryDBConfig =
new QueueDatabaseConfig();
primaryDBConfig.Creation = CreatePolicy.IF_NEEDED;
QueueDatabase primaryDB;
/*
* If secondary database name is given, the primary
* database is also opened with database name.
*/
primaryDB = QueueDatabase.Open(dbFileName,
primaryDBConfig);
try
{
// Open a new secondary database.
SecondaryQueueDatabaseConfig secQueueDBConfig =
new SecondaryQueueDatabaseConfig(
primaryDB, null);
SecondaryQueueDatabaseConfigTest.Config(
xmlElem, ref secQueueDBConfig, false);
secQueueDBConfig.Creation =
CreatePolicy.IF_NEEDED;
SecondaryQueueDatabase secQueueDB;
secQueueDB = SecondaryQueueDatabase.Open(
dbSecFileName, secQueueDBConfig);
// Close the secondary database.
secQueueDB.Close();
// Open the existing secondary database.
SecondaryDatabaseConfig secDBConfig =
new SecondaryQueueDatabaseConfig(
primaryDB, null);
SecondaryDatabase secDB;
secDB = SecondaryQueueDatabase.Open(
dbSecFileName, secDBConfig);
// Close secondary database.
secDB.Close();
}
catch (DatabaseException)
{
throw new TestException();
}
finally
{
// Close primary database.
primaryDB.Close();
}
}
[Test]
public void TestOpenWithinTxn()
{
testName = "TestOpenWithinTxn";
SetUpTest(true);
string dbFileName = testName + ".db";
string dbSecFileName = testName + "_sec.db";
OpenSecQueueDBWithinTxn(testFixtureName,
"TestOpen", testHome, dbFileName,
dbSecFileName);
}
[Test]
public void TestOpenDBNameWithinTxn()
{
testName = "TestOpenDBNameWithinTxn";
SetUpTest(true);
string dbFileName = testName + ".db";
string dbSecFileName = testName + "_sec.db";
OpenSecQueueDBWithinTxn(testFixtureName,
"TestOpen", testHome, dbFileName,
dbSecFileName);
}
public void OpenSecQueueDBWithinTxn(string className,
string funName, string home, string dbFileName,
string dbSecFileName)
{
XmlElement xmlElem = Configuration.TestSetUp(
className, funName);
// Open an environment.
DatabaseEnvironmentConfig envConfig =
new DatabaseEnvironmentConfig();
envConfig.Create = true;
envConfig.UseTxns = true;
envConfig.UseMPool = true;
envConfig.UseLogging = true;
DatabaseEnvironment env = DatabaseEnvironment.Open(
home, envConfig);
// Open a primary queue database.
Transaction openDBTxn = env.BeginTransaction();
QueueDatabaseConfig dbConfig =
new QueueDatabaseConfig();
dbConfig.Creation = CreatePolicy.IF_NEEDED;
dbConfig.Env = env;
QueueDatabase db = QueueDatabase.Open(
dbFileName, dbConfig, openDBTxn);
openDBTxn.Commit();
// Open a secondary queue database.
Transaction openSecTxn = env.BeginTransaction();
SecondaryQueueDatabaseConfig secDBConfig =
new SecondaryQueueDatabaseConfig(db,
new SecondaryKeyGenDelegate(SecondaryKeyGen));
SecondaryQueueDatabaseConfigTest.Config(xmlElem,
ref secDBConfig, true);
secDBConfig.Env = env;
SecondaryQueueDatabase secDB;
secDB = SecondaryQueueDatabase.Open(
dbSecFileName, secDBConfig, openSecTxn);
openSecTxn.Commit();
// Confirm its flags configured in secDBConfig.
Confirm(xmlElem, secDB, true);
secDB.Close();
// Open the existing secondary database.
Transaction secTxn = env.BeginTransaction();
SecondaryDatabaseConfig secConfig =
new SecondaryDatabaseConfig(db,
new SecondaryKeyGenDelegate(SecondaryKeyGen));
secConfig.Env = env;
SecondaryDatabase secExDB;
secExDB = SecondaryQueueDatabase.Open(
dbSecFileName, secConfig, secTxn);
secExDB.Close();
secTxn.Commit();
db.Close();
env.Close();
}
public DatabaseEntry SecondaryKeyGen(
DatabaseEntry key, DatabaseEntry data)
{
DatabaseEntry dbtGen;
dbtGen = new DatabaseEntry(data.Data);
return dbtGen;
}
public static void Confirm(XmlElement xmlElem,
SecondaryQueueDatabase secDB, bool compulsory)
{
Configuration.ConfirmUint(xmlElem,
"ExtentSize", secDB.ExtentSize, compulsory);
Configuration.ConfirmUint(xmlElem, "Length",
secDB.Length, compulsory);
Configuration.ConfirmInt(xmlElem, "PadByte",
secDB.PadByte, compulsory);
}
}
}