Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 6462B200CF2 for ; Sat, 2 Sep 2017 16:11:00 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 62C7C166ED4; Sat, 2 Sep 2017 14:11:00 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 89F21166EC8 for ; Sat, 2 Sep 2017 16:10:58 +0200 (CEST) Received: (qmail 28451 invoked by uid 500); 2 Sep 2017 14:10:56 -0000 Mailing-List: contact commits-help@juneau.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@juneau.incubator.apache.org Delivered-To: mailing list commits@juneau.incubator.apache.org Received: (qmail 28442 invoked by uid 99); 2 Sep 2017 14:10:56 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd1-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 02 Sep 2017 14:10:56 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd1-us-west.apache.org (ASF Mail Server at spamd1-us-west.apache.org) with ESMTP id 33CFFC09D5 for ; Sat, 2 Sep 2017 14:10:55 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd1-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -3.722 X-Spam-Level: X-Spam-Status: No, score=-3.722 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_NUMSUBJECT=0.5, RCVD_IN_DNSWL_HI=-5, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RP_MATCHES_RCVD=-0.001, SPF_PASS=-0.001] autolearn=disabled Received: from mx1-lw-eu.apache.org ([10.40.0.8]) by localhost (spamd1-us-west.apache.org [10.40.0.7]) (amavisd-new, port 10024) with ESMTP id 4ufUOKEaru0w for ; Sat, 2 Sep 2017 14:10:42 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-lw-eu.apache.org (ASF Mail Server at mx1-lw-eu.apache.org) with SMTP id 6A8DD6104A for ; Sat, 2 Sep 2017 14:10:28 +0000 (UTC) Received: (qmail 27426 invoked by uid 99); 2 Sep 2017 14:10:25 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 02 Sep 2017 14:10:25 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 8C1EDF5681; Sat, 2 Sep 2017 14:10:24 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: jamesbognar@apache.org To: commits@juneau.incubator.apache.org Date: Sat, 02 Sep 2017 14:11:00 -0000 Message-Id: In-Reply-To: <2baa6c805a0647b3a1512a5ef9d11254@git.apache.org> References: <2baa6c805a0647b3a1512a5ef9d11254@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [38/51] [partial] incubator-juneau git commit: Add project hierarchies, part 1 archived-at: Sat, 02 Sep 2017 14:11:00 -0000 http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/75b0d8ee/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/html/CommonTest.java ---------------------------------------------------------------------- diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/html/CommonTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/html/CommonTest.java new file mode 100755 index 0000000..e83900e --- /dev/null +++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/html/CommonTest.java @@ -0,0 +1,459 @@ +// *************************************************************************************************************************** +// * 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.juneau.html; + +import static org.apache.juneau.TestUtils.*; +import static org.junit.Assert.*; + +import java.net.*; +import java.net.URI; +import java.util.*; + +import org.apache.juneau.*; +import org.apache.juneau.annotation.*; +import org.apache.juneau.serializer.*; +import org.apache.juneau.utils.*; +import org.junit.*; + +@SuppressWarnings({"serial","javadoc"}) +public class CommonTest { + + //==================================================================================================== + // Trim nulls from beans + //==================================================================================================== + @Test + public void testTrimNullsFromBeans() throws Exception { + HtmlSerializerBuilder s = new HtmlSerializerBuilder().sq().addKeyValueTableHeaders(true); + HtmlParser p = HtmlParser.DEFAULT; + A t1 = A.create(), t2; + + s.trimNullProperties(false); + String r = s.build().serialize(t1); + assertEquals("
keyvalue
s1
s2s2
", r); + t2 = p.parse(r, A.class); + assertEqualObjects(t1, t2); + + s.trimNullProperties(true); + r = s.build().serialize(t1); + assertEquals("
keyvalue
s2s2
", r); + t2 = p.parse(r, A.class); + assertEqualObjects(t1, t2); + } + + public static class A { + public String s1, s2; + + public static A create() { + A t = new A(); + t.s2 = "s2"; + return t; + } + } + + //==================================================================================================== + // Trim empty maps + //==================================================================================================== + @Test + public void testTrimEmptyMaps() throws Exception { + HtmlSerializerBuilder s = new HtmlSerializerBuilder().sq().addKeyValueTableHeaders(true); + HtmlParser p = HtmlParser.DEFAULT; + B t1 = B.create(), t2; + String r; + + s.trimEmptyMaps(false); + r = s.build().serialize(t1); + assertEquals("
keyvalue
f1
keyvalue
f2
keyvalue
f2a
f2b
keyvalue
s2s2
", r); + t2 = p.parse(r, B.class); + assertEqualObjects(t1, t2); + + s.trimEmptyMaps(true); + r = s.build().serialize(t1); + assertEquals("
keyvalue
f2
keyvalue
f2a
f2b
keyvalue
s2s2
", r); + t2 = p.parse(r, B.class); + assertNull(t2.f1); + } + + public static class B { + public TreeMap f1, f2; + + public static B create() { + B t = new B(); + t.f1 = new TreeMap(); + t.f2 = new TreeMap(){{put("f2a",null);put("f2b",A.create());}}; + return t; + } + } + + //==================================================================================================== + // Trim empty lists + //==================================================================================================== + @Test + public void testTrimEmptyLists() throws Exception { + HtmlSerializerBuilder s = new HtmlSerializerBuilder().sq().addKeyValueTableHeaders(true); + HtmlParser p = HtmlParser.DEFAULT; + C t1 = C.create(), t2; + String r; + + s.trimEmptyCollections(false); + r = s.build().serialize(t1); + assertEquals("
keyvalue
f1
    f2
    s2
    s2
    ", r); + t2 = p.parse(r, C.class); + assertEqualObjects(t1, t2); + + s.trimEmptyCollections(true); + r = s.build().serialize(t1); + assertEquals("
    keyvalue
    f2
    s2
    s2
    ", r); + t2 = p.parse(r, C.class); + assertNull(t2.f1); + } + + public static class C { + public List f1, f2; + + public static C create() { + C t = new C(); + t.f1 = new AList(); + t.f2 = new AList().append(null).append(A.create()); + return t; + } + } + + //==================================================================================================== + // Trim empty arrays + //==================================================================================================== + @Test + public void testTrimEmptyArrays() throws Exception { + HtmlSerializerBuilder s = new HtmlSerializerBuilder().sq().addKeyValueTableHeaders(true); + HtmlParser p = HtmlParser.DEFAULT; + D t1 = D.create(), t2; + String r; + + s.trimEmptyCollections(false); + r = s.build().serialize(t1); + assertEquals( + "" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"
    keyvalue
    f1
      f2" + +"" + +"" + +"" + +"" + +"
      s2
      s2
      " + +"
      ", + r); + t2 = p.parse(r, D.class); + assertEqualObjects(t1, t2); + + s.trimEmptyCollections(true); + r = s.build().serialize(t1); + assertEquals( + "" + +"" + +"" + +"" + +"" + +"" + +"
      keyvalue
      f2" + +"" + +"" + +"" + +"" + +"
      s2
      s2
      " + +"
      ", + r); + t2 = p.parse(r, D.class); + assertNull(t2.f1); + } + + public static class D { + public A[] f1, f2; + + public static D create() { + D t = new D(); + t.f1 = new A[]{}; + t.f2 = new A[]{null, A.create()}; + return t; + } + } + + //==================================================================================================== + // @BeanProperty.properties annotation. + //==================================================================================================== + @Test + public void testBeanPropertyProperties() throws Exception { + HtmlSerializer s = new HtmlSerializerBuilder().sq().addKeyValueTableHeaders(true).build(); + E1 t = new E1(); + String r; + + r = s.serialize(t); + assertEquals( + "" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"
      keyvalue
      x1" + +"" + +"" + +"" + +"
      keyvalue
      f11
      " + +"
      x2" + +"" + +"" + +"" + +"
      keyvalue
      f13
      " + +"
      x3" + +"" + +"" + +"" + +"
      f1
      1
      " + +"
      x4" + +"" + +"" + +"" + +"
      f1
      1
      " + +"
      x5" + +"" + +"" + +"" + +"
      f1
      5
      " + +"
      x6" + +"" + +"" + +"" + +"
      f1
      7
      " + +"
      ", + r); + r = s.getSchemaSerializer().serialize(new E1()); + assertTrue(r.indexOf("f2") == -1); + } + + public static class E1 { + @BeanProperty(properties="f1") public E2 x1 = new E2(); + @BeanProperty(properties="f1") public Map x2 = new AMap().append("f1",3).append("f2",4); + @BeanProperty(properties="f1") public E2[] x3 = {new E2()}; + @BeanProperty(properties="f1") public List x4 = new AList().append(new E2()); + @BeanProperty(properties="f1") public ObjectMap[] x5 = {new ObjectMap().append("f1",5).append("f2",6)}; + @BeanProperty(properties="f1") public List x6 = new AList().append(new ObjectMap().append("f1",7).append("f2",8)); + } + + public static class E2 { + public int f1 = 1; + public int f2 = 2; + } + + //==================================================================================================== + // @BeanProperty.properties annotation on list of beans. + //==================================================================================================== + @Test + public void testBeanPropertyPropertiesOnListOfBeans() throws Exception { + HtmlSerializer s = HtmlSerializer.DEFAULT_SQ; + List l = new LinkedList(); + F t = new F(); + t.x1.add(new F()); + l.add(t); + String html = s.serialize(l); + assertEquals( + "" + +"" + +"" + +"" + +"" + +"" + +"
      x1x2
      " + +"" + +"" + +"" + +"
      x2
      2
      " + +"
      2
      ", html); + } + + public static class F { + @BeanProperty(properties="x2") public List x1 = new LinkedList(); + public int x2 = 2; + } + + //==================================================================================================== + // Test that URLs and URIs are serialized and parsed correctly. + //==================================================================================================== + @Test + public void testURIAttr() throws Exception { + HtmlSerializer s = HtmlSerializer.DEFAULT_SQ; + HtmlParser p = HtmlParser.DEFAULT; + + G t = new G(); + t.uri = new URI("http://uri"); + t.f1 = new URI("http://f1"); + t.f2 = new URL("http://f2"); + + String html = s.serialize(t); + t = p.parse(html, G.class); + assertEquals("http://uri", t.uri.toString()); + assertEquals("http://f1", t.f1.toString()); + assertEquals("http://f2", t.f2.toString()); + } + + public static class G { + public URI uri; + public URI f1; + public URL f2; + } + + + //==================================================================================================== + // Recursion + //==================================================================================================== + @Test + public void testRecursion() throws Exception { + HtmlSerializerBuilder s = new HtmlSerializerBuilder().sq().addKeyValueTableHeaders(true); + + R1 r1 = new R1(); + R2 r2 = new R2(); + R3 r3 = new R3(); + r1.r2 = r2; + r2.r3 = r3; + r3.r1 = r1; + + // No recursion detection + try { + s.build().serialize(r1); + fail("Exception expected!"); + } catch (Exception e) { + String msg = e.getLocalizedMessage(); + assertTrue(msg.contains("It's recommended you use the SerializerContext.SERIALIZER_detectRecursions setting to help locate the loop.")); + } + + // Recursion detection, no ignore + s.detectRecursions(true); + try { + s.build().serialize(r1); + fail("Exception expected!"); + } catch (Exception e) { + String msg = e.getLocalizedMessage(); + assertTrue(msg.contains("[0]:org.apache.juneau.html.CommonTest$R1")); + assertTrue(msg.contains("->[1]r2:org.apache.juneau.html.CommonTest$R2")); + assertTrue(msg.contains("->[2]r3:org.apache.juneau.html.CommonTest$R3")); + assertTrue(msg.contains("->[3]r1:org.apache.juneau.html.CommonTest$R1")); + } + + s.ignoreRecursions(true); + assertEquals( + "
      keyvalue
      namefoo
      r2
      keyvalue
      namebar
      r3
      keyvalue
      namebaz
      ", + s.build().serialize(r1) + ); + + // Make sure this doesn't blow up. + s.build().getSchemaSerializer().serialize(r1); + } + + public static class R1 { + public String name = "foo"; + public R2 r2; + } + public static class R2 { + public String name = "bar"; + public R3 r3; + } + public static class R3 { + public String name = "baz"; + public R1 r1; + } + + //==================================================================================================== + // Basic bean + //==================================================================================================== + @Test + public void testBasicBean() throws Exception { + WriterSerializer s = new HtmlSerializerBuilder().sq().trimNullProperties(false).sortProperties(true).addKeyValueTableHeaders(true).build(); + + J a = new J(); + a.setF1("J"); + a.setF2(100); + a.setF3(true); + assertEquals( + "" + +"" + +"" + +"" + +"" + +"
      keyvalue
      f1J
      f2100
      f3true
      ", + s.serialize(a)); + } + + public static class J { + private String f1 = null; + private int f2 = -1; + private boolean f3 = false; + + public String getF1() { + return this.f1; + } + + public void setF1(String f1) { + this.f1 = f1; + } + + public int getF2() { + return this.f2; + } + + public void setF2(int f2) { + this.f2 = f2; + } + + public boolean isF3() { + return this.f3; + } + + public void setF3(boolean f3) { + this.f3 = f3; + } + + @Override /* Object */ + public String toString() { + return ("J(f1: " + this.getF1() + ", f2: " + this.getF2() + ")"); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/75b0d8ee/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/html/HtmlTest.java ---------------------------------------------------------------------- diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/html/HtmlTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/html/HtmlTest.java new file mode 100755 index 0000000..9d76201 --- /dev/null +++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/html/HtmlTest.java @@ -0,0 +1,287 @@ +// *************************************************************************************************************************** +// * 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.juneau.html; + +import static org.apache.juneau.html.HtmlSerializerContext.*; +import static org.junit.Assert.*; + +import java.util.*; + +import org.apache.juneau.*; +import org.apache.juneau.html.annotation.*; +import org.apache.juneau.testbeans.*; +import org.junit.*; + +@SuppressWarnings({"javadoc","unchecked","rawtypes","serial"}) +public class HtmlTest { + + //==================================================================================================== + // Verifies that lists of maps/beans are converted to tables correctly. + //==================================================================================================== + @Test + public void testTables1() throws Exception { + HtmlSerializer s = HtmlSerializer.DEFAULT_SQ; + Object[] t; + String html; + + t = new Object[] {new A1(), new A1()}; + html = s.serialize(t); + assertEquals("
      f1
      f1
      f1
      ", html); + + } + + public static class A1 { + public String f1 = "f1"; + } + + //==================================================================================================== + // Test URI_ANCHOR_SET options + //==================================================================================================== + @Test + public void testAnchorTextOptions() throws Exception { + HtmlSerializerBuilder s = new HtmlSerializerBuilder().sq().addKeyValueTableHeaders(true).uriResolution(UriResolution.NONE); + TestURI t = new TestURI(); + String r; + String expected = null; + + s.uriAnchorText(TO_STRING); + r = strip(s.build().serialize(t)); + expected = "" + +"\n[f0]=
      f0/x0" + +"\n[f1]=f1/x1" + +"\n[f2]=/f2/x2" + +"\n[f3]=http://www.apache.org/f3/x3" + +"\n[f4]=f4/x4" + +"\n[f5]=/f5/x5" + +"\n[f6]=http://www.apache.org/f6/x6" + +"\n[f7]=http://www.apache.org/f7/x7" + +"\n[f8]=f8/x8" + +"\n[f9]=f9/x9" + +"\n[fa]=http://www.apache.org/fa/xa#MY_LABEL" + +"\n[fb]=MY_LABEL" + +"\n[fc]=MY_LABEL" + +"\n[fd]=http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar" + +"\n[fe]=http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL"; + assertEquals(expected, r); + + s.uriAnchorText(URI); + r = strip(s.build().serialize(t)); + expected = "" + +"\n[f0]=f0/x0" + +"\n[f1]=f1/x1" + +"\n[f2]=/f2/x2" + +"\n[f3]=http://www.apache.org/f3/x3" + +"\n[f4]=f4/x4" + +"\n[f5]=/f5/x5" + +"\n[f6]=http://www.apache.org/f6/x6" + +"\n[f7]=http://www.apache.org/f7/x7" + +"\n[f8]=f8/x8" + +"\n[f9]=f9/x9" + +"\n[fa]=http://www.apache.org/fa/xa#MY_LABEL" + +"\n[fb]=MY_LABEL" + +"\n[fc]=MY_LABEL" + +"\n[fd]=http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar" + +"\n[fe]=http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL"; + assertEquals(expected, r); + + s.uriAnchorText(LAST_TOKEN); + r = strip(s.build().serialize(t)); + expected = "" + +"\n[f0]=x0" + +"\n[f1]=x1" + +"\n[f2]=x2" + +"\n[f3]=x3" + +"\n[f4]=x4" + +"\n[f5]=x5" + +"\n[f6]=x6" + +"\n[f7]=x7" + +"\n[f8]=x8" + +"\n[f9]=x9" + +"\n[fa]=xa" + +"\n[fb]=MY_LABEL" + +"\n[fc]=MY_LABEL" + +"\n[fd]=xd" + +"\n[fe]=xe"; + assertEquals(expected, r); + + s.uriAnchorText(URI_ANCHOR); + r = strip(s.build().serialize(t)); + expected = "" + +"\n[f0]=f0/x0" + +"\n[f1]=f1/x1" + +"\n[f2]=/f2/x2" + +"\n[f3]=http://www.apache.org/f3/x3" + +"\n[f4]=f4/x4" + +"\n[f5]=/f5/x5" + +"\n[f6]=http://www.apache.org/f6/x6" + +"\n[f7]=http://www.apache.org/f7/x7" + +"\n[f8]=f8/x8" + +"\n[f9]=f9/x9" + +"\n[fa]=MY_LABEL" + +"\n[fb]=MY_LABEL" + +"\n[fc]=MY_LABEL" + +"\n[fd]=http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar" + +"\n[fe]=http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL"; + assertEquals(expected, r); + + s.labelParameter("label2"); + r = strip(s.build().serialize(t)); + expected = "" + +"\n[f0]=f0/x0" + +"\n[f1]=f1/x1" + +"\n[f2]=/f2/x2" + +"\n[f3]=http://www.apache.org/f3/x3" + +"\n[f4]=f4/x4" + +"\n[f5]=/f5/x5" + +"\n[f6]=http://www.apache.org/f6/x6" + +"\n[f7]=http://www.apache.org/f7/x7" + +"\n[f8]=f8/x8" + +"\n[f9]=f9/x9" + +"\n[fa]=MY_LABEL" + +"\n[fb]=http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar" + +"\n[fc]=http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL" + +"\n[fd]=MY_LABEL" + +"\n[fe]=MY_LABEL"; + assertEquals(expected, r); + + s.detectLinksInStrings(false); + r = strip(s.build().serialize(t)); + expected = "" + +"\n[f0]=f0/x0" + +"\n[f1]=f1/x1" + +"\n[f2]=/f2/x2" + +"\n[f3]=http://www.apache.org/f3/x3" + +"\n[f4]=f4/x4" + +"\n[f5]=/f5/x5" + +"\n[f6]=http://www.apache.org/f6/x6" + +"\n[f7]=http://www.apache.org/f7/x7" + +"\n[f8]=f8/x8" + +"\n[f9]=f9/x9" + +"\n[fa]=http://www.apache.org/fa/xa#MY_LABEL" + +"\n[fb]=http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar" + +"\n[fc]=http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL" + +"\n[fd]=http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar" + +"\n[fe]=http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL"; + assertEquals(expected, r); + + s.detectLinksInStrings(true); + s.lookForLabelParameters(false); + r = strip(s.build().serialize(t)); + expected = "" + +"\n[f0]=f0/x0" + +"\n[f1]=f1/x1" + +"\n[f2]=/f2/x2" + +"\n[f3]=http://www.apache.org/f3/x3" + +"\n[f4]=f4/x4" + +"\n[f5]=/f5/x5" + +"\n[f6]=http://www.apache.org/f6/x6" + +"\n[f7]=http://www.apache.org/f7/x7" + +"\n[f8]=f8/x8" + +"\n[f9]=f9/x9" + +"\n[fa]=MY_LABEL" + +"\n[fb]=http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar" + +"\n[fc]=http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL" + +"\n[fd]=http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar" + +"\n[fe]=http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL"; + assertEquals(expected, r); + } + + private String strip(String html) { + return html + .replace("", "") + .replace("
      keyvalue
      ", "") + .replace("", "\n[") + .replace("", "]=") + .replace("", ""); + } + + //==================================================================================================== + // Test @Html.asPlainText annotation on classes and fields + //==================================================================================================== + @Test + public void testHtmlAnnotationAsPlainText() throws Exception { + HtmlSerializer s = new HtmlSerializerBuilder().sq().addKeyValueTableHeaders(true).build(); + Object o = null; + String r; + + o = new B1(); + r = s.serialize(o); + assertEquals("", r); + + o = new B2(); + r = s.serialize(o); + assertEquals("
      keyvalue
      f1
      ", r); + } + + @Html(asPlainText=true) + public static class B1 { + public String f1 = ""; + @Override /* Object */ + public String toString() { + return ""; + } + } + + public static class B2 { + @Html(asPlainText=true) + public String f1 = ""; + } + + //==================================================================================================== + // Test @Html.asXml annotation on classes and fields + //==================================================================================================== + @Test + public void testHtmlAnnotationAsXml() throws Exception { + HtmlSerializer s = new HtmlSerializerBuilder().sq().addKeyValueTableHeaders(true).build(); + Object o = null; + String r; + + o = new C1(); + r = s.serialize(o); + assertEquals("<f1>", r); + + o = new C2(); + r = s.serialize(o); + assertEquals("
      keyvalue
      f1<f1>
      ", r); + } + + @Html(asXml=true) + public static class C1 { + public String f1 = ""; + } + + public static class C2 { + @Html(asXml=true) + public String f1 = ""; + } + + //==================================================================================================== + // Test @Html.noTableHeaders + //==================================================================================================== + @Test + public void testNoTableHeaders() throws Exception { + HtmlSerializer s = HtmlSerializer.DEFAULT_SQ; + Object o = null; + String r; + + Map m = new MyMap(); + m.put("foo", "bar"); + o = new ObjectList().append(m); + r = s.serialize(o); + assertEquals("
      • foobar
      ", r); + } + + @Html(noTables=true, noTableHeaders=true) + public static class MyMap extends LinkedHashMap {} + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/75b0d8ee/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/https/AcceptExtensionsTest.java ---------------------------------------------------------------------- diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/https/AcceptExtensionsTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/https/AcceptExtensionsTest.java new file mode 100644 index 0000000..c2759d4 --- /dev/null +++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/https/AcceptExtensionsTest.java @@ -0,0 +1,118 @@ +// *************************************************************************************************************************** +// * 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.juneau.https; + +import static org.apache.juneau.TestUtils.*; +import static org.junit.Assert.*; + +import org.apache.juneau.http.*; +import org.junit.*; + +/** + * Verifies that the Accept class handles parameters and extensions correctly. + */ +public class AcceptExtensionsTest { + + //-------------------------------------------------------------------------------- + // Verifies that media type parameters are distinguished from media range extensions. + //-------------------------------------------------------------------------------- + @Test + public void testExtensions() throws Exception { + Accept accept; + MediaTypeRange mr; + + accept = Accept.forString("text/json"); + mr = accept.asRanges().get(0); + assertTextEquals("text/json", mr); + assertTextEquals("text/json", mr.getMediaType()); + assertObjectEquals("{}", mr.getMediaType().getParameters()); + assertTextEquals("1.0", mr.getQValue()); + assertObjectEquals("{}", mr.getExtensions()); + + accept = Accept.forString("foo,bar"); + mr = accept.asRanges().get(0); + assertTextEquals("foo", mr); + assertTextEquals("foo", mr.getMediaType()); + assertObjectEquals("{}", mr.getMediaType().getParameters()); + assertTextEquals("1.0", mr.getQValue()); + assertObjectEquals("{}", mr.getExtensions()); + + accept = Accept.forString(" foo , bar "); + mr = accept.asRanges().get(0); + assertTextEquals("foo", mr); + assertTextEquals("foo", mr.getMediaType()); + assertObjectEquals("{}", mr.getMediaType().getParameters()); + assertTextEquals("1.0", mr.getQValue()); + assertObjectEquals("{}", mr.getExtensions()); + + accept = Accept.forString("text/json;a=1;q=0.9;b=2"); + mr = accept.asRanges().get(0); + assertTextEquals("text/json;a=1;q=0.9;b=2", mr); + assertTextEquals("text/json;a=1", mr.getMediaType()); + assertObjectEquals("{a:['1']}", mr.getMediaType().getParameters()); + assertTextEquals("0.9", mr.getQValue()); + assertObjectEquals("{b:['2']}", mr.getExtensions()); + + accept = Accept.forString("text/json;a=1;a=2;q=0.9;b=3;b=4"); + mr = accept.asRanges().get(0); + assertTextEquals("text/json;a=1;a=2;q=0.9;b=3;b=4", mr); + assertTextEquals("text/json;a=1;a=2", mr.getMediaType()); + assertObjectEquals("{a:['1','2']}", mr.getMediaType().getParameters()); + assertTextEquals("0.9", mr.getQValue()); + assertObjectEquals("{b:['3','4']}", mr.getExtensions()); + + accept = Accept.forString("text/json;a=1"); + mr = accept.asRanges().get(0); + assertTextEquals("text/json;a=1", mr); + assertTextEquals("text/json;a=1", mr.getMediaType()); + assertObjectEquals("{a:['1']}", mr.getMediaType().getParameters()); + assertTextEquals("1.0", mr.getQValue()); + assertObjectEquals("{}", mr.getExtensions()); + + accept = Accept.forString("text/json;a=1;"); + mr = accept.asRanges().get(0); + assertTextEquals("text/json;a=1", mr); + assertTextEquals("text/json;a=1", mr.getMediaType()); + assertObjectEquals("{a:['1']}", mr.getMediaType().getParameters()); + assertTextEquals("1.0", mr.getQValue()); + assertObjectEquals("{}", mr.getExtensions()); + + accept = Accept.forString("text/json;q=0.9"); + mr = accept.asRanges().get(0); + assertTextEquals("text/json;q=0.9", mr); + assertTextEquals("text/json", mr.getMediaType()); + assertObjectEquals("{}", mr.getMediaType().getParameters()); + assertTextEquals("0.9", mr.getQValue()); + assertObjectEquals("{}", mr.getExtensions()); + + accept = Accept.forString("text/json;q=0.9;"); + mr = accept.asRanges().get(0); + assertTextEquals("text/json;q=0.9", mr); + assertTextEquals("text/json", mr.getMediaType()); + assertObjectEquals("{}", mr.getMediaType().getParameters()); + assertTextEquals("0.9", mr.getQValue()); + assertObjectEquals("{}", mr.getExtensions()); + } + + //-------------------------------------------------------------------------------- + // Tests the Accept.hasSubtypePart() method. + //-------------------------------------------------------------------------------- + @Test + public void testHasSubtypePart() { + Accept accept = Accept.forString("text/json+x,text/foo+y;q=0.0"); + assertTrue(accept.hasSubtypePart("json")); + assertTrue(accept.hasSubtypePart("x")); + assertFalse(accept.hasSubtypePart("foo")); + assertFalse(accept.hasSubtypePart("y")); + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/75b0d8ee/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/https/AcceptTest.java ---------------------------------------------------------------------- diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/https/AcceptTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/https/AcceptTest.java new file mode 100644 index 0000000..6f44506 --- /dev/null +++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/https/AcceptTest.java @@ -0,0 +1,127 @@ +// *************************************************************************************************************************** +// * 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.juneau.https; + +import java.util.*; + +import org.apache.juneau.*; +import org.apache.juneau.http.*; +import org.apache.juneau.json.*; +import org.junit.*; +import org.junit.runner.*; +import org.junit.runners.*; + +/** + * Verifies that the Accept class handles matching correctly. + */ +@RunWith(Parameterized.class) +public class AcceptTest { + @Parameterized.Parameters + public static Collection getParameters() { + return Arrays.asList(new Object[][] { + + // label, accept-header, media-types, expected-index + + // Simple matches + { "SimpleMatch-1", "text/json", "['text/json']", 0 }, + { "SimpleMatch-2", "text/json", "['text/json','text/foo']", 0 }, + { "SimpleMatch-3", "text/json", "['text/foo','text/json']", 1 }, + + // Simple no-matches + { "SimpleNoMatch-1", "text/jsonx", "['text/json']", -1 }, + { "SimpleNoMatch-2", "text/jso", "['text/json']", -1 }, + { "SimpleNoMatch-3", "text/json", "['application/json']", -1 }, + { "SimpleNoMatch-4", "text/json", "[]", -1 }, + + // Meta-character matches + { "MetaMatch-1", "text/*", "['text/a','text/b+c','text/b+d+e']", 2 }, + { "MetaMatch-2", "text/b+*", "['text/a','text/b+c','text/b+d+e']", 2 }, + { "MetaMatch-3", "text/c+*", "['text/a','text/b+c','text/b+d+e']", 1 }, + { "MetaMatch-4", "text/b+d+e", "['text/a','text/b+c','text/b+d']", 2 }, + { "MetaMatch-5", "text/b+*", "['text/a','text/b+c','text/b+d']", 1 }, + { "MetaMatch-6", "text/d+e+*", "['text/a','text/b+c','text/b+d+e']", 2 }, + + { "MetaMatch-7", "*/a", "['text/a','application/a']", 0 }, + { "MetaMatch-8", "*/*", "['text/a','text/b+c']", 1 }, + { "MetaMatch-9", "*/*", "['text/b+c','text/a']", 0 }, + + // Reverse meta-character matches + { "RevMetaMatch-1", "text/a", "['text/*']", 0 }, + { "RevMetaMatch-3", "text/a", "['*/a']", 0 }, + { "RevMetaMatch-3", "text/a", "['*/*']", 0 }, + + // Meta-character mixture matches + { "MixedMetaMatch-1", "text/*", "['text/*','text/a','text/a+b','text/b+c','text/d+*']", 0 }, + { "MixedMetaMatch-2", "*/a", "['text/*','text/a','text/a+b','text/b+c','text/d+*']", 1 }, + { "MixedMetaMatch-3", "*/*", "['text/*','text/a','text/a+b','text/b+c','text/d+*']", 0 }, + { "MixedMetaMatch-4", "text/a+*", "['text/*','text/a','text/a+b','text/b+c','text/d+*']", 2 }, + { "MixedMetaMatch-5", "text/c+*", "['text/*','text/a','text/a+b','text/b+c','text/d+*']", 3 }, + { "MixedMetaMatch-6", "text/d+*", "['text/*','text/a','text/a+b','text/b+c','text/d+*']", 4 }, + + // Fuzzy matches + { "Fuzzy-1", "text/1+2", "['text/1+2']", 0 }, + // Order of subtype parts shouldn't matter. + { "Fuzzy-2", "text/2+1", "['text/1+2']", 0 }, + // Should match if Accept has 'extra' subtypes. + // For example, "Accept: text/json+activity" should match against the "text/json" serializer. + { "Fuzzy-3", "text/1+2", "['text/1']", 0 }, + // Shouldn't match because the accept media type must be at least a subset of the real media type + // For example, "Accept: text/json" should not match against the "text/json+lax" serializer. + { "Fuzzy-4", "text/1", "['text/1+2']", -1 }, + { "Fuzzy-5", "text/1+2", "['text/1','text/1+3']", 0 }, + // "text/1+2" should be a better match than just "text/1" + { "Fuzzy-6", "text/1+2", "['text/1','text/1+2','text/1+2+3']", 1 }, + // Same as last, but mix up the order a bit. + { "Fuzzy-7", "text/1+2", "['text/1+2+3','text/1','text/1+2']", 2 }, + // Same as last, but mix up the order of the subtypes as well. + { "Fuzzy-8", "text/1+2", "['text/3+2+1','text/1','text/2+1']", 2 }, + { "Fuzzy-9", "text/1+2+3+4", "['text/1+2','text/1+2+3']", 1 }, + { "Fuzzy-10", "text/1+2+3+4", "['text/1+2+3','text/1+2']", 0 }, + { "Fuzzy-11", "text/4+2+3+1", "['text/1+2+3','text/1+2']", 0 }, + { "Fuzzy-12", "text/4+2+3+1", "['text/1+2','text/1+2+3']", 1 }, + + // Q metrics + { "Q-1", "text/A;q=0.9,text/B;q=0.1", "['text/A','text/B']", 0 }, + { "Q-2", "text/A;q=0.9,text/B;q=0.1", "['text/B','text/A']", 1 }, + { "Q-3", "text/A+1;q=0.9,text/B;q=0.1", "['text/A','text/B']", 0 }, + { "Q-4", "text/A;q=0.9,text/B+1;q=0.1", "['text/A','text/B+1']", 0 }, + { "Q-5", "text/A;q=0.9,text/A+1;q=0.1", "['text/A+1','text/A']", 1 }, + + // Test q=0 + { "Q0-1", "text/A;q=0,text/B;q=0.1", "['text/A','text/B']", 1 }, + { "Q0-2", "text/A;q=0,text/B;q=0.1", "['text/A','text/A+1']", -1 }, + + // Test media types with parameters + { "Parms-1", "text/A", "['text/A;foo=bar','text/B']", 0 }, + { "Parms-2", "text/A;foo=bar", "['text/A','text/B']", 0 }, + }); + } + + private String label, accept, mediaTypes; + private int expected; + + public AcceptTest(String label, String accept, String mediaTypes, int expected) { + this.label = label; + this.accept = accept; + this.mediaTypes = mediaTypes; + this.expected = expected; + } + + @Test + public void test() throws Exception { + Accept accept = Accept.forString(this.accept); + MediaType[] mt = JsonParser.DEFAULT.parse(mediaTypes, MediaType[].class); + int r = accept.findMatch(mt); + TestUtils.assertEquals(expected, r, "{0} failed", label); + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/75b0d8ee/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/https/ContentTypeTest.java ---------------------------------------------------------------------- diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/https/ContentTypeTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/https/ContentTypeTest.java new file mode 100644 index 0000000..ecf7b93 --- /dev/null +++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/https/ContentTypeTest.java @@ -0,0 +1,90 @@ +// *************************************************************************************************************************** +// * 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.juneau.https; + +import java.util.*; + +import org.apache.juneau.*; +import org.apache.juneau.http.*; +import org.apache.juneau.json.*; +import org.junit.*; +import org.junit.runner.*; +import org.junit.runners.*; + +/** + * Verifies that the Content-Type class handles matching correctly. + */ +@RunWith(Parameterized.class) +public class ContentTypeTest { + @Parameterized.Parameters + public static Collection getParameters() { + return Arrays.asList(new Object[][] { + + // label, accept-header, media-types, expected-index + + // Simple matches + { "SimpleMatch-1", "text/json", "['text/json']", 0 }, + { "SimpleMatch-2", "text/json", "['text/json','text/foo']", 0 }, + { "SimpleMatch-3", "text/json", "['text/foo','text/json']", 1 }, + + // Simple no-matches + { "SimpleNoMatch-1", "text/jsonx", "['text/json']", -1 }, + { "SimpleNoMatch-2", "text/jso", "['text/json']", -1 }, + { "SimpleNoMatch-3", "text/json", "['application/json']", -1 }, + { "SimpleNoMatch-4", "text/json", "[]", -1 }, + + { "XmlAndRdf-1", "text/xml+rdf", "['text/xml','text/xml+rdf']", 1 }, + { "XmlAndRdf-2", "text/xml+rdf", "['text/xml+rdf','text/xml']", 0 }, + + // Fuzzy matches + { "Fuzzy-1", "text/1+2", "['text/1+2']", 0 }, + // Order of subtype parts shouldn't matter. + { "Fuzzy-2", "text/2+1", "['text/1+2']", 0 }, + // Should match if Accept has 'extra' subtypes. + // For example, "Accept: text/json+activity" should match against the "text/json" serializer. + { "Fuzzy-3", "text/1+2", "['text/1']", 0 }, + // Shouldn't match because the accept media type must be at least a subset of the real media type + // For example, "Accept: text/json" should not match against the "text/json+lax" serializer. + { "Fuzzy-4", "text/1", "['text/1+2']", -1 }, + { "Fuzzy-5", "text/1+2", "['text/1','text/1+3']", 0 }, + // "text/1+2" should be a better match than just "text/1" + { "Fuzzy-6", "text/1+2", "['text/1','text/1+2','text/1+2+3']", 1 }, + // Same as last, but mix up the order a bit. + { "Fuzzy-7", "text/1+2", "['text/1+2+3','text/1','text/1+2']", 2 }, + // Same as last, but mix up the order of the subtypes as well. + { "Fuzzy-8", "text/1+2", "['text/3+2+1','text/1','text/2+1']", 2 }, + { "Fuzzy-9", "text/1+2+3+4", "['text/1+2','text/1+2+3']", 1 }, + { "Fuzzy-10", "text/1+2+3+4", "['text/1+2+3','text/1+2']", 0 }, + { "Fuzzy-11", "text/4+2+3+1", "['text/1+2+3','text/1+2']", 0 }, + { "Fuzzy-12", "text/4+2+3+1", "['text/1+2','text/1+2+3']", 1 }, + }); + } + + private String label, contentType, mediaTypes; + private int expected; + + public ContentTypeTest(String label, String contentType, String mediaTypes, int expected) { + this.label = label; + this.contentType = contentType; + this.mediaTypes = mediaTypes; + this.expected = expected; + } + + @Test + public void test() throws Exception { + ContentType ct = ContentType.forString(this.contentType); + MediaType[] mt = JsonParser.DEFAULT.parse(mediaTypes, MediaType[].class); + int r = ct.findMatch(mt); + TestUtils.assertEquals(expected, r, "{0} failed", label); + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/75b0d8ee/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/https/MediaRangeTest.java ---------------------------------------------------------------------- diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/https/MediaRangeTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/https/MediaRangeTest.java new file mode 100644 index 0000000..8ba7acb --- /dev/null +++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/https/MediaRangeTest.java @@ -0,0 +1,66 @@ +// *************************************************************************************************************************** +// * 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.juneau.https; + +import static org.junit.Assert.*; + +import java.util.*; + +import org.apache.juneau.http.*; +import org.apache.juneau.json.*; +import org.junit.*; +import org.junit.runner.*; +import org.junit.runners.*; + +/** + * Verifies that the MediaRange and MediaType classes parse and sort Accept headers correctly. + */ +@RunWith(Parameterized.class) +public class MediaRangeTest { + @Parameterized.Parameters + public static Collection getParameters() { + return Arrays.asList(new Object[][] { + { "0", "text/json", "['text/json']" }, + { "1", "text/json,text/*", "['text/json','text/*']" }, + { "2", "text/*,text/json", "['text/json','text/*']" }, + { "3", "text/*,text/*", "['text/*']" }, + { "4", "*/text,text/*", "['text/*','*/text']" }, + { "5", "text/*,*/text", "['text/*','*/text']" }, + { "6", "a;q=0.9,b;q=0.1", "['a;q=0.9','b;q=0.1']" }, + { "7", "b;q=0.9,a;q=0.1", "['b;q=0.9','a;q=0.1']" }, + { "8", "a,b;q=0.9,c;q=0.1,d;q=0", "['a','b;q=0.9','c;q=0.1','d;q=0.0']" }, + { "9", "d;q=0,c;q=0.1,b;q=0.9,a", "['a','b;q=0.9','c;q=0.1','d;q=0.0']" }, + { "10", "a;q=1,b;q=0.9,c;q=0.1,d;q=0", "['a','b;q=0.9','c;q=0.1','d;q=0.0']" }, + { "11", "d;q=0,c;q=0.1,b;q=0.9,a;q=1", "['a','b;q=0.9','c;q=0.1','d;q=0.0']" }, + { "12", "a;q=0,b;q=0.1,c;q=0.9,d;q=1", "['d','c;q=0.9','b;q=0.1','a;q=0.0']" }, + { "13", "*", "['*']" }, + { "14", "", "['*/*']" }, + { "15", null, "['*/*']" }, + { "16", "foo/bar/baz", "['foo/bar/baz']" }, + }); + } + + private String label, mediaRange, expected; + + public MediaRangeTest(String label, String mediaRange, String expected) { + this.label = label; + this.mediaRange = mediaRange; + this.expected = expected; + } + + @Test + public void test() { + MediaTypeRange[] r = MediaTypeRange.parse(mediaRange); + assertEquals(label + " failed", expected, JsonSerializer.DEFAULT_LAX.toString(r)); + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/75b0d8ee/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/ini/ConfigFileBuilderTest.java ---------------------------------------------------------------------- diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/ini/ConfigFileBuilderTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/ini/ConfigFileBuilderTest.java new file mode 100755 index 0000000..f780f64 --- /dev/null +++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/ini/ConfigFileBuilderTest.java @@ -0,0 +1,198 @@ +// *************************************************************************************************************************** +// * 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.juneau.ini; + +import static org.apache.juneau.TestUtils.*; +import static org.junit.Assert.*; +import static org.apache.juneau.internal.FileUtils.*; +import static org.apache.juneau.internal.StringUtils.*; +import static org.apache.juneau.internal.IOUtils.*; + +import java.io.*; + +import org.apache.juneau.svl.*; +import org.junit.*; + +@SuppressWarnings("javadoc") +public class ConfigFileBuilderTest { + + private static File tempDir; + private static String[] TEMP_DIR; + + @BeforeClass + public static void setup() { + tempDir = new File(System.getProperty("java.io.tmpdir"), generateUUID(12)); + mkdirs(tempDir, true); + TEMP_DIR = new String[]{tempDir.getAbsolutePath()}; + } + + @AfterClass + public static void teardown() { + delete(tempDir); + } + + /** + * + * @throws Exception + */ + @Test + public void testGet() throws Exception { + File f; + ConfigFileBuilder b1 = new ConfigFileBuilder().paths(TEMP_DIR).createIfNotExists(); + + ConfigFile cf = b1.build("TestGet.cfg"); + cf.put("Test/A", "a"); + + f = new File(tempDir, "TestGet.cfg"); + assertTrue(f.exists()); + + cf.save(); + assertTextEquals("[Test]|A = a|", read(f)); + + cf = b1.build("TestGet.cfg"); + assertObjectEquals("{'default':{},Test:{A:'a'}}", cf); + + String NL = System.getProperty("line.separator"); + cf = b1.build(new StringReader(("[Test]"+NL+"A = a"+NL))); + assertObjectEquals("{'default':{},Test:{A:'a'}}", cf); + + b1.charset(UTF8); + cf = b1.build("TestGet.cfg"); + assertObjectEquals("{'default':{},Test:{A:'a'}}", cf); + } + + /** + * Retrieving config file should fail if the file doesn't exist and createIfNotExist == false. + */ + @Test + public void testFailOnNonExistentFiles() throws Exception { + ConfigFileBuilder b = new ConfigFileBuilder().paths(new String[]{tempDir.getAbsolutePath()}); + try { b.build("TestGet2.cfg"); fail(); } catch (FileNotFoundException e) {} + try { b.build(tempDir.getAbsolutePath() + "TestGet2.cfg"); fail(); } catch (FileNotFoundException e) {} + + b = new ConfigFileBuilder().paths().createIfNotExists(); + try { b.build("TestGet.cfg"); fail(); } catch (FileNotFoundException e) {} + } + + + //==================================================================================================== + // loadIfModified() + //==================================================================================================== + @Test + public void testLoadIfModified() throws Exception { + ConfigFileBuilder b = new ConfigFileBuilder().paths(TEMP_DIR).createIfNotExists(); + File f; + ConfigFile cf = b.build("TestGet.cfg"); + cf.put("Test/A", "a"); + + f = new File(tempDir, "TestGet.cfg"); + String NL = System.getProperty("line.separator"); + write(f, new StringReader("[Test]"+NL+"A = b"+NL)); + modifyTimestamp(f); + + cf.loadIfModified(); + assertEquals("b", cf.getString("Test/A")); + cf.loadIfModified(); + assertEquals("b", cf.getString("Test/A")); + + // Config file with no backing file. + cf = b.build(); + cf.put("Test/B", "b"); + cf.loadIfModified(); + cf.loadIfModified(); + assertEquals("b", cf.getString("Test/B")); + } + + //==================================================================================================== + // read only + //==================================================================================================== + @Test + public void testReadOnly() throws Exception { + ConfigFileBuilder cm = new ConfigFileBuilder().paths(TEMP_DIR).createIfNotExists().readOnly(); + ConfigFile cf = cm.build("TestGet.cfg"); + + // All these should fail. + try { cf.loadIfModified(); fail(); } catch (UnsupportedOperationException e) {} + try { cf.load(); fail(); } catch (UnsupportedOperationException e) {} + try { cf.load(new StringReader("")); fail(); } catch (UnsupportedOperationException e) {} + try { cf.put("A","b"); fail(); } catch (UnsupportedOperationException e) {} + try { cf.put("A","b",true); fail(); } catch (UnsupportedOperationException e) {} + try { cf.put("A","b"); fail(); } catch (UnsupportedOperationException e) {} + try { cf.put("A","b",true); fail(); } catch (UnsupportedOperationException e) {} + try { cf.removeString("A"); fail(); } catch (UnsupportedOperationException e) {} + try { cf.addLines("A","b=c"); fail(); } catch (UnsupportedOperationException e) {} + try { cf.addHeaderComments("A", "b=c"); fail(); } catch (UnsupportedOperationException e) {} + try { cf.clearHeaderComments("A"); fail(); } catch (UnsupportedOperationException e) {} + try { cf.addSection("A"); fail(); } catch (UnsupportedOperationException e) {} + try { cf.setSection("A",null); fail(); } catch (UnsupportedOperationException e) {} + try { cf.removeSection("A"); fail(); } catch (UnsupportedOperationException e) {} + try { cf.save(); fail(); } catch (UnsupportedOperationException e) {} + try { cf.merge(cf); fail(); } catch (UnsupportedOperationException e) {} + try { cf.addListener(new ConfigFileListener(){}); fail(); } catch (UnsupportedOperationException e) {} + + // All these should succeed. + cf.getObject("A", String.class); + cf.getObject("A", "a", String.class); + cf.getString("A"); + cf.getString("A","a"); + cf.getObject("A", String.class); + cf.getObject("A", "a", String.class); + cf.getObject("A", String[].class); + cf.getStringArray("A"); + cf.getStringArray("A", null); + cf.getInt("A"); + cf.getInt("A", 0); + cf.getBoolean("A"); + cf.getBoolean("A", true); + cf.containsNonEmptyValue("A"); + cf.getSectionMap("A"); + cf.serializeTo(new StringWriter()); + cf.serializeTo(new StringWriter(), ConfigFileFormat.INI); + cf.getResolving(VarResolver.DEFAULT); + cf.toWritable(); + } + + //==================================================================================================== + // main(String[] args) + //==================================================================================================== + @Test + public void testMain() throws Exception { + System.setProperty("exit.2", "0"); + ConfigFileBuilder cm = new ConfigFileBuilder().paths(TEMP_DIR).createIfNotExists(); + + ConfigFile cf = cm.build("Test.cfg") + .addLines(null, "# c1", "\t# c2", " c3 ", " ", "x1=1", "x2=true", "x3=null") + .addLines("s1", "#c4", "k1=1", "#c5 foo=bar", "k2 = true", "k3 = \tnull"); + cf.save(); + + File configFile = new File(tempDir, "Test.cfg"); + File envFile = new File(tempDir, "Test.bat"); + + ConfigFileBuilder.main(new String[]{"createBatchEnvFile", "-configFile", configFile.getAbsolutePath(), "-envFile", envFile.getAbsolutePath()}); + String expected = "rem c1|rem c2|rem c3||set x1 = 1|set x2 = true|set x3 = null|rem c4|set s1_k1 = 1|rem c5 foo=bar|set s1_k2 = true|set s1_k3 = null|"; + String actual = read(envFile); + assertTextEquals(expected, actual); + + ConfigFileBuilder.main(new String[]{"createShellEnvFile", "-configFile", configFile.getAbsolutePath(), "-envFile", envFile.getAbsolutePath()}); + expected = "# c1|# c2|# c3||export x1=\"1\"|export x2=\"true\"|export x3=\"null\"|# c4|export s1_k1=\"1\"|# c5 foo=bar|export s1_k2=\"true\"|export s1_k3=\"null\"|"; + actual = read(envFile); + assertTextEquals(expected, actual); + + ConfigFileBuilder.main(new String[]{"setVals", "-configFile", configFile.getAbsolutePath(), "-vals", "x1=2", "s1/k1=2", "s2/k1=3"}); + modifyTimestamp(configFile); + cf.loadIfModified(); + assertObjectEquals("{'default':{x1:'2',x2:'true',x3:'null'},s1:{k1:'2',k2:'true',k3:'null'},s2:{k1:'3'}}", cf); + + ConfigFileBuilder.main(new String[]{}); + } +} \ No newline at end of file