1 /* 2 * Copyright (c) 2012, 2013, 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 24 /* 25 * This file is available under and governed by the GNU General Public 26 * License version 2 only, as published by the Free Software Foundation. 27 * However, the following notice accompanied the original version of this 28 * file: 29 * 30 * Copyright (c) 2009-2012, Stephen Colebourne & Michael Nascimento Santos 31 * 32 * All rights reserved. 33 * 34 * Redistribution and use in source and binary forms, with or without 35 * modification, are permitted provided that the following conditions are met: 36 * 37 * * Redistributions of source code must retain the above copyright notice, 38 * this list of conditions and the following disclaimer. 39 * 40 * * Redistributions in binary form must reproduce the above copyright notice, 41 * this list of conditions and the following disclaimer in the documentation 42 * and/or other materials provided with the distribution. 43 * 44 * * Neither the name of JSR-310 nor the names of its contributors 45 * may be used to endorse or promote products derived from this software 46 * without specific prior written permission. 47 * 48 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 49 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 50 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 51 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 52 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 53 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 54 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 55 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 56 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 57 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 58 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 59 */ 60 package tck.java.time.temporal.serial; 61 62 import static org.testng.Assert.assertEquals; 63 import static org.testng.Assert.fail; 64 65 import java.io.ByteArrayInputStream; 66 import java.io.ByteArrayOutputStream; 67 import java.io.IOException; 68 import java.io.InvalidObjectException; 69 import java.io.ObjectInputStream; 70 import java.io.ObjectOutputStream; 71 import java.time.temporal.ValueRange; 72 import java.util.Arrays; 73 74 import org.testng.annotations.Test; 75 76 import tck.java.time.AbstractTCKTest; 77 78 /** 79 * Test serialization of ValueRange. 80 */ 81 @Test 82 public class TCKValueRangeSerialization extends AbstractTCKTest { 83 84 //----------------------------------------------------------------------- 85 // Serialization 86 //----------------------------------------------------------------------- test_serialization()87 public void test_serialization() throws Exception { 88 ValueRange range = ValueRange.of(1, 2, 3, 4); 89 assertSerializable(range); 90 } 91 92 93 /** 94 * Verify Serialized bytes of a ValueRange. 95 * @throws IOException if thrown during serialization is an unexpected test tailure 96 */ test_valueRangeSerialized()97 public void test_valueRangeSerialized() throws IOException { 98 byte[] expected = { 99 (byte)172, (byte)237, 0, 5, 115, 114, 0, 29, 106, 97, /* \u00ac \u00ed \u0000 \u0005 s r \u0000 \u001d j a */ 100 118, 97, 46, 116, 105, 109, 101, 46, 116, 101, /* v a . t i m e . t e */ 101 109, 112, 111, 114, 97, 108, 46, 86, 97, 108, /* m p o r a l . V a l */ 102 117, 101, 82, 97, 110, 103, 101, (byte)154, 113, (byte)169, /* u e R a n g e \u009a q \u00a9 */ 103 86, (byte)242, (byte)205, 90, (byte)184, 2, 0, 4, 74, 0, /* V \u00f2 \u00cd Z \u00b8 \u0002 \u0000 \u0004 J \u0000 */ 104 10, 109, 97, 120, 76, 97, 114, 103, 101, 115, /* m a x L a r g e s */ 105 116, 74, 0, 11, 109, 97, 120, 83, 109, 97, /* t J \u0000 \u000b m a x S m a */ 106 108, 108, 101, 115, 116, 74, 0, 10, 109, 105,/* l l e s t J \u0000 m i */ 107 110, 76, 97, 114, 103, 101, 115, 116, 74, 0, /* n L a r g e s t J \u0000 */ 108 11, 109, 105, 110, 83, 109, 97, 108, 108, 101, /* \u000b m i n S m a l l e */ 109 115, 116, 120, 112, 0, 0, 0, 0, 0, 0, /* s t x p \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 */ 110 0, 40, 0, 0, 0, 0, 0, 0, 0, 30, /* \u0000 ( \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u001e */ 111 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, /* \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0014 \u0000 \u0000 */ 112 0, 0, 0, 0, 0, 10, /* \u0000 \u0000 \u0000 \u0000 \u0000 */ 113 }; 114 115 ValueRange range = ValueRange.of(10, 20, 30, 40); 116 try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); 117 ObjectOutputStream oos = new ObjectOutputStream(baos) ) { 118 oos.writeObject(range); 119 120 byte[] actual = baos.toByteArray(); 121 assertEquals(actual, expected, "Serialized bytes incorrect"); 122 } 123 } 124 125 @Test test_invalid_serialform()126 public void test_invalid_serialform() throws Exception { 127 byte[] template = { 128 (byte)172, (byte)237, 0, 5, 115, 114, 0, 29, 106, 97, /* \u00ac \u00ed \u0000 \u0005 s r \u0000 \u001d j a */ 129 118, 97, 46, 116, 105, 109, 101, 46, 116, 101, /* v a . t i m e . t e */ 130 109, 112, 111, 114, 97, 108, 46, 86, 97, 108, /* m p o r a l . V a l */ 131 117, 101, 82, 97, 110, 103, 101, (byte)154, 113, (byte)169, /* u e R a n g e \u009a q \u00a9 */ 132 86, (byte)242, (byte)205, 90, (byte)184, 2, 0, 4, 74, 0, /* V \u00f2 \u00cd Z \u00b8 \u0002 \u0000 \u0004 J \u0000 */ 133 10, 109, 97, 120, 76, 97, 114, 103, 101, 115, /* m a x L a r g e s */ 134 116, 74, 0, 11, 109, 97, 120, 83, 109, 97, /* t J \u0000 \u000b m a x S m a */ 135 108, 108, 101, 115, 116, 74, 0, 10, 109, 105,/* l l e s t J \u0000 m i */ 136 110, 76, 97, 114, 103, 101, 115, 116, 74, 0, /* n L a r g e s t J \u0000 */ 137 11, 109, 105, 110, 83, 109, 97, 108, 108, 101, /* \u000b m i n S m a l l e */ 138 115, 116, 120, 112, 0, 0, 0, 0, 0, 0, /* s t x p \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 */ 139 0, 40, 0, 0, 0, 0, 0, 0, 0, 30, /* \u0000 ( \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u001e */ 140 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, /* \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0014 \u0000 \u0000 */ 141 0, 0, 0, 0, 0, 10, /* \u0000 \u0000 \u0000 \u0000 \u0000 */ 142 }; 143 144 // minSmallest > minLargest, insert invalid values and deserialize 145 byte[] bad1 = {0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 4}; 146 byte[] val = Arrays.copyOf(template, template.length); 147 System.arraycopy(bad1, 0, val, 114, bad1.length); 148 try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(val))) { 149 in.readObject(); 150 fail("Invalid minSmallest > minLargest " + ValueRange.class.getName()); 151 } catch (InvalidObjectException ioe) { 152 // Expected exception 153 } 154 155 // maxSmallest > maxLargest, insert invalid values and deserialize 156 byte[] bad2 = {0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 3}; 157 val = Arrays.copyOf(template, template.length); 158 System.arraycopy(bad1, 0, val, 114, bad2.length); 159 try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(val))) { 160 in.readObject(); 161 fail("Invalid maxSmallest > maxLargest " + ValueRange.class.getName()); 162 } catch (InvalidObjectException ioe) { 163 // Expected exception 164 } 165 166 // minLagest > maxLargest, insert invalid values and deserialize 167 byte[] bad3 = {0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 4}; 168 val = Arrays.copyOf(template, template.length); 169 System.arraycopy(bad1, 0, val, 114, bad3.length); 170 try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(val))) { 171 in.readObject(); 172 fail("Invalid minLagest > maxLargest " + ValueRange.class.getName()); 173 } catch (InvalidObjectException ioe) { 174 // Expected exception 175 } 176 } 177 178 } 179