org.jolokia.converter.object.StringToObjectConverterTest.java Source code

Java tutorial

Introduction

Here is the source code for org.jolokia.converter.object.StringToObjectConverterTest.java

Source

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);
    }
}