001: /*
002: *
003: * Derby - Class org.apache.derbyTesting.functionTests.util.ScriptTestCase
004: *
005: * Licensed to the Apache Software Foundation (ASF) under one or more
006: * contributor license agreements. See the NOTICE file distributed with
007: * this work for additional information regarding copyright ownership.
008: * The ASF licenses this file to You under the Apache License, Version 2.0
009: * (the "License"); you may not use this file except in compliance with
010: * the License. You may obtain a copy of the License at
011: *
012: * http://www.apache.org/licenses/LICENSE-2.0
013: *
014: * Unless required by applicable law or agreed to in writing,
015: * software distributed under the License is distributed on an
016: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
017: * either express or implied. See the License for the specific
018: * language governing permissions and limitations under the License.
019: */
020: package org.apache.derbyTesting.functionTests.util;
021:
022: import java.io.InputStream;
023: import java.net.URL;
024: import java.sql.Connection;
025:
026: import junit.framework.Test;
027:
028: /**
029: * Run a .sql script as a test comparing it to
030: * a master output file.
031: *
032: */
033: public abstract class ScriptTestCase extends CanonTestCase {
034:
035: private final String inputEncoding;
036:
037: /**
038: * Create a ScriptTestCase to run a single test
039: * using a connection obtained from getConnection()
040: * @param script Base name of the .sql script
041: * excluding the .sql suffix.
042: */
043: public ScriptTestCase(String script) {
044: super (script);
045: inputEncoding = "US-ASCII";
046: }
047:
048: /**
049: * Return the folder (last element of the package) where
050: * the .sql script lives, e.g. lang.
051: * @return
052: */
053: protected String getArea() {
054:
055: String name = getClass().getName();
056:
057: int lastDot = name.lastIndexOf('.');
058:
059: name = name.substring(0, lastDot);
060:
061: lastDot = name.lastIndexOf('.');
062:
063: return name.substring(lastDot + 1);
064: }
065:
066: /**
067: * Get a decorator to setup the ij in order
068: * to run the test. A sub-class must decorate
069: * its suite using this call.
070: */
071: public static Test getIJConfig(Test test) {
072: // No decorator needed currently.
073: return test;
074: }
075:
076: /**
077: * Run the test, using the resource as the input.
078: * Compare to the master file using a very simple
079: * line by line comparision. Fails at the first
080: * difference. If a failure occurs the output
081: * is written into the current directory as
082: * testScript.out, otherwise the output is only
083: * kept in memory.
084: * @throws Throwable
085: */
086: public void runTest() throws Throwable {
087: String resource = "org/apache/derbyTesting/functionTests/tests/"
088: + getArea() + "/" + getName() + ".sql";
089:
090: String canon = "org/apache/derbyTesting/functionTests/master/"
091: + getName() + ".out";
092:
093: URL sql = getTestResource(resource);
094: assertNotNull("SQL script missing: " + resource, sql);
095:
096: InputStream sqlIn = openTestResource(sql);
097:
098: Connection conn = getConnection();
099: org.apache.derby.tools.ij.runScript(conn, sqlIn, inputEncoding,
100: getOutputStream(), outputEncoding);
101:
102: if (!conn.isClosed() && !conn.getAutoCommit())
103: conn.commit();
104:
105: sqlIn.close();
106:
107: this.compareCanon(canon);
108: }
109: }
|