1/*- 2 * See the file LICENSE for redistribution information. 3 * 4 * Copyright (c) 2009 Oracle. All rights reserved. 5 * 6 */ 7using System; 8using System.Collections; 9using System.Collections.Generic; 10using System.IO; 11using System.Text; 12using System.Threading; 13using System.Xml; 14using NUnit.Framework; 15using BerkeleyDB; 16 17namespace CsharpAPITest 18{ 19 [TestFixture] 20 public class SecondaryQueueDatabaseTest 21 { 22 private string testFixtureHome; 23 private string testFixtureName; 24 private string testName; 25 private string testHome; 26 27 [TestFixtureSetUp] 28 public void RunBeforeTests() 29 { 30 testFixtureName = "SecondaryQueueDatabaseTest"; 31 testFixtureHome = "./TestOut/" + testFixtureName; 32 33 Configuration.ClearDir(testFixtureHome); 34 } 35 36 /* 37 * Tests to all Open() share the same configuration in 38 * AllTestData.xml. 39 */ 40 [Test] 41 public void TestOpen() 42 { 43 testName = "TestOpen"; 44 testHome = testFixtureHome + "/" + testName; 45 string dbFileName = testHome + "/" + testName + ".db"; 46 string dbSecFileName = testHome + "/" + 47 testName + "_sec.db"; 48 49 Configuration.ClearDir(testHome); 50 51 OpenSecQueueDB(testFixtureName, "TestOpen", 52 dbFileName, dbSecFileName); 53 } 54 55 public void OpenSecQueueDB(string className, 56 string funName, string dbFileName, string dbSecFileName) 57 { 58 XmlElement xmlElem = Configuration.TestSetUp( 59 className, funName); 60 61 // Open a primary queue database. 62 QueueDatabaseConfig primaryDBConfig = 63 new QueueDatabaseConfig(); 64 primaryDBConfig.Creation = CreatePolicy.IF_NEEDED; 65 QueueDatabase primaryDB; 66 67 /* 68 * If secondary database name is given, the primary 69 * database is also opened with database name. 70 */ 71 primaryDB = QueueDatabase.Open(dbFileName, 72 primaryDBConfig); 73 74 try 75 { 76 // Open a new secondary database. 77 SecondaryQueueDatabaseConfig secQueueDBConfig = 78 new SecondaryQueueDatabaseConfig( 79 primaryDB, null); 80 SecondaryQueueDatabaseConfigTest.Config( 81 xmlElem, ref secQueueDBConfig, false); 82 secQueueDBConfig.Creation = 83 CreatePolicy.IF_NEEDED; 84 85 SecondaryQueueDatabase secQueueDB; 86 secQueueDB = SecondaryQueueDatabase.Open( 87 dbSecFileName, secQueueDBConfig); 88 89 // Close the secondary database. 90 secQueueDB.Close(); 91 92 // Open the existing secondary database. 93 SecondaryDatabaseConfig secDBConfig = 94 new SecondaryQueueDatabaseConfig( 95 primaryDB, null); 96 97 SecondaryDatabase secDB; 98 secDB = SecondaryQueueDatabase.Open( 99 dbSecFileName, secDBConfig); 100 101 // Close secondary database. 102 secDB.Close(); 103 } 104 catch (DatabaseException) 105 { 106 throw new TestException(); 107 } 108 finally 109 { 110 // Close primary database. 111 primaryDB.Close(); 112 } 113 } 114 115 [Test] 116 public void TestOpenWithinTxn() 117 { 118 testName = "TestOpenWithinTxn"; 119 testHome = testFixtureHome + "/" + testName; 120 string dbFileName = testName + ".db"; 121 string dbSecFileName = testName + "_sec.db"; 122 123 Configuration.ClearDir(testHome); 124 125 OpenSecQueueDBWithinTxn(testFixtureName, 126 "TestOpen", testHome, dbFileName, 127 dbSecFileName); 128 } 129 130 [Test] 131 public void TestOpenDBNameWithinTxn() 132 { 133 testName = "TestOpenDBNameWithinTxn"; 134 testHome = testFixtureHome + "/" + testName; 135 string dbFileName = testName + ".db"; 136 string dbSecFileName = testName + "_sec.db"; 137 138 Configuration.ClearDir(testHome); 139 140 OpenSecQueueDBWithinTxn(testFixtureName, 141 "TestOpen", testHome, dbFileName, 142 dbSecFileName); 143 } 144 145 public void OpenSecQueueDBWithinTxn(string className, 146 string funName, string home, string dbFileName, 147 string dbSecFileName) 148 { 149 XmlElement xmlElem = Configuration.TestSetUp( 150 className, funName); 151 152 // Open an environment. 153 DatabaseEnvironmentConfig envConfig = 154 new DatabaseEnvironmentConfig(); 155 envConfig.Create = true; 156 envConfig.UseTxns = true; 157 envConfig.UseMPool = true; 158 envConfig.UseLogging = true; 159 DatabaseEnvironment env = DatabaseEnvironment.Open( 160 home, envConfig); 161 162 // Open a primary queue database. 163 Transaction openDBTxn = env.BeginTransaction(); 164 QueueDatabaseConfig dbConfig = 165 new QueueDatabaseConfig(); 166 dbConfig.Creation = CreatePolicy.IF_NEEDED; 167 dbConfig.Env = env; 168 QueueDatabase db = QueueDatabase.Open( 169 dbFileName, dbConfig, openDBTxn); 170 openDBTxn.Commit(); 171 172 // Open a secondary queue database. 173 Transaction openSecTxn = env.BeginTransaction(); 174 SecondaryQueueDatabaseConfig secDBConfig = 175 new SecondaryQueueDatabaseConfig(db, 176 new SecondaryKeyGenDelegate(SecondaryKeyGen)); 177 SecondaryQueueDatabaseConfigTest.Config(xmlElem, 178 ref secDBConfig, true); 179 secDBConfig.Env = env; 180 SecondaryQueueDatabase secDB; 181 secDB = SecondaryQueueDatabase.Open( 182 dbSecFileName, secDBConfig, openSecTxn); 183 184 openSecTxn.Commit(); 185 186 // Confirm its flags configured in secDBConfig. 187 Confirm(xmlElem, secDB, true); 188 secDB.Close(); 189 190 // Open the existing secondary database. 191 Transaction secTxn = env.BeginTransaction(); 192 SecondaryDatabaseConfig secConfig = 193 new SecondaryDatabaseConfig(db, 194 new SecondaryKeyGenDelegate(SecondaryKeyGen)); 195 secConfig.Env = env; 196 197 SecondaryDatabase secExDB; 198 secExDB = SecondaryQueueDatabase.Open( 199 dbSecFileName, secConfig, secTxn); 200 201 secExDB.Close(); 202 secTxn.Commit(); 203 204 db.Close(); 205 env.Close(); 206 } 207 208 public DatabaseEntry SecondaryKeyGen( 209 DatabaseEntry key, DatabaseEntry data) 210 { 211 DatabaseEntry dbtGen; 212 dbtGen = new DatabaseEntry(data.Data); 213 return dbtGen; 214 } 215 216 public static void Confirm(XmlElement xmlElem, 217 SecondaryQueueDatabase secDB, bool compulsory) 218 { 219 Configuration.ConfirmUint(xmlElem, 220 "ExtentSize", secDB.ExtentSize, compulsory); 221 Configuration.ConfirmUint(xmlElem, "Length", 222 secDB.Length, compulsory); 223 Configuration.ConfirmInt(xmlElem, "PadByte", 224 secDB.PadByte, compulsory); 225 } 226 } 227} 228