File: XMLMissingClassesTest.java

package info (click to toggle)
derby 10.14.2.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 79,056 kB
  • sloc: java: 691,961; sql: 42,686; xml: 20,512; sh: 3,373; sed: 96; makefile: 60
file content (142 lines) | stat: -rw-r--r-- 5,265 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
 *
 * Derby - Class org.apache.derbyTesting.functionTests.tests.lang.XMLMissingClassesTest
 *
 * 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.lang;

import java.sql.Statement;
import junit.framework.Test;
import org.apache.derbyTesting.junit.BaseJDBCTestCase;
import org.apache.derbyTesting.junit.BaseTestSuite;
import org.apache.derbyTesting.junit.TestConfiguration;
import org.apache.derbyTesting.junit.XML;

/**
 * This JUnit test is only run when the test classpath does not
 * contain the external classes required for use of the Derby
 * XML operators--namely, JAXP and Xalan.  In such a situation
 * all we do is try to execute each of the four SQL/XML operators
 * supported by Derby.  In all cases the operators should fail
 * with an error indicating that the required classes could
 * not be found.
 */
public final class XMLMissingClassesTest extends BaseJDBCTestCase {
    
    /**
     * Statements to run if the required XML classes are missing--need
     * to make sure the result is a compile-time error in all cases.
     */
    private static String [] SQLXML_STMTS = new String []
    {
        // One statement for each of the SQL/XML operators...
        "insert into xt values " +
            "(1, xmlparse(document '<hi/>' preserve whitespace))",
        "select xmlserialize(x as char(80)) from xt",
        "select xmlexists('//*' passing by ref x) from xt",
        "select i from xt where " +
            "xmlquery('//*' passing by ref x empty on empty) is not null"
    };

    /**
     * Public constructor required for running test as standalone JUnit.
     */
    public XMLMissingClassesTest(String name)
    {
        super(name);
    }

    /**
     * If the classpath does not have the XML classes that are
     * required for using Derby's SQL/XML operators, then try
     * try to execute each of the Derby XML operators and
     * verify that the result is an error in all cases.
     *
     * If the classpath *does* have the XML classes required
     * for use of Derby SQL/XML operators, then just return
     * an empty suite (the operators are tested in a different
     * JUnit test--namely XMLTypeAndOpTests.java).
     */
    public static Test suite()
    {
        BaseTestSuite suite = new BaseTestSuite("XML Missing Classes Suite");
        if (!XML.classpathMeetsXMLReqs())
        {
            // Run this test in embedded and client modes.
            suite.addTest(TestConfiguration.defaultSuite(
                XMLMissingClassesTest.class));
        }

        return suite;
    }

    /**
     * Assumption is that we only run this test if the classpath
     * is missing required XML classes.  In that case do a simple
     * check to make sure any attempts to use any of the SQL/XML
     * operators will fail at compile time with the appropriate
     * error.
     */
    public void testMissingClasses() throws Exception
    {
        Statement st = createStatement();

        // It's okay to create a column of type XML, so long
        // as no operators are involved.

        st.execute("create table xt (i int, x xml)");
        st.execute("create table xt1 (i int, x xml default null)");

        // But if the create statement uses an operator, it should
        // fail.

        assertCompileError("XML00",
            "create table fail1 (i int, x xml check "
            + "(xmlexists('//should' passing by ref x)))");

        assertCompileError("XML00",
            "create table fail2 (i int, x xml default xmlparse("
            + "document '<my>default col</my>' preserve whitespace))");

        // As a sanity check, make sure that XML columns declared
        // with invalid values still throw the correct errors--
        // and especially, make sure no attempts are made to load
        // XML classes.

        assertCompileError("42894",
            "create table fail3 (i int, x xml default 'oops')");

        assertCompileError("42894",
            "create table fail4 (i int, x xml default 8)");

        assertCompileError("42818",
            "create table fail5 (i int, x xml check (x != 0))");

        // Now go through and test each of the operators.  They
        // should all fail at compile time.

        for (int i = 0; i < SQLXML_STMTS.length; i++)
            assertCompileError("XML00", SQLXML_STMTS[i]);

        // Cleanup.

        st.execute("drop table xt");
        st.execute("drop table xt1");
        st.close();
        st = null;
    }
}