/* * 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 javax.el; import org.junit.Assert; import org.junit.Test; public class TestStaticFieldELResolver { private static final String PROPERTY01_NAME = "publicStaticString"; private static final String PROPERTY01_VALUE = "publicStaticStringNewValue"; private static final String PROPERTY02_NAME = "nonExistingString"; private static final String PROPERTY03_NAME = "publicString"; private static final String PROPERTY04_NAME = "privateStaticString"; private static final String PROPERTY05_NAME = "privateString"; private static final String METHOD01_NAME = "<init>"; private static final String METHOD02_NAME = "getPublicStaticString"; private static final String METHOD03_NAME = "setPrivateString"; private static final String METHOD04_NAME = "printPublicStaticString"; /** * Tests that a null context results in an NPE as per EL Javadoc. */ @Test(expected = NullPointerException.class) public void testGetValue01() { StaticFieldELResolver resolver = new StaticFieldELResolver(); resolver.getValue(null, new Object(), new Object()); } /** * Tests that a valid property is resolved. */ @Test public void testGetValue02() { StaticFieldELResolver resolver = new StaticFieldELResolver(); ELContext context = new StandardELContext( ELManager.getExpressionFactory()); Object result = resolver.getValue(context, new ELClass( TesterClass.class), PROPERTY01_NAME); Assert.assertEquals(PROPERTY01_NAME, result); Assert.assertTrue(context.isPropertyResolved()); } /** * Tests that a valid property is not resolved if base is not ELCLass. */ @Test public void testGetValue03() { doNegativeTest(new Object(), PROPERTY01_NAME, MethodUnderTest.GET_VALUE); } /** * Tests that non String property is not resolved. */ @Test public void testGetValue04() { doNegativeTest(new ELClass(TesterClass.class), new Object(), MethodUnderTest.GET_VALUE); } /** * Property doesn't exist */ @Test public void testGetValue05() { doThrowableTest(PROPERTY02_NAME, MethodUnderTest.GET_VALUE, true); } /** * Property is not static */ @Test public void testGetValue06() { doThrowableTest(PROPERTY03_NAME, MethodUnderTest.GET_VALUE, false); } /** * Property is not public */ @Test public void testGetValue07() { doThrowableTest(PROPERTY04_NAME, MethodUnderTest.GET_VALUE, true); } /** * Property is neither public nor static */ @Test public void testGetValue08() { doThrowableTest(PROPERTY05_NAME, MethodUnderTest.GET_VALUE, true); } /** * Tests that a valid property of Enum is resolved. */ @Test public void testGetValue09() { StaticFieldELResolver resolver = new StaticFieldELResolver(); ELContext context = new StandardELContext( ELManager.getExpressionFactory()); Object result = resolver.getValue(context, new ELClass( MethodUnderTest.class), MethodUnderTest.GET_TYPE.toString()); Assert.assertEquals(MethodUnderTest.GET_TYPE, result); Assert.assertTrue(context.isPropertyResolved()); } /** * Tests that a null context results in an NPE as per EL Javadoc. */ @Test(expected = NullPointerException.class) public void testSetValue01() { StaticFieldELResolver resolver = new StaticFieldELResolver(); resolver.setValue(null, new Object(), new Object(), new Object()); } /** * Tests that cannot write to a static field. */ @Test(expected = PropertyNotWritableException.class) public void testSetValue02() { StaticFieldELResolver resolver = new StaticFieldELResolver(); ELContext context = new StandardELContext( ELManager.getExpressionFactory()); resolver.setValue(context, new ELClass(TesterClass.class), PROPERTY01_NAME, PROPERTY01_VALUE); } /** * Tests that the operation is not invoked if base is not ELCLass. */ @Test public void testSetValue03() { doNegativeTest(new Object(), PROPERTY01_NAME, MethodUnderTest.SET_VALUE); } /** * Tests that the operation is no invoked when the property is not String. */ @Test public void testSetValue04() { doNegativeTest(new ELClass(TesterClass.class), new Object(), MethodUnderTest.SET_VALUE); } /** * Tests that a null context results in an NPE as per EL Javadoc. */ @Test(expected = NullPointerException.class) public void testIsReadOnly01() { StaticFieldELResolver resolver = new StaticFieldELResolver(); resolver.isReadOnly(null, new Object(), new Object()); } /** * Tests that the propertyResolved is true when base is ELCLass and the * property is String. */ @Test public void testIsReadOnly02() { StaticFieldELResolver resolver = new StaticFieldELResolver(); ELContext context = new StandardELContext( ELManager.getExpressionFactory()); boolean result = resolver.isReadOnly(context, new ELClass( TesterClass.class), PROPERTY01_NAME); Assert.assertTrue(result); Assert.assertTrue(context.isPropertyResolved()); } /** * Tests that the propertyResolved is false if base is not ELCLass. */ @Test public void testIsReadOnly03() { StaticFieldELResolver resolver = new StaticFieldELResolver(); ELContext context = new StandardELContext( ELManager.getExpressionFactory()); boolean result = resolver.isReadOnly(context, new Object(), PROPERTY01_NAME); Assert.assertTrue(result); Assert.assertFalse(context.isPropertyResolved()); } /** * Tests that the propertyResolved is false when the property is not String. */ @Test public void testIsReadOnly04() { StaticFieldELResolver resolver = new StaticFieldELResolver(); ELContext context = new StandardELContext( ELManager.getExpressionFactory()); boolean result = resolver.isReadOnly(context, new ELClass( TesterClass.class), new Object()); Assert.assertTrue(result); Assert.assertFalse(context.isPropertyResolved()); } /** * Tests that a null context results in an NPE as per EL Javadoc. */ @Test(expected = NullPointerException.class) public void testGetType01() { StaticFieldELResolver resolver = new StaticFieldELResolver(); resolver.getType(null, new Object(), new Object()); } /** * Tests that a valid property is resolved. */ @Test public void testGetType02() { StaticFieldELResolver resolver = new StaticFieldELResolver(); ELContext context = new StandardELContext( ELManager.getExpressionFactory()); Class<?> result = resolver.getType(context, new ELClass( TesterClass.class), PROPERTY01_NAME); Assert.assertEquals(PROPERTY01_NAME.getClass(), result); Assert.assertTrue(context.isPropertyResolved()); } /** * Tests that a valid property is not resolved if base is not ELCLass. */ @Test public void testGetType03() { doNegativeTest(new Object(), PROPERTY01_NAME, MethodUnderTest.GET_TYPE); } /** * Tests that non String property is not resolved. */ @Test public void testGetType04() { doNegativeTest(new ELClass(TesterClass.class), new Object(), MethodUnderTest.GET_TYPE); } /** * Property doesn't exist */ @Test public void testGetType05() { doThrowableTest(PROPERTY02_NAME, MethodUnderTest.GET_TYPE, true); } /** * Property is not static */ @Test public void testGetType06() { doThrowableTest(PROPERTY03_NAME, MethodUnderTest.GET_TYPE, false); } /** * Property is not public */ @Test public void testGetType07() { doThrowableTest(PROPERTY04_NAME, MethodUnderTest.GET_TYPE, true); } /** * Property is neither public nor static */ @Test public void testGetType08() { doThrowableTest(PROPERTY05_NAME, MethodUnderTest.GET_TYPE, true); } /** * Tests that a valid property of Enum is resolved. */ @Test public void testGetType09() { StaticFieldELResolver resolver = new StaticFieldELResolver(); ELContext context = new StandardELContext( ELManager.getExpressionFactory()); Class<?> result = resolver.getType(context, new ELClass( MethodUnderTest.class), MethodUnderTest.GET_TYPE.toString()); Assert.assertEquals(MethodUnderTest.GET_TYPE.getClass(), result); Assert.assertTrue(context.isPropertyResolved()); } /** * Tests that a null context results in an NPE as per EL Javadoc. */ @Test(expected = NullPointerException.class) public void testInvoke01() { StaticFieldELResolver resolver = new StaticFieldELResolver(); resolver.invoke(null, new Object(), new Object(), new Class<?>[] {}, new Object[] {}); } /** * Tests a constructor invocation. */ @Test public void testInvoke02() { StaticFieldELResolver resolver = new StaticFieldELResolver(); ELContext context = new StandardELContext( ELManager.getExpressionFactory()); Object result = resolver.invoke(context, new ELClass(TesterClass.class), METHOD01_NAME, null, null); Assert.assertEquals(TesterClass.class, result.getClass()); Assert.assertTrue(context.isPropertyResolved()); } /** * Tests a method invocation. */ @Test public void testInvoke03() { StaticFieldELResolver resolver = new StaticFieldELResolver(); ELContext context = new StandardELContext( ELManager.getExpressionFactory()); Object result = resolver.invoke(context, new ELClass(TesterClass.class), METHOD02_NAME, new Class<?>[] {}, new Object[] {}); Assert.assertEquals(PROPERTY01_NAME, result); Assert.assertTrue(context.isPropertyResolved()); } /** * Tests that a valid method is not resolved if base is not ELCLass. */ @Test public void testInvoke04() { doNegativeTest(new Object(), METHOD02_NAME, MethodUnderTest.INVOKE); } /** * Tests that non String method name is not resolved. */ @Test public void testInvoke05() { doNegativeTest(new ELClass(TesterClass.class), new Object(), MethodUnderTest.INVOKE); } /** * Tests that a private constructor invocation will fail. */ @Test public void testInvoke06() { doThrowableTest(METHOD01_NAME, MethodUnderTest.INVOKE, false); } /** * Tests that a non static method invocation will fail. */ @Test public void testInvoke07() { doThrowableTest(METHOD03_NAME, MethodUnderTest.INVOKE, false); } /** * Tests a void method invocation. */ @Test public void testInvoke08() { StaticFieldELResolver resolver = new StaticFieldELResolver(); ELContext context = new StandardELContext( ELManager.getExpressionFactory()); Object result = resolver.invoke(context, new ELClass(TesterClass.class), METHOD04_NAME, new Class<?>[] {}, new Object[] {}); Assert.assertNull(result); Assert.assertTrue(context.isPropertyResolved()); } private void doNegativeTest(Object elClass, Object trigger, MethodUnderTest method) { StaticFieldELResolver resolver = new StaticFieldELResolver(); ELContext context = new StandardELContext( ELManager.getExpressionFactory()); Object result = null; switch (method) { case GET_VALUE: { result = resolver.getValue(context, elClass, trigger); break; } case SET_VALUE: { resolver.setValue(context, elClass, trigger, PROPERTY01_VALUE); result = resolver.getValue(context, elClass, trigger); break; } case GET_TYPE: { result = resolver.getType(context, elClass, trigger); break; } case INVOKE: { result = resolver.invoke(context, elClass, trigger, new Class<?>[] { String.class }, new Object[] { "test" }); break; } default: { // Should never happen Assert.fail("Missing case for method"); } } Assert.assertNull(result); Assert.assertFalse(context.isPropertyResolved()); } private void doThrowableTest(String trigger, MethodUnderTest method, boolean checkCause) { StaticFieldELResolver resolver = new StaticFieldELResolver(); ELContext context = new StandardELContext( ELManager.getExpressionFactory()); ELException exception = null; try { switch (method) { case GET_VALUE: { resolver.getValue(context, new ELClass(TesterClass.class), trigger); break; } case GET_TYPE: { resolver.getType(context, new ELClass(TesterClass.class), trigger); break; } case INVOKE: { resolver.invoke(context, new ELClass(TesterClass.class), trigger, new Class<?>[] { String.class }, new Object[] { "test" }); break; } default: { // Should never happen Assert.fail("Missing case for method"); } } } catch (PropertyNotFoundException | MethodNotFoundException e) { exception = e; } Assert.assertTrue(context.isPropertyResolved()); Assert.assertNotNull(exception); if (checkCause) { // Can't be null due to assertion above Throwable cause = exception.getCause(); Assert.assertNotNull(cause); } } private static enum MethodUnderTest { GET_VALUE, SET_VALUE, GET_TYPE, INVOKE } }