/*
* Copyright 2015 The Netty Project
*
* The Netty Project 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 io.netty.handler.codec.http;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static io.netty.util.internal.StringUtil.COMMA;
import static io.netty.util.internal.StringUtil.DOUBLE_QUOTE;
/**
* Utility methods for {@link HttpHeaders} related unit tests.
*/
public final class HttpHeadersTestUtils {
enum HeaderValue {
UNKNOWN("Unknown", 0),
ONE("One", 1),
TWO("Two", 2),
THREE("Three", 3),
FOUR("Four", 4),
FIVE("Five", 5),
SIX_QUOTED("Six,", 6),
SEVEN_QUOTED("Seven; , GMT", 7),
EIGHT("Eight", 8);
private final int nr;
private final String value;
private List<CharSequence> array;
HeaderValue(final String value, final int nr) {
this.nr = nr;
this.value = value;
}
@Override
public String toString() {
return value;
}
public List<CharSequence> asList() {
if (array == null) {
List<CharSequence> list = new ArrayList<CharSequence>(nr);
for (int i = 1; i <= nr; i++) {
list.add(of(i).toString());
}
array = list;
}
return array;
}
public List<CharSequence> subset(int from) {
assert from > 0;
--from;
final int size = nr - from;
final int end = from + size;
List<CharSequence> list = new ArrayList<CharSequence>(size);
List<CharSequence> fullList = asList();
for (int i = from; i < end; ++i) {
list.add(fullList.get(i));
}
return list;
}
public String subsetAsCsvString(final int from) {
final List<CharSequence> subset = subset(from);
return asCsv(subset);
}
public String asCsv(final List<CharSequence> arr) {
if (arr == null || arr.isEmpty()) {
return "";
}
final StringBuilder sb = new StringBuilder(arr.size() * 10);
final int end = arr.size() - 1;
for (int i = 0; i < end; ++i) {
quoted(sb, arr.get(i)).append(COMMA);
}
quoted(sb, arr.get(end));
return sb.toString();
}
public CharSequence asCsv() {
return asCsv(asList());
}
private static StringBuilder quoted(final StringBuilder sb, final CharSequence value) {
if (contains(value, COMMA) && !contains(value, DOUBLE_QUOTE)) {
return sb.append(DOUBLE_QUOTE).append(value).append(DOUBLE_QUOTE);
}
return sb.append(value);
}
private static boolean contains(CharSequence value, char c) {
for (int i = 0; i < value.length(); ++i) {
if (value.charAt(i) == c) {
return true;
}
}
return false;
}
private static final Map<Integer, HeaderValue> MAP;
static {
final Map<Integer, HeaderValue> map = new HashMap<Integer, HeaderValue>();
for (HeaderValue v : values()) {
final int nr = v.nr;
map.put(Integer.valueOf(nr), v);
}
MAP = map;
}
public static HeaderValue of(final int nr) {
final HeaderValue v = MAP.get(Integer.valueOf(nr));
return v == null ? UNKNOWN : v;
}
}
public static CharSequence of(String s) {
return s;
}
private HttpHeadersTestUtils() { }
}