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 */
23package test.sql;
24
25import java.io.ByteArrayInputStream;
26import java.io.File;
27import java.io.ObjectInputStream;
28import java.sql.BatchUpdateException;
29import java.sql.SQLException;
30import java.util.Arrays;
31import static org.testng.Assert.*;
32import org.testng.annotations.Test;
33import util.SerializedBatchUpdateException;
34import util.BaseTest;
35
36public class BatchUpdateExceptionTests extends BaseTest {
37
38    private final int[] uc = {1, 2, 3};
39    private final long[] luc = {1, 2, 3};
40
41    private final String testSrcDir = System.getProperty("test.src", ".")
42            + File.separatorChar;
43
44    /**
45     * Create BatchUpdateException and setting all objects to null
46     */
47    @Test
48    public void test() {
49        BatchUpdateException be = new BatchUpdateException(null,
50                null, errorCode, (int[]) null, null);
51        assertTrue(be.getMessage() == null && be.getSQLState() == null
52                && be.getUpdateCounts() == null && be.getCause() == null
53                && be.getLargeUpdateCounts() == null
54                && be.getErrorCode() == errorCode);
55    }
56
57    /**
58     * Create BatchUpdateException with no-arg constructor
59     */
60    @Test
61    public void test1() {
62        BatchUpdateException ex = new BatchUpdateException();
63        assertTrue(ex.getMessage() == null
64                && ex.getSQLState() == null
65                && ex.getCause() == null
66                && ex.getErrorCode() == 0
67                && ex.getUpdateCounts() == null
68                && ex.getLargeUpdateCounts() == null);
69    }
70
71    /**
72     * Create BatchUpdateException with null Throwable
73     */
74    @Test
75    public void test2() {
76        BatchUpdateException ex = new BatchUpdateException((Throwable) null);
77        assertTrue(ex.getMessage() == null
78                && ex.getSQLState() == null
79                && ex.getCause() == null
80                && ex.getErrorCode() == 0
81                && ex.getUpdateCounts() == null
82                && ex.getLargeUpdateCounts() == null);
83    }
84
85    /**
86     * Create BatchUpdateException with message and update counts
87     */
88    @Test
89    public void test3() {
90
91        BatchUpdateException ex = new BatchUpdateException(reason, uc);
92        assertTrue(ex.getMessage().equals(reason)
93                && ex.getSQLState() == null
94                && ex.getCause() == null
95                && ex.getErrorCode() == 0
96                && Arrays.equals(ex.getUpdateCounts(), uc)
97                && Arrays.equals(ex.getLargeUpdateCounts(), luc)
98        );
99    }
100
101    /**
102     * Create BatchUpdateException with update counts
103     */
104    @Test
105    public void test4() {
106        BatchUpdateException ex = new BatchUpdateException(uc);
107        assertTrue(ex.getMessage() == null
108                && ex.getSQLState() == null
109                && ex.getCause() == null
110                && ex.getErrorCode() == 0
111                && Arrays.equals(ex.getUpdateCounts(), uc)
112                && Arrays.equals(ex.getLargeUpdateCounts(), luc)
113        );
114    }
115
116    /**
117     * Create BatchUpdateException with Throwable and update counts
118     */
119    @Test
120    public void test5() {
121        BatchUpdateException ex = new BatchUpdateException(uc, t);
122        assertTrue(ex.getMessage().equals(cause)
123                && ex.getSQLState() == null
124                && cause.equals(ex.getCause().toString())
125                && ex.getErrorCode() == 0
126                && Arrays.equals(ex.getUpdateCounts(), uc)
127                && Arrays.equals(ex.getLargeUpdateCounts(), luc)
128        );
129    }
130
131    /**
132     * Create BatchUpdateException with message, Throwable, and update counts
133     */
134    @Test
135    public void test6() {
136        BatchUpdateException ex = new BatchUpdateException(reason, uc, t);
137        assertTrue(ex.getMessage().equals(reason)
138                && ex.getSQLState() == null
139                && cause.equals(ex.getCause().toString())
140                && ex.getErrorCode() == 0
141                && Arrays.equals(ex.getUpdateCounts(), uc)
142                && Arrays.equals(ex.getLargeUpdateCounts(), luc)
143        );
144    }
145
146    /**
147     * Create BatchUpdateException with message, SQLState, Throwable, and update
148     * counts
149     */
150    @Test
151    public void test7() {
152        BatchUpdateException ex = new BatchUpdateException(reason, state, uc, t);
153        assertTrue(ex.getMessage().equals(reason)
154                && ex.getSQLState().equals(state)
155                && cause.equals(ex.getCause().toString())
156                && ex.getErrorCode() == 0
157                && Arrays.equals(ex.getUpdateCounts(), uc)
158                && Arrays.equals(ex.getLargeUpdateCounts(), luc)
159        );
160    }
161
162    /**
163     * Create BatchUpdateException with message, SQLState, errorCode code
164     * Throwable, and update counts
165     */
166    @Test
167    public void test8() {
168        BatchUpdateException ex = new BatchUpdateException(reason, state, errorCode,
169                uc, t);
170        assertTrue(ex.getMessage().equals(reason)
171                && ex.getSQLState().equals(state)
172                && cause.equals(ex.getCause().toString())
173                && ex.getErrorCode() == errorCode
174                && Arrays.equals(ex.getUpdateCounts(), uc)
175                && Arrays.equals(ex.getLargeUpdateCounts(), luc)
176        );
177    }
178
179    /**
180     * Create BatchUpdateException with message, SQLState, errorCode code
181     * Throwable, and long [] update counts
182     */
183    @Test
184    public void test9() {
185        BatchUpdateException ex = new BatchUpdateException(reason, state, errorCode,
186                luc, t);
187        assertTrue(ex.getMessage().equals(reason)
188                && ex.getSQLState().equals(state)
189                && cause.equals(ex.getCause().toString())
190                && ex.getErrorCode() == errorCode
191                && Arrays.equals(ex.getUpdateCounts(), uc)
192                && Arrays.equals(ex.getLargeUpdateCounts(), luc)
193        );
194    }
195
196    /**
197     * Validate that a copy of the update counts array is made
198     */
199    @Test
200    public void test10() {
201        int[] uc1 = {1, 2};
202        BatchUpdateException ex = new BatchUpdateException(uc1);
203        assertTrue(Arrays.equals(ex.getUpdateCounts(), uc1));
204        uc1[0] = 6689;
205        assertFalse(Arrays.equals(ex.getUpdateCounts(), uc1));
206    }
207
208    /**
209     * Validate that if null is specified for the update count, it is returned
210     * as null
211     */
212    @Test
213    public void test11() {
214        BatchUpdateException ex = new BatchUpdateException((int[]) null);
215        assertTrue(ex.getMessage() == null && ex.getSQLState() == null
216                && ex.getErrorCode() == 0 && ex.getUpdateCounts() == null
217                && ex.getLargeUpdateCounts() == null);
218    }
219
220    /**
221     * Serialize a BatchUpdateException and make sure you can read it back
222     * properly
223     */
224    @Test
225    public void test12() throws Exception {
226        BatchUpdateException be = new BatchUpdateException(reason, state, errorCode,
227                uc, t);
228        BatchUpdateException bue
229                = createSerializedException(be);
230        assertTrue(reason.equals(bue.getMessage())
231                && bue.getSQLState().equals(state)
232                && cause.equals(bue.getCause().toString())
233                && bue.getErrorCode() == errorCode
234                && Arrays.equals(bue.getLargeUpdateCounts(), luc)
235                && Arrays.equals(bue.getUpdateCounts(), uc));
236    }
237
238
239
240    /**
241     * De-Serialize a BatchUpdateException from JDBC 4.0 and make sure you can
242     * read it back properly
243     */
244    @Test
245    public void test13() throws Exception {
246        String reason1 = "This was the error msg";
247        String state1 = "user defined sqlState";
248        String cause1 = "java.lang.Throwable: throw 1";
249        int errorCode1 = 99999;
250        Throwable t = new Throwable("throw 1");
251        int[] uc1 = {1, 2, 21};
252        long[] luc1 = {1, 2, 21};
253
254        ObjectInputStream ois = new ObjectInputStream(
255                new ByteArrayInputStream(SerializedBatchUpdateException.DATA));
256        BatchUpdateException bue = (BatchUpdateException) ois.readObject();
257        assertTrue(reason1.equals(bue.getMessage())
258                && bue.getSQLState().equals(state1)
259                && bue.getErrorCode() == errorCode1
260                && cause1.equals(bue.getCause().toString())
261                && Arrays.equals(bue.getLargeUpdateCounts(), luc1)
262                && Arrays.equals(bue.getUpdateCounts(), uc1));
263    }
264
265    /**
266     * Serialize a BatchUpdateException with an Integer.MAX_VALUE + 1 and
267     * validate you can read it back properly
268     */
269    @Test
270    public void test14() throws Exception {
271        int[] uc1 = {Integer.MAX_VALUE, Integer.MAX_VALUE + 1};
272        long[] luc1 = {Integer.MAX_VALUE, Integer.MAX_VALUE + 1};
273        BatchUpdateException be = new BatchUpdateException(reason, state, errorCode,
274                luc1, t);
275                BatchUpdateException bue
276                = createSerializedException(be);
277        assertTrue(reason.equals(bue.getMessage())
278                && bue.getSQLState().equals(state)
279                && cause.equals(bue.getCause().toString())
280                && bue.getErrorCode() == errorCode
281                && Arrays.equals(bue.getLargeUpdateCounts(), luc1)
282                && Arrays.equals(bue.getUpdateCounts(), uc1));
283    }
284
285    /**
286     * Validate that the ordering of the returned Exceptions is correct
287     * using for-each loop
288     */
289    @Test
290    public void test15() {
291        BatchUpdateException ex = new BatchUpdateException("Exception 1", uc, t1);
292        BatchUpdateException ex1 = new BatchUpdateException("Exception 2", uc);
293        BatchUpdateException ex2 = new BatchUpdateException("Exception 3", uc, t2);
294        ex.setNextException(ex1);
295        ex.setNextException(ex2);
296        int num = 0;
297        for (Throwable e : ex) {
298            assertTrue(msgs[num++].equals(e.getMessage()));
299        }
300    }
301
302    /**
303     * Validate that the ordering of the returned Exceptions is correct
304     * using traditional while loop
305     */
306    @Test
307    public void test16() {
308        BatchUpdateException ex = new BatchUpdateException("Exception 1", uc,  t1);
309        BatchUpdateException ex1 = new BatchUpdateException("Exception 2", uc);
310        BatchUpdateException ex2 = new BatchUpdateException("Exception 3", uc, t2);
311        ex.setNextException(ex1);
312        ex.setNextException(ex2);
313        SQLException sqe = ex;
314        int num = 0;
315        while (sqe != null) {
316            assertTrue(msgs[num++].equals(sqe.getMessage()));
317            Throwable c = sqe.getCause();
318            while (c != null) {
319                assertTrue(msgs[num++].equals(c.getMessage()));
320                c = c.getCause();
321            }
322            sqe = sqe.getNextException();
323        }
324    }
325
326}
327