Path: blob/master/test/jdk/com/sun/net/httpserver/UnmodifiableHeadersTest.java
41152 views
/*1* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/*24* @test25* @bug 825149626* @summary Test that UnmodifiableHeaders is in fact immutable27* @modules jdk.httpserver/sun.net.httpserver:+open28* @run testng/othervm UnmodifiableHeadersTest29*/3031import java.io.InputStream;32import java.io.OutputStream;33import java.net.InetSocketAddress;34import java.net.URI;35import java.util.AbstractMap;36import java.util.List;37import java.util.Map;38import com.sun.net.httpserver.Headers;39import com.sun.net.httpserver.HttpContext;40import com.sun.net.httpserver.HttpExchange;41import com.sun.net.httpserver.HttpPrincipal;42import org.testng.annotations.Test;43import sun.net.httpserver.UnmodifiableHeaders;44import static org.testng.Assert.assertEquals;45import static org.testng.Assert.assertThrows;4647public class UnmodifiableHeadersTest {4849@Test50public static void testEquality() {51var headers = new Headers();52var unmodifiableHeaders1 = new UnmodifiableHeaders(headers);53assertEquals(unmodifiableHeaders1, headers);54assertEquals(unmodifiableHeaders1.hashCode(), headers.hashCode());55assertEquals(unmodifiableHeaders1.get("Foo"), headers.get("Foo"));5657headers.add("Foo", "Bar");58var unmodifiableHeaders2 = new UnmodifiableHeaders(headers);59assertEquals(unmodifiableHeaders2, headers);60assertEquals(unmodifiableHeaders2.hashCode(), headers.hashCode());61assertEquals(unmodifiableHeaders2.get("Foo"), headers.get("Foo"));62}6364@Test65public static void testUnmodifiableHeaders() {66var headers = new Headers();67headers.add("Foo", "Bar");68HttpExchange exchange = new TestHttpExchange(headers);6970assertUnsupportedOperation(exchange.getRequestHeaders());71assertUnmodifiableCollection(exchange.getRequestHeaders());72}7374static final Class<UnsupportedOperationException> UOP = UnsupportedOperationException.class;7576static void assertUnsupportedOperation(Headers headers) {77assertThrows(UOP, () -> headers.add("a", "b"));78assertThrows(UOP, () -> headers.compute("c", (k, v) -> List.of("c")));79assertThrows(UOP, () -> headers.computeIfAbsent("d", k -> List.of("d")));80assertThrows(UOP, () -> headers.computeIfPresent("Foo", (k, v) -> null));81assertThrows(UOP, () -> headers.merge("e", List.of("e"), (k, v) -> List.of("e")));82assertThrows(UOP, () -> headers.put("f", List.of("f")));83assertThrows(UOP, () -> headers.putAll(Map.of()));84assertThrows(UOP, () -> headers.putIfAbsent("g", List.of("g")));85assertThrows(UOP, () -> headers.remove("h"));86assertThrows(UOP, () -> headers.replace("i", List.of("i")));87assertThrows(UOP, () -> headers.replace("j", List.of("j"), List.of("j")));88assertThrows(UOP, () -> headers.replaceAll((k, v) -> List.of("k")));89assertThrows(UOP, () -> headers.set("l", "m"));90assertThrows(UOP, () -> headers.clear());91}9293static void assertUnmodifiableCollection(Headers headers) {94var entry = new AbstractMap.SimpleEntry<>("n", List.of("n"));9596assertThrows(UOP, () -> headers.values().remove(List.of("Bar")));97assertThrows(UOP, () -> headers.values().removeAll(List.of("Bar")));98assertThrows(UOP, () -> headers.keySet().remove("Foo"));99assertThrows(UOP, () -> headers.keySet().removeAll(List.of("Foo")));100assertThrows(UOP, () -> headers.entrySet().remove(entry));101assertThrows(UOP, () -> headers.entrySet().removeAll(List.of(entry)));102}103104static void assertUnmodifiableList(Headers headers) {105assertThrows(UOP, () -> headers.get("Foo").remove(0));106assertThrows(UOP, () -> headers.get("foo").remove(0));107assertThrows(UOP, () -> headers.values().stream().findFirst().orElseThrow().remove(0));108assertThrows(UOP, () -> headers.entrySet().stream().findFirst().orElseThrow().getValue().remove(0));109}110111static class TestHttpExchange extends StubHttpExchange {112final UnmodifiableHeaders headers;113114TestHttpExchange(Headers headers) {115this.headers = new UnmodifiableHeaders(headers);116}117118@Override119public Headers getRequestHeaders() {120return headers;121}122}123124static class StubHttpExchange extends HttpExchange {125@Override public Headers getRequestHeaders() { return null; }126@Override public Headers getResponseHeaders() { return null; }127@Override public URI getRequestURI() { return null; }128@Override public String getRequestMethod() { return null; }129@Override public HttpContext getHttpContext() { return null; }130@Override public void close() { }131@Override public InputStream getRequestBody() { return null; }132@Override public OutputStream getResponseBody() { return null; }133@Override public void sendResponseHeaders(int rCode, long responseLength) { }134@Override public InetSocketAddress getRemoteAddress() { return null; }135@Override public int getResponseCode() { return 0; }136@Override public InetSocketAddress getLocalAddress() { return null; }137@Override public String getProtocol() { return null; }138@Override public Object getAttribute(String name) { return null; }139@Override public void setAttribute(String name, Object value) { }140@Override public void setStreams(InputStream i, OutputStream o) { }141@Override public HttpPrincipal getPrincipal() { return null; }142}143}144145146