blob: b5250eb4aa319bb27c8dbd48848d650888feda88 [file] [log] [blame]
// LUCENENET NOTE: Clearly this test is not applicable to .NET, but just
// adding the file to the project for completedness.
//using System;
//using System.Collections.Generic;
//using System.Threading;
//using Lucene.Net.Randomized;
//using Lucene.Net.Randomized.Generators;
//using Console = Lucene.Net.Util.SystemConsole;
//namespace Lucene.Net.Index
//{
// /*
// /// 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 Codec = Lucene.Net.Codecs.Codec;
// using BaseDirectoryWrapper = Lucene.Net.Store.BaseDirectoryWrapper;
// using Constants = Lucene.Net.Util.Constants;
// using TestUtil = Lucene.Net.Util.TestUtil;
// using NUnit.Framework;
// using Lucene.Net.Support;
// using System.IO;
// /// <summary>
// /// Runs TestNRTThreads in a separate process, crashes the JRE in the middle
// /// of execution, then runs checkindex to make sure its not corrupt.
// /// </summary>
// [TestFixture]
// public class TestIndexWriterOnJRECrash : TestNRTThreads
// {
// private DirectoryInfo TempDir;
// [SetUp]
// public override void SetUp()
// {
// base.SetUp();
// TempDir = CreateTempDir("jrecrash");
// TempDir.Delete();
// TempDir.mkdir();
// }
// [Test]
// public override void TestNRTThreads_Mem()
// {
// // if we are not the fork
// if (System.getProperty("tests.crashmode") == null)
// {
// // try up to 10 times to create an index
// for (int i = 0; i < 10; i++)
// {
// ForkTest();
// // if we succeeded in finding an index, we are done.
// if (CheckIndexes(TempDir))
// {
// return;
// }
// }
// }
// else
// {
// // TODO: the non-fork code could simply enable impersonation?
// AssumeFalse("does not support PreFlex, see LUCENE-3992", Codec.Default.Name.Equals("Lucene3x", StringComparison.Ordinal));
// // we are the fork, setup a crashing thread
// int crashTime = TestUtil.NextInt(Random(), 3000, 4000);
// ThreadClass t = new ThreadAnonymousInnerClassHelper(this, crashTime);
// t.Priority = ThreadPriority.Highest;
// t.Start();
// // run the test until we crash.
// for (int i = 0; i < 1000; i++)
// {
// base.TestNRTThreads_Mem();
// }
// }
// }
// private class ThreadAnonymousInnerClassHelper : ThreadClass
// {
// private readonly TestIndexWriterOnJRECrash outerInstance;
// private int CrashTime;
// public ThreadAnonymousInnerClassHelper(TestIndexWriterOnJRECrash outerInstance, int crashTime)
// {
// this.outerInstance = outerInstance;
// this.CrashTime = crashTime;
// }
// public override void Run()
// {
// try
// {
// Thread.Sleep(CrashTime);
// }
// catch (ThreadInterruptedException e)
// {
// }
// outerInstance.CrashJRE();
// }
// }
// /// <summary>
// /// fork ourselves in a new jvm. sets -Dtests.crashmode=true </summary>
// public virtual void ForkTest()
// {
// IList<string> cmd = new List<string>();
// cmd.Add(System.getProperty("java.home") + System.getProperty("file.separator") + "bin" + System.getProperty("file.separator") + "java");
// cmd.Add("-Xmx512m");
// cmd.Add("-Dtests.crashmode=true");
// // passing NIGHTLY to this test makes it run for much longer, easier to catch it in the act...
// cmd.Add("-Dtests.nightly=true");
// cmd.Add("-DtempDir=" + TempDir.Path);
// cmd.Add("-Dtests.seed=" + SeedUtils.formatSeed(Random().NextLong()));
// cmd.Add("-ea");
// cmd.Add("-cp");
// cmd.Add(System.getProperty("java.class.path"));
// cmd.Add("org.junit.runner.JUnitCore");
// cmd.Add(this.GetType().Name);
// ProcessBuilder pb = new ProcessBuilder(cmd);
// pb.directory(TempDir);
// pb.redirectErrorStream(true);
// Process p = pb.Start();
// // We pump everything to stderr.
// PrintStream childOut = System.err;
// Thread stdoutPumper = ThreadPumper.Start(p.InputStream, childOut);
// Thread stderrPumper = ThreadPumper.Start(p.ErrorStream, childOut);
// if (VERBOSE)
// {
// childOut.println(">>> Begin subprocess output");
// }
// p.waitFor();
// stdoutPumper.Join();
// stderrPumper.Join();
// if (VERBOSE)
// {
// childOut.println("<<< End subprocess output");
// }
// }
// /// <summary>
// /// A pipe thread. It'd be nice to reuse guava's implementation for this... </summary>
// internal class ThreadPumper
// {
// public static Thread Start(InputStream from, OutputStream to)
// {
// ThreadClass t = new ThreadAnonymousInnerClassHelper2(from, to);
// t.Start();
// return t;
// }
// private class ThreadAnonymousInnerClassHelper2 : ThreadClass
// {
// private InputStream From;
// private OutputStream To;
// public ThreadAnonymousInnerClassHelper2(InputStream from, OutputStream to)
// {
// this.From = from;
// this.To = to;
// }
// public override void Run()
// {
// try
// {
// sbyte[] buffer = new sbyte[1024];
// int len;
// while ((len = From.Read(buffer)) != -1)
// {
// if (VERBOSE)
// {
// To.Write(buffer, 0, len);
// }
// }
// }
// catch (IOException e)
// {
// Console.Error.WriteLine("Couldn't pipe from the forked process: " + e.ToString());
// }
// }
// }
// }
// /// <summary>
// /// Recursively looks for indexes underneath <code>file</code>,
// /// and runs checkindex on them. returns true if it found any indexes.
// /// </summary>
// public virtual bool CheckIndexes(DirectoryInfo file)
// {
// if (file.IsDirectory)
// {
// BaseDirectoryWrapper dir = NewFSDirectory(file);
// dir.CheckIndexOnClose = false; // don't double-checkindex
// if (DirectoryReader.IndexExists(dir))
// {
// if (VERBOSE)
// {
// Console.Error.WriteLine("Checking index: " + file);
// }
// // LUCENE-4738: if we crashed while writing first
// // commit it's possible index will be corrupt (by
// // design we don't try to be smart about this case
// // since that too risky):
// if (SegmentInfos.GetLastCommitGeneration(dir) > 1)
// {
// TestUtil.CheckIndex(dir);
// }
// dir.Dispose();
// return true;
// }
// dir.Dispose();
// foreach (FileInfo f in file.ListAll())
// {
// if (CheckIndexes(f))
// {
// return true;
// }
// }
// }
// return false;
// }
// /// <summary>
// /// currently, this only works/tested on Sun and IBM.
// /// </summary>
// public virtual void CrashJRE()
// {
// string vendor = Constants.JAVA_VENDOR;
// bool supportsUnsafeNpeDereference = vendor.StartsWith("Oracle", StringComparison.Ordinal) || vendor.StartsWith("Sun", StringComparison.Ordinal) || vendor.StartsWith("Apple", StringComparison.Ordinal);
// try
// {
// if (supportsUnsafeNpeDereference)
// {
// try
// {
// Type clazz = Type.GetType("sun.misc.Unsafe");
// Field field = clazz.GetDeclaredField("theUnsafe");
// field.Accessible = true;
// object o = field.Get(null);
// Method m = clazz.GetMethod("putAddress", typeof(long), typeof(long));
// m.invoke(o, 0L, 0L);
// }
// catch (Exception e)
// {
// Console.WriteLine("Couldn't kill the JVM via Unsafe.");
// Console.WriteLine(e.StackTrace);
// }
// }
// // Fallback attempt to Runtime.halt();
// Runtime.Runtime.halt(-1);
// }
// catch (Exception e)
// {
// Console.WriteLine("Couldn't kill the JVM.");
// Console.WriteLine(e.StackTrace);
// }
// // We couldn't get the JVM to crash for some reason.
// Assert.Fail();
// }
// }
//}