blob: 4bd52132f00c02f2dec7f0aec8ccf64a950e4662 [file] [log] [blame]
/*
*
* Derby - Class org.apache.derbyTesting.functionTests.util.ScriptTestCase
*
* 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.util;
import java.io.InputStream;
import java.net.URL;
import java.sql.Connection;
import java.util.Locale;
import junit.framework.Test;
import org.apache.derby.iapi.tools.i18n.LocalizedResource;
import org.apache.derbyTesting.junit.BaseTestSuite;
import org.apache.derbyTesting.junit.Derby;
import org.apache.derbyTesting.junit.LocaleTestSetup;
/**
* Run a .sql script as a test comparing it to
* a master output file.
*
*/
public abstract class ScriptTestCase extends CanonTestCase {
private final String inputEncoding;
private final String user;
private boolean useSystemProperties = false;
private Locale oldLocale;
/**
* Create a ScriptTestCase to run a single test
* using a connection obtained from getConnection()
* @param script Base name of the .sql script
* @param useSystemProperties Whether to use system properties for this test
* excluding the .sql suffix.
*/
public ScriptTestCase(String script, boolean useSystemProperties)
{
this(script, null, null, null);
this.useSystemProperties = useSystemProperties;
}
/**
* Create a ScriptTestCase to run a single test
* using a connection obtained from getConnection()
* @param script Base name of the .sql script
* excluding the .sql suffix.
*/
public ScriptTestCase(String script)
{
this(script, null, null, null);
}
/**
* Create a ScriptTestCase to run a single test
* using a connection obtained from getConnection() with a
* different encoding
* @param script Base name of the .sql script
* excluding the .sql suffix.
*/
public ScriptTestCase(String script, String encoding)
{
this(script, encoding, encoding, null);
}
/**
* Create a ScriptTestCase to run a single test
* using a connection obtained from getConnection() with a
* different encoding.
* @param script Base name of the .sql script
* excluding the .sql suffix.
* @param inputEnc The encoding for the script, if not null,
* else use "US-ASCII"
* @param outputEnc The encoding for the ouput from the script,
* if not null, else use "US-ASCII"
* @param user Run script as user
*/
public ScriptTestCase(String script,
String inputEnc, String outputEnc, String user)
{
super(script, outputEnc);
setSystemProperty("ij.showNoConnectionsAtStart", "true");
setSystemProperty("ij.showNoCountForSelect", "true");
inputEncoding = (inputEnc == null) ? DEFAULT_ENCODING : inputEnc;
this.user = user;
}
/**
* Return the folder (last element of the package) where
* the .sql script lives, e.g. lang.
*/
protected String getArea() {
String name = getClass().getName();
int lastDot = name.lastIndexOf('.');
name = name.substring(0, lastDot);
lastDot = name.lastIndexOf('.');
return name.substring(lastDot+1);
}
/**
* Get a decorator to setup the ij in order
* to run the test. A sub-class must decorate
* its suite using this call.
*/
public static Test getIJConfig(Test test)
{
// Need the tools to run the scripts as this
// test uses ij as the script runner.
if (!Derby.hasTools())
return new BaseTestSuite("empty: no tools support");
// No decorator needed currently.
return test;
}
/**
* Run the test, using the resource as the input.
* Compare to the master file using a very simple
* line by line comparision. Fails at the first
* difference. If a failure occurs the output
* is written into the current directory as
* testScript.out, otherwise the output is only
* kept in memory.
* @throws Throwable
*/
public void runTest() throws Throwable
{
String resource =
"org/apache/derbyTesting/functionTests/tests/"
+ getArea() + "/"
+ getName() + ".sql";
String canon =
"org/apache/derbyTesting/functionTests/master/"
+ getName() + ".out";
URL sql = getTestResource(resource);
assertNotNull("SQL script missing: " + resource, sql);
InputStream sqlIn = openTestResource(sql);
Connection conn;
if (user != null) {
conn = openUserConnection(user);
} else {
conn = getConnection();
}
final String outputEnc;
final String derby_ui_codeset = getSystemProperty("derby.ui.codeset");
if (derby_ui_codeset != null) {
// IJ should format output according to the derby.ui.codeset
// variable. If we pass in an encoding explicitly to runScript(),
// we won't test that derby.ui.codeset is obeyed. Therefore,
// leave it as null.
outputEnc = null;
assertEquals(
"Requested output encoding and derby.ui.codeset differ",
outputEncoding, derby_ui_codeset);
} else {
// derby.ui.codeset isn't set. Tell runScript() which output
// encoding to use.
outputEnc = outputEncoding;
}
org.apache.derby.tools.ij.runScript(
conn,
sqlIn,
inputEncoding,
getOutputStream(),
outputEnc,
useSystemProperties);
if (!conn.isClosed() && !conn.getAutoCommit())
conn.commit();
sqlIn.close();
this.compareCanon(canon);
}
/**
* Set up the new locale for the test
*/
protected void setUp() {
oldLocale = Locale.getDefault();
LocaleTestSetup.setDefaultLocale(Locale.US);
// Reset IJ's locale to allow it to pick up the new locale from
// the environment.
LocalizedResource.resetLocalizedResourceCache();
}
/**
* Revert the locale back to the old one
*/
protected void tearDown() throws Exception {
super.tearDown();
LocaleTestSetup.setDefaultLocale(oldLocale);
// Forget the locale used by this test.
LocalizedResource.resetLocalizedResourceCache();
}
}