blob: ad04a482afb496d20962ab83d81b2d9affceea64 [file] [log] [blame]
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.Util;
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using Directory = Lucene.Net.Store.Directory;
namespace Lucene.Net.Replicator
{
/*
* 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.
*/
public class LocalReplicatorTest : ReplicatorTestCase
{
private const string VERSION_ID = "version";
private LocalReplicator replicator;
private Directory sourceDirectory;
private IndexWriter sourceWriter;
public override void SetUp()
{
base.SetUp();
sourceDirectory = NewDirectory();
IndexWriterConfig conf = NewIndexWriterConfig(TEST_VERSION_CURRENT, null);
conf.IndexDeletionPolicy = new SnapshotDeletionPolicy(conf.IndexDeletionPolicy);
sourceWriter = new IndexWriter(sourceDirectory, conf);
replicator = new LocalReplicator();
}
public override void TearDown()
{
IOUtils.Dispose(replicator, sourceWriter, sourceDirectory);
base.TearDown();
}
private IRevision CreateRevision(int id)
{
sourceWriter.AddDocument(new Document());
sourceWriter.SetCommitData(new Dictionary<string, string> {
{ VERSION_ID, id.ToString() }
});
sourceWriter.Commit();
return new IndexRevision(sourceWriter);
}
[Test]
public void TestCheckForUpdateNoRevisions()
{
assertNull(replicator.CheckForUpdate(null));
}
[Test]
public void TestObtainFileAlreadyClosed()
{
replicator.Publish(CreateRevision(1));
SessionToken res = replicator.CheckForUpdate(null);
assertNotNull(res);
assertEquals(1, res.SourceFiles.Count);
System.Collections.Generic.KeyValuePair<string, System.Collections.Generic.IList<RevisionFile>> entry = res.SourceFiles.First();
replicator.Dispose();
try
{
replicator.ObtainFile(res.Id, entry.Key, entry.Value.First().FileName);
fail("should have failed on AlreadyClosedException");
}
catch (ObjectDisposedException)
{
// expected
}
}
[Test]
public void TestPublishAlreadyClosed()
{
replicator.Dispose();
try
{
replicator.Publish(CreateRevision(2));
fail("should have failed on AlreadyClosedException");
}
catch (ObjectDisposedException)
{
// expected
}
}
[Test]
public void TestUpdateAlreadyClosed()
{
replicator.Dispose();
try
{
replicator.CheckForUpdate(null);
fail("should have failed on AlreadyClosedException");
}
catch (ObjectDisposedException)
{
// expected
}
}
[Test]
public void TestPublishSameRevision()
{
IRevision rev = CreateRevision(1);
replicator.Publish(rev);
SessionToken res = replicator.CheckForUpdate(null);
assertNotNull(res);
assertEquals(rev.Version, res.Version);
replicator.Release(res.Id);
replicator.Publish(new IndexRevision(sourceWriter));
res = replicator.CheckForUpdate(res.Version);
assertNull(res);
// now make sure that publishing same revision doesn't leave revisions
// "locked", i.e. that replicator releases revisions even when they are not
// kept
replicator.Publish(CreateRevision(2));
assertEquals(1, DirectoryReader.ListCommits(sourceDirectory).size());
}
[Test]
public void TestPublishOlderRev()
{
replicator.Publish(CreateRevision(1));
IRevision old = new IndexRevision(sourceWriter);
replicator.Publish(CreateRevision(2));
try
{
replicator.Publish(old);
fail("should have failed to publish an older revision");
}
catch (ArgumentException)
{
// expected
}
assertEquals(1, DirectoryReader.ListCommits(sourceDirectory).size());
}
[Test]
public void TestObtainMissingFile()
{
replicator.Publish(CreateRevision(1));
SessionToken res = replicator.CheckForUpdate(null);
try
{
replicator.ObtainFile(res.Id, res.SourceFiles.Keys.First(), "madeUpFile");
fail("should have failed obtaining an unrecognized file");
}
#pragma warning disable 168
catch (FileNotFoundException e)
#pragma warning restore 168
{
// expected
}
#pragma warning disable 168
catch (DirectoryNotFoundException e) // LUCENENET specific: In Java, a FileNotFound exception is thrown when there is no directory, so we need to cover this case as well
#pragma warning restore 168
{
// expected
}
}
[Test]
public void TestSessionExpiration()
{
replicator.Publish(CreateRevision(1));
SessionToken session = replicator.CheckForUpdate(null);
replicator.ExpirationThreshold = 5; // expire quickly
Thread.Sleep(50); // sufficient for expiration
try
{
replicator.ObtainFile(session.Id, session.SourceFiles.Keys.First(), session.SourceFiles.Values.First().First().FileName);
fail("should have failed to obtain a file for an expired session");
}
catch (SessionExpiredException)
{
// expected
}
}
[Test]
public void TestUpdateToLatest()
{
replicator.Publish(CreateRevision(1));
IRevision rev = CreateRevision(2);
replicator.Publish(rev);
SessionToken res = replicator.CheckForUpdate(null);
assertNotNull(res);
assertEquals(0, rev.CompareTo(res.Version));
}
[Test]
public void TestRevisionRelease()
{
replicator.Publish(CreateRevision(1));
assertTrue(SlowFileExists(sourceDirectory, IndexFileNames.SEGMENTS + "_1"));
replicator.Publish(CreateRevision(2));
// now the files of revision 1 can be deleted
assertTrue(SlowFileExists(sourceDirectory, IndexFileNames.SEGMENTS + "_2"));
assertFalse("segments_1 should not be found in index directory after revision is released", SlowFileExists(sourceDirectory, IndexFileNames.SEGMENTS + "_1"));
}
}
}