/*
* 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.
*/
package gobblin.data.management.retention.integration;
import lombok.extern.slf4j.Slf4j;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import com.google.common.io.Files;
import gobblin.util.PathUtils;
import gobblin.util.test.RetentionTestDataGenerator;
import gobblin.util.test.RetentionTestHelper;
/**
*
* Integration tests for gobblin retention.
* <ul>
* <li> Reads a <code>setup_validate.conf</code> to setup files/dirs for the test.
* See {@link RetentionTestDataGenerator#setup()}
* <li> Then runs gobblin retention with confgs in <code>retention.conf</code> file.
* <li> Validates for deleted and retained files as specified by <code>setup_validate.conf</code> file.
* See {@link RetentionTestDataGenerator#validate()}
* </ul>
*
* The class is a parameterized test meaning a test {@link #testRetention(String, String)} is run for every row returned
* by the data provider method {@link #retentionTestDataProvider()}
*
* <p>
* <b>Adding a new test is simple</b>
* <ul>
* <li> Create a package under src/test/resources/retentionIntegrationTest/YOUR_NEW_TEST
* <li> Create a <code>setup_validate.conf</code> file under this package to describe data to create
* and data to validate after the test
* <li> Create a <code>retention.conf</code> file under this package with retention configuration. Finders, policies etc.
* <li> Add YOUR_TEST_NAME to the data provider {@link #retentionTestDataProvider()}
* </ul>
* </p>
*/
@Slf4j
@Test(groups = { "SystemTimeTests"})
public class RetentionIntegrationTest {
private FileSystem fs;
private Path testClassTempPath;
private static final String SETUP_VALIDATE_CONFIG_CLASSPATH_FILENAME = "setup_validate.conf";
static final String TEST_PACKAGE_RESOURCE_NAME = "retentionIntegrationTest";
private static final String TEST_DATA_DIR_NAME = "retentionIntegrationTestData";
@BeforeClass
public void setupClass() throws Exception {
this.fs = FileSystem.get(new Configuration());
testClassTempPath = new Path(Files.createTempDir().getAbsolutePath(), TEST_DATA_DIR_NAME);
if (!fs.mkdirs(testClassTempPath)) {
throw new RuntimeException("Failed to create temp directory for the test at " + testClassTempPath.toString());
}
}
/**
*
* The method is a data provider for {@link RetentionIntegrationTest#testRetention(String, String)},
* Return a 2d string array. The pair of strings in each row is passed to {@link RetentionIntegrationTest#testRetention(String, String)}
* The first element in the pair is the name of the test and 2nd string the name of job config file to use.
* It may be a .properties file or a .conf file parsed by typesafe
*/
@DataProvider
public Object[][] retentionTestDataProvider() {
return new Object[][] {
{ "testTimeBasedRetention", "retention.conf" },
{ "testTimeBasedRetention", "selection.conf" },
{ "testNewestKRetention", "retention.conf" },
{ "testNewestKRetention", "selection.conf" },
{ "testHourlyPatternRetention", "hourly-retention.job" },
{ "testDailyPatternRetention", "daily-retention.job" },
{ "testMultiVersionRetention", "daily-hourly-retention.conf" },
{ "testCombinePolicy", "retention.job" },
{ "testCombinePolicy", "selection.conf" },
{ "testTimeBasedAccessControl", "selection.conf" },
{ "testMultiVersionAccessControl", "daily-retention-with-accessControl.conf" }
};
}
@Test(dataProvider = "retentionTestDataProvider")
public void testRetention(final String testName, final String testConfFileName) throws Exception {
// Temp path for this test under which test data is generated
Path testNameTempPath = new Path(testClassTempPath, testName);
RetentionTestDataGenerator dataGenerator = new RetentionTestDataGenerator(testNameTempPath,
PathUtils.combinePaths(TEST_PACKAGE_RESOURCE_NAME, testName, SETUP_VALIDATE_CONFIG_CLASSPATH_FILENAME), fs);
try {
dataGenerator.setup();
RetentionTestHelper.clean(fs, PathUtils.combinePaths(TEST_PACKAGE_RESOURCE_NAME, testName, testConfFileName), testNameTempPath);
dataGenerator.validate();
} finally {
dataGenerator.cleanup();
}
}
@AfterClass
public void cleanUpClass() {
try {
this.fs.delete(testClassTempPath, true);
} catch (Exception e) {
log.error("Failed to cleanup test files", e);
}
}
}