| /* |
| * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| package test.rowset; |
| |
| import com.sun.rowset.RowSetFactoryImpl; |
| import java.io.File; |
| import java.net.URL; |
| import java.net.URLClassLoader; |
| import java.sql.SQLException; |
| import javax.sql.rowset.RowSetFactory; |
| import javax.sql.rowset.RowSetProvider; |
| import static org.testng.Assert.*; |
| import org.testng.annotations.AfterClass; |
| import org.testng.annotations.AfterMethod; |
| import org.testng.annotations.BeforeClass; |
| import org.testng.annotations.DataProvider; |
| import org.testng.annotations.Test; |
| import util.BaseTest; |
| import util.StubRowSetFactory; |
| |
| public class RowSetProviderTests extends BaseTest { |
| |
| // Default RowSetFactory Implementation |
| private final String DEFFAULT_FACTORY_CLASSNAME = "com.sun.rowset.RowSetFactoryImpl"; |
| // Stub RowSetFactory Implementation |
| private final String STUB_FACTORY_CLASSNAME = "util.StubRowSetFactory"; |
| // Indicator that the factory implementation does not need to be checked |
| private final String NO_VALADATE_IMPL = ""; |
| // Original System property value for javax.sql.rowset.RowSetFactory |
| private static String origFactoryProperty; |
| // Original ClassLoader |
| private static ClassLoader cl; |
| // Path to the location of the jar files used by the ServiceLoader API |
| private static String jarPath; |
| |
| /* |
| * Save off the original property value for javax.sql.rowset.RowSetFactory, |
| * original classloader and define the path to the jars directory |
| */ |
| @BeforeClass |
| public static void setUpClass() throws Exception { |
| origFactoryProperty = System.getProperty("javax.sql.rowset.RowSetFactory"); |
| cl = Thread.currentThread().getContextClassLoader(); |
| jarPath = System.getProperty("test.src", ".") + File.separatorChar |
| + "jars" + File.separatorChar; |
| } |
| |
| /* |
| * Install the original javax.sql.rowset.RowSetFactory property value |
| */ |
| @AfterClass |
| public static void tearDownClass() throws Exception { |
| if (origFactoryProperty != null) { |
| System.setProperty("javax.sql.rowset.RowSetFactory", |
| origFactoryProperty); |
| } |
| } |
| |
| /* |
| * Clear the javax.sql.rowset.RowSetFactory property value and |
| * reset the classloader to its original value |
| */ |
| @AfterMethod |
| public void tearDownMethod() throws Exception { |
| System.clearProperty("javax.sql.rowset.RowSetFactory"); |
| Thread.currentThread().setContextClassLoader(cl); |
| } |
| |
| /* |
| * Validate that the correct RowSetFactory is returned by newFactory(). |
| */ |
| @Test(dataProvider = "RowSetFactoryValues") |
| public void test(RowSetFactory rsf, String impl) throws SQLException { |
| validateProvider(rsf, impl); |
| } |
| |
| /* |
| * Validate that the default RowSetFactory is returned by newFactory() |
| * when specified by the javax.sql.rowset.RowSetFactory property. |
| */ |
| @Test |
| public void test01() throws SQLException { |
| System.setProperty("javax.sql.rowset.RowSetFactory", |
| DEFFAULT_FACTORY_CLASSNAME); |
| validateProvider(RowSetProvider.newFactory(), DEFFAULT_FACTORY_CLASSNAME); |
| } |
| |
| /* |
| * Validate that the correct RowSetFactory is returned by newFactory() |
| * when specified by the javax.sql.rowset.RowSetFactory property. |
| */ |
| @Test(enabled = true) |
| public void test02() throws SQLException { |
| System.setProperty("javax.sql.rowset.RowSetFactory", STUB_FACTORY_CLASSNAME); |
| validateProvider(RowSetProvider.newFactory(), STUB_FACTORY_CLASSNAME); |
| } |
| |
| /* |
| * Validate that a SQLException is thrown by newFactory() |
| * when specified RowSetFactory specified by the |
| * javax.sql.rowset.RowSetFactory property is not valid. |
| */ |
| @Test(expectedExceptions = SQLException.class) |
| public void test03() throws SQLException { |
| System.setProperty("javax.sql.rowset.RowSetFactory", |
| "invalid.RowSetFactoryImpl"); |
| RowSetFactory rsf = RowSetProvider.newFactory(); |
| } |
| |
| /* |
| * Validate that the correct RowSetFactory is returned by newFactory() |
| * when specified by the ServiceLoader API. |
| */ |
| @Test |
| public void test04() throws Exception { |
| File f = new File(jarPath + "goodFactory"); |
| URLClassLoader loader = new URLClassLoader(new URL[]{ |
| new URL(f.toURI().toString())}, getClass().getClassLoader()); |
| Thread.currentThread().setContextClassLoader(loader); |
| validateProvider(RowSetProvider.newFactory(), STUB_FACTORY_CLASSNAME); |
| } |
| |
| /* |
| * Validate that a SQLException is thrown by newFactory() if the default |
| * RowSetFactory specified by the ServiceLoader API is not valid |
| */ |
| @Test(expectedExceptions = SQLException.class) |
| public void test05() throws Exception { |
| File f = new File(jarPath + "badFactory"); |
| URLClassLoader loader = new URLClassLoader(new URL[]{ |
| new URL(f.toURI().toString())}, getClass().getClassLoader()); |
| Thread.currentThread().setContextClassLoader(loader); |
| RowSetProvider.newFactory(); |
| } |
| |
| /* |
| * Utility Method to validate that the RowsetFactory returned from |
| * RowSetProvider.newFactory() is correct |
| */ |
| private void validateProvider(RowSetFactory rsf, String implName) { |
| assertNotNull(rsf, "RowSetFactory should not be null"); |
| switch (implName) { |
| case DEFFAULT_FACTORY_CLASSNAME: |
| assertTrue(rsf instanceof RowSetFactoryImpl); |
| break; |
| case STUB_FACTORY_CLASSNAME: |
| assertTrue(rsf instanceof StubRowSetFactory); |
| break; |
| default: |
| } |
| } |
| |
| /* |
| * DataProvider used to provide a RowSetFactory and the expected |
| * RowSetFactory implementation that should be returned |
| */ |
| @DataProvider(name = "RowSetFactoryValues") |
| private Object[][] RowSetFactoryValues() throws SQLException { |
| RowSetFactory rsf = RowSetProvider.newFactory(); |
| RowSetFactory rsf1 = RowSetProvider.newFactory(STUB_FACTORY_CLASSNAME, null); |
| RowSetFactory rsf2 = RowSetProvider.newFactory(DEFFAULT_FACTORY_CLASSNAME, null); |
| return new Object[][]{ |
| {rsf, NO_VALADATE_IMPL}, |
| {rsf, DEFFAULT_FACTORY_CLASSNAME}, |
| {rsf1, STUB_FACTORY_CLASSNAME}, |
| {rsf2, DEFFAULT_FACTORY_CLASSNAME} |
| }; |
| } |
| } |