View Javadoc
1   /**
2    * 
3    */
4   package org.melati.poem.test;
5   
6   import java.sql.Connection;
7   import java.sql.Driver;
8   import java.sql.SQLException;
9   import java.sql.Statement;
10  import java.util.Properties;
11  
12  import org.melati.poem.PoemDatabase;
13  import org.melati.poem.dbms.Hsqldb;
14  
15  import junit.framework.TestCase;
16  
17  /**
18   * Test db outside of PoemTestCase so that we do not run into session closing
19   * issues.<p>
20   * This test exercises the jdbc metadata unification.
21   * 
22   * @author timp
23   * @since 25 Jan 2007
24   * 
25   */
26  public class DatabaseUnifyWithDBTest extends TestCase {
27  
28    public DatabaseUnifyWithDBTest(String name) {
29      super(name);
30    }
31  
32    protected void setUp() throws Exception {
33      super.setUp();
34    }
35  
36    protected void tearDown() throws Exception {
37      super.tearDown();
38    }
39  
40    /**
41     * Set up tables not in dsd to exercise other branch of unification.
42     */
43    public void testUnifyWithDB() throws Exception {
44      Driver driver = null;
45      Class<?> driverClass;
46      String url = "jdbc:hsqldb:mem:unifiable";
47      driverClass = Class.forName("org.hsqldb.jdbcDriver");
48      driver = (Driver)driverClass.newInstance();
49      Properties info = new Properties();
50      info.put("user", "sa");
51      info.put("password", "");
52  
53      Connection c = driver.connect(url, info);
54      Statement s = c.createStatement();
55      Hsqldb dbms = new Hsqldb();
56      StringBuffer sqb = new StringBuffer();
57      sqb.append("CREATE TABLE " + dbms.getQuotedName("testable") + " (");
58      sqb.append(dbms.getQuotedName("id") + " INTEGER NOT NULL PRIMARY KEY");
59      sqb.append(", ");
60      sqb.append(dbms.getQuotedName("testname") + " VARCHAR(233) NOT NULL");
61      sqb.append(", ");
62      sqb.append(dbms.getQuotedName("deleted") + " BOOLEAN");
63      sqb.append(", ");
64      sqb.append(dbms.getQuotedName("canRead") + " INTEGER");
65      sqb.append(", ");
66      sqb.append(dbms.getQuotedName("canCreate") + " INTEGER");
67      sqb.append(", ");
68      sqb.append(dbms.getQuotedName("canDelete") + " INTEGER");
69      sqb.append(", ");
70      sqb.append(dbms.getQuotedName("canSelect") + " INTEGER");
71      sqb.append(")");
72  
73      try { 
74        s.executeUpdate(sqb.toString());
75      } catch (SQLException e) { 
76        try { 
77          assertTrue(e.getMessage().indexOf("already exists") > 0);
78        } catch (Error e2) { 
79          throw e;
80        }
81      }
82      try { 
83        s.executeUpdate("CREATE UNIQUE INDEX \"TESTABLE_ID_INDEX\" ON \"TESTABLE\" (\"ID\")");    
84      } catch (SQLException e) { 
85        assertTrue(e.getMessage().indexOf("already exists") > 0);
86      }
87      StringBuffer sqb2 = new StringBuffer();
88      sqb2.append("INSERT INTO " + dbms.getQuotedName("testable") + " (");
89      sqb2.append(dbms.getQuotedName("id")) ;
90      sqb2.append(", ");
91      sqb2.append(dbms.getQuotedName("testname"))  ;
92      sqb2.append(") VALUES (");
93      sqb2.append("0, 't1'");
94      sqb2.append(") ");
95  
96      try { 
97        s.executeUpdate(sqb2.toString());
98      } catch (SQLException e) { 
99        assertTrue(e.getMessage().indexOf("Violation of unique index") >= 0);
100     }
101    
102     s.close();
103     c.commit();
104     if (!c.isClosed()) {
105       Statement st = c.createStatement();
106       //st.execute("SHUTDOWN SCRIPT"); 
107       st.close();
108     }
109     c.close();
110     PoemDatabase db = new PoemDatabase();
111     db.connect("unifiable", "org.melati.poem.dbms.Hsqldb",
112         url, "sa", "", 22);
113     assertEquals(22, db.getFreeTransactionsCount());
114     assertTrue(db.getClass().getName() == "org.melati.poem.PoemDatabase");
115     assertEquals("testable", db.getTable("testable").getName());
116     db.setLogSQL(false);
117   }
118 
119   /**
120    * Set up tables not in dsd to exercise other branch of unification.
121    */
122   public void testUnifyWithDB_nonIDKey() throws Exception {
123     Driver driver = null;
124     Class<?> driverClass;
125     String url = "jdbc:hsqldb:mem:unifiable";
126     driverClass = Class.forName("org.hsqldb.jdbcDriver");
127     driver = (Driver)driverClass.newInstance();
128     Properties info = new Properties();
129     info.put("user", "sa");
130     info.put("password", "");
131 
132     Connection c = driver.connect(url, info);
133     Statement s = c.createStatement();
134     Hsqldb dbms = new Hsqldb();
135     StringBuffer sqb = new StringBuffer();
136     sqb.append("CREATE TABLE " + dbms.getQuotedName("testable2") + " (");
137     sqb.append(dbms.getQuotedName("testableId") + " INTEGER NOT NULL PRIMARY KEY");
138     sqb.append(", ");
139     sqb.append(dbms.getQuotedName("testname") + " VARCHAR(233) NOT NULL");
140     sqb.append(", ");
141     sqb.append(dbms.getQuotedName("deleted") + " BOOLEAN");
142     sqb.append(", ");
143     sqb.append(dbms.getQuotedName("canRead") + " INTEGER");
144     sqb.append(", ");
145     sqb.append(dbms.getQuotedName("canCreate") + " INTEGER");
146     sqb.append(", ");
147     sqb.append(dbms.getQuotedName("canDelete") + " INTEGER");
148     sqb.append(", ");
149     sqb.append(dbms.getQuotedName("canSelect") + " INTEGER");
150     sqb.append(")");
151 
152     try { 
153       s.executeUpdate(sqb.toString());
154     } catch (SQLException e) { 
155         assertTrue(e.getMessage().indexOf("already exists") > 0);
156     }
157     try { 
158       s.executeUpdate("CREATE UNIQUE INDEX \"TESTABLE_ID_INDEX\" ON \"TESTABLE2\" (\"TESTABLEID\")");    
159     } catch (SQLException e) { 
160       assertTrue(e.getMessage(),e.getMessage().indexOf("already exists") > 0);
161     }
162     StringBuffer sqb2 = new StringBuffer();
163     sqb2.append("INSERT INTO " + dbms.getQuotedName("testable2") + " (");
164     sqb2.append(dbms.getQuotedName("testableid")) ;
165     sqb2.append(", ");
166     sqb2.append(dbms.getQuotedName("testname"))  ;
167     sqb2.append(") VALUES (");
168     sqb2.append("0, 't1'");
169     sqb2.append(") ");
170 
171     try { 
172       s.executeUpdate(sqb2.toString());
173     } catch (SQLException e) { 
174       assertTrue(e.getMessage(),e.getMessage().indexOf("Violation of unique index") >= 0);
175     }
176    
177     s.close();
178     c.commit();
179     if (!c.isClosed()) {
180       Statement st = c.createStatement();
181       //st.execute("SHUTDOWN SCRIPT"); 
182       st.close();
183     }
184     c.close();
185     PoemDatabase db = new PoemDatabase();
186     db.connect("unifiable", "org.melati.poem.dbms.Hsqldb",
187         url, "sa", "", 22);
188     assertEquals(22, db.getFreeTransactionsCount());
189     assertTrue(db.getClass().getName() == "org.melati.poem.PoemDatabase");
190     assertEquals("testable2", db.getTable("testable2").getName());
191     db.setLogSQL(false);
192   }
193 
194 }