blob: d7c2e70acd19e930d93ff7d1f688bc72e938b376 [file] [log] [blame]
/*
Derby - Class org.apache.derbyTesting.functionTests.tests.store.BackupRestoreTest
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 org.apache.derbyTesting.functionTests.tests.store;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.CallableStatement;
import java.sql.SQLException;
import javax.sql.DataSource;
import junit.framework.Test;
import org.apache.derbyTesting.functionTests.util.PrivilegedFileOpsForTests;
import org.apache.derbyTesting.junit.BaseJDBCTestCase;
import org.apache.derbyTesting.junit.BaseTestSuite;
import org.apache.derbyTesting.junit.JDBCDataSource;
import org.apache.derbyTesting.junit.SupportFilesSetup;
import org.apache.derbyTesting.junit.TestConfiguration;
import org.apache.derbyTesting.junit.Utilities;
public class BackupRestoreTest
extends BaseJDBCTestCase {
public BackupRestoreTest(String name) {
super(name);
}
/**
* See DERBY-3875.
* <p>
* Steps in the test:
* 1) Create a database and perform a backup.
* 2) Shutdown the Derby engine.
* 3) Corrupt one of the database files.
* 4) Boot corrupted database.
* 5) Restore backup.
* <p>
* With the bug present, the test failed in step 5.
* Note that the test did fail only on Windows platforms, which is probably
* because of differences in the file system code.
*/
public void testDerby3875()
throws SQLException, IOException {
// Create the database.
println("Creating database");
getConnection();
// Backup the database.
println("Backing up database");
String dbBackup = SupportFilesSetup.getReadWrite("dbbackup").getPath();
CallableStatement cs = prepareCall(
"CALL SYSCS_UTIL.SYSCS_BACKUP_DATABASE(?)");
cs.setString(1, dbBackup);
cs.execute();
cs.close();
// Shutdown the database.
getTestConfiguration().shutdownEngine();
// Corrupt one of the database files.
File dataDir = new File("system/" +
getTestConfiguration().getDefaultDatabaseName(), "seg0");
File df = new File(dataDir, "c10.dat");
assertTrue("File to corrupt doesn't exist: " + df.getPath(),
PrivilegedFileOpsForTests.exists(df));
println("Corrupting data file");
byte[] zeros = new byte[(int)PrivilegedFileOpsForTests.length(df)];
FileOutputStream fout =
PrivilegedFileOpsForTests.getFileOutputStream(df);
fout.write(zeros);
fout.flush();
fout.close();
// Reboot the database, which should fail.
try {
println("Rebooting corrupted database");
getConnection();
fail("Reboot of currupted database should have failed");
} catch (SQLException sqle) {
assertSQLState("XJ040", sqle);
}
// Now try to restore database.
println("Restoring database");
String tmp[] = Utilities.split(
getTestConfiguration().getDefaultDatabaseName(), '/');
final String dbName = tmp[tmp.length -1];
DataSource ds = JDBCDataSource.getDataSource();
JDBCDataSource.setBeanProperty(ds, "connectionAttributes",
("restoreFrom=" + dbBackup + "/" + dbName ));
assertNotNull(ds.getConnection());
}
/**
* Returns a suite running with a single use database with the embedded
* driver only.
*
* @return A test suite.
*/
public static Test suite() {
BaseTestSuite suite = new BaseTestSuite(BackupRestoreTest.class);
return new SupportFilesSetup(
TestConfiguration.singleUseDatabaseDecorator(suite));
}
}