package org.jolokia.converter.object; import java.math.BigDecimal; import java.math.BigInteger; import java.net.MalformedURLException; import java.net.URL; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; import org.jolokia.config.ConfigKey; import org.jolokia.util.DateUtil; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.testng.Assert; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertNull; /* * Copyright 2009-2013 Roland Huss * * Licensed 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. */ /** * @author roland * @since Feb 14, 2010 */ public class StringToObjectConverterTest { StringToObjectConverter converter; @BeforeTest public void setup() { converter = new StringToObjectConverter(); } @Test public void simpleConversions() { Object obj = converter.convertFromString(int.class.getCanonicalName(),"10"); assertEquals("Int conversion",10,obj); obj = converter.convertFromString(Integer.class.getCanonicalName(),"10"); assertEquals("Integer conversion",10,obj); obj = converter.convertFromString(Short.class.getCanonicalName(),"10"); assertEquals("Short conversion",(short) 10,obj); obj = converter.convertFromString(short.class.getCanonicalName(),"10"); assertEquals("short conversion",Short.parseShort("10"),obj); obj = converter.convertFromString(Long.class.getCanonicalName(),"10"); assertEquals("long conversion",10L,obj); obj = converter.convertFromString(long.class.getCanonicalName(),"10"); assertEquals("Long conversion",10L,obj); obj = converter.convertFromString(Byte.class.getCanonicalName(),"10"); assertEquals("Byte conversion",(byte) 10,obj); obj = converter.convertFromString(byte.class.getCanonicalName(),"10"); assertEquals("byte conversion",Byte.parseByte("10"),obj); obj = converter.convertFromString(Float.class.getCanonicalName(),"10.5"); assertEquals("Float conversion",10.5f,obj); obj = converter.convertFromString(float.class.getCanonicalName(),"21.3"); assertEquals("float conversion",new Float(21.3f),obj); obj = converter.convertFromString(Double.class.getCanonicalName(),"10.5"); assertEquals("Double conversion",10.5d,obj); obj = converter.convertFromString(double.class.getCanonicalName(),"21.3"); assertEquals("double conversion",21.3d,obj); obj = converter.convertFromString(BigDecimal.class.getCanonicalName(),"83.4e+4"); assertEquals("BigDecimal conversion", new BigDecimal("8.34e+5"), obj); obj = converter.convertFromString(BigInteger.class.getCanonicalName(),"47110815471108154711"); assertEquals("BigInteger conversion", new BigInteger("47110815471108154711"), obj); obj = converter.convertFromString(Boolean.class.getCanonicalName(),"false"); assertEquals("Boolean conversion",false,obj); obj = converter.convertFromString(boolean.class.getCanonicalName(),"true"); assertEquals("boolean conversion",true,obj); obj = converter.convertFromString(char.class.getCanonicalName(),"a"); assertEquals("Char conversion",'a',obj); obj = converter.convertFromString("java.lang.String","10"); assertEquals("String conversion","10",obj); } @Test public void jsonConversion() { JSONObject json = new JSONObject(); json.put("name","roland"); json.put("kind","jolokia"); Object object = converter.convertFromString(JSONObject.class.getName(),json.toString()); assertEquals(json,object); JSONArray array = new JSONArray(); array.add("roland"); array.add("jolokia"); object = converter.convertFromString(JSONArray.class.getName(),array.toString()); assertEquals(array,object); try { converter.convertFromString(JSONObject.class.getName(),"{bla:blub{"); fail(); } catch (IllegalArgumentException exp) { } } @Test public void urlConversion(){ URL url = null; try { url = new URL("http://google.com"); } catch (MalformedURLException e) {} Object object = converter.convertFromString(URL.class.getCanonicalName(),"http://google.com"); assertEquals("URL conversion", url, object); } @Test public void enumConversion() { ConfigKey key = (ConfigKey) converter.prepareValue(ConfigKey.class.getName(), "MAX_DEPTH"); assertEquals(key, ConfigKey.MAX_DEPTH); } @Test public void dateConversion() { Date date = (Date) converter.convertFromString(Date.class.getName(),"0"); assertEquals(date.getTime(),0); Date now = new Date(); date = (Date) converter.convertFromString(Date.class.getName(), DateUtil.toISO8601(now)); assertEquals(date.getTime() / 1000,now.getTime() / 1000); } @Test(expectedExceptions = { IllegalArgumentException.class}) public void dateConversionFailed() { converter.prepareValue(Date.class.getName(),"illegal-date-format"); } @Test public void objectNameConversion() throws MalformedObjectNameException { String name = "JOLOKIA:class=Conversion,type=builder,name=jlk"; ObjectName objName = new ObjectName(name); ObjectName testName = (ObjectName)converter.convertFromString(ObjectName.class.getName(), name); assertEquals(objName, testName); } @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = ".*parse.*ObjectName.*") public void objectNameConversionFailed() { converter.convertFromString(ObjectName.class.getName(),"bla:blub:InvalidName"); } @Test public void arrayConversions() { Object obj = converter.convertFromString(new int[0].getClass().getName(),"10,20,30"); int expected[] = new int[] { 10,20,30}; for (int i = 0;i < expected.length;i++) { assertEquals(expected[i],((int[]) obj)[i]); } obj = converter.convertFromString(new Integer[0].getClass().getName(),"10,20,30"); for (int i = 0;i < expected.length;i++) { assertEquals(expected[i],(int) ((Integer[]) obj)[i]); } // Escaped arrays String[] strings = (String[]) converter.convertFromString(new String[0].getClass().getName(),"hallo!,hans!!,wu!!rs!t"); assertEquals(strings.length,2); assertEquals("hallo,hans!",strings[0]); assertEquals("wu!rst",strings[1]); try { obj = converter.convertFromString("[Lbla;","10,20,30"); fail("Unknown object type"); } catch (IllegalArgumentException exp) {} try { obj = converter.convertFromString("[X","10,20,30"); fail("Unknown object type"); } catch (IllegalArgumentException exp) {} } @Test public void checkNull() { Object obj = converter.convertFromString(new int[0].getClass().getName(),"[null]"); assertNull("Null check",obj); } @Test public void checkEmptyString() { Object obj = converter.convertFromString("java.lang.String","\"\""); assertEquals("Empty String check",0,((String) obj).length()); try { obj = converter.convertFromString("java.lang.Integer","\"\""); fail("Empty string conversion only for string"); } catch (IllegalArgumentException exp) {} } @Test public void unknownExtractor() { try { Object obj = converter.convertFromString(this.getClass().getName(),"bla"); fail("Unknown extractor"); } catch (IllegalArgumentException exp) {}; } @Test public void prepareValue() { assertNull(converter.prepareValue("java.lang.String", null)); assertEquals(converter.prepareValue("java.lang.Long", 10L), 10L); assertEquals(converter.prepareValue("java.lang.Long", "10"), 10L); Map<String,String> map = new HashMap<String, String>(); map.put("euro","fcn"); assertTrue(converter.prepareValue("java.util.Map", map) == map); } @Test(expectedExceptions = { IllegalArgumentException.class }) public void prepareValueInvalidClass() { converter.prepareValue("blubber.bla.hello",10L); } @Test public void prepareValueListConversion1() { List<Boolean> list = new ArrayList<Boolean>(); list.add(true); list.add(false); boolean[] res = (boolean[]) converter.prepareValue("[Z",list); assertTrue(res[0]); assertFalse(res[1]); Assert.assertEquals(res.length,2); } @Test public void prepareValueListConversion2() { List<Boolean> list = new ArrayList<Boolean>(); list.add(true); list.add(false); list.add(null); Boolean[] res = (Boolean[]) converter.prepareValue("[Ljava.lang.Boolean;",list); assertTrue(res[0]); assertFalse(res[1]); assertNull(res[2]); Assert.assertEquals(res.length,3); } @Test(expectedExceptions = { IllegalArgumentException.class }) public void prepareValueWithException() { List<Integer> list = new ArrayList<Integer>(); list.add(10); list.add(null); converter.prepareValue("[I",list); } public static class Example { private String value; private List<String> list; public Example(String value) { this.value = value; } public Example(List<String> list) { this.list = list; } public String getValue() { return value; } public List<String> getList() { return list; } } public static class PrivateExample { private String value; private PrivateExample(String value) { this.value = value; } public String getValue() { return value; } } public static class MultipleConstructorExample { private String value; private List<String> list; public MultipleConstructorExample(String value, List<String> list) { this.value = value; this.list = list; } public String getValue() { return value; } public List<String> getList() { return list; } } @Test public void prepareValueWithConstructor() { Object o = converter.prepareValue(this.getClass().getCanonicalName() + "$Example", "test"); assertTrue(o instanceof Example); assertEquals("test", ((Example)o).getValue()); } @Test public void prepareValueWithConstructorList() { Object o = converter.prepareValue(this.getClass().getCanonicalName() + "$Example", Arrays.asList("test")); assertTrue(o instanceof Example); assertNull(((Example)o).getList()); assertEquals("[test]", ((Example)o).getValue()); } @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Cannot convert string test to type " + "org.jolokia.converter.object.StringToObjectConverterTest\\$PrivateExample " + "because no converter could be found") public void prepareValueWithPrivateExample() { converter.prepareValue(this.getClass().getCanonicalName() + "$PrivateExample", "test"); } @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Cannot convert string test to type " + "org.jolokia.converter.object.StringToObjectConverterTest\\$MultipleConstructorExample " + "because no converter could be found") public void prepareValueWithMultipleConstructors() { converter.prepareValue(this.getClass().getCanonicalName() + "$MultipleConstructorExample", "test"); } @Test public void dateConversionNotByConstructor() throws ParseException { final String dateStr = "2015-11-20T00:00:00+00:00"; try { new Date(dateStr); fail("Should have throw IllegalArgumentException"); } catch (IllegalArgumentException ignore) {} // new Date(dateStr) will throw IllegalArgumentException but our convert does not. // so it does not use Constructor to convert date Object obj = converter.convertFromString(Date.class.getCanonicalName(), dateStr); assertNotNull(obj); assertTrue(obj instanceof Date); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); Date expectedDate = sdf.parse(dateStr.replaceFirst("\\+(0\\d)\\:(\\d{2})$", "+$1$2")); assertEquals(expectedDate, obj); } }