001    /*
002     * $Id: JDBCResourcesTestCase.java 354761 2005-12-07 15:11:58Z niallp $
003     * $Revision: 354761 $
004     * $Date: 2005-12-07 15:11:58 +0000 (Wed, 07 Dec 2005) $
005     *
006     * ====================================================================
007     *
008     *  Copyright 2003-2005 The Apache Software Foundation
009     * 
010     *  Licensed under the Apache License, Version 2.0 (the "License");
011     *  you may not use this file except in compliance with the License.
012     *  You may obtain a copy of the License at
013     *
014     *      http://www.apache.org/licenses/LICENSE-2.0
015     *
016     *  Unless required by applicable law or agreed to in writing, software
017     *  distributed under the License is distributed on an "AS IS" BASIS,
018     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
019     *  See the License for the specific language governing permissions and
020     *  limitations under the License.
021     *
022     */
023    package org.apache.commons.resources.impl;
024    
025    import java.net.URL;
026    import java.sql.Connection;
027    import java.sql.DriverManager;
028    import java.sql.SQLException;
029    import java.sql.Statement;
030    import java.util.StringTokenizer;
031    
032    import junit.framework.Test;
033    import junit.framework.TestSuite;
034    
035    /**
036     * <p>Unit tests for
037     * <code>org.apache.commons.resources.impl.JDBCResources</code>.
038     * </p>
039     *
040     * @author James Mitchell
041     * @version $Revision: 354761 $ $Date: 2005-12-07 15:11:58 +0000 (Wed, 07 Dec 2005) $
042     */
043    
044    public class JDBCResourcesTestCase
045        extends CollectionResourcesBaseTestCase {
046    
047    
048        // ----------------------------------------------------- Instance Variables
049        private Connection con;
050    
051    
052        protected String getBase() throws Exception
053        {
054            URL url = 
055                JDBCResourcesTestCase.class.getResource
056                ("/org/apache/commons/resources/impl/jdbc.test.config.properties");
057        
058            if (url == null) {
059                fail("URL NOT FOUND");
060            }
061            String string = url.toExternalForm();
062            String base = string.substring(0, string.length() - 11);
063            return base;
064        }
065    
066        // ----------------------------------------------------------- Constructors
067    
068    
069        public JDBCResourcesTestCase(String name) {
070            super(name);
071        }
072    
073    
074        // --------------------------------------------------- Overall Test Methods
075    
076    
077        // Set up instance variables required by this test case
078        public void setUp() throws Exception {
079            if (isPre14JVM()) {
080                System.out.println("WARNING: CANNOT TEST with HSQLDB 1.7.2 ON PRE1.4 JVM");
081                return;
082            }
083    
084            factory = new JDBCResourcesFactory();
085            resources = factory.getResources(NAME, getBase());
086            
087    //        InputStream in = this.getClass().getResourceAsStream("init.sql");
088    //        File file = new File("init.sql");
089            
090            // change this to load from init.sql
091            String[] sql = {""
092            + "create table resources (" 
093            + "  locale            varchar(10)      not null,"
094            + "  msgKey            varchar(255)     not null,"
095            + "  val               varchar(255),"
096            + "  Primary Key("
097            + "    locale,"
098            + "    msgKey"
099            + "  )"
100            + " );"
101            , "Insert into resources (locale, msgKey, val) Values ('', 'test.base', '[Base] ONLY');"
102            , "Insert into resources (locale, msgKey, val) Values ('', 'test.specific', '[Base] SPECIFIC');"
103            , "Insert into resources (locale, msgKey, val) Values ('', 'test.inherit', '[Base] INHERIT');"
104            , "Insert into resources (locale, msgKey, val) Values ('', 'test.message.single', '[Base] REPLACE {0}');"
105            , "Insert into resources (locale, msgKey, val) Values ('', 'test.message', '[Base] REPLACE {0} WITH {1}');"
106            , "Insert into resources (locale, msgKey, val) Values ('en', 'test.specific', '[en] SPECIFIC');"
107            , "Insert into resources (locale, msgKey, val) Values ('en', 'test.inherit', '[en] INHERIT');"
108            , "Insert into resources (locale, msgKey, val) Values ('en_US', 'test.specific', '[en_US] SPECIFIC');"
109            , "Insert into resources (locale, msgKey, val) Values ('fr', 'test.specific', '[fr] SPECIFIC');"
110            , "Insert into resources (locale, msgKey, val) Values ('fr', 'test.inherit', '[fr] INHERIT');"
111            };
112            runSql(sql);
113        }
114    
115        // Return the tests included in this test suite
116        public static Test suite() {
117            return (new TestSuite(JDBCResourcesTestCase.class));
118        }
119    
120        // Tear down the instance variables required by this test case
121        public void tearDown() {
122            resources = null;
123            factory = null;
124            if (isPre14JVM()) {
125                return;
126            }
127            try{
128                runSql(new String[]{"drop table resources"});
129                con.close();
130            }catch(Exception e){
131                // not really necessary to fail if creation also fails
132                e.printStackTrace();
133            }
134    
135        }
136        public void testInherit() throws Exception {
137            if (!isPre14JVM()) {
138                super.testInherit();
139            }
140        }
141        public void testLocaleList() {
142            if (!isPre14JVM()) {
143                super.testLocaleList();
144            }
145        }
146        public void testMissing() throws Exception {
147            if (!isPre14JVM()) {
148                super.testMissing();
149            }
150        }
151        public void testSpecific() throws Exception {
152            if (!isPre14JVM()) {
153                super.testSpecific();
154            }
155        }
156        public void testKeys() throws Exception {
157            if (!isPre14JVM()) {
158                super.testKeys();
159            }
160        }
161        public void testPristine() {
162            if (!isPre14JVM()) {
163                super.testPristine();
164            }
165        }
166        public void testRelease() throws Exception {
167            if (!isPre14JVM()) {
168                super.testRelease();
169            }
170        }
171    
172    
173        // ------------------------------------------------ Individual Test Methods
174    
175    
176        // ------------------------------------------------------ Protected Methods
177    
178    
179        // ------------------------------------------------------ Private Methods
180    
181        /**
182         * @param sql
183         * @throws SQLException
184         */
185        private void runSql(String[] sql) throws SQLException {
186    
187            String url = "jdbc:hsqldb:.";
188            
189            Statement stmt;
190            try {
191                Class.forName("org.hsqldb.jdbcDriver");
192    
193            } catch(java.lang.ClassNotFoundException e) {
194                fail("ClassNotFoundException:" + e.getMessage());
195            }
196    
197            try {
198                // TODO change this to pull from jdbc.test.config.properties
199                if (con == null || con.isClosed())
200                    con = DriverManager.getConnection(url, "sa", "");
201                stmt = con.createStatement();
202                
203                for (int i = 0; i < sql.length; i++) {
204                       stmt.execute(sql[i]);
205                }
206                stmt.close();
207        
208            } catch(SQLException ex) {
209                fail("SQLException: " + ex.getMessage());
210            }
211        }
212    
213        private boolean isPre14JVM() {
214            // some pre 1.4 JVM have buggy WeakHashMap implementations 
215            // this is used to test for those JVM
216            String version = System.getProperty("java.specification.version");
217            StringTokenizer tokenizer = new StringTokenizer(version,".");
218            if (tokenizer.nextToken().equals("1")) {
219                String minorVersion = tokenizer.nextToken();
220                if (minorVersion.equals("0")) return true;
221                if (minorVersion.equals("1")) return true;
222                if (minorVersion.equals("2")) return true;
223                if (minorVersion.equals("3")) return true;
224            }
225            return false;
226        }
227    }