/* * Copyright (c) 2010 Google Inc. * * 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. */ package com.google.api.client.http; import com.google.api.client.util.ArrayMap; import com.google.api.client.util.GenericData; import com.google.api.client.util.Key; import com.google.api.client.util.Value; import com.google.common.base.Objects; import junit.framework.TestCase; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; /** * Tests {@link UrlEncodedParser}. * * @author Yaniv Inbar */ public class UrlEncodedParserTest extends TestCase { public UrlEncodedParserTest() { } public UrlEncodedParserTest(String name) { super(name); } public static class Simple { @Key Void v; @Key String a; @Key String b; @Key String c; @Key List<String> q; @Key String[] r; @Key Object o; @Override public boolean equals(Object obj) { Simple other = (Simple) obj; return Objects.equal(a, other.a) && Objects.equal(b, other.b) && Objects.equal(c, other.c) && Objects.equal(q, other.q) && Arrays.equals(r, other.r) && Objects.equal(o, other.o); } public Simple() { } @Override public String toString() { return Objects.toStringHelper(this) .add("a", a) .add("b", b) .add("c", c) .add("q", q) .add("r", Arrays.asList(r)) .add("o", o) .toString(); } } public static class Generic extends GenericData { @Key String a; @Key String b; @Key String c; @Key List<String> q; @Key Object o; @Override public Generic set(String fieldName, Object value) { return (Generic) super.set(fieldName, value); } } public void testParse_simple() { Simple actual = new Simple(); UrlEncodedParser.parse( "v=ignore&v=ignore2&q=1&a=x&b=y&c=z&q=2&undeclared=0&o=object&r=a1&r=a2", actual); Simple expected = new Simple(); expected.a = "x"; expected.b = "y"; expected.c = "z"; expected.q = new ArrayList<String>(Arrays.asList("1", "2")); expected.r = new String[] {"a1", "a2"}; expected.o = new ArrayList<String>(Arrays.asList("object")); assertEquals(expected, actual); assertNull(expected.v); } public void testParse_generic() { Generic actual = new Generic(); UrlEncodedParser.parse("p=4&q=1&a=x&p=3&b=y&c=z&d=v&q=2&p=5&o=object", actual); Generic expected = new Generic(); expected.a = "x"; expected.b = "y"; expected.c = "z"; expected.q = new ArrayList<String>(Arrays.asList("1", "2")); expected.o = new ArrayList<String>(Arrays.asList("object")); expected.set("d", Collections.singletonList("v")).set("p", Arrays.asList("4", "3", "5")); assertEquals(expected, actual); assertEquals(ArrayList.class, actual.get("d").getClass()); } public void testParse_map() { ArrayMap<String, Object> actual = new ArrayMap<String, Object>(); UrlEncodedParser.parse("p=4&q=1&a=x&p=3&b=y&c=z&d=v&q=2&p=5&noval1&noval2=", actual); ArrayMap<String, Object> expected = ArrayMap.create(); expected.add("p", Arrays.asList("4", "3", "5")); expected.add("q", Arrays.asList("1", "2")); expected.add("a", Collections.singletonList("x")); expected.add("b", Collections.singletonList("y")); expected.add("c", Collections.singletonList("z")); expected.add("d", Collections.singletonList("v")); expected.add("noval1", Collections.singletonList("")); expected.add("noval2", Collections.singletonList("")); assertEquals(expected, actual); assertEquals(ArrayList.class, actual.get("a").getClass()); } public void testParse_encoding() { ArrayMap<String, Object> actual = new ArrayMap<String, Object>(); UrlEncodedParser.parse("q=%20", actual); ArrayMap<String, Object> expected = ArrayMap.create(); expected.add("q", Collections.singletonList(" ")); assertEquals(expected, actual); } public void testParse_null() { ArrayMap<String, Object> actual = new ArrayMap<String, Object>(); UrlEncodedParser.parse((String) null, actual); assertTrue(actual.isEmpty()); } public enum E { @Value VALUE, @Value("other") OTHER_VALUE, } public static class EnumValue extends GenericData { @Key public E value; @Key public E otherValue; @Override public EnumValue set(String fieldName, Object value) { return (EnumValue) super.set(fieldName, value); } } static final String ENUM_VALUE = "otherValue=other&value=VALUE"; public void testParse_enum() throws IOException { EnumValue actual = new EnumValue(); UrlEncodedParser.parse(ENUM_VALUE, actual); EnumValue expected = new EnumValue(); expected.value = E.VALUE; expected.otherValue = E.OTHER_VALUE; assertEquals(expected, actual); subtestWriteTo(ENUM_VALUE, actual); } private void subtestWriteTo(String expected, Object data) throws IOException { UrlEncodedContent content = new UrlEncodedContent(data); ByteArrayOutputStream out = new ByteArrayOutputStream(); content.writeTo(out); assertEquals(expected, out.toString()); } }