1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski package complex.storages; 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski import com.sun.star.uno.XInterface; 25*b1cdbd2cSJim Jagielski import com.sun.star.lang.XMultiServiceFactory; 26*b1cdbd2cSJim Jagielski import com.sun.star.lang.XSingleServiceFactory; 27*b1cdbd2cSJim Jagielski 28*b1cdbd2cSJim Jagielski import com.sun.star.bridge.XUnoUrlResolver; 29*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime; 30*b1cdbd2cSJim Jagielski import com.sun.star.uno.XInterface; 31*b1cdbd2cSJim Jagielski import com.sun.star.io.XStream; 32*b1cdbd2cSJim Jagielski import com.sun.star.io.XInputStream; 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski import com.sun.star.embed.*; 35*b1cdbd2cSJim Jagielski 36*b1cdbd2cSJim Jagielski import share.LogWriter; 37*b1cdbd2cSJim Jagielski import complex.storages.TestHelper; 38*b1cdbd2cSJim Jagielski import complex.storages.StorageTest; 39*b1cdbd2cSJim Jagielski 40*b1cdbd2cSJim Jagielski public class RegressionTest_i59886 implements StorageTest { 41*b1cdbd2cSJim Jagielski 42*b1cdbd2cSJim Jagielski XMultiServiceFactory m_xMSF; 43*b1cdbd2cSJim Jagielski XSingleServiceFactory m_xStorageFactory; 44*b1cdbd2cSJim Jagielski TestHelper m_aTestHelper; 45*b1cdbd2cSJim Jagielski RegressionTest_i59886( XMultiServiceFactory xMSF, XSingleServiceFactory xStorageFactory, LogWriter aLogWriter )46*b1cdbd2cSJim Jagielski public RegressionTest_i59886( XMultiServiceFactory xMSF, XSingleServiceFactory xStorageFactory, LogWriter aLogWriter ) 47*b1cdbd2cSJim Jagielski { 48*b1cdbd2cSJim Jagielski m_xMSF = xMSF; 49*b1cdbd2cSJim Jagielski m_xStorageFactory = xStorageFactory; 50*b1cdbd2cSJim Jagielski m_aTestHelper = new TestHelper( aLogWriter, "RegressionTest_i59886: " ); 51*b1cdbd2cSJim Jagielski } 52*b1cdbd2cSJim Jagielski test()53*b1cdbd2cSJim Jagielski public boolean test() 54*b1cdbd2cSJim Jagielski { 55*b1cdbd2cSJim Jagielski try 56*b1cdbd2cSJim Jagielski { 57*b1cdbd2cSJim Jagielski XStream xTempFileStream = m_aTestHelper.CreateTempFileStream( m_xMSF ); 58*b1cdbd2cSJim Jagielski if ( xTempFileStream == null ) 59*b1cdbd2cSJim Jagielski return false; 60*b1cdbd2cSJim Jagielski 61*b1cdbd2cSJim Jagielski // create storage based on the temporary stream 62*b1cdbd2cSJim Jagielski Object pArgs[] = new Object[2]; 63*b1cdbd2cSJim Jagielski pArgs[0] = (Object) xTempFileStream; 64*b1cdbd2cSJim Jagielski pArgs[1] = new Integer( ElementModes.WRITE ); 65*b1cdbd2cSJim Jagielski 66*b1cdbd2cSJim Jagielski Object oTempStorage = m_xStorageFactory.createInstanceWithArguments( pArgs ); 67*b1cdbd2cSJim Jagielski XStorage xTempStorage = (XStorage) UnoRuntime.queryInterface( XStorage.class, oTempStorage ); 68*b1cdbd2cSJim Jagielski if ( xTempStorage == null ) 69*b1cdbd2cSJim Jagielski { 70*b1cdbd2cSJim Jagielski m_aTestHelper.Error( "Can't create temporary storage representation!" ); 71*b1cdbd2cSJim Jagielski return false; 72*b1cdbd2cSJim Jagielski } 73*b1cdbd2cSJim Jagielski 74*b1cdbd2cSJim Jagielski byte pBytes[] = new byte[36000]; 75*b1cdbd2cSJim Jagielski for ( int nInd = 0; nInd < 36000; nInd++ ) 76*b1cdbd2cSJim Jagielski pBytes[nInd] = (byte)( nInd % 128 ); 77*b1cdbd2cSJim Jagielski 78*b1cdbd2cSJim Jagielski String sPass = "12345"; 79*b1cdbd2cSJim Jagielski 80*b1cdbd2cSJim Jagielski // open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes 81*b1cdbd2cSJim Jagielski if ( !m_aTestHelper.WriteBytesToEncrSubstream( xTempStorage, "SubStream1", "MediaType1", true, pBytes, sPass ) ) 82*b1cdbd2cSJim Jagielski return false; 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski // open a new substorage 85*b1cdbd2cSJim Jagielski XStorage xTempSubStorage = m_aTestHelper.openSubStorage( xTempStorage, 86*b1cdbd2cSJim Jagielski "SubStorage1", 87*b1cdbd2cSJim Jagielski ElementModes.WRITE ); 88*b1cdbd2cSJim Jagielski if ( xTempSubStorage == null ) 89*b1cdbd2cSJim Jagielski { 90*b1cdbd2cSJim Jagielski m_aTestHelper.Error( "Can't create substorage!" ); 91*b1cdbd2cSJim Jagielski return false; 92*b1cdbd2cSJim Jagielski } 93*b1cdbd2cSJim Jagielski 94*b1cdbd2cSJim Jagielski // open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes 95*b1cdbd2cSJim Jagielski if ( !m_aTestHelper.WriteBytesToEncrSubstream( xTempSubStorage, "SubStream2", "MediaType2", false, pBytes, sPass ) ) 96*b1cdbd2cSJim Jagielski return false; 97*b1cdbd2cSJim Jagielski 98*b1cdbd2cSJim Jagielski // set "MediaType" property for storages and check that "IsRoot" and "OpenMode" properties are set correctly 99*b1cdbd2cSJim Jagielski if ( !m_aTestHelper.setStorageTypeAndCheckProps( xTempStorage, 100*b1cdbd2cSJim Jagielski "MediaType3", 101*b1cdbd2cSJim Jagielski true, 102*b1cdbd2cSJim Jagielski ElementModes.WRITE ) ) 103*b1cdbd2cSJim Jagielski return false; 104*b1cdbd2cSJim Jagielski 105*b1cdbd2cSJim Jagielski // set "MediaType" property for storages and check that "IsRoot" and "OpenMode" properties are set correctly 106*b1cdbd2cSJim Jagielski if ( !m_aTestHelper.setStorageTypeAndCheckProps( xTempSubStorage, 107*b1cdbd2cSJim Jagielski "MediaType4", 108*b1cdbd2cSJim Jagielski false, 109*b1cdbd2cSJim Jagielski ElementModes.WRITE ) ) 110*b1cdbd2cSJim Jagielski return false; 111*b1cdbd2cSJim Jagielski 112*b1cdbd2cSJim Jagielski // commit substorage first 113*b1cdbd2cSJim Jagielski if ( !m_aTestHelper.commitStorage( xTempSubStorage ) ) 114*b1cdbd2cSJim Jagielski return false; 115*b1cdbd2cSJim Jagielski 116*b1cdbd2cSJim Jagielski // commit the root storage so the contents must be stored now 117*b1cdbd2cSJim Jagielski if ( !m_aTestHelper.commitStorage( xTempStorage ) ) 118*b1cdbd2cSJim Jagielski return false; 119*b1cdbd2cSJim Jagielski 120*b1cdbd2cSJim Jagielski // dispose used storage to free resources 121*b1cdbd2cSJim Jagielski if ( !m_aTestHelper.disposeStorage( xTempStorage ) ) 122*b1cdbd2cSJim Jagielski return false; 123*b1cdbd2cSJim Jagielski 124*b1cdbd2cSJim Jagielski // ================================================ 125*b1cdbd2cSJim Jagielski // now reopen the storage, set the common storage key 126*b1cdbd2cSJim Jagielski // and copy the storage 127*b1cdbd2cSJim Jagielski // ================================================ 128*b1cdbd2cSJim Jagielski 129*b1cdbd2cSJim Jagielski Object oStep2TempStorage = m_xStorageFactory.createInstanceWithArguments( pArgs ); 130*b1cdbd2cSJim Jagielski XStorage xStep2TempStorage = (XStorage) UnoRuntime.queryInterface( XStorage.class, oStep2TempStorage ); 131*b1cdbd2cSJim Jagielski if ( xStep2TempStorage == null ) 132*b1cdbd2cSJim Jagielski { 133*b1cdbd2cSJim Jagielski m_aTestHelper.Error( "Can't create temporary storage representation!" ); 134*b1cdbd2cSJim Jagielski return false; 135*b1cdbd2cSJim Jagielski } 136*b1cdbd2cSJim Jagielski 137*b1cdbd2cSJim Jagielski 138*b1cdbd2cSJim Jagielski XStorage xStep2TempSubStorage = m_aTestHelper.openSubStorage( xStep2TempStorage, 139*b1cdbd2cSJim Jagielski "SubStorage1", 140*b1cdbd2cSJim Jagielski ElementModes.WRITE ); 141*b1cdbd2cSJim Jagielski if ( xStep2TempSubStorage == null ) 142*b1cdbd2cSJim Jagielski { 143*b1cdbd2cSJim Jagielski m_aTestHelper.Error( "Can't create substorage!" ); 144*b1cdbd2cSJim Jagielski return false; 145*b1cdbd2cSJim Jagielski } 146*b1cdbd2cSJim Jagielski 147*b1cdbd2cSJim Jagielski // set the common storage password 148*b1cdbd2cSJim Jagielski XEncryptionProtectedSource xEncr = (XEncryptionProtectedSource) UnoRuntime.queryInterface( XEncryptionProtectedSource.class, xStep2TempStorage ); 149*b1cdbd2cSJim Jagielski if ( xEncr == null ) 150*b1cdbd2cSJim Jagielski { 151*b1cdbd2cSJim Jagielski m_aTestHelper.Error( "The storage does not support encryption access!" ); 152*b1cdbd2cSJim Jagielski return false; 153*b1cdbd2cSJim Jagielski } 154*b1cdbd2cSJim Jagielski try 155*b1cdbd2cSJim Jagielski { 156*b1cdbd2cSJim Jagielski xEncr.setEncryptionPassword( sPass ); 157*b1cdbd2cSJim Jagielski } 158*b1cdbd2cSJim Jagielski catch( Exception e ) 159*b1cdbd2cSJim Jagielski { 160*b1cdbd2cSJim Jagielski m_aTestHelper.Error( "Can not set the common storage password!" ); 161*b1cdbd2cSJim Jagielski return false; 162*b1cdbd2cSJim Jagielski } 163*b1cdbd2cSJim Jagielski 164*b1cdbd2cSJim Jagielski // open the stream for writing and read them so that the cache is created, but do not change 165*b1cdbd2cSJim Jagielski byte pDummyData[][] = new byte[1][3]; 166*b1cdbd2cSJim Jagielski XStream xTempStream1 = m_aTestHelper.OpenStream( xStep2TempStorage, "SubStream1", ElementModes.WRITE ); 167*b1cdbd2cSJim Jagielski XStream xTempStream2 = m_aTestHelper.OpenStream( xStep2TempSubStorage, "SubStream2", ElementModes.WRITE ); 168*b1cdbd2cSJim Jagielski if ( xTempStream1 == null || xTempStream2 == null ) 169*b1cdbd2cSJim Jagielski return false; 170*b1cdbd2cSJim Jagielski 171*b1cdbd2cSJim Jagielski XInputStream xTempInStream1 = xTempStream1.getInputStream(); 172*b1cdbd2cSJim Jagielski XInputStream xTempInStream2 = xTempStream2.getInputStream(); 173*b1cdbd2cSJim Jagielski if ( xTempInStream1 == null || xTempInStream2 == null ) 174*b1cdbd2cSJim Jagielski { 175*b1cdbd2cSJim Jagielski m_aTestHelper.Error( "No input stream is available!" ); 176*b1cdbd2cSJim Jagielski return false; 177*b1cdbd2cSJim Jagielski } 178*b1cdbd2cSJim Jagielski 179*b1cdbd2cSJim Jagielski xTempInStream1.readBytes( pDummyData, 3 ); 180*b1cdbd2cSJim Jagielski xTempInStream2.readBytes( pDummyData, 3 ); 181*b1cdbd2cSJim Jagielski 182*b1cdbd2cSJim Jagielski 183*b1cdbd2cSJim Jagielski // create temporary storage, it will be checked later 184*b1cdbd2cSJim Jagielski Object oTargetStorage = m_xStorageFactory.createInstance(); 185*b1cdbd2cSJim Jagielski XStorage xTargetStorage = (XStorage) UnoRuntime.queryInterface( XStorage.class, oTargetStorage ); 186*b1cdbd2cSJim Jagielski if ( xTargetStorage == null ) 187*b1cdbd2cSJim Jagielski { 188*b1cdbd2cSJim Jagielski m_aTestHelper.Error( "Can't create temporary storage representation!" ); 189*b1cdbd2cSJim Jagielski return false; 190*b1cdbd2cSJim Jagielski } 191*b1cdbd2cSJim Jagielski 192*b1cdbd2cSJim Jagielski // copy the current storage to the target 193*b1cdbd2cSJim Jagielski try 194*b1cdbd2cSJim Jagielski { 195*b1cdbd2cSJim Jagielski xStep2TempStorage.copyToStorage( xTargetStorage ); 196*b1cdbd2cSJim Jagielski } 197*b1cdbd2cSJim Jagielski catch( Exception e ) 198*b1cdbd2cSJim Jagielski { 199*b1cdbd2cSJim Jagielski m_aTestHelper.Error( "Can not copy the storage with common storage password!" ); 200*b1cdbd2cSJim Jagielski return false; 201*b1cdbd2cSJim Jagielski } 202*b1cdbd2cSJim Jagielski 203*b1cdbd2cSJim Jagielski // dispose used storage to free resources 204*b1cdbd2cSJim Jagielski if ( !m_aTestHelper.disposeStorage( xStep2TempStorage ) ) 205*b1cdbd2cSJim Jagielski return false; 206*b1cdbd2cSJim Jagielski 207*b1cdbd2cSJim Jagielski // ================================================ 208*b1cdbd2cSJim Jagielski // now check all the information in the copy 209*b1cdbd2cSJim Jagielski // ================================================ 210*b1cdbd2cSJim Jagielski 211*b1cdbd2cSJim Jagielski if ( !m_aTestHelper.checkStorageProperties( xTargetStorage, "MediaType3", true, ElementModes.WRITE ) ) 212*b1cdbd2cSJim Jagielski return false; 213*b1cdbd2cSJim Jagielski 214*b1cdbd2cSJim Jagielski // open existing substorage 215*b1cdbd2cSJim Jagielski XStorage xTargetSubStorage = m_aTestHelper.openSubStorage( xTargetStorage, 216*b1cdbd2cSJim Jagielski "SubStorage1", 217*b1cdbd2cSJim Jagielski ElementModes.WRITE ); 218*b1cdbd2cSJim Jagielski if ( xTargetSubStorage == null ) 219*b1cdbd2cSJim Jagielski { 220*b1cdbd2cSJim Jagielski m_aTestHelper.Error( "Can't open existing substorage!" ); 221*b1cdbd2cSJim Jagielski return false; 222*b1cdbd2cSJim Jagielski } 223*b1cdbd2cSJim Jagielski 224*b1cdbd2cSJim Jagielski if ( !m_aTestHelper.checkStorageProperties( xTargetSubStorage, "MediaType4", false, ElementModes.WRITE ) ) 225*b1cdbd2cSJim Jagielski return false; 226*b1cdbd2cSJim Jagielski 227*b1cdbd2cSJim Jagielski // set the common storage password 228*b1cdbd2cSJim Jagielski XEncryptionProtectedSource xTargetEncr = (XEncryptionProtectedSource) UnoRuntime.queryInterface( XEncryptionProtectedSource.class, xTargetStorage ); 229*b1cdbd2cSJim Jagielski if ( xTargetEncr == null ) 230*b1cdbd2cSJim Jagielski { 231*b1cdbd2cSJim Jagielski m_aTestHelper.Error( "The storage does not support encryption access!" ); 232*b1cdbd2cSJim Jagielski return false; 233*b1cdbd2cSJim Jagielski } 234*b1cdbd2cSJim Jagielski try 235*b1cdbd2cSJim Jagielski { 236*b1cdbd2cSJim Jagielski xTargetEncr.setEncryptionPassword( sPass ); 237*b1cdbd2cSJim Jagielski } 238*b1cdbd2cSJim Jagielski catch( Exception e ) 239*b1cdbd2cSJim Jagielski { 240*b1cdbd2cSJim Jagielski m_aTestHelper.Error( "Can not set the common storage password!" ); 241*b1cdbd2cSJim Jagielski return false; 242*b1cdbd2cSJim Jagielski } 243*b1cdbd2cSJim Jagielski 244*b1cdbd2cSJim Jagielski // check the streams 245*b1cdbd2cSJim Jagielski if ( !m_aTestHelper.checkStream( xTargetStorage, "SubStream1", "MediaType1", true, pBytes ) ) 246*b1cdbd2cSJim Jagielski return false; 247*b1cdbd2cSJim Jagielski if ( !m_aTestHelper.checkStream( xTargetSubStorage, "SubStream2", "MediaType2", true, pBytes ) ) 248*b1cdbd2cSJim Jagielski return false; 249*b1cdbd2cSJim Jagielski 250*b1cdbd2cSJim Jagielski 251*b1cdbd2cSJim Jagielski // dispose used storages to free resources 252*b1cdbd2cSJim Jagielski if ( !m_aTestHelper.disposeStorage( xTargetStorage ) ) 253*b1cdbd2cSJim Jagielski return false; 254*b1cdbd2cSJim Jagielski 255*b1cdbd2cSJim Jagielski return true; 256*b1cdbd2cSJim Jagielski } 257*b1cdbd2cSJim Jagielski catch( Exception e ) 258*b1cdbd2cSJim Jagielski { 259*b1cdbd2cSJim Jagielski m_aTestHelper.Error( "Exception: " + e ); 260*b1cdbd2cSJim Jagielski return false; 261*b1cdbd2cSJim Jagielski } 262*b1cdbd2cSJim Jagielski } 263*b1cdbd2cSJim Jagielski } 264*b1cdbd2cSJim Jagielski 265