/*
* Copyright 2007 - 2017 the original author or authors.
*
* Licensed 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 net.sf.jailer;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import net.sf.jailer.database.BasicDataSource;
import net.sf.jailer.database.Session;
import net.sf.jailer.ui.CommandLineInstance;
import net.sf.jailer.util.SqlScriptExecutor;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
/**
* Tests deletion feature.
*
* @author Ralf Wisser
*/
public class DeletionTestCase extends DbmsAwareTestCase {
private final File testDir;
private final File datamodelDir;
private final File initialDataset;
private final File expectedResult;
private final String scope;
/**
* Constructor.
*
* @param name test case name
* @param initialDataset initial data
*/
public DeletionTestCase(String name, File testDir, File datamodelDir, File initialDataset, File expectedResult, String scope) {
super(name);
this.testDir = testDir;
this.datamodelDir = datamodelDir;
this.initialDataset = initialDataset;
this.expectedResult = expectedResult;
this.scope = scope;
}
/**
* Gets data set holding the initial DB state.
*/
protected IDataSet getDataSet() throws Exception {
return new FlatXmlDataSet(initialDataset, false, true);
}
/**
* Tests export.
*/
public void testDeletion() throws Exception {
File resultDir = new File(testDir, "result");
if (!resultDir.exists()) {
resultDir.mkdir();
}
File result = null;
result = new File(resultDir, "delete.sql");
File insertResult = new File(resultDir, "insert.sql");
if (doDeletion(datamodelDir, new File(testDir, "extractionmodel.csv"), result, insertResult, scope)) {
BasicDataSource dataSource = new BasicDataSource(connectionArguments.get(0), connectionArguments.get(1), connectionArguments.get(2), connectionArguments.get(3), 0);
Session statementExecutor = new Session(dataSource, dataSource.dbms);
new SqlScriptExecutor(statementExecutor, 1).executeScript(result.getCanonicalPath());
statementExecutor.shutDown();
File actualState = new File(resultDir, "remaining-state.xml");
IDataSet depDataset = getConnection().createDataSet(getDataSet().getTableNames());
Writer out = new FileWriter(actualState);
FlatXmlDataSet.write(depDataset, out, Charset.defaultCharset().name());
out.close();
assertEqualDatasets(expectedResult, actualState);
}
}
/**
* Deletes data.
*
* @param extractionModel extraction model file name
* @param scope GLOBAL or SESSION_LOCAL
*/
private boolean doDeletion(File datamodel, File extractionModel, File result, File insertResult, String scope) throws Exception {
if ("SESSION_LOCAL".equals(scope)) {
if (!"yes".equals(System.getProperty("DB_SUPPORTS_SESSION_LOCAL"))) {
return false;
}
} else {
List<String> ddlArgs = new ArrayList<String>();
ddlArgs.add("create-ddl");
ddlArgs.addAll(connectionArguments);
ddlArgs.add("-datamodel");
ddlArgs.add(datamodel.getCanonicalPath());
Jailer.main(ddlArgs.toArray(new String[0]));
}
List<String> args = new ArrayList<String>();
args.add("export");
args.add(extractionModel.getCanonicalPath());
args.addAll(connectionArguments);
args.add("-d");
args.add(result.getCanonicalPath());
args.add("-datamodel");
args.add(datamodel.getCanonicalPath());
args.add("-script-enhancer");
args.add(datamodel.getParent());
args.add("-scope");
args.add(scope);
args.add("-e");
args.add(insertResult.getAbsolutePath());
System.out.println(args);
Jailer.main(args.toArray(new String[0]));
return true;
}
public String toString() {
return super.toString() + ": " + testDir + ", " + scope;
}
}