Added: 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/NlsTest.java
==============================================================================
--- 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/NlsTest.java
 (added)
+++ 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/NlsTest.java
 Fri Sep  8 23:21:12 2017
@@ -0,0 +1,97 @@
+// 
***************************************************************************************************************************
+// * 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.rest.test;
+
+import static org.apache.juneau.rest.test.TestUtils.*;
+
+import org.apache.juneau.dto.swagger.*;
+import org.apache.juneau.rest.client.*;
+import org.junit.*;
+
+public class NlsTest extends RestTestcase {
+
+       private static String URL = "/testNls";
+       private RestClient client = TestMicroservice.DEFAULT_CLIENT;
+
+       // 
====================================================================================================
+       // test1 - Pull labels from annotations only.
+       // 
====================================================================================================
+       @Test
+       public void test1() throws Exception {
+
+               Swagger s = client.doOptions(URL + 
"/test1").getResponse(Swagger.class);
+               assertObjectEquals("{title:'Test1.a',description:'Test1.b'}", 
s.getInfo());
+               
assertObjectEquals("[{'in':'body',description:'Test1.f'},{'in':'header',name:'D',type:'string',description:'Test1.g'},{'in':'header',name:'D2',type:'string',description:'Test1.j'},{'in':'header',name:'g'},{'in':'path',name:'a',type:'string',description:'Test1.d',required:true},{'in':'path',name:'a2',type:'string',description:'Test1.h',required:true},{'in':'path',name:'e',required:true},{'in':'query',name:'b',type:'string',description:'Test1.e'},{'in':'query',name:'b2',type:'string',description:'Test1.i'},{'in':'query',name:'f'}]",
 s.getPaths().get("/{a}").get("post").getParameters());
+               
assertObjectEquals("{'200':{description:'OK'},'201':{description:'Test1.l',headers:{bar:{description:'Test1.m',type:'string'}}}}",
 s.getPaths().get("/{a}").get("post").getResponses());
+       }
+
+       // 
====================================================================================================
+       // test2 - Pull labels from resource bundles only - simple keys.
+       // 
====================================================================================================
+       @Test
+       public void test2() throws Exception {
+
+               Swagger s = client.doOptions(URL + 
"/test2").getResponse(Swagger.class);
+               assertObjectEquals("{title:'Test2.a',description:'Test2.b'}", 
s.getInfo());
+               
assertObjectEquals("[{'in':'body',description:'Test2.f'},{'in':'header',name:'D',description:'Test2.g'},{'in':'header',name:'D2',description:'Test2.j'},{'in':'header',name:'g'},{'in':'path',name:'a',description:'Test2.d',required:true},{'in':'path',name:'a2',description:'Test2.h',required:true},{'in':'path',name:'e',required:true},{'in':'query',name:'b',description:'Test2.e'},{'in':'query',name:'b2',description:'Test2.i'},{'in':'query',name:'f'}]",
 s.getPaths().get("/{a}").get("post").getParameters());
+               
assertObjectEquals("{'200':{description:'OK2'},'201':{description:'Test2.l'}}", 
s.getPaths().get("/{a}").get("post").getResponses());
+       }
+
+       // 
====================================================================================================
+       // test3 - Pull labels from resource bundles only - keys with class 
names.
+       // 
====================================================================================================
+       @Test
+       public void test3() throws Exception {
+
+               Swagger s = client.doOptions(URL + 
"/test3").getResponse(Swagger.class);
+               assertObjectEquals("{title:'Test3.a',description:'Test3.b'}", 
s.getInfo());
+               
assertObjectEquals("[{'in':'body',description:'Test3.f'},{'in':'header',name:'D',description:'Test3.g'},{'in':'header',name:'D2',description:'Test3.j'},{'in':'header',name:'g'},{'in':'path',name:'a',description:'Test3.d',required:true},{'in':'path',name:'a2',description:'Test3.h',required:true},{'in':'path',name:'e',required:true},{'in':'query',name:'b',description:'Test3.e'},{'in':'query',name:'b2',description:'Test3.i'},{'in':'query',name:'f'}]",
 s.getPaths().get("/{a}").get("post").getParameters());
+               
assertObjectEquals("{'200':{description:'OK3'},'201':{description:'Test3.l'}}", 
s.getPaths().get("/{a}").get("post").getResponses());
+       }
+
+       // 
====================================================================================================
+       // test4 - Pull labels from resource bundles only. Values have 
localized variables to resolve.
+       // 
====================================================================================================
+       @Test
+       public void test4() throws Exception {
+
+               Swagger s = client.doOptions(URL + 
"/test4").getResponse(Swagger.class);
+               assertObjectEquals("{title:'baz',description:'baz'}", 
s.getInfo());
+               
assertObjectEquals("[{'in':'body',description:'baz'},{'in':'header',name:'D',description:'baz'},{'in':'header',name:'D2',description:'baz'},{'in':'header',name:'g'},{'in':'path',name:'a',description:'baz',required:true},{'in':'path',name:'a2',description:'baz',required:true},{'in':'path',name:'e',required:true},{'in':'query',name:'b',description:'baz'},{'in':'query',name:'b2',description:'baz'},{'in':'query',name:'f'}]",
 s.getPaths().get("/{a}").get("post").getParameters());
+               
assertObjectEquals("{'200':{description:'foobazfoobazfoo'},'201':{description:'baz'}}",
 s.getPaths().get("/{a}").get("post").getResponses());
+       }
+
+       // 
====================================================================================================
+       // test5 - Pull labels from resource bundles only. Values have request 
variables to resolve.
+       // 
====================================================================================================
+       @Test
+       public void test5() throws Exception {
+
+               Swagger s = client.doOptions(URL + 
"/test5").getResponse(Swagger.class);
+               assertObjectEquals("{title:'baz2',description:'baz2'}", 
s.getInfo());
+               
assertObjectEquals("[{'in':'body',description:'baz2'},{'in':'header',name:'D',description:'baz2'},{'in':'header',name:'D2',description:'baz2'},{'in':'header',name:'g'},{'in':'path',name:'a',description:'baz2',required:true},{'in':'path',name:'a2',description:'baz2',required:true},{'in':'path',name:'e',required:true},{'in':'query',name:'b',description:'baz2'},{'in':'query',name:'b2',description:'baz2'},{'in':'query',name:'f'}]",
 s.getPaths().get("/{a}").get("post").getParameters());
+               
assertObjectEquals("{'200':{description:'foobaz2foobaz2foo'},'201':{description:'baz2'}}",
 s.getPaths().get("/{a}").get("post").getResponses());
+       }
+
+       // 
====================================================================================================
+       // test6 - Pull labels from annotations only, but annotations contain 
variables.
+       // 
====================================================================================================
+       @Test
+       public void test6() throws Exception {
+
+               Swagger s = client.doOptions(URL + 
"/test6").getResponse(Swagger.class);
+               assertObjectEquals("{title:'baz',description:'baz'}", 
s.getInfo());
+               
assertObjectEquals("[{'in':'body',description:'baz'},{'in':'header',name:'D',type:'string',description:'baz'},{'in':'header',name:'D2',type:'string',description:'baz'},{'in':'header',name:'g'},{'in':'path',name:'a',type:'string',description:'baz',required:true},{'in':'path',name:'a2',type:'string',description:'baz',required:true},{'in':'path',name:'e',required:true},{'in':'query',name:'b',type:'string',description:'baz'},{'in':'query',name:'b2',type:'string',description:'baz'},{'in':'query',name:'f'}]",
 s.getPaths().get("/{a}").get("post").getParameters());
+               
assertObjectEquals("{'200':{description:'OK'},'201':{description:'baz',headers:{bar:{description:'baz',type:'string'}}}}",
 s.getPaths().get("/{a}").get("post").getResponses());
+       }
+}

Propchange: 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/NlsTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/NoParserInputTest.java
==============================================================================
--- 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/NoParserInputTest.java
 (added)
+++ 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/NoParserInputTest.java
 Fri Sep  8 23:21:12 2017
@@ -0,0 +1,61 @@
+// 
***************************************************************************************************************************
+// * 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.rest.test;
+
+import static javax.servlet.http.HttpServletResponse.*;
+import static org.apache.juneau.rest.test.TestUtils.*;
+import static org.junit.Assert.*;
+
+import org.apache.juneau.rest.client.*;
+import org.junit.*;
+
+public class NoParserInputTest extends RestTestcase {
+
+       private static String URL = "/testNoParserInput";
+       private static boolean debug = false;
+       RestClient plainTextClient = TestMicroservice.DEFAULT_CLIENT_PLAINTEXT;
+
+       
//====================================================================================================
+       // @Body annotated InputStream.
+       
//====================================================================================================
+       @Test
+       public void testInputStream() throws Exception {
+               String r = plainTextClient.doPut(URL + "/testInputStream", 
"foo").getResponseAsString();
+               assertEquals("foo", r);
+       }
+
+       
//====================================================================================================
+       // @Body annotated Reader.
+       
//====================================================================================================
+       @Test
+       public void testReader() throws Exception {
+               String r = plainTextClient.doPut(URL + "/testReader", 
"foo").getResponseAsString();
+               assertEquals("foo", r);
+       }
+
+       
//====================================================================================================
+       // @Body annotated PushbackReader.
+       // This should always fail since the servlet reader is not a pushback 
reader.
+       
//====================================================================================================
+       @Test
+       public void testPushbackReader() throws Exception {
+               try {
+                       plainTextClient.doPut(URL + 
"/testPushbackReader?noTrace=true", "foo").getResponseAsString();
+                       fail("Exception expected");
+               } catch (RestCallException e) {
+                       checkErrorResponse(debug, e, SC_BAD_REQUEST,
+                               "Invalid argument type passed to the following 
method:",
+                               "'public java.lang.String 
org.apache.juneau.rest.test.NoParserInputResource.testPushbackReader(java.io.PushbackReader)
 throws java.lang.Exception'");
+               }
+       }
+}

Propchange: 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/NoParserInputTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/OnPostCallTest.java
==============================================================================
--- 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/OnPostCallTest.java
 (added)
+++ 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/OnPostCallTest.java
 Fri Sep  8 23:21:12 2017
@@ -0,0 +1,121 @@
+// 
***************************************************************************************************************************
+// * 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.rest.test;
+
+import static org.junit.Assert.*;
+
+import java.io.*;
+
+import org.apache.juneau.rest.client.*;
+import org.junit.*;
+
+public class OnPostCallTest extends RestTestcase {
+
+       private static String URL = "/testOnPostCall";
+
+       
//====================================================================================================
+       // Properties overridden via properties annotation.
+       
//====================================================================================================
+       @Test
+       public void testPropertiesOverridenByAnnotation() throws Exception {
+               RestClient client = 
TestMicroservice.client().accept("text/s1").build();
+               String url = URL + "/testPropertiesOverridenByAnnotation";
+               String r;
+               RestCall rc;
+
+               r = client.doPut(url, new 
StringReader("")).getResponseAsString();
+               
assertEquals("p1=sp1,p2=xp2,p3=mp3,p4=xp4,p5=xp5,contentType=text/s1", r);
+
+               r = client.doPut(url, new 
StringReader("")).header("Override-Accept", "text/s2").getResponseAsString();
+               
assertEquals("p1=sp1,p2=xp2,p3=mp3,p4=xp4,p5=xp5,contentType=text/s2", r);
+
+               rc = client.doPut(url, new 
StringReader("")).header("Override-Content-Type", "text/s3").connect();
+               r = rc.getResponseAsString();
+               
assertEquals("p1=sp1,p2=xp2,p3=mp3,p4=xp4,p5=xp5,contentType=text/s1", r);
+               
assertTrue(rc.getResponse().getFirstHeader("Content-Type").getValue().startsWith("text/s3"));
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // Properties overridden via properties annotation.  Default Accept 
header.
+       
//====================================================================================================
+       @Test
+       public void testPropertiesOverridenByAnnotationDefaultAccept() throws 
Exception {
+               RestClient client = 
TestMicroservice.client().accept("").build();
+               String url = URL + "/testPropertiesOverridenByAnnotation";
+               String r;
+               RestCall rc;
+
+               r = client.doPut(url, new 
StringReader("")).getResponseAsString();
+               
assertEquals("p1=sp1,p2=xp2,p3=mp3,p4=xp4,p5=xp5,contentType=text/s2", r);
+
+               r = client.doPut(url, new 
StringReader("")).header("Override-Accept", "text/s3").getResponseAsString();
+               
assertEquals("p1=sp1,p2=xp2,p3=mp3,p4=xp4,p5=xp5,contentType=text/s3", r);
+
+               rc = client.doPut(url, new 
StringReader("")).header("Override-Content-Type", "text/s3").connect();
+               r = rc.getResponseAsString();
+               
assertEquals("p1=sp1,p2=xp2,p3=mp3,p4=xp4,p5=xp5,contentType=text/s2", r);
+               
assertTrue(rc.getResponse().getFirstHeader("Content-Type").getValue().startsWith("text/s3"));
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // Properties overridden programmatically.
+       
//====================================================================================================
+       @Test
+       public void testPropertiesOverriddenProgramatically() throws Exception {
+               RestClient client = 
TestMicroservice.client().accept("text/s1").build();
+               String url = URL + "/testPropertiesOverriddenProgramatically";
+               String r;
+               RestCall rc;
+
+               r = client.doPut(url, new 
StringReader("")).getResponseAsString();
+               
assertEquals("p1=sp1,p2=xp2,p3=pp3,p4=xp4,p5=xp5,contentType=text/s1", r);
+
+               r = client.doPut(url, new 
StringReader("")).header("Override-Accept", "text/s2").getResponseAsString();
+               
assertEquals("p1=sp1,p2=xp2,p3=pp3,p4=xp4,p5=xp5,contentType=text/s2", r);
+
+               rc = client.doPut(url, new 
StringReader("")).header("Override-Content-Type", "text/s3").connect();
+               r = rc.getResponseAsString();
+               
assertEquals("p1=sp1,p2=xp2,p3=pp3,p4=xp4,p5=xp5,contentType=text/s1", r);
+               
assertTrue(rc.getResponse().getFirstHeader("Content-Type").getValue().startsWith("text/s3"));
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // Properties overridden programmatically.  Default Accept header.
+       
//====================================================================================================
+       @Test
+       public void testPropertiesOverriddenProgramaticallyDefaultAccept() 
throws Exception {
+               RestClient client = 
TestMicroservice.client().accept("").build();
+               String url = URL + "/testPropertiesOverriddenProgramatically";
+               String r;
+               RestCall rc;
+
+               r = client.doPut(url, new 
StringReader("")).getResponseAsString();
+               
assertEquals("p1=sp1,p2=xp2,p3=pp3,p4=xp4,p5=xp5,contentType=text/s2", r);
+
+               r = client.doPut(url, new 
StringReader("")).header("Override-Accept", "text/s3").getResponseAsString();
+               
assertEquals("p1=sp1,p2=xp2,p3=pp3,p4=xp4,p5=xp5,contentType=text/s3", r);
+
+               rc = client.doPut(url, new 
StringReader("")).header("Override-Content-Type", "text/s3").connect();
+               r = rc.getResponseAsString();
+               
assertEquals("p1=sp1,p2=xp2,p3=pp3,p4=xp4,p5=xp5,contentType=text/s2", r);
+               
assertTrue(rc.getResponse().getFirstHeader("Content-Type").getValue().startsWith("text/s3"));
+
+               client.closeQuietly();
+       }
+}

Propchange: 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/OnPostCallTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/OnPreCallTest.java
==============================================================================
--- 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/OnPreCallTest.java
 (added)
+++ 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/OnPreCallTest.java
 Fri Sep  8 23:21:12 2017
@@ -0,0 +1,61 @@
+// 
***************************************************************************************************************************
+// * 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.rest.test;
+
+import static org.junit.Assert.*;
+
+import java.io.*;
+
+import org.apache.juneau.rest.client.*;
+import org.junit.*;
+
+public class OnPreCallTest extends RestTestcase {
+
+       private static String URL = "/testOnPreCall";
+
+       
//====================================================================================================
+       // Properties overridden via properties annotation.
+       
//====================================================================================================
+       @Test
+       public void testPropertiesOverriddenByAnnotation() throws Exception {
+               RestClient client = 
TestMicroservice.client().contentType("text/a1").accept("text/plain").build();
+               String url = URL + "/testPropertiesOverriddenByAnnotation";
+               String r;
+
+               r = client.doPut(url, new 
StringReader("")).getResponseAsString();
+               
assertEquals("p1=sp1,p2=xp2,p3=mp3,p4=xp4,p5=xp5,contentType=text/a1", r);
+
+               r = client.doPut(url, new 
StringReader("")).header("Override-Content-Type", 
"text/a2").getResponseAsString();
+               
assertEquals("p1=sp1,p2=xp2,p3=mp3,p4=xp4,p5=xp5,contentType=text/a2", r);
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // Properties overridden programmatically.
+       
//====================================================================================================
+       @Test
+       public void testPropertiesOverriddenProgrammatically() throws Exception 
{
+               RestClient client = 
TestMicroservice.client().contentType("text/a1").accept("text/plain").build();
+               String url = URL + "/testPropertiesOverriddenProgrammatically";
+               String r;
+
+               r = client.doPut(url, new 
StringReader("")).getResponseAsString();
+               
assertEquals("p1=sp1,p2=xp2,p3=pp3,p4=pp4,p5=xp5,contentType=text/a1", r);
+
+               r = client.doPut(url, new 
StringReader("")).header("Override-Content-Type", 
"text/a2").getResponseAsString();
+               
assertEquals("p1=sp1,p2=xp2,p3=pp3,p4=pp4,p5=xp5,contentType=text/a2", r);
+
+               client.closeQuietly();
+       }
+}

Propchange: 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/OnPreCallTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/OptionsWithoutNlsTest.java
==============================================================================
--- 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/OptionsWithoutNlsTest.java
 (added)
+++ 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/OptionsWithoutNlsTest.java
 Fri Sep  8 23:21:12 2017
@@ -0,0 +1,45 @@
+// 
***************************************************************************************************************************
+// * 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.rest.test;
+
+import static org.junit.Assert.*;
+
+import org.apache.juneau.dto.swagger.*;
+import org.apache.juneau.rest.client.*;
+import org.junit.*;
+
+public class OptionsWithoutNlsTest extends RestTestcase {
+
+       private static String URL = "/testOptionsWithoutNls";
+       private RestClient client = TestMicroservice.DEFAULT_CLIENT;
+
+       
//====================================================================================================
+       // Should get to the options page without errors
+       
//====================================================================================================
+       @Test
+       public void testOptions() throws Exception {
+               RestCall r = client.doOptions(URL + "/testOptions");
+               Swagger o = r.getResponse(Swagger.class);
+               assertNotNull(o.getInfo());
+       }
+
+       
//====================================================================================================
+       // Missing resource bundle should cause {!!x} string.
+       
//====================================================================================================
+       @Test
+       public void testMissingResourceBundle() throws Exception {
+               RestCall r = client.doGet(URL + "/testMissingResourceBundle");
+               String o = r.getResponse(String.class);
+               assertEquals("{!!bad}", o);
+       }
+}

Propchange: 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/OptionsWithoutNlsTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/OverlappingMethodsTest.java
==============================================================================
--- 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/OverlappingMethodsTest.java
 (added)
+++ 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/OverlappingMethodsTest.java
 Fri Sep  8 23:21:12 2017
@@ -0,0 +1,170 @@
+// 
***************************************************************************************************************************
+// * 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.rest.test;
+
+import static javax.servlet.http.HttpServletResponse.*;
+import static org.apache.juneau.rest.test.TestUtils.*;
+import static org.junit.Assert.*;
+
+import org.apache.juneau.rest.client.*;
+import org.junit.*;
+
+public class OverlappingMethodsTest extends RestTestcase {
+
+       private static String URL = "/testOverlappingMethods";
+       private static boolean debug = false;
+
+       
//====================================================================================================
+       // Overlapping guards
+       
//====================================================================================================
+       @Test
+       public void testOverlappingGuards1() throws Exception {
+               RestClient client = 
TestMicroservice.client().accept("text/plain").build();
+               String r;
+               String url = URL + "/testOverlappingGuards1";
+
+               r = client.doGet(url + "?t1=1").getResponseAsString();
+               assertEquals("test1_doGet", r);
+
+               try {
+                       client.doGet(url + "?noTrace=true").connect();
+                       fail("Exception expected");
+               } catch (RestCallException e) {
+                       checkErrorResponse(debug, e, SC_FORBIDDEN, "Access 
denied by guard");
+               }
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // Overlapping guards
+       
//====================================================================================================
+       @Test
+       public void testOverlappingGuards2() throws Exception {
+               RestClient client = 
TestMicroservice.client().accept("text/plain").build();
+               String r;
+               String url = URL + "/testOverlappingGuards2";
+               try {
+                       client.doGet(url + "?noTrace=true").connect();
+                       fail("Exception expected");
+               } catch (RestCallException e) {
+                       checkErrorResponse(debug, e, SC_FORBIDDEN, "Access 
denied by guard");
+               }
+
+               try {
+                       client.doGet(url + "?t1=1&noTrace=true").connect();
+                       fail("Exception expected");
+               } catch (RestCallException e) {
+                       checkErrorResponse(debug, e, SC_FORBIDDEN, "Access 
denied by guard");
+               }
+
+               try {
+                       client.doGet(url + "?t2=2&noTrace=true").connect();
+                       fail("Exception expected");
+               } catch (RestCallException e) {
+                       checkErrorResponse(debug, e, SC_FORBIDDEN, "Access 
denied by guard");
+               }
+
+               r = client.doGet(url + "?t1=1&t2=2").getResponseAsString();
+               assertEquals("test2_doGet", r);
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // Overlapping matchers
+       
//====================================================================================================
+       @Test
+       public void testOverlappingMatchers1() throws Exception {
+               RestClient client = 
TestMicroservice.client().accept("text/plain").build();
+               String r;
+               String url = URL + "/testOverlappingMatchers1";
+
+               r = client.doGet(url + "?t1=1").getResponseAsString();
+               assertEquals("test3a", r);
+
+               r = client.doGet(url + "?t2=2").getResponseAsString();
+               assertEquals("test3b", r);
+
+               r = client.doGet(url).getResponseAsString();
+               assertEquals("test3c", r);
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // Overlapping matchers
+       
//====================================================================================================
+       @Test
+       public void testOverlappingMatchers2() throws Exception {
+               RestClient client = 
TestMicroservice.client().accept("text/plain").build();
+               String r;
+               String url = URL + "/testOverlappingMatchers2";
+
+               r = client.doGet(url + "?t1=1").getResponseAsString();
+               assertEquals("test4b", r);
+
+               r = client.doGet(url + "?t2=2").getResponseAsString();
+               assertEquals("test4b", r);
+
+               r = client.doGet(url + "?t1=1&t2=2").getResponseAsString();
+               assertEquals("test4b", r);
+
+               r = client.doGet(url + "?tx=x").getResponseAsString();
+               assertEquals("test4a", r);
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // Overlapping URL patterns
+       
//====================================================================================================
+       @Test
+       public void testOverlappingUrlPatterns() throws Exception {
+               RestClient client = 
TestMicroservice.client().accept("text/plain").build();
+               String r;
+               String url = URL + "/testOverlappingUrlPatterns";
+
+               // [/test5] = [test5a]
+               // [/test5/*] = [test5b]   -- Cannot get called.
+               // [/test5/foo] = [test5c]
+               // [/test5/foo/*] = [test5d]
+               // [/test5/{id}] = [test5e]
+               // [/test5/{id}/*] = [test5f]
+               // [/test5/{id}/foo] = [test5g]
+               // [/test5/{id}/foo/*] = [test5h]
+
+               r = client.doGet(url).getResponseAsString();
+               assertEquals("test5a", r);
+
+               r = client.doGet(url + "/foo").getResponseAsString();
+               assertEquals("test5c", r);
+
+               r = client.doGet(url + "/foo/x").getResponseAsString();
+               assertEquals("test5d", r);
+
+               r = client.doGet(url + "/x").getResponseAsString();
+               assertEquals("test5e", r);
+
+               r = client.doGet(url + "/x/x").getResponseAsString();
+               assertEquals("test5f", r);
+
+               r = client.doGet(url + "/x/foo").getResponseAsString();
+               assertEquals("test5g", r);
+
+               r = client.doGet(url + "/x/foo/x").getResponseAsString();
+               assertEquals("test5h", r);
+
+               client.closeQuietly();
+       }
+}

Propchange: 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/OverlappingMethodsTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/ParamsTest.java
==============================================================================
--- 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/ParamsTest.java
 (added)
+++ 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/ParamsTest.java
 Fri Sep  8 23:21:12 2017
@@ -0,0 +1,855 @@
+// 
***************************************************************************************************************************
+// * 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.rest.test;
+
+import static javax.servlet.http.HttpServletResponse.*;
+import static org.apache.juneau.rest.test.TestUtils.*;
+import static org.junit.Assert.*;
+
+import java.io.*;
+import java.util.*;
+
+import org.apache.http.*;
+import org.apache.http.client.entity.*;
+import org.apache.http.entity.*;
+import org.apache.http.message.*;
+import org.apache.juneau.*;
+import org.apache.juneau.rest.client.*;
+import org.junit.*;
+
+public class ParamsTest extends RestTestcase {
+
+       private static String URL = "/testParams";
+       private static boolean debug = false;
+
+       private static RestClient CLIENT = TestMicroservice.DEFAULT_CLIENT;
+
+       
//====================================================================================================
+       // Basic tests
+       
//====================================================================================================
+       @Test
+       public void testBasic() throws Exception {
+               RestClient client = TestMicroservice.DEFAULT_CLIENT;
+               RestCall r;
+
+               //              @Override
+               //              @RestMethod(name="GET",pattern="/")
+               //              public void doGet(RestRequest req, RestResponse 
res) {
+               //                      res.setOutput("No args");
+               //              }
+               r = client.doGet(URL);
+               assertEquals("GET", r.getResponse(String.class));
+
+               r = client.doGet(URL + "/getx?noTrace=true");
+               try {
+                       r.connect();
+                       fail("Connection should have failed.");
+               } catch (RestCallException e) {
+                       checkErrorResponse(debug, e, SC_NOT_FOUND, "Method 
'GET' not found on resource with matching pattern on path '/getx'");
+               }
+
+               //      @RestMethod(name="GET",pattern="/get1")
+               //      public void doGet1(RestRequest req, RestResponse res) {
+               //              res.setOutput("/get1");
+               //      }
+               r = client.doGet(URL + "/get1");
+               assertEquals("GET /get1", r.getResponse(String.class));
+
+               r = client.doGet(URL + "/get1a?noTrace=true");
+               try {
+                       r.connect();
+                       fail("Connection should have failed.");
+               } catch (RestCallException e) {
+                       checkErrorResponse(debug, e, SC_NOT_FOUND, "Method 
'GET' not found on resource with matching pattern on path '/get1a'");
+               }
+
+               //      @RestMethod(name="GET",pattern="/get1/{foo}")
+               //      public void doGet(RestRequest req, RestResponse res, 
String foo) {
+               //              res.setOutput("/get1/" + foo);
+               //      }
+               r = client.doGet(URL + "/get1/foo");
+               assertEquals("GET /get1a foo", r.getResponse(String.class));
+
+               // URL-encoded part should not get decoded before finding 
method to invoke.
+               // This should match /get1/{foo} and not /get1/{foo}/{bar}
+               // NOTE:  When testing on Tomcat, must specify the following 
system property:
+               // 
-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
+               String x = "x%2Fy";  // [x/y]
+               r = client.doGet(URL + "/get1/"+x);
+               assertEquals("GET /get1a x/y", r.getResponse(String.class));
+
+               r = client.doGet(URL + "/get1/"+x+"/"+x);
+               assertEquals("GET /get1b x/y,x/y", r.getResponse(String.class));
+
+               r = client.doGet(URL + "/get1/foo");
+               assertEquals("GET /get1a foo", r.getResponse(String.class));
+
+               r = client.doGet(URL + "/get1/foo/bar/baz?noTrace=true");
+               try {
+                       r.connect();
+                       fail("Connection should have failed.");
+               } catch (RestCallException e) {
+                       checkErrorResponse(debug, e, SC_NOT_FOUND, "Method 
'GET' not found on resource with matching pattern on path '/get1/foo/bar/baz'");
+               }
+
+               //      @RestMethod(name="GET",pattern="/get3/{foo}/{bar}/*")
+               //      public void doGet3(RestRequest req, RestResponse res, 
String foo, int bar) {
+               //              res.setOutput("/get3/"+foo+"/"+bar+", 
remainder="+req.getRemainder());
+               //      }
+               r = client.doGet(URL + "/get3/foo/123");
+               assertEquals("GET /get3/foo/123 remainder=null", 
r.getResponse(String.class));
+
+               r = client.doGet(URL + "/get3/foo/123/xxx");
+               assertEquals("GET /get3/foo/123 remainder=xxx", 
r.getResponse(String.class));
+
+               //      // Test method name with overlapping name, remainder 
allowed.
+               //      @RestMethod(name="GET2")
+               //      public void get2(RestRequest req, RestResponse res) {
+               //              res.setOutput("GET2, 
remainder="+req.getRemainder());
+               //      }
+               r = client.doGet(URL + "?method=get2");
+               assertEquals("GET2 remainder=null", 
r.getResponse(String.class));
+               r = client.doGet(URL + "/foo/bar?method=get2");
+               assertEquals("GET2 remainder=foo/bar", 
r.getResponse(String.class));
+               r = client.doGet(URL + "/foo/bar?method=GET2");
+               assertEquals("GET2 remainder=foo/bar", 
r.getResponse(String.class));
+
+               //      // Default POST
+               //      @Override
+               //      public void doPost(RestRequest req, RestResponse res) {
+               //              res.setOutput("POST, 
remainder="+req.getRemainder());
+               //      }
+               r = client.doPost(URL, "");
+               assertEquals("POST remainder=null", 
r.getResponse(String.class));
+               r = client.doPost(URL + "/foo", "");
+               assertEquals("POST remainder=foo", r.getResponse(String.class));
+
+               //      // Bunch of different argument types
+               //      @RestMethod(name="POST",pattern="/person/{person}")
+               //      public void doPost(RestRequest req, RestResponse res, 
Person p) {
+               //              res.setOutput("POST, /person, name="+p.name+", 
age="+p.age+" remainder="+req.getRemainder());
+               //      }
+               r = client.doPost(URL + 
"/person/(name='John+Smith',birthDate='Jan+12,+1952')", "");
+               assertEquals("POST /person/{name=John 
Smith,birthDate.year=1952} remainder=null", r.getResponse(String.class));
+
+               // Fall through to top-level POST
+               r = client.doPost(URL + 
"/person/(name:'John+Smith',age:123)/foo", "");
+               assertEquals("POST remainder=person/(name:'John 
Smith',age:123)/foo", r.getResponse(String.class));
+
+               //      // Various primitive types
+               //      
@RestMethod(name="PUT",pattern="/primitives/{xInt}.{xShort},{xLong}/{xChar}/{xFloat}/{xDouble}/{xByte}/{xBoolean}")
+               //      public void doPut1(RestRequest req, RestResponse res, 
int xInt, short xShort, long xLong, char xChar, float xFloat, double xDouble, 
byte xByte, boolean xBoolean) {
+               //              res.setOutput("PUT, 
/primitives/"+xInt+"."+xShort+","+xLong+"/"+xChar+"/"+xFloat+"/"+xDouble+"/"+xByte+"/"+xBoolean);
+               //      }
+               r = client.doPut(URL + "/primitives/1/2/3/x/4/5/6/true", "");
+               assertEquals("PUT /primitives/1/2/3/x/4.0/5.0/6/true", 
r.getResponse(String.class));
+
+               //      // Various primitive objects
+               //      
@RestMethod(name="PUT",pattern="/primitiveObjects/{xInt}/{xShort}/{xLong}/{xChar}/{xFloat}/{xDouble}/{xByte}/{xBoolean}")
+               //      public void doPut1(RestRequest req, RestResponse res, 
Integer xInt, Short xShort, Long xLong, Character xChar, Float xFloat, Double 
xDouble, Byte xByte, Boolean xBoolean) {
+               //              res.setOutput("PUT 
/primitives/"+xInt+"/"+xShort+"/"+xLong+"/"+xChar+"/"+xFloat+"/"+xDouble+"/"+xByte+"/"+xBoolean);
+               //      }
+               r = client.doPut(URL + "/primitiveObjects/1/2/3/x/4/5/6/true", 
"");
+               assertEquals("PUT /primitiveObjects/1/2/3/x/4.0/5.0/6/true", 
r.getResponse(String.class));
+
+               //      // Object with forString(String) method
+               //      @RestMethod(name="PUT",pattern="/uuid/{uuid}")
+               //      public void doPut1(RestRequest req, RestResponse res, 
UUID uuid) {
+               //              res.setOutput("PUT /uuid/"+uuid);
+               //      }
+               UUID uuid = UUID.randomUUID();
+               r = client.doPut(URL + "/uuid/"+uuid, "");
+               assertEquals("PUT /uuid/"+uuid, r.getResponse(String.class));
+       }
+
+       
//====================================================================================================
+       // @FormData annotation - GET
+       
//====================================================================================================
+       @Test
+       public void testParamGet() throws Exception {
+               RestClient client = 
TestMicroservice.client().accept("text/plain").build();
+               String r;
+               String url = URL + "/testParamGet";
+
+               r = client.doGet(url + "?p1=p1&p2=2").getResponseAsString();
+               assertEquals("p1=[p1,p1,p1],p2=[2,2,2]", r);
+
+               r = client.doGet(url + "?p1&p2").getResponseAsString();
+               assertEquals("p1=[,,],p2=[0,,0]", r);
+
+               r = client.doGet(url).getResponseAsString();
+               assertEquals("p1=[null,null,null],p2=[0,null,0]", r);
+
+               r = client.doGet(url + "?p1").getResponseAsString();
+               assertEquals("p1=[,,],p2=[0,null,0]", r);
+
+               r = client.doGet(url + "?p2").getResponseAsString();
+               assertEquals("p1=[null,null,null],p2=[0,,0]", r);
+
+               r = client.doGet(url + "?p1=foo&p2").getResponseAsString();
+               assertEquals("p1=[foo,foo,foo],p2=[0,,0]", r);
+
+               r = client.doGet(url + "?p1&p2=1").getResponseAsString();
+               assertEquals("p1=[,,],p2=[1,1,1]", r);
+
+               String x = "a%2Fb%25c%3Dd+e"; // [x/y%z=a+b]
+               r = client.doGet(url + "?p1="+x+"&p2=1").getResponseAsString();
+               assertEquals("p1=[a/b%c=d e,a/b%c=d e,a/b%c=d e],p2=[1,1,1]", 
r);
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // @FormData(format=PLAIN) annotation - GET
+       
//====================================================================================================
+       @Test
+       public void testPlainParamGet() throws Exception {
+               RestClient client = 
TestMicroservice.client().accept("text/plain").build();
+               String r;
+               String url = URL + "/testPlainParamGet";
+
+               r = client.doGet(url + "?p1=p1").getResponseAsString();
+               assertEquals("p1=[p1,p1,p1]", r);
+
+               r = client.doGet(url + "?p1='p1'").getResponseAsString();
+               assertEquals("p1=['p1','p1',p1]", r);
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // @FormData annotation - POST
+       
//====================================================================================================
+       @Test
+       public void testParamPost() throws Exception {
+               RestClient client = 
TestMicroservice.client().accept("text/plain").build();
+               String r;
+               String url = URL + "/testParamPost";
+
+               r = client.doFormPost(url, new 
ObjectMap("{p1:'p1',p2:2}")).getResponseAsString();
+               assertEquals("p1=[p1,p1,p1],p2=[2,2,2]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{p1:null,p2:0}")).getResponseAsString();
+               assertEquals("p1=[null,null,null],p2=[0,0,0]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{}")).getResponseAsString();
+               assertEquals("p1=[null,null,null],p2=[0,null,0]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{p1:null}")).getResponseAsString();
+               assertEquals("p1=[null,null,null],p2=[0,null,0]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{p2:0}")).getResponseAsString();
+               assertEquals("p1=[null,null,null],p2=[0,0,0]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{p1:'foo',p2:0}")).getResponseAsString();
+               assertEquals("p1=[foo,foo,foo],p2=[0,0,0]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{p1:null,p2:1}")).getResponseAsString();
+               assertEquals("p1=[null,null,null],p2=[1,1,1]", r);
+
+               r = client.doFormPost(url, new ObjectMap("{p1:'a/b%c=d 
e,f/g%h=i j',p2:1}")).getResponseAsString();
+               assertEquals("p1=[a/b%c=d e,f/g%h=i j,'a/b%c=d e,f/g%h=i 
j',a/b%c=d e,f/g%h=i j],p2=[1,1,1]", r);
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // @FormData(format=PLAIN) annotation - POST
+       
//====================================================================================================
+       @Test
+       public void testPlainParamPost() throws Exception {
+               RestClient client = 
TestMicroservice.client().accept("text/plain").build();
+               String r;
+               String url = URL + "/testPlainParamPost";
+
+               List<NameValuePair> nvps = new ArrayList<NameValuePair>();
+               nvps.add(new BasicNameValuePair("p1", "p1"));
+               HttpEntity he = new UrlEncodedFormEntity(nvps);
+
+               r = client.doPost(url, he).getResponseAsString();
+               assertEquals("p1=[p1,p1,p1]", r);
+
+               nvps = new ArrayList<NameValuePair>();
+               nvps.add(new BasicNameValuePair("p1", "'p1'"));
+               he = new UrlEncodedFormEntity(nvps);
+
+               r = client.doFormPost(url, he).getResponseAsString();
+               assertEquals("p1=['p1','p1',p1]", r);
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // @Query annotation - GET
+       
//====================================================================================================
+       @Test
+       public void testQParamGet() throws Exception {
+               RestClient client = 
TestMicroservice.client().accept("text/plain").build();
+               String r;
+               String url = URL + "/testQParamGet";
+
+               r = client.doGet(url + "?p1=p1&p2=2").getResponseAsString();
+               assertEquals("p1=[p1,p1,p1],p2=[2,2,2]", r);
+
+               r = client.doGet(url + "?p1&p2").getResponseAsString();
+               assertEquals("p1=[,,],p2=[0,,0]", r);
+
+               r = client.doGet(url).getResponseAsString();
+               assertEquals("p1=[null,null,null],p2=[0,null,0]", r);
+
+               r = client.doGet(url + "?p1").getResponseAsString();
+               assertEquals("p1=[,,],p2=[0,null,0]", r);
+
+               r = client.doGet(url + "?p2").getResponseAsString();
+               assertEquals("p1=[null,null,null],p2=[0,,0]", r);
+
+               r = client.doGet(url + "?p1=foo&p2").getResponseAsString();
+               assertEquals("p1=[foo,foo,foo],p2=[0,,0]", r);
+
+               r = client.doGet(url + "?p1&p2=1").getResponseAsString();
+               assertEquals("p1=[,,],p2=[1,1,1]", r);
+
+               String x = "a%2Fb%25c%3Dd+e"; // [x/y%z=a+b]
+               r = client.doGet(url + "?p1="+x+"&p2=1").getResponseAsString();
+               assertEquals("p1=[a/b%c=d e,a/b%c=d e,a/b%c=d e],p2=[1,1,1]", 
r);
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // @Query(format=PLAIN) annotation - GET
+       
//====================================================================================================
+       @Test
+       public void testPlainQParamGet() throws Exception {
+               RestClient client = 
TestMicroservice.client().accept("text/plain").build();
+               String r;
+               String url = URL + "/testPlainQParamGet";
+
+               r = client.doGet(url + "?p1=p1").getResponseAsString();
+               assertEquals("p1=[p1,p1,p1]", r);
+
+               r = client.doGet(url + "?p1='p1'").getResponseAsString();
+               assertEquals("p1=['p1','p1',p1]", r);
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // @Query annotation - POST
+       
//====================================================================================================
+       @Test
+       public void testQParamPost() throws Exception {
+               RestClient client = 
TestMicroservice.client().accept("text/plain").build();
+               String r;
+               String url = URL + "/testQParamPost";
+
+               r = client.doFormPost(url, new 
ObjectMap("{p1:'p1',p2:2}")).getResponseAsString();
+               assertEquals("p1=[null,null,null],p2=[0,null,0]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{p1:null,p2:0}")).getResponseAsString();
+               assertEquals("p1=[null,null,null],p2=[0,null,0]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{}")).getResponseAsString();
+               assertEquals("p1=[null,null,null],p2=[0,null,0]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{p1:null}")).getResponseAsString();
+               assertEquals("p1=[null,null,null],p2=[0,null,0]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{p2:0}")).getResponseAsString();
+               assertEquals("p1=[null,null,null],p2=[0,null,0]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{p1:'foo',p2:0}")).getResponseAsString();
+               assertEquals("p1=[null,null,null],p2=[0,null,0]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{p1:null,p2:1}")).getResponseAsString();
+               assertEquals("p1=[null,null,null],p2=[0,null,0]", r);
+
+               r = client.doFormPost(url, new ObjectMap("{p1:'a/b%c=d 
e,f/g%h=i j',p2:1}")).getResponseAsString();
+               assertEquals("p1=[null,null,null],p2=[0,null,0]", r);
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // @HasQuery annotation - GET
+       
//====================================================================================================
+       @Test
+       public void testHasParamGet() throws Exception {
+               RestClient client = 
TestMicroservice.client().accept("text/plain").build();
+               String r;
+               String url = URL + "/testHasParamGet";
+
+               r = client.doGet(url + "?p1=p1&p2=2").getResponseAsString();
+               assertEquals("p1=[true,true],p2=[true,true]", r);
+
+               r = client.doGet(url + "?p1&p2").getResponseAsString();
+               assertEquals("p1=[true,true],p2=[true,true]", r);
+
+               r = client.doGet(url).getResponseAsString();
+               assertEquals("p1=[false,false],p2=[false,false]", r);
+
+               r = client.doGet(url + "?p1").getResponseAsString();
+               assertEquals("p1=[true,true],p2=[false,false]", r);
+
+               r = client.doGet(url + "?p2").getResponseAsString();
+               assertEquals("p1=[false,false],p2=[true,true]", r);
+
+               r = client.doGet(url + "?p1=foo&p2").getResponseAsString();
+               assertEquals("p1=[true,true],p2=[true,true]", r);
+
+               r = client.doGet(url + "?p1&p2=1").getResponseAsString();
+               assertEquals("p1=[true,true],p2=[true,true]", r);
+
+               String x = "x%2Fy%25z%3Da+b"; // [x/y%z=a+b]
+               r = client.doGet(url + "?p1="+x+"&p2=1").getResponseAsString();
+               assertEquals("p1=[true,true],p2=[true,true]", r);
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // @HasQuery annotation - POST
+       
//====================================================================================================
+       @Test
+       public void testHasParamPost() throws Exception {
+               RestClient client = 
TestMicroservice.client().accept("text/plain").build();
+               String r;
+               String url = URL + "/testHasParamPost";
+
+               r = client.doFormPost(url, new 
ObjectMap("{p1:'p1',p2:2}")).getResponseAsString();
+               assertEquals("p1=[true,true],p2=[true,true]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{p1:null,p2:0}")).getResponseAsString();
+               assertEquals("p1=[true,true],p2=[true,true]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{}")).getResponseAsString();
+               assertEquals("p1=[false,false],p2=[false,false]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{p1:null}")).getResponseAsString();
+               assertEquals("p1=[true,true],p2=[false,false]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{p2:0}")).getResponseAsString();
+               assertEquals("p1=[false,false],p2=[true,true]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{p1:'foo',p2:0}")).getResponseAsString();
+               assertEquals("p1=[true,true],p2=[true,true]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{p1:null,p2:1}")).getResponseAsString();
+               assertEquals("p1=[true,true],p2=[true,true]", r);
+
+               r = client.doFormPost(url, new ObjectMap("{p1:'a/b%c=d 
e,f/g%h=i j',p2:1}")).getResponseAsString();
+               assertEquals("p1=[true,true],p2=[true,true]", r);
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // @HasQuery annotation - GET
+       
//====================================================================================================
+       @Test
+       public void testHasQParamGet() throws Exception {
+               RestClient client = 
TestMicroservice.client().accept("text/plain").build();
+               String r;
+               String url = URL + "/testHasQParamGet";
+
+               r = client.doGet(url + "?p1=p1&p2=2").getResponseAsString();
+               assertEquals("p1=[true,true],p2=[true,true]", r);
+
+               r = client.doGet(url + "?p1&p2").getResponseAsString();
+               assertEquals("p1=[true,true],p2=[true,true]", r);
+
+               r = client.doGet(url).getResponseAsString();
+               assertEquals("p1=[false,false],p2=[false,false]", r);
+
+               r = client.doGet(url + "?p1").getResponseAsString();
+               assertEquals("p1=[true,true],p2=[false,false]", r);
+
+               r = client.doGet(url + "?p2").getResponseAsString();
+               assertEquals("p1=[false,false],p2=[true,true]", r);
+
+               r = client.doGet(url + "?p1=foo&p2").getResponseAsString();
+               assertEquals("p1=[true,true],p2=[true,true]", r);
+
+               r = client.doGet(url + "?p1&p2=1").getResponseAsString();
+               assertEquals("p1=[true,true],p2=[true,true]", r);
+
+               String x = "x%2Fy%25z%3Da+b"; // [x/y%z=a+b]
+               r = client.doGet(url + "?p1="+x+"&p2=1").getResponseAsString();
+               assertEquals("p1=[true,true],p2=[true,true]", r);
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // @HasQuery annotation - POST
+       
//====================================================================================================
+       @Test
+       public void testHasQParamPost() throws Exception {
+               RestClient client = 
TestMicroservice.client().accept("text/plain").build();
+               String r;
+               String url = URL + "/testHasQParamPost";
+
+               r = client.doFormPost(url, new 
ObjectMap("{p1:'p1',p2:2}")).getResponseAsString();
+               assertEquals("p1=[false,false],p2=[false,false]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{p1:null,p2:0}")).getResponseAsString();
+               assertEquals("p1=[false,false],p2=[false,false]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{}")).getResponseAsString();
+               assertEquals("p1=[false,false],p2=[false,false]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{p1:null}")).getResponseAsString();
+               assertEquals("p1=[false,false],p2=[false,false]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{p2:0}")).getResponseAsString();
+               assertEquals("p1=[false,false],p2=[false,false]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{p1:'foo',p2:0}")).getResponseAsString();
+               assertEquals("p1=[false,false],p2=[false,false]", r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{p1:null,p2:1}")).getResponseAsString();
+               assertEquals("p1=[false,false],p2=[false,false]", r);
+
+               r = client.doFormPost(url, new ObjectMap("{p1:'a/b%c=d 
e,f/g%h=i j',p2:1}")).getResponseAsString();
+               assertEquals("p1=[false,false],p2=[false,false]", r);
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // Form POSTS with @Body parameter
+       
//====================================================================================================
+       @Test
+       public void testFormPostAsContent() throws Exception {
+               RestClient client = 
TestMicroservice.client().accept("text/plain").build();
+               String r;
+               String url = URL + "/testFormPostAsContent";
+
+               r = client.doFormPost(url, new 
ObjectMap("{p1:'p1',p2:2}")).getResponseAsString();
+               
assertEquals("bean=[{p1:'p1',p2:2}],qp1=[null],qp2=[0],hqp1=[false],hqp2=[false]",
 r);
+
+               r = client.doFormPost(url, new 
ObjectMap("{}")).getResponseAsString();
+               
assertEquals("bean=[{p2:0}],qp1=[null],qp2=[0],hqp1=[false],hqp2=[false]", r);
+
+               r = client.doFormPost(url+"?p1=p3&p2=4", new 
ObjectMap("{p1:'p1',p2:2}")).getResponseAsString();
+               
assertEquals("bean=[{p1:'p1',p2:2}],qp1=[p3],qp2=[4],hqp1=[true],hqp2=[true]", 
r);
+
+               r = client.doFormPost(url+"?p1=p3&p2=4", new 
ObjectMap("{}")).getResponseAsString();
+               
assertEquals("bean=[{p2:0}],qp1=[p3],qp2=[4],hqp1=[true],hqp2=[true]", r);
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // Test @FormData and @Query annotations when using multi-part 
parameters (e.g. &key=val1,&key=val2).
+       
//====================================================================================================
+       @Test
+       public void testMultiPartParams() throws Exception {
+               RestClient client = 
TestMicroservice.client().accept("text/plain").build();
+               String r;
+               String url = URL + "/testMultiPartParams";
+
+               String in = ""
+                       + "?p1=a&p1=b"
+                       + "&p2=1&p2=2"
+                       + "&p3=a&p3=b"
+                       + "&p4=1&p4=2"
+                       + "&p5=a&p5=b"
+                       + "&p6=1&p6=2"
+                       + "&p7=a&p7=b"
+                       + "&p8=1&p8=2"
+                       + "&p9=(a=1,b=2,c=false)&p9=(a=3,b=4,c=true)"
+                       + "&p10=(a=1,b=2,c=false)&p10=(a=3,b=4,c=true)"
+                       + "&p11=(a=1,b=2,c=false)&p11=(a=3,b=4,c=true)"
+                       + "&p12=(a=1,b=2,c=false)&p12=(a=3,b=4,c=true)";
+               r = client.doGet(url + in).getResponseAsString();
+               String e = "{"
+                       + "p1:['a','b'],"
+                       + "p2:[1,2],"
+                       + "p3:['a','b'],"
+                       + "p4:[1,2],"
+                       + "p5:['a','b'],"
+                       + "p6:[1,2],"
+                       + "p7:['a','b'],"
+                       + "p8:[1,2],"
+                       + "p9:[{a:'1',b:2,c:false},{a:'3',b:4,c:true}],"
+                       + "p10:[{a:'1',b:2,c:false},{a:'3',b:4,c:true}],"
+                       + "p11:[{a:'1',b:2,c:false},{a:'3',b:4,c:true}],"
+                       + "p12:[{a:'1',b:2,c:false},{a:'3',b:4,c:true}]"
+               +"}";
+               assertEquals(e, r);
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // Same as testMultiPartParams(), except make sure single values are 
still interpreted as collections.
+       
//====================================================================================================
+       @Test
+       public void testMultiPartParamsSingleValues() throws Exception {
+               RestClient client = 
TestMicroservice.client().accept("text/plain").build();
+               String r;
+               String url = URL + "/testMultiPartParams";
+
+               String in = ""
+                       + "?p1=a"
+                       + "&p2=1"
+                       + "&p3=a"
+                       + "&p4=1"
+                       + "&p5=a"
+                       + "&p6=1"
+                       + "&p7=a"
+                       + "&p8=1"
+                       + "&p9=(a=1,b=2,c=false)"
+                       + "&p10=(a=1,b=2,c=false)"
+                       + "&p11=(a=1,b=2,c=false)"
+                       + "&p12=(a=1,b=2,c=false)";
+               r = client.doGet(url + in).getResponseAsString();
+               String e = "{"
+                       + "p1:['a'],"
+                       + "p2:[1],"
+                       + "p3:['a'],"
+                       + "p4:[1],"
+                       + "p5:['a'],"
+                       + "p6:[1],"
+                       + "p7:['a'],"
+                       + "p8:[1],"
+                       + "p9:[{a:'1',b:2,c:false}],"
+                       + "p10:[{a:'1',b:2,c:false}],"
+                       + "p11:[{a:'1',b:2,c:false}],"
+                       + "p12:[{a:'1',b:2,c:false}]"
+               +"}";
+               assertEquals(e, r);
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // Test multi-part parameter keys on bean properties of type 
array/Collection (i.e. &key=val1,&key=val2)
+       // using URLENC_expandedParams property.
+       // A simple round-trip test to verify that both serializing and parsing 
works.
+       
//====================================================================================================
+       @Test
+       public void testFormPostsWithMultiParamsUsingProperty() throws 
Exception {
+               RestClient client = TestMicroservice.client()
+                       .contentType("application/x-www-form-urlencoded")
+                       .accept("application/x-www-form-urlencoded")
+                       .build();
+               String r;
+               String url = URL + "/testFormPostsWithMultiParamsUsingProperty";
+
+               String in = ""
+                       + "f01=a&f01=b"
+                       + "&f02=c&f02=d"
+                       + "&f03=1&f03=2"
+                       + "&f04=3&f04=4"
+                       + "&f05=@(e,f)&f05=@(g,h)"
+                       + "&f06=@(i,j)&f06=@(k,l)"
+                       + "&f07=(a=a,b=1,c=true)&f07=(a=b,b=2,c=false)"
+                       + "&f08=(a=a,b=1,c=true)&f08=(a=b,b=2,c=false)"
+                       + "&f09=@((a=a,b=1,c=true))&f09=@((a=b,b=2,c=false))"
+                       + "&f10=@((a=a,b=1,c=true))&f10=@((a=b,b=2,c=false))"
+                       + "&f11=a&f11=b"
+                       + "&f12=c&f12=d"
+                       + "&f13=1&f13=2"
+                       + "&f14=3&f14=4"
+                       + "&f15=@(e,f)&f15=@(g,h)"
+                       + "&f16=@(i,j)&f16=@(k,l)"
+                       + "&f17=(a=a,b=1,c=true)&f17=(a=b,b=2,c=false)"
+                       + "&f18=(a=a,b=1,c=true)&f18=(a=b,b=2,c=false)"
+                       + "&f19=@((a=a,b=1,c=true))&f19=@((a=b,b=2,c=false))"
+                       + "&f20=@((a=a,b=1,c=true))&f20=@((a=b,b=2,c=false))";
+               r = client.doPost(url, new 
StringEntity(in)).getResponseAsString();
+               assertEquals(in, r);
+
+               client.closeQuietly();
+       }
+
+       
//====================================================================================================
+       // Test multi-part parameter keys on bean properties of type 
array/Collection (i.e. &key=val1,&key=val2)
+       // using @UrlEncoding(expandedParams=true) annotation.
+       // A simple round-trip test to verify that both serializing and parsing 
works.
+       
//====================================================================================================
+       @Test
+       public void testFormPostsWithMultiParamsUsingAnnotation() throws 
Exception {
+               RestClient client = TestMicroservice.client()
+                       .contentType("application/x-www-form-urlencoded")
+                       .accept("application/x-www-form-urlencoded")
+                       .build();
+               String r;
+               String url = URL + 
"/testFormPostsWithMultiParamsUsingAnnotation";
+
+               String in = ""
+                       + "f01=a&f01=b"
+                       + "&f02=c&f02=d"
+                       + "&f03=1&f03=2"
+                       + "&f04=3&f04=4"
+                       + "&f05=@(e,f)&f05=@(g,h)"
+                       + "&f06=@(i,j)&f06=@(k,l)"
+                       + "&f07=(a=a,b=1,c=true)&f07=(a=b,b=2,c=false)"
+                       + "&f08=(a=a,b=1,c=true)&f08=(a=b,b=2,c=false)"
+                       + "&f09=@((a=a,b=1,c=true))&f09=@((a=b,b=2,c=false))"
+                       + "&f10=@((a=a,b=1,c=true))&f10=@((a=b,b=2,c=false))"
+                       + "&f11=a&f11=b"
+                       + "&f12=c&f12=d"
+                       + "&f13=1&f13=2"
+                       + "&f14=3&f14=4"
+                       + "&f15=@(e,f)&f15=@(g,h)"
+                       + "&f16=@(i,j)&f16=@(k,l)"
+                       + "&f17=(a=a,b=1,c=true)&f17=(a=b,b=2,c=false)"
+                       + "&f18=(a=a,b=1,c=true)&f18=(a=b,b=2,c=false)"
+                       + "&f19=@((a=a,b=1,c=true))&f19=@((a=b,b=2,c=false))"
+                       + "&f20=@((a=a,b=1,c=true))&f20=@((a=b,b=2,c=false))";
+               r = client.doPost(url, new 
StringEntity(in)).getResponseAsString();
+               assertEquals(in, r);
+
+               client.closeQuietly();
+       }
+
+
+       
//====================================================================================================
+       // Test other available object types as parameters.
+       
//====================================================================================================
+
+       @Test
+       public void testOtherResourceBundle() throws Exception {
+               String r = CLIENT.doGet(URL + 
"/otherObjects/ResourceBundle").acceptLanguage("en-US").getResponseAsString();
+               assertEquals("\"bar\"", r);
+               r = CLIENT.doGet(URL + 
"/otherObjects/ResourceBundle").acceptLanguage("ja-JP").getResponseAsString();
+               assertEquals("\"baz\"", r);
+       }
+
+       @Test
+       public void testOtherMessages() throws Exception {
+               String r = CLIENT.doGet(URL + 
"/otherObjects/MessageBundle").acceptLanguage("en-US").getResponseAsString();
+               assertEquals("\"bar\"", r);
+               r = CLIENT.doGet(URL + 
"/otherObjects/MessageBundle").acceptLanguage("ja-JP").getResponseAsString();
+               assertEquals("\"baz\"", r);
+       }
+
+       @Test
+       public void testOtherInputStream() throws IOException {
+               String r = CLIENT.doPost(URL + 
"/otherObjects/InputStream").input(new 
StringReader("foo")).getResponseAsString();
+               assertEquals("\"foo\"", r);
+       }
+
+       @Test
+       public void testOtherServletInputStream() throws Exception {
+               String r = CLIENT.doPost(URL + 
"/otherObjects/ServletInputStream").input(new 
StringReader("foo")).getResponseAsString();
+               assertEquals("\"foo\"", r);
+       }
+
+       @Test
+       public void testOtherReader() throws Exception {
+               String r = CLIENT.doPost(URL + 
"/otherObjects/Reader").input(new StringReader("foo")).getResponseAsString();
+               assertEquals("\"foo\"", r);
+       }
+
+       @Test
+       public void testOtherOutputStream() throws Exception {
+               String r = CLIENT.doGet(URL + 
"/otherObjects/OutputStream").getResponseAsString();
+               assertEquals("OK", r);
+       }
+
+       @Test
+       public void testOtherServletOutputStream() throws Exception {
+               String r = CLIENT.doGet(URL + 
"/otherObjects/ServletOutputStream").getResponseAsString();
+               assertEquals("OK", r);
+       }
+
+       @Test
+       public void testOtherWriter() throws Exception {
+               String r = CLIENT.doGet(URL + 
"/otherObjects/Writer").getResponseAsString();
+               assertEquals("OK", r);
+       }
+
+       @Test
+       public void testOtherRequestHeaders() throws Exception {
+               String r = CLIENT.doGet(URL + 
"/otherObjects/RequestHeaders").getResponseAsString();
+               assertEquals("true", r);
+       }
+
+       @Test
+       public void testOtherRequestQuery() throws Exception {
+               String r = CLIENT.doGet(URL + 
"/otherObjects/RequestQuery").getResponseAsString();
+               assertEquals("true", r);
+       }
+
+       @Test
+       public void testOtherRequestFormData() throws Exception {
+               String r = CLIENT.doGet(URL + 
"/otherObjects/RequestFormData").getResponseAsString();
+               assertEquals("true", r);
+       }
+
+       @Test
+       public void testOtherHttpMethod() throws Exception {
+               String r = CLIENT.doGet(URL + 
"/otherObjects/HttpMethod").getResponseAsString();
+               assertEquals("\"GET\"", r);
+       }
+
+       @Test
+       public void testOtherLogger() throws Exception {
+               String r = CLIENT.doGet(URL + 
"/otherObjects/Logger").getResponseAsString();
+               assertEquals("true", r);
+       }
+
+       @Test
+       public void testOtherJuneauLogger() throws Exception {
+               String r = CLIENT.doGet(URL + 
"/otherObjects/JuneauLogger").getResponseAsString();
+               assertEquals("true", r);
+       }
+
+       @Test
+       public void testOtherRestContext() throws Exception {
+               String r = CLIENT.doGet(URL + 
"/otherObjects/RestContext").getResponseAsString();
+               assertEquals("true", r);
+       }
+
+       @Test
+       public void testOtherParser() throws Exception {
+               String r = CLIENT.doGet(URL + 
"/otherObjects/Parser").getResponseAsString();
+               assertEquals("\"org.apache.juneau.json.JsonParser\"", r);
+       }
+
+       @Test
+       public void testOtherLocale() throws Exception {
+               String r = CLIENT.doGet(URL + 
"/otherObjects/Locale").acceptLanguage("en-US").getResponseAsString();
+               assertEquals("\"en_US\"", r);
+               r = CLIENT.doGet(URL + 
"/otherObjects/Locale").acceptLanguage("ja-JP").getResponseAsString();
+               assertEquals("\"ja_JP\"", r);
+       }
+
+       @Test
+       public void testOtherSwagger() throws Exception {
+               String r = CLIENT.doGet(URL + 
"/otherObjects/Swagger").getResponseAsString();
+               assertEquals("true", r);
+       }
+
+       @Test
+       public void testOtherRequestPathMatch() throws Exception {
+               String r = CLIENT.doGet(URL + 
"/otherObjects/RequestPathMatch").getResponseAsString();
+               assertEquals("true", r);
+       }
+
+       @Test
+       public void testOtherRequestBody() throws Exception {
+               String r = CLIENT.doGet(URL + 
"/otherObjects/RequestBody").getResponseAsString();
+               assertEquals("true", r);
+       }
+
+       @Test
+       public void testOtherConfigFile() throws Exception {
+               String r = CLIENT.doGet(URL + 
"/otherObjects/ConfigFile").getResponseAsString();
+               assertEquals("true", r);
+       }
+}

Propchange: 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/ParamsTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/ParsersTest.java
==============================================================================
--- 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/ParsersTest.java
 (added)
+++ 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/ParsersTest.java
 Fri Sep  8 23:21:12 2017
@@ -0,0 +1,138 @@
+// 
***************************************************************************************************************************
+// * 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.rest.test;
+
+import static javax.servlet.http.HttpServletResponse.*;
+import static org.apache.juneau.rest.test.TestUtils.*;
+import static org.junit.Assert.*;
+
+import org.apache.juneau.rest.client.*;
+import org.junit.*;
+
+public class ParsersTest extends RestTestcase {
+
+       private static String URL = "/testParsers";
+       private static boolean debug = false;
+
+       
//====================================================================================================
+       // Parser defined on class.
+       
//====================================================================================================
+       @Test
+       public void testParserOnClass() throws Exception {
+               RestClient client = TestMicroservice.DEFAULT_CLIENT_PLAINTEXT;
+               String url = URL + "/testParserOnClass";
+
+               String r = client.doPut(url, 
"test1").contentType("text/a").getResponseAsString();
+               assertEquals("text/a - test1", r);
+
+               try {
+                       client.doPut(url + "?noTrace=true", 
"test1").contentType("text/b").getResponseAsString();
+                       fail("Exception expected");
+               } catch (RestCallException e) {
+                       checkErrorResponse(debug, e, SC_UNSUPPORTED_MEDIA_TYPE,
+                               "Unsupported media-type in request header 
'Content-Type': 'text/b'",
+                               "Supported media-types: ['text/a"
+                       );
+               }
+
+               r = client.doPut(url, 
"'test1'").contentType("text/json").accept("text/json").getResponseAsString();
+               assertEquals("\"test1\"", r);
+       }
+
+       
//====================================================================================================
+       // Parser defined on method.
+       
//====================================================================================================
+       @Test
+       public void testParserOnMethod() throws Exception {
+               RestClient client = TestMicroservice.DEFAULT_CLIENT_PLAINTEXT;
+               String url = URL + "/testParserOnMethod";
+
+               String r = client.doPut(url, 
"test2").contentType("text/b").getResponseAsString();
+               assertEquals("text/b - test2", r);
+
+               try {
+                       client.doPut(url + "?noTrace=true", 
"test2").contentType("text/a").getResponseAsString();
+                       fail("Exception expected");
+               } catch (RestCallException e) {
+                       checkErrorResponse(debug, e, SC_UNSUPPORTED_MEDIA_TYPE,
+                               "Unsupported media-type in request header 
'Content-Type': 'text/a'",
+                               "Supported media-types: ['text/b']"
+                       );
+               }
+
+               try {
+                       r = client.doPut(url + "?noTrace=true", 
"'test2'").contentType("text/json").getResponseAsString();
+                       fail("Exception expected");
+               } catch (RestCallException e) {
+                       checkErrorResponse(debug, e, SC_UNSUPPORTED_MEDIA_TYPE,
+                               "Unsupported media-type in request header 
'Content-Type': 'text/json'",
+                               "Supported media-types: ['text/b']"
+                       );
+               }
+       }
+
+       
//====================================================================================================
+       // Parser overridden on method.
+       
//====================================================================================================
+       @Test
+       public void testParserOverriddenOnMethod() throws Exception {
+               RestClient client = TestMicroservice.DEFAULT_CLIENT_PLAINTEXT;
+               String url = URL + "/testParserOverriddenOnMethod";
+
+               String r = client.doPut(url, 
"test3").contentType("text/a").getResponseAsString();
+               assertEquals("text/a - test3", r);
+
+               r = client.doPut(url, 
"test3").contentType("text/b").getResponseAsString();
+               assertEquals("text/b - test3", r);
+
+               r = client.doPut(url, 
"'test3'").contentType("text/json").getResponseAsString();
+               assertEquals("test3", r);
+       }
+
+       
//====================================================================================================
+       // Parser with different Accept than Content-Type.
+       
//====================================================================================================
+       @Test
+       public void testParserWithDifferentMediaTypes() throws Exception {
+               RestClient client = TestMicroservice.DEFAULT_CLIENT_PLAINTEXT;
+               String url = URL + "/testParserWithDifferentMediaTypes";
+
+               String r = client.doPut(url, 
"test4").contentType("text/a").getResponseAsString();
+               assertEquals("text/a - test4", r);
+
+               r = client.doPut(url, 
"test4").contentType("text/d").getResponseAsString();
+               assertEquals("text/d - test4", r);
+
+               r = client.doPut(url, 
"'test4'").contentType("text/json").getResponseAsString();
+               assertEquals("test4", r);
+       }
+
+       
//====================================================================================================
+       // Check for valid error response.
+       
//====================================================================================================
+       @Test
+       public void testValidErrorResponse() throws Exception {
+               RestClient client = TestMicroservice.DEFAULT_CLIENT_PLAINTEXT;
+               String url = URL + "/testValidErrorResponse";
+
+               try {
+                       client.doPut(url + "?noTrace=true", 
"test1").contentType("text/bad").getResponseAsString();
+                       fail("Exception expected");
+               } catch (RestCallException e) {
+                       checkErrorResponse(debug, e, SC_UNSUPPORTED_MEDIA_TYPE,
+                               "Unsupported media-type in request header 
'Content-Type': 'text/bad'",
+                               "Supported media-types: ['text/a"
+                       );
+               }
+       }
+}

Propchange: 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/ParsersTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/PathTest.java
==============================================================================
--- 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/PathTest.java
 (added)
+++ 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/PathTest.java
 Fri Sep  8 23:21:12 2017
@@ -0,0 +1,41 @@
+// 
***************************************************************************************************************************
+// * 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.rest.test;
+
+import static org.junit.Assert.*;
+
+import org.apache.juneau.rest.client.*;
+import org.junit.*;
+
+public class PathTest extends RestTestcase {
+
+       private static String URL = "/testPath";
+
+       
//====================================================================================================
+       // Basic tests
+       
//====================================================================================================
+       @Test
+       public void testBasic() throws Exception {
+               RestClient client = TestMicroservice.DEFAULT_CLIENT;
+               String r = null;
+
+               r = client.doGet(URL).getResponse(String.class);
+               assertEquals("/testPath", r);
+
+               r = client.doGet(URL + "/testPath2").getResponse(String.class);
+               assertEquals("/testPath/testPath2", r);
+
+               r = client.doGet(URL + 
"/testPath2/testPath3").getResponse(String.class);
+               assertEquals("/testPath/testPath2/testPath3", r);
+       }
+}

Propchange: 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/PathTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/PathVariableTest.java
==============================================================================
--- 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/PathVariableTest.java
 (added)
+++ 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/PathVariableTest.java
 Fri Sep  8 23:21:12 2017
@@ -0,0 +1,51 @@
+// 
***************************************************************************************************************************
+// * 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.rest.test;
+
+import static org.junit.Assert.*;
+
+import org.apache.juneau.rest.client.*;
+import org.junit.*;
+
+/**
+ * Tests the <code>@RestMethod.path()</code> annotation.
+ */
+public class PathVariableTest extends RestTestcase {
+
+       private static String URL = "/testPathVariables";
+       RestClient client = TestMicroservice.DEFAULT_CLIENT;
+
+       @Test
+       public void test1() throws Exception {
+               String r = client.doGet(URL + 
"/test1/xxx/foo/123/bar/true").getResponseAsString();
+               assertEquals("x=xxx,y=123,z=true", r);
+       }
+
+       @Test
+       public void test2() throws Exception {
+               String r = client.doGet(URL + 
"/test2/true/foo/123/bar/xxx").getResponseAsString();
+               assertEquals("x=xxx,y=123,z=true", r);
+       }
+
+       @Test
+       public void test3() throws Exception {
+               String r = client.doGet(URL + 
"/test3/xxx/foo/123/bar/true").getResponseAsString();
+               assertEquals("x=xxx,y=123,z=true", r);
+       }
+
+       @Test
+       public void test4() throws Exception {
+               String r = client.doGet(URL + 
"/test4/true/foo/123/bar/xxx").getResponseAsString();
+               assertEquals("x=xxx,y=123,z=true", r);
+       }
+}

Propchange: 
release/incubator/juneau/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/PathVariableTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain


Reply via email to