/* * Copyright (C) 2011 The Guava Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.common.net; import com.google.common.base.Ascii; import com.google.common.base.Joiner; import com.google.common.base.Splitter; import com.google.common.collect.ImmutableBiMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import java.lang.reflect.Field; import java.util.List; import junit.framework.TestCase; /** * Tests for the HttpHeaders class. * * @author Kurt Alfred Kluever */ public class HttpHeadersTest extends TestCase { public void testConstantNameMatchesString() throws Exception { // Special case some of the weird HTTP Header names... ImmutableBiMap specialCases = ImmutableBiMap.builder() .put("CDN_LOOP", "CDN-Loop") .put("ETAG", "ETag") .put("SOURCE_MAP", "SourceMap") .put("SEC_WEBSOCKET_ACCEPT", "Sec-WebSocket-Accept") .put("SEC_WEBSOCKET_EXTENSIONS", "Sec-WebSocket-Extensions") .put("SEC_WEBSOCKET_KEY", "Sec-WebSocket-Key") .put("SEC_WEBSOCKET_PROTOCOL", "Sec-WebSocket-Protocol") .put("SEC_WEBSOCKET_VERSION", "Sec-WebSocket-Version") .put("X_WEBKIT_CSP", "X-WebKit-CSP") .put("X_WEBKIT_CSP_REPORT_ONLY", "X-WebKit-CSP-Report-Only") .build(); ImmutableSet uppercaseAcronyms = ImmutableSet.of( "CH", "ID", "DNT", "DNS", "HTTP2", "IP", "MD5", "P3P", "TE", "UA", "UID", "URL", "WWW", "XSS"); assertConstantNameMatchesString(HttpHeaders.class, specialCases, uppercaseAcronyms); } // Visible for other tests to use static void assertConstantNameMatchesString( Class clazz, ImmutableBiMap specialCases, ImmutableSet uppercaseAcronyms) throws IllegalAccessException { for (Field field : relevantFields(clazz)) { assertEquals( upperToHttpHeaderName(field.getName(), specialCases, uppercaseAcronyms), field.get(null)); } } // Visible for other tests to use static ImmutableSet relevantFields(Class cls) { ImmutableSet.Builder builder = ImmutableSet.builder(); for (Field field : cls.getDeclaredFields()) { /* * Coverage mode generates synthetic fields. If we ever add private * fields, they will cause similar problems, and we may want to switch * this check to isAccessible(). */ if (!field.isSynthetic() && field.getType() == String.class) { builder.add(field); } } return builder.build(); } private static final Splitter SPLITTER = Splitter.on('_'); private static final Joiner JOINER = Joiner.on('-'); private static String upperToHttpHeaderName( String constantName, ImmutableBiMap specialCases, ImmutableSet uppercaseAcronyms) { if (specialCases.containsKey(constantName)) { return specialCases.get(constantName); } List parts = Lists.newArrayList(); for (String part : SPLITTER.split(constantName)) { if (!uppercaseAcronyms.contains(part)) { part = part.charAt(0) + Ascii.toLowerCase(part.substring(1)); } parts.add(part); } return JOINER.join(parts); } }