1 /* 2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 package test.rowset.serial; 24 25 import java.net.URL; 26 import java.sql.Array; 27 import java.sql.Blob; 28 import java.sql.Clob; 29 import java.sql.Ref; 30 import java.sql.SQLException; 31 import java.sql.Struct; 32 import java.util.Arrays; 33 import java.util.HashMap; 34 import java.util.Map; 35 import javax.sql.rowset.serial.SQLInputImpl; 36 import static org.testng.Assert.*; 37 import org.testng.annotations.BeforeMethod; 38 import org.testng.annotations.Test; 39 import util.BaseTest; 40 import util.StubArray; 41 import util.StubBlob; 42 import util.StubClob; 43 import util.StubRef; 44 import util.StubStruct; 45 import util.SuperHero; 46 import util.TestSQLDataImpl; 47 48 public class SQLInputImplTests extends BaseTest { 49 50 // Copy of the array of data type values 51 private Object[] typeValues; 52 private TestSQLDataImpl impl; 53 private Map<String, Class<?>> map ; 54 private SuperHero hero; 55 private final String sqlType = "SUPERHERO"; 56 57 @BeforeMethod 58 @Override 59 public void setUpMethod() throws Exception { 60 map = new HashMap<>(); 61 impl = new TestSQLDataImpl("TestSQLData"); 62 typeValues = Arrays.copyOf(TestSQLDataImpl.attributes, 63 TestSQLDataImpl.attributes.length); 64 hero = new SuperHero(sqlType, "Bruce", "Wayne", 65 1939, "Batman"); 66 } 67 68 /* 69 * Validate that a SQLException is thrown if the attribute value is 70 * null 71 */ 72 @Test(expectedExceptions = SQLException.class) 73 public void test() throws Exception { 74 SQLInputImpl x = new SQLInputImpl(null, map); 75 } 76 77 /* 78 * Validate that a SQLException is thrown if the map value is 79 * null 80 */ 81 @Test(expectedExceptions = SQLException.class) 82 public void test02() throws Exception { 83 SQLInputImpl x = new SQLInputImpl(typeValues, null); 84 } 85 86 /* 87 * Read in the various datatypes via readSQL (which will exercise the 88 * various readXXX methods and validate that results are as expected 89 */ 90 @Test() 91 public void test03() throws Exception { 92 impl.readSQL(new SQLInputImpl(typeValues, map), "misc"); 93 assertTrue(Arrays.equals(impl.toArray(), typeValues)); 94 // Null out a field and make sure the arrays do not match 95 typeValues[2] = null; 96 assertFalse(Arrays.equals(impl.toArray(), typeValues)); 97 } 98 99 /* 100 * Validate that wasNull indicates if a null was read in 101 */ 102 @Test() 103 public void test04() throws Exception { 104 Object[] values = {"Hello", null, 1}; 105 SQLInputImpl sqli = new SQLInputImpl(values, map); 106 String s = sqli.readString(); 107 assertFalse(sqli.wasNull()); 108 s = sqli.readString(); 109 assertTrue(sqli.wasNull()); 110 int i = sqli.readInt(); 111 assertFalse(sqli.wasNull()); 112 } 113 114 /* 115 * Validate that readObject returns the correct value 116 */ 117 @Test() 118 public void test05() throws Exception { 119 Object[] values = {hero}; 120 SQLInputImpl sqli = new SQLInputImpl(values, map); 121 Object o = sqli.readObject(); 122 assertTrue(hero.equals(o)); 123 124 } 125 126 /* 127 * Validate a Array can be read 128 */ 129 @Test(enabled = true) 130 public void test06() throws Exception { 131 Object[] coffees = new Object[]{"Espresso", "Colombian", "French Roast", 132 "Cappuccino"}; 133 Array a = new StubArray("VARCHAR", coffees); 134 Object[] values = {a}; 135 SQLInputImpl sqli = new SQLInputImpl(values, map); 136 Array a2 = sqli.readArray(); 137 assertTrue(Arrays.equals((Object[]) a2.getArray(), (Object[]) a.getArray())); 138 assertTrue(a.getBaseTypeName().equals(a2.getBaseTypeName())); 139 } 140 141 /* 142 * Validate a Blob can be read 143 */ 144 @Test(enabled = true) 145 public void test07() throws Exception { 146 Blob b = new StubBlob(); 147 Object[] values = {b}; 148 SQLInputImpl sqli = new SQLInputImpl(values, map); 149 Blob b2 = sqli.readBlob(); 150 assertTrue(Arrays.equals( 151 b.getBytes(1, (int) b.length()), 152 b2.getBytes(1, (int) b2.length()))); 153 } 154 155 /* 156 * Validate a Clob can be read 157 */ 158 @Test(enabled = true) 159 public void test08() throws Exception { 160 Clob c = new StubClob(); 161 Object[] values = {c}; 162 SQLInputImpl sqli = new SQLInputImpl(values, map); 163 Clob c2 = sqli.readClob(); 164 assertTrue(c.getSubString(1, 165 (int) c.length()).equals(c2.getSubString(1, (int) c2.length()))); 166 } 167 168 /* 169 * Validate a Ref can be read 170 */ 171 @Test(enabled = true) 172 public void test09() throws Exception { 173 Ref ref = new StubRef(sqlType, hero); 174 Object[] values = {ref}; 175 SQLInputImpl sqli = new SQLInputImpl(values, map); 176 Ref ref2 = sqli.readRef(); 177 assertTrue(ref.getObject().equals(ref2.getObject())); 178 assertTrue(ref.getBaseTypeName().equals(ref2.getBaseTypeName())); 179 } 180 181 /* 182 * Validate a URL can be read 183 */ 184 @Test(enabled = true) 185 public void test10() throws Exception { 186 URL u = new URL("http://www.oracle.com/");; 187 Object[] values = {u}; 188 SQLInputImpl sqli = new SQLInputImpl(values, map); 189 URL u2 = sqli.readURL(); 190 assertTrue(u2.equals(u)); 191 assertTrue(u2.sameFile(u)); 192 } 193 194 /* 195 * Validate that readObject returns the correct value when a Struct is 196 * next on the stream 197 */ 198 @Test() 199 public void test11() throws Exception { 200 Object[] attributes = new Object[]{"Bruce", "Wayne", 1939, 201 "Batman"}; 202 map.put(sqlType, Class.forName("util.SuperHero")); 203 Struct struct = new StubStruct(sqlType, attributes); 204 Object[] values = {struct}; 205 SQLInputImpl sqli = new SQLInputImpl(values, map); 206 Object o = sqli.readObject(); 207 208 assertTrue(hero.equals(o)); 209 210 } 211 }