Author: mthl
Date: Sat Oct 26 21:46:01 2019 New Revision: 1869022 URL: http://svn.apache.org/viewvc?rev=1869022&view=rev Log: Improved: Turn ‘UtilObjectTests’ into a unit test class (OFBIZ-11067) Adapt ‘UtilObjectUnitTest’ test class to avoid side effects when testing allowed serialization classes. Added: ofbiz/ofbiz-framework/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/UtilObjectTests.java (with props) ofbiz/ofbiz-framework/trunk/framework/base/src/test/resources/ ofbiz/ofbiz-framework/trunk/framework/base/src/test/resources/META-INF/ ofbiz/ofbiz-framework/trunk/framework/base/src/test/resources/META-INF/services/ ofbiz/ofbiz-framework/trunk/framework/base/src/test/resources/META-INF/services/org.apache.ofbiz.base.util.UtilObjectTests$TestFactoryIntf Removed: ofbiz/ofbiz-framework/trunk/framework/base/src/main/java/org/apache/ofbiz/base/util/test/ ofbiz/ofbiz-framework/trunk/framework/base/src/main/resources/META-INF/ Modified: ofbiz/ofbiz-framework/trunk/build.gradle ofbiz/ofbiz-framework/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/UtilObjectUnitTest.java Modified: ofbiz/ofbiz-framework/trunk/build.gradle URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/build.gradle?rev=1869022&r1=1869021&r2=1869022&view=diff ============================================================================== --- ofbiz/ofbiz-framework/trunk/build.gradle (original) +++ ofbiz/ofbiz-framework/trunk/build.gradle Sat Oct 26 21:46:01 2019 @@ -307,7 +307,7 @@ checkstyle { // the sum of errors that were present before introducing the // âcheckstyleâ tool present in the framework and in the official // plugins. - tasks.checkstyleMain.maxErrors = 37858 + tasks.checkstyleMain.maxErrors = 37830 tasks.checkstyleTest.maxErrors = 176 // Currently there are a lot of errors so we need to temporarily // hide them to avoid polluting the terminal output. Added: ofbiz/ofbiz-framework/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/UtilObjectTests.java URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/UtilObjectTests.java?rev=1869022&view=auto ============================================================================== --- ofbiz/ofbiz-framework/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/UtilObjectTests.java (added) +++ ofbiz/ofbiz-framework/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/UtilObjectTests.java Sat Oct 26 21:46:01 2019 @@ -0,0 +1,308 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.ofbiz.base.util; + +import static org.apache.ofbiz.base.util.UtilMisc.toSet; +import static org.apache.ofbiz.base.util.UtilObject.getObjectFromFactory; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertNull; + +import java.io.ByteArrayInputStream; +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.util.HashMap; +import java.util.Set; + +import org.apache.ofbiz.base.lang.Factory; +import org.apache.ofbiz.base.lang.SourceMonitored; +import org.junit.Test; + +@SourceMonitored +public class UtilObjectTests { + + public static final class ErrorInjector extends FilterInputStream { + private int after; + private final boolean onClose; + + public ErrorInjector(InputStream in, boolean onClose) { + this(in, -1, onClose); + } + + public ErrorInjector(InputStream in, int after) { + this(in, after, false); + } + + public ErrorInjector(InputStream in, int after, boolean onClose) { + super(in); + this.after = after; + this.onClose = onClose; + } + + @Override + public int read() throws IOException { + if (after == 0) { + throw new IOException(); + } + if (after > 0) { + after--; + } + return super.read(); + } + + @Override + public int read(byte[] buf) throws IOException { + return read(buf, 0, buf.length); + } + + @Override + public int read(byte[] buf, int offset, int length) throws IOException { + if (after == 0) { + throw new IOException(); + } + if (after > 0) { + if (length > after) { + length = after; + } + int r = super.read(buf, offset, length); + after -= r; + return r; + } else { + return super.read(buf, offset, length); + } + } + + @Override + public void close() throws IOException { + if (onClose) { + throw new IOException(); + } + super.close(); + } + } + + @Test + public void testErrorInjector() throws Exception { + byte[] source = new byte[] {0, 1, 2, 3, 4, 5, 6}; + InputStream in = new ErrorInjector(new ByteArrayInputStream(source), true); + byte[] result = new byte[source.length]; + int r = in.read(); + assertEquals("onClose, read short length", 2, in.read(new byte[2])); + assertNotSame("onClose, not read/eof", -1, r); + assertEquals("onClose, read length", source.length - 3, in.read(result, 3, result.length - 3)); + Exception caught = null; + try { + in.close(); + } catch (IOException e) { + caught = e; + } finally { + assertNotNull("onClose, exception", caught); + } + in = new ErrorInjector(new ByteArrayInputStream(source), 4); + result = new byte[source.length]; + r = in.read(); + assertNotSame("after, not read/eof", -1, r); + assertEquals("after, read short length", 2, in.read(result, 0, 2)); + assertEquals("after, read long length", 1, in.read(result, 3, result.length - 3)); + caught = null; + try { + in.read(result, 4, result.length - 4); + } catch (IOException e) { + caught = e; + } finally { + assertNotNull("read, buffer exception", caught); + } + caught = null; + try { + in.read(); + } catch (IOException e) { + caught = e; + } finally { + assertNotNull("read, singleton exception", caught); + } + in.close(); + } + + @SuppressWarnings("serial") + public static class SerializationInjector implements Serializable { + private boolean onRead; + private boolean onWrite; + + public SerializationInjector(boolean onRead, boolean onWrite) { + this.onRead = onRead; + this.onWrite = onWrite; + } + + private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { + onRead = stream.readBoolean(); + onWrite = stream.readBoolean(); + if (onRead) { + throw new IOException(); + } + } + + private void writeObject(ObjectOutputStream stream) throws IOException { + if (onWrite) { + throw new IOException(); + } + stream.writeBoolean(onRead); + stream.writeBoolean(onWrite); + } + } + + @Test + public void testGetBytesObject() { + assertNotNull("long", UtilObject.getBytes(0L)); + assertNotNull("injector good", UtilObject.getBytes(new SerializationInjector(false, false))); + boolean errorOn = Debug.isOn(Debug.ERROR); + try { + Debug.set(Debug.ERROR, false); + assertNull("injector bad", UtilObject.getBytes(new SerializationInjector(false, true))); + assertNull("long", UtilObject.getBytes(this)); + } finally { + Debug.set(Debug.ERROR, errorOn); + } + } + + @Test + public void testGetObject() { + Long one = 1L; + byte[] oneBytes = UtilObject.getBytes(one); + assertNotNull("oneBytes", oneBytes); + assertEquals("one getObject", one, UtilObject.getObject(oneBytes)); + boolean errorOn = Debug.isOn(Debug.ERROR); + try { + Debug.set(Debug.ERROR, false); + assertNull("parse empty array", UtilObject.getObject(new byte[0])); + + // simulate a ClassNotFoundException + Object groovySerializable = GroovyUtil.eval( + "class foo implements java.io.Serializable { }; return new foo()", + new HashMap<String, Object>()); + byte[] groovySerializableBytes = UtilObject.getBytes(groovySerializable); + assertNotNull("groovySerializableBytes", groovySerializableBytes); + assertNull("groovyDeserializable", UtilObject.getObject(groovySerializableBytes)); + + byte[] injectorBytes = UtilObject.getBytes(new SerializationInjector(false, false)); + assertNotNull("injectorBytes good", injectorBytes); + assertNotNull("injector good", UtilObject.getObject(injectorBytes)); + injectorBytes = UtilObject.getBytes(new SerializationInjector(true, false)); + assertNotNull("injectorBytes bad", injectorBytes); + assertNull("injector bad", UtilObject.getObject(injectorBytes)); + } finally { + Debug.set(Debug.ERROR, errorOn); + } + } + + @Test + public void testGetByteCount() throws Exception { + assertNotSame("long", 0, UtilObject.getByteCount(0L)); + Exception caught = null; + try { + UtilObject.getByteCount(this); + } catch (IOException e) { + caught = e; + } finally { + assertNotNull("exception thrown", caught); + } + } + + @Test + public void testDoHashCode() throws Exception { + UtilObject.doHashCode(this); + UtilObject.doHashCode(null); + UtilObject.doHashCode(0); + UtilObject.doHashCode(new Object[] {this, Object.class}); + UtilObject.doHashCode(new Object[] {null, Object.class}); + UtilObject.doHashCode(new int[] {1, 3}); + } + + public interface TestFactoryIntf extends Factory<Object, Set<String>> { + } + + public static final class FirstTestFactory implements TestFactoryIntf { + @Override + public Object getInstance(Set<String> set) { + if (!set.contains("first")) { + return null; + } + if (set.contains("one")) { + return "ONE"; + } + if (set.contains("two")) { + return "TWO"; + } + if (set.contains("three")) { + return "THREE"; + } + return null; + } + } + + public static final class SecondTestFactory implements TestFactoryIntf { + @Override + public Object getInstance(Set<String> set) { + if (!set.contains("second")) { + return null; + } + if (set.contains("ONE")) { + return "1"; + } + if (set.contains("TWO")) { + return "2"; + } + if (set.contains("THREE")) { + return "3"; + } + return null; + } + } + + @Test + public void testGetObjectFromFactory() throws Exception { + assertEquals("first one", "ONE", getObjectFromFactory(TestFactoryIntf.class, toSet("first", "one"))); + assertEquals("first two", "TWO", getObjectFromFactory(TestFactoryIntf.class, toSet("first", "two"))); + assertEquals("first three", "THREE", getObjectFromFactory(TestFactoryIntf.class, toSet("first", "three"))); + assertEquals("first null", "1", getObjectFromFactory(TestFactoryIntf.class, toSet("first", "second", "ONE"))); + assertEquals("second one", "1", getObjectFromFactory(TestFactoryIntf.class, toSet("second", "ONE"))); + assertEquals("second two", "2", getObjectFromFactory(TestFactoryIntf.class, toSet("second", "TWO"))); + assertEquals("second three", "3", getObjectFromFactory(TestFactoryIntf.class, toSet("second", "THREE"))); + Exception caught = null; + try { + getObjectFromFactory(TestFactoryIntf.class, toSet("first")); + } catch (ClassNotFoundException e) { + caught = e; + } finally { + assertNotNull("nothing found first", caught); + } + caught = null; + try { + getObjectFromFactory(TestFactoryIntf.class, toSet("second")); + } catch (ClassNotFoundException e) { + caught = e; + } finally { + assertNotNull("nothing found second", caught); + } + } +} Propchange: ofbiz/ofbiz-framework/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/UtilObjectTests.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/ofbiz-framework/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/UtilObjectTests.java ------------------------------------------------------------------------------ svn:keywords = Date Rev Author URL Id Propchange: ofbiz/ofbiz-framework/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/UtilObjectTests.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: ofbiz/ofbiz-framework/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/UtilObjectUnitTest.java URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/UtilObjectUnitTest.java?rev=1869022&r1=1869021&r2=1869022&view=diff ============================================================================== --- ofbiz/ofbiz-framework/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/UtilObjectUnitTest.java (original) +++ ofbiz/ofbiz-framework/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/UtilObjectUnitTest.java Sat Oct 26 21:46:01 2019 @@ -28,9 +28,16 @@ import java.io.ObjectOutputStream; import java.util.Arrays; import java.util.List; +import org.junit.After; import org.junit.Test; public class UtilObjectUnitTest { + @After + public void cleanUp() { + // Ensure that the default value of allowed deserialization classes is used. + UtilProperties.setPropertyValueInMemory("SafeObjectInputStream", "ListOfSafeObjectsForInputStream", ""); + } + // Test reading a basic list of string object. @Test public void testGetObjectExceptionSafe() throws IOException, ClassNotFoundException { Added: ofbiz/ofbiz-framework/trunk/framework/base/src/test/resources/META-INF/services/org.apache.ofbiz.base.util.UtilObjectTests$TestFactoryIntf URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/base/src/test/resources/META-INF/services/org.apache.ofbiz.base.util.UtilObjectTests%24TestFactoryIntf?rev=1869022&view=auto ============================================================================== --- ofbiz/ofbiz-framework/trunk/framework/base/src/test/resources/META-INF/services/org.apache.ofbiz.base.util.UtilObjectTests$TestFactoryIntf (added) +++ ofbiz/ofbiz-framework/trunk/framework/base/src/test/resources/META-INF/services/org.apache.ofbiz.base.util.UtilObjectTests$TestFactoryIntf Sat Oct 26 21:46:01 2019 @@ -0,0 +1,2 @@ +org.apache.ofbiz.base.util.UtilObjectTests$FirstTestFactory +org.apache.ofbiz.base.util.UtilObjectTests$SecondTestFactory |
Free forum by Nabble | Edit this page |