blob: 9aed227b3471056d2e72b1299e212052a3cddca8 [file] [log] [blame]
/*
* 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.servicecomb.foundation.vertx.http;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.HttpMethod;
import javax.ws.rs.core.MediaType;
import org.apache.commons.io.IOUtils;
import org.apache.servicecomb.foundation.vertx.stream.BufferInputStream;
import org.hamcrest.MatcherAssert;
import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.Test;
import io.vertx.core.buffer.Buffer;
import mockit.Deencapsulation;
import mockit.Expectations;
import mockit.Mocked;
import org.junit.jupiter.api.Assertions;
public class TestStandardHttpServletRequestEx {
@Mocked
HttpServletRequest request;
StandardHttpServletRequestEx requestEx;
@Before
public void setup() {
requestEx = new StandardHttpServletRequestEx(request);
}
@Test
public void setBodyBuffer() {
Buffer bodyBuffer = Buffer.buffer();
bodyBuffer.appendString("abc");
requestEx.setBodyBuffer(bodyBuffer);
Assertions.assertSame(bodyBuffer, requestEx.getBodyBuffer());
Assertions.assertArrayEquals("abc".getBytes(), Arrays.copyOf(requestEx.getBodyBytes(), requestEx.getBodyBytesLength()));
}
@Test
public void getInputStreamNotCache() throws IOException {
ServletInputStream inputStream = request.getInputStream();
Assertions.assertSame(inputStream, requestEx.getInputStream());
}
@Test
public void getInputStreamCache() throws IOException {
requestEx.setCacheRequest(true);
ServletInputStream inputStream = request.getInputStream();
new Expectations(IOUtils.class) {
{
IOUtils.toByteArray(inputStream);
result = "abc".getBytes();
}
};
ServletInputStream cachedInputStream = requestEx.getInputStream();
Assertions.assertEquals("abc", IOUtils.toString(cachedInputStream, StandardCharsets.UTF_8));
Assertions.assertEquals("abc", requestEx.getBodyBuffer().toString());
// do not create another one
Assertions.assertSame(cachedInputStream, requestEx.getInputStream());
}
@Test
public void parameterMap_inherited() {
Map<String, String[]> inherited = new HashMap<>();
String[] v1 = new String[] {"v1-1", "v1-2"};
inherited.put("p1", v1);
new Expectations() {
{
request.getParameterMap();
result = inherited;
request.getMethod();
result = HttpMethod.POST;
}
};
Assertions.assertSame(inherited, requestEx.getParameterMap());
MatcherAssert.assertThat(Collections.list(requestEx.getParameterNames()), Matchers.contains("p1"));
Assertions.assertSame(v1, requestEx.getParameterValues("p1"));
Assertions.assertEquals("v1-1", requestEx.getParameter("p1"));
}
@Test
public void parameterMap_merge() throws IOException {
Map<String, String[]> inherited = new HashMap<>();
String[] v1 = new String[] {"v1-1", "v1-2"};
inherited.put("p1", v1);
Buffer buffer = Buffer.buffer("p1=v1-3;p2=v2");
BufferInputStream inputStream = new BufferInputStream(buffer.getByteBuf());
new Expectations() {
{
request.getParameterMap();
result = inherited;
request.getMethod();
result = HttpMethod.PUT;
request.getContentType();
result = MediaType.APPLICATION_FORM_URLENCODED.toUpperCase(Locale.US) + ";abc";
request.getInputStream();
result = inputStream;
}
};
MatcherAssert.assertThat(Collections.list(requestEx.getParameterNames()), Matchers.contains("p1", "p2"));
MatcherAssert.assertThat(requestEx.getParameterValues("p1"), Matchers.arrayContaining("v1-1", "v1-2", "v1-3"));
Assertions.assertEquals("v1-1", requestEx.getParameter("p1"));
}
@Test
public void setParameter() {
Map<String, String[]> parameterMap = new HashMap<>();
Deencapsulation.setField(requestEx, "parameterMap", parameterMap);
requestEx.setParameter("k1", "v1");
requestEx.setParameter("k2", "v2");
Assertions.assertEquals("v1", requestEx.getParameter("k1"));
Assertions.assertEquals("v2", requestEx.getParameter("k2"));
Assertions.assertSame(parameterMap, requestEx.getParameterMap());
MatcherAssert.assertThat(Collections.list(requestEx.getParameterNames()), Matchers.contains("k1", "k2"));
}
}