• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/router/db-4.8.30/test/scr037/
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 SecondaryRecnoDatabaseTest
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 = "SecondaryRecnoDatabaseTest";
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			OpenSecRecnoDB(testFixtureName, "TestOpen",
52			    dbFileName, dbSecFileName, false);
53		}
54
55		[Test]
56		public void TestOpenWithDBName()
57		{
58			testName = "TestOpenWithDBName";
59			testHome = testFixtureHome + "/" + testName;
60			string dbFileName = testHome + "/" + testName + ".db";
61			string dbSecFileName = testHome + "/" +
62			    testName + "_sec.db";
63
64			Configuration.ClearDir(testHome);
65
66			OpenSecRecnoDB(testFixtureName, "TestOpen",
67			    dbFileName, dbSecFileName, true);
68		}
69
70		public void OpenSecRecnoDB(string className,
71		    string funName, string dbFileName, string dbSecFileName,
72		    bool ifDBName)
73		{
74			XmlElement xmlElem = Configuration.TestSetUp(
75			    className, funName);
76
77			// Open a primary recno database.
78			RecnoDatabaseConfig primaryDBConfig =
79			    new RecnoDatabaseConfig();
80			primaryDBConfig.Creation = CreatePolicy.IF_NEEDED;
81			RecnoDatabase primaryDB;
82
83			/*
84			 * If secondary database name is given, the primary
85			 * database is also opened with database name.
86			 */
87			if (ifDBName == false)
88				primaryDB = RecnoDatabase.Open(dbFileName,
89				    primaryDBConfig);
90			else
91				primaryDB = RecnoDatabase.Open(dbFileName,
92				    "primary", primaryDBConfig);
93
94			try
95			{
96				// Open a new secondary database.
97				SecondaryRecnoDatabaseConfig secRecnoDBConfig =
98				    new SecondaryRecnoDatabaseConfig(
99				    primaryDB, null);
100				SecondaryRecnoDatabaseConfigTest.Config(
101				    xmlElem, ref secRecnoDBConfig, false);
102				secRecnoDBConfig.Creation =
103				    CreatePolicy.IF_NEEDED;
104
105				SecondaryRecnoDatabase secRecnoDB;
106				if (ifDBName == false)
107					secRecnoDB = SecondaryRecnoDatabase.Open(
108					    dbSecFileName, secRecnoDBConfig);
109				else
110					secRecnoDB = SecondaryRecnoDatabase.Open(
111					    dbSecFileName, "secondary",
112					    secRecnoDBConfig);
113
114				// Close the secondary database.
115				secRecnoDB.Close();
116
117				// Open the existing secondary database.
118				SecondaryDatabaseConfig secDBConfig =
119				    new SecondaryDatabaseConfig(
120				    primaryDB, null);
121
122				SecondaryDatabase secDB;
123				if (ifDBName == false)
124					secDB = SecondaryRecnoDatabase.Open(
125					    dbSecFileName, secDBConfig);
126				else
127					secDB = SecondaryRecnoDatabase.Open(
128					    dbSecFileName, "secondary", secDBConfig);
129
130				// Close secondary database.
131				secDB.Close();
132			}
133			catch (DatabaseException)
134			{
135				throw new TestException();
136			}
137			finally
138			{
139				// Close primary database.
140				primaryDB.Close();
141			}
142		}
143
144		[Test]
145		public void TestOpenWithinTxn()
146		{
147			testName = "TestOpenWithinTxn";
148			testHome = testFixtureHome + "/" + testName;
149			string dbFileName = testName + ".db";
150			string dbSecFileName = testName + "_sec.db";
151
152			Configuration.ClearDir(testHome);
153
154			OpenSecRecnoDBWithinTxn(testFixtureName,
155			    "TestOpen", testHome, dbFileName,
156			    dbSecFileName, false);
157		}
158
159		[Test]
160		public void TestOpenDBNameWithinTxn()
161		{
162			testName = "TestOpenDBNameWithinTxn";
163			testHome = testFixtureHome + "/" + testName;
164			string dbFileName = testName + ".db";
165			string dbSecFileName = testName + "_sec.db";
166
167			Configuration.ClearDir(testHome);
168
169			OpenSecRecnoDBWithinTxn(testFixtureName,
170			    "TestOpen", testHome, dbFileName,
171			    dbSecFileName, true);
172		}
173
174		public void OpenSecRecnoDBWithinTxn(string className,
175		    string funName, string home, string dbFileName,
176		    string dbSecFileName, bool ifDbName)
177		{
178			XmlElement xmlElem = Configuration.TestSetUp(
179			    className, funName);
180
181			// Open an environment.
182			DatabaseEnvironmentConfig envConfig =
183			    new DatabaseEnvironmentConfig();
184			envConfig.Create = true;
185			envConfig.UseTxns = true;
186			envConfig.UseMPool = true;
187			envConfig.UseLogging = true;
188			DatabaseEnvironment env = DatabaseEnvironment.Open(
189			    home, envConfig);
190
191			// Open a primary recno database.
192			Transaction openDBTxn = env.BeginTransaction();
193			RecnoDatabaseConfig dbConfig =
194			    new RecnoDatabaseConfig();
195			dbConfig.Creation = CreatePolicy.IF_NEEDED;
196
197			dbConfig.Env = env;
198			RecnoDatabase db = RecnoDatabase.Open(
199			    dbFileName, dbConfig, openDBTxn);
200			openDBTxn.Commit();
201
202			// Open a secondary recno database.
203			Transaction openSecTxn = env.BeginTransaction();
204			SecondaryRecnoDatabaseConfig secDBConfig =
205			    new SecondaryRecnoDatabaseConfig(db,
206			    new SecondaryKeyGenDelegate(SecondaryKeyGen));
207			SecondaryRecnoDatabaseConfigTest.Config(xmlElem,
208			    ref secDBConfig, false);
209			secDBConfig.Env = env;
210			SecondaryRecnoDatabase secDB;
211			if (ifDbName == false)
212				secDB = SecondaryRecnoDatabase.Open(
213				    dbSecFileName, secDBConfig, openSecTxn);
214			else
215				secDB = SecondaryRecnoDatabase.Open(
216				    dbSecFileName, "secondary", secDBConfig,
217				    openSecTxn);
218			openSecTxn.Commit();
219
220			// Confirm its flags configured in secDBConfig.
221			Confirm(xmlElem, secDB, true);
222			secDB.Close();
223
224			// Open the existing secondary database.
225			Transaction secTxn = env.BeginTransaction();
226			SecondaryDatabaseConfig secConfig =
227			    new SecondaryDatabaseConfig(db,
228			    new SecondaryKeyGenDelegate(SecondaryKeyGen));
229			secConfig.Env = env;
230
231			SecondaryDatabase secExDB;
232			if (ifDbName == false)
233				secExDB = SecondaryRecnoDatabase.Open(
234				    dbSecFileName, secConfig, secTxn);
235			else
236				secExDB = SecondaryRecnoDatabase.Open(
237				    dbSecFileName, "secondary", secConfig,
238				    secTxn);
239			secExDB.Close();
240			secTxn.Commit();
241
242			db.Close();
243			env.Close();
244		}
245
246		public DatabaseEntry SecondaryKeyGen(
247		    DatabaseEntry key, DatabaseEntry data)
248		{
249			DatabaseEntry dbtGen;
250			dbtGen = new DatabaseEntry(data.Data);
251			return dbtGen;
252		}
253
254		public static void Confirm(XmlElement xmlElem,
255		    SecondaryRecnoDatabase secDB, bool compulsory)
256		{
257			Configuration.ConfirmInt(xmlElem, "Delimiter",
258			    secDB.Delimiter, compulsory);
259			Configuration.ConfirmUint(xmlElem, "Length",
260			    secDB.Length, compulsory);
261			Configuration.ConfirmInt(xmlElem, "PadByte",
262			    secDB.PadByte, compulsory);
263			Configuration.ConfirmBool(xmlElem,
264			    "Renumber", secDB.Renumber, compulsory);
265			Configuration.ConfirmBool(xmlElem, "Snapshot",
266			    secDB.Snapshot, compulsory);
267		}
268	}
269}
270