// Copyright (C) 2011 Splunk Inc.
//
// Splunk Inc. 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.
package com.splunk.shuttl.archiver.archive;
import static com.splunk.shuttl.testutil.TUtilsFile.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
import static org.testng.AssertJUnit.*;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.http.client.ClientProtocolException;
import org.mockito.ArgumentCaptor;
import org.mockito.InOrder;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.splunk.shuttl.archiver.archive.recovery.FailedBucketsArchiver;
import com.splunk.shuttl.archiver.archive.recovery.IndexPreservingBucketMover;
import com.splunk.shuttl.archiver.bucketlock.BucketLocker.SharedLockBucketHandler;
import com.splunk.shuttl.archiver.bucketlock.BucketLockerInTestDir;
import com.splunk.shuttl.archiver.model.Bucket;
import com.splunk.shuttl.archiver.model.LocalBucket;
import com.splunk.shuttl.testutil.TUtilsBucket;
import com.splunk.shuttl.testutil.TUtilsTestNG;
/**
* Fixture: HttpClient returns HttpStatus codes that represent successful
* archiving.
*/
@Test(groups = { "fast-unit" })
public class BucketFreezerSuccessfulArchivingTest {
File tempTestDirectory;
BucketFreezer bucketFreezer;
ArchiveRestHandler archiveRestHandler;
FailedBucketsArchiver failedBucketsArchiver;
@BeforeMethod
public void setUp() throws ClientProtocolException, IOException {
tempTestDirectory = createDirectory();
archiveRestHandler = mock(ArchiveRestHandler.class);
failedBucketsArchiver = mock(FailedBucketsArchiver.class);
bucketFreezer = new BucketFreezer(
IndexPreservingBucketMover.create(tempTestDirectory),
new BucketLockerInTestDir(tempTestDirectory), archiveRestHandler,
failedBucketsArchiver);
}
@AfterMethod
public void tearDown() {
FileUtils.deleteQuietly(tempTestDirectory);
}
@Test(groups = { "fast-unit" })
public void should_moveDirectoryToaSafeLocation_when_givenPath()
throws IOException {
File dirToBeMoved = TUtilsBucket.createBucket().getDirectory();
File safeLocationDirectory = tempTestDirectory;
assertTrue(isDirectoryEmpty(safeLocationDirectory));
// Test
int exitStatus = bucketFreezer.freezeBucket("index-name",
dirToBeMoved.getAbsolutePath());
assertEquals(0, exitStatus);
// Verify
assertTrue(!dirToBeMoved.exists());
assertTrue(safeLocationDirectory.exists());
assertTrue(!isDirectoryEmpty(safeLocationDirectory));
}
public void freezeBucket_givenNonExistingSafeLocation_createSafeLocation()
throws IOException {
File dirToBeMoved = TUtilsBucket.createBucket().getDirectory();
System.err.println(tempTestDirectory);
assertTrue(FileUtils.deleteQuietly(tempTestDirectory));
File nonExistingSafeLocation = tempTestDirectory;
assertTrue(!nonExistingSafeLocation.exists());
System.err.println(tempTestDirectory.getName());
// Test
bucketFreezer.freezeBucket("index", dirToBeMoved.getAbsolutePath());
// Verify
assertTrue(!dirToBeMoved.exists());
assertTrue(nonExistingSafeLocation.exists());
}
public void freezeBucket_givenBucket_callRestWithMovedBucket() {
LocalBucket bucket = TUtilsBucket.createBucket();
bucketFreezer.freezeBucket(bucket.getIndex(), bucket.getDirectory()
.getAbsolutePath());
ArgumentCaptor<LocalBucket> bucketCaptor = ArgumentCaptor
.forClass(LocalBucket.class);
verify(archiveRestHandler, times(1)).callRestToArchiveLocalBucket(
bucketCaptor.capture());
assertEquals(1, bucketCaptor.getAllValues().size());
Bucket capturedBucket = bucketCaptor.getValue();
TUtilsTestNG.assertBucketsGotSameIndexFormatAndName(bucket, capturedBucket);
}
public void freezeBucket_givenBucket_callItToRecoverBuckets() {
LocalBucket bucket = TUtilsBucket.createBucket();
bucketFreezer.freezeBucket(bucket.getIndex(), bucket.getDirectory()
.getAbsolutePath());
verify(failedBucketsArchiver).archiveFailedBuckets(archiveRestHandler);
}
public void freezeBucket_givenBucket_triesToRestoreBucketsAFTERCallingRest() {
LocalBucket bucket = TUtilsBucket.createBucket();
bucketFreezer.freezeBucket(bucket.getIndex(), bucket.getDirectory()
.getAbsolutePath());
InOrder inOrder = inOrder(archiveRestHandler, failedBucketsArchiver);
inOrder.verify(archiveRestHandler, times(1)).callRestToArchiveLocalBucket(
any(LocalBucket.class));
inOrder.verify(failedBucketsArchiver).archiveFailedBuckets(
any(SharedLockBucketHandler.class));
inOrder.verifyNoMoreInteractions();
}
}