1*ef39d40dSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*ef39d40dSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*ef39d40dSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*ef39d40dSAndrew Rist * distributed with this work for additional information 6*ef39d40dSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*ef39d40dSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*ef39d40dSAndrew Rist * "License"); you may not use this file except in compliance 9*ef39d40dSAndrew Rist * with the License. You may obtain a copy of the License at 10*ef39d40dSAndrew Rist * 11*ef39d40dSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*ef39d40dSAndrew Rist * 13*ef39d40dSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*ef39d40dSAndrew Rist * software distributed under the License is distributed on an 15*ef39d40dSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*ef39d40dSAndrew Rist * KIND, either express or implied. See the License for the 17*ef39d40dSAndrew Rist * specific language governing permissions and limitations 18*ef39d40dSAndrew Rist * under the License. 19*ef39d40dSAndrew Rist * 20*ef39d40dSAndrew Rist *************************************************************/ 21*ef39d40dSAndrew Rist 22*ef39d40dSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir package ifc.sdbc; 25cdf0e10cSrcweir 26cdf0e10cSrcweir import lib.MultiMethodTest; 27cdf0e10cSrcweir import lib.StatusException; 28cdf0e10cSrcweir 29cdf0e10cSrcweir import com.sun.star.sdbc.SQLException; 30cdf0e10cSrcweir import com.sun.star.sdbc.XResultSetUpdate; 31cdf0e10cSrcweir import com.sun.star.sdbc.XRowUpdate; 32cdf0e10cSrcweir import com.sun.star.uno.UnoRuntime; 33cdf0e10cSrcweir 34cdf0e10cSrcweir /** 35cdf0e10cSrcweir /** 36cdf0e10cSrcweir * Testing <code>com.sun.star.sdbc.XResultSetUpdate</code> 37cdf0e10cSrcweir * interface methods : 38cdf0e10cSrcweir * <ul> 39cdf0e10cSrcweir * <li><code> insertRow()</code></li> 40cdf0e10cSrcweir * <li><code> updateRow()</code></li> 41cdf0e10cSrcweir * <li><code> deleteRow()</code></li> 42cdf0e10cSrcweir * <li><code> cancelRowUpdates()</code></li> 43cdf0e10cSrcweir * <li><code> moveToInsertRow()</code></li> 44cdf0e10cSrcweir * <li><code> moveToCurrentRow()</code></li> 45cdf0e10cSrcweir * </ul> <p> 46cdf0e10cSrcweir * The test requires the following object relations : 47cdf0e10cSrcweir * <ul> 48cdf0e10cSrcweir * <li><code>'XResultSetUpdate.UpdateTester'</code> 49cdf0e10cSrcweir * inner <code>UpdateTester</code> interface implementation : 50cdf0e10cSrcweir * is used for checking test results. See interface 51cdf0e10cSrcweir * documentation for more information.</li> 52cdf0e10cSrcweir * </ul> 53cdf0e10cSrcweir * The test is <b>not designed</b> for multithreaded testing. <p> 54cdf0e10cSrcweir * After it's execution environment must be recreated. 55cdf0e10cSrcweir * @see com.sun.star.sdbc.XResultSetUpdate 56cdf0e10cSrcweir */ 57cdf0e10cSrcweir public class _XResultSetUpdate extends MultiMethodTest { 58cdf0e10cSrcweir 59cdf0e10cSrcweir // oObj filled by MultiMethodTest 60cdf0e10cSrcweir public XResultSetUpdate oObj = null ; 61cdf0e10cSrcweir 62cdf0e10cSrcweir private UpdateTester tester = null ; 63cdf0e10cSrcweir 64cdf0e10cSrcweir /** 65cdf0e10cSrcweir * Interface contains some methods for checking 66cdf0e10cSrcweir * test results. It's implementation must be passed 67cdf0e10cSrcweir * to this test. 68cdf0e10cSrcweir */ 69cdf0e10cSrcweir public static interface UpdateTester { 70cdf0e10cSrcweir /** 71cdf0e10cSrcweir * @return Current number of rows. 72cdf0e10cSrcweir */ rowCount()73cdf0e10cSrcweir public int rowCount() throws SQLException ; 74cdf0e10cSrcweir /** 75cdf0e10cSrcweir * Updates some data in the current row but doesn't commit 76cdf0e10cSrcweir * changes to the source. 77cdf0e10cSrcweir */ update()78cdf0e10cSrcweir public void update() throws SQLException ; 79cdf0e10cSrcweir /** 80cdf0e10cSrcweir * Checks if updates made by method <code>update</code> was 81cdf0e10cSrcweir * commited to the data source. 82cdf0e10cSrcweir */ wasUpdated()83cdf0e10cSrcweir public boolean wasUpdated() throws SQLException ; 84cdf0e10cSrcweir /** 85cdf0e10cSrcweir * Returns current row number. Really it must returns value 86cdf0e10cSrcweir * < 1 if the current position is on insert row. 87cdf0e10cSrcweir */ currentRow()88cdf0e10cSrcweir public int currentRow() throws SQLException ; 89cdf0e10cSrcweir } 90cdf0e10cSrcweir 91cdf0e10cSrcweir /** 92cdf0e10cSrcweir * Retrieves relation. 93cdf0e10cSrcweir * @throw StatusException If relation not found. 94cdf0e10cSrcweir */ before()95cdf0e10cSrcweir public void before() throws StatusException { 96cdf0e10cSrcweir tester = (UpdateTester)tEnv.getObjRelation 97cdf0e10cSrcweir ("XResultSetUpdate.UpdateTester") ; 98cdf0e10cSrcweir 99cdf0e10cSrcweir if (tester == null) { 100cdf0e10cSrcweir log.println("Required relation not found !!!") ; 101cdf0e10cSrcweir throw new StatusException("Required relation not found !!!", 102cdf0e10cSrcweir new NullPointerException()) ; 103cdf0e10cSrcweir } 104cdf0e10cSrcweir } 105cdf0e10cSrcweir 106cdf0e10cSrcweir /** 107cdf0e10cSrcweir * Calls method when the cursor position is on existing row. 108cdf0e10cSrcweir * Checks total number of rows before and after method call. <p> 109cdf0e10cSrcweir * Executes <code>moveToCurrentRow</code> method test before to 110cdf0e10cSrcweir * be sure that cursor is not on the insert row. <p> 111cdf0e10cSrcweir * Has OK status if after method execution number of rows decreased 112cdf0e10cSrcweir * by one. 113cdf0e10cSrcweir */ _deleteRow()114cdf0e10cSrcweir public void _deleteRow() { 115cdf0e10cSrcweir executeMethod("moveToCurrentRow()") ; 116cdf0e10cSrcweir 117cdf0e10cSrcweir //temporary to avoid SOffice hanging 118cdf0e10cSrcweir executeMethod("updateRow()") ; 119cdf0e10cSrcweir executeMethod("cancelRowUpdates()") ; 120cdf0e10cSrcweir 121cdf0e10cSrcweir boolean result = true ; 122cdf0e10cSrcweir try { 123cdf0e10cSrcweir int rowsBefore = tester.rowCount() ; 124cdf0e10cSrcweir oObj.deleteRow() ; 125cdf0e10cSrcweir int rowsAfter = tester.rowCount() ; 126cdf0e10cSrcweir 127cdf0e10cSrcweir result = rowsBefore == rowsAfter + 1 ; 128cdf0e10cSrcweir } catch (SQLException e) { 129cdf0e10cSrcweir e.printStackTrace(log) ; 130cdf0e10cSrcweir result = false ; 131cdf0e10cSrcweir } 132cdf0e10cSrcweir 133cdf0e10cSrcweir tRes.tested("deleteRow()", result) ; 134cdf0e10cSrcweir } 135cdf0e10cSrcweir 136cdf0e10cSrcweir /** 137cdf0e10cSrcweir * Using relation methods first updates some data in the current 138cdf0e10cSrcweir * row, then calls <code>updateRow</code> method to commit data. 139cdf0e10cSrcweir * Then checks if the data changed was commited. <p> 140cdf0e10cSrcweir * Executes <code>moveToCurrentRow</code> method test before to 141cdf0e10cSrcweir * be sure that cursor is not on the insert row. <p> 142cdf0e10cSrcweir * Has OK status if data in the source was changed. 143cdf0e10cSrcweir */ _updateRow()144cdf0e10cSrcweir public void _updateRow() { 145cdf0e10cSrcweir executeMethod("moveToCurrentRow()") ; 146cdf0e10cSrcweir boolean result = true ; 147cdf0e10cSrcweir try { 148cdf0e10cSrcweir tester.update() ; 149cdf0e10cSrcweir oObj.updateRow() ; 150cdf0e10cSrcweir 151cdf0e10cSrcweir result = tester.wasUpdated() ; 152cdf0e10cSrcweir } catch (SQLException e) { 153cdf0e10cSrcweir e.printStackTrace(log) ; 154cdf0e10cSrcweir result = false ; 155cdf0e10cSrcweir } 156cdf0e10cSrcweir tRes.tested("updateRow()", result) ; 157cdf0e10cSrcweir } 158cdf0e10cSrcweir 159cdf0e10cSrcweir /** 160cdf0e10cSrcweir * Using relation methods first updates some data in the current 161cdf0e10cSrcweir * row, then calls <code>cancelRowUpdates</code> method. 162cdf0e10cSrcweir * Then checks if the data changed was not commited. <p> 163cdf0e10cSrcweir * Executes <code>moveToCurrentRow</code> method test before to 164cdf0e10cSrcweir * be sure that cursor is not on the insert row. <p> 165cdf0e10cSrcweir * Has OK status if data in the source was not changed. 166cdf0e10cSrcweir */ _cancelRowUpdates()167cdf0e10cSrcweir public void _cancelRowUpdates() { 168cdf0e10cSrcweir executeMethod("moveToCurrentRow()") ; 169cdf0e10cSrcweir boolean result = true ; 170cdf0e10cSrcweir try { 171cdf0e10cSrcweir tester.update() ; 172cdf0e10cSrcweir oObj.cancelRowUpdates() ; 173cdf0e10cSrcweir 174cdf0e10cSrcweir result = !tester.wasUpdated() ; 175cdf0e10cSrcweir } catch (SQLException e) { 176cdf0e10cSrcweir e.printStackTrace(log) ; 177cdf0e10cSrcweir result = false ; 178cdf0e10cSrcweir } 179cdf0e10cSrcweir tRes.tested("cancelRowUpdates()", result) ; 180cdf0e10cSrcweir } 181cdf0e10cSrcweir 182cdf0e10cSrcweir /** 183cdf0e10cSrcweir * Tries to move cursor to insert row. Then checks current row 184cdf0e10cSrcweir * number. It must be less than 1. (0 as I know) <p> 185cdf0e10cSrcweir */ _moveToInsertRow()186cdf0e10cSrcweir public void _moveToInsertRow() { 187cdf0e10cSrcweir boolean result = true ; 188cdf0e10cSrcweir try { 189cdf0e10cSrcweir oObj.moveToInsertRow() ; 190cdf0e10cSrcweir 191cdf0e10cSrcweir result = tester.currentRow() < 1 ; 192cdf0e10cSrcweir } catch (SQLException e) { 193cdf0e10cSrcweir e.printStackTrace(log) ; 194cdf0e10cSrcweir result = false ; 195cdf0e10cSrcweir } 196cdf0e10cSrcweir tRes.tested("moveToInsertRow()", result) ; 197cdf0e10cSrcweir } 198cdf0e10cSrcweir 199cdf0e10cSrcweir /** 200cdf0e10cSrcweir * Returns cursor from insert row back to previous row. <p> 201cdf0e10cSrcweir * <code>moveToInsertRow</code> method test must be executed 202cdf0e10cSrcweir * first for positioning curosr to insert row. <p> 203cdf0e10cSrcweir * Has OK status if after method call current row number is 204cdf0e10cSrcweir * above 0. 205cdf0e10cSrcweir */ 206cdf0e10cSrcweir public void _moveToCurrentRow() { 207cdf0e10cSrcweir boolean result = true ; 208cdf0e10cSrcweir try { 209cdf0e10cSrcweir oObj.moveToCurrentRow() ; 210cdf0e10cSrcweir 211cdf0e10cSrcweir result = tester.currentRow() >= 1 ; 212cdf0e10cSrcweir } catch (SQLException e) { 213cdf0e10cSrcweir e.printStackTrace(log) ; 214cdf0e10cSrcweir result = false ; 215cdf0e10cSrcweir } 216cdf0e10cSrcweir tRes.tested("moveToCurrentRow()", result) ; 217cdf0e10cSrcweir } 218cdf0e10cSrcweir 219cdf0e10cSrcweir /** 220cdf0e10cSrcweir * Moves cursor to the insert row, then calls the method 221cdf0e10cSrcweir * <code>insertRow</code>. Before and after call stores 222cdf0e10cSrcweir * total number of rows. <p> 223cdf0e10cSrcweir * Has OK status if after method call rows number increases 224cdf0e10cSrcweir * by one. 225cdf0e10cSrcweir */ _insertRow()226cdf0e10cSrcweir public void _insertRow() { 227cdf0e10cSrcweir executeMethod("moveToInsertRow()") ; 228cdf0e10cSrcweir boolean result = true ; 229cdf0e10cSrcweir try { 230cdf0e10cSrcweir oObj.moveToCurrentRow(); 231cdf0e10cSrcweir int rowsBefore = tester.rowCount() ; 232cdf0e10cSrcweir oObj.moveToInsertRow() ; 233cdf0e10cSrcweir XRowUpdate rowU = (XRowUpdate) 234cdf0e10cSrcweir UnoRuntime.queryInterface(XRowUpdate.class, oObj); 235cdf0e10cSrcweir rowU.updateString(1,"open"); 236cdf0e10cSrcweir rowU.updateInt(2,5); 237cdf0e10cSrcweir rowU.updateDouble(5,3.4); 238cdf0e10cSrcweir rowU.updateBoolean(10,true); 239cdf0e10cSrcweir oObj.insertRow() ; 240cdf0e10cSrcweir oObj.moveToCurrentRow(); 241cdf0e10cSrcweir int rowsAfter = tester.rowCount() ; 242cdf0e10cSrcweir result = rowsBefore + 1 == rowsAfter ; 243cdf0e10cSrcweir } catch (SQLException e) { 244cdf0e10cSrcweir e.printStackTrace(log) ; 245cdf0e10cSrcweir log.println("******"+e.getMessage()); 246cdf0e10cSrcweir result = false ; 247cdf0e10cSrcweir } 248cdf0e10cSrcweir tRes.tested("insertRow()", result) ; 249cdf0e10cSrcweir } 250cdf0e10cSrcweir 251cdf0e10cSrcweir /** 252cdf0e10cSrcweir * Forces environment to be recreated. 253cdf0e10cSrcweir */ after()254cdf0e10cSrcweir public void after() { 255cdf0e10cSrcweir //disposeEnvironment() ; 256cdf0e10cSrcweir } 257cdf0e10cSrcweir } // finish class _XResultSetUpdate 258cdf0e10cSrcweir 259cdf0e10cSrcweir 260