< prev index next >
test/jdk/java/net/httpclient/http2/jdk.incubator.httpclient/jdk/incubator/http/internal/hpack/HeaderTableTest.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,7 ----
/*
! * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 114,124 ****
private static final int STATIC_TABLE_LENGTH = createStaticEntries().size();
private final Random rnd = newRandom();
@Test
public void staticData() {
! HeaderTable table = new HeaderTable(0);
Map<Integer, HeaderField> staticHeaderFields = createStaticEntries();
Map<String, Integer> minimalIndexes = new HashMap<>();
for (Map.Entry<Integer, HeaderField> e : staticHeaderFields.entrySet()) {
--- 114,124 ----
private static final int STATIC_TABLE_LENGTH = createStaticEntries().size();
private final Random rnd = newRandom();
@Test
public void staticData() {
! HeaderTable table = new HeaderTable(0, HPACK.getLogger());
Map<Integer, HeaderField> staticHeaderFields = createStaticEntries();
Map<String, Integer> minimalIndexes = new HashMap<>();
for (Map.Entry<Integer, HeaderField> e : staticHeaderFields.entrySet()) {
*** 157,225 ****
}
@Test
public void constructorSetsMaxSize() {
int size = rnd.nextInt(64);
! HeaderTable t = new HeaderTable(size);
assertEquals(t.size(), 0);
assertEquals(t.maxSize(), size);
}
@Test
public void negativeMaximumSize() {
int maxSize = -(rnd.nextInt(100) + 1); // [-100, -1]
IllegalArgumentException e =
assertVoidThrows(IllegalArgumentException.class,
! () -> new HeaderTable(0).setMaxSize(maxSize));
assertExceptionMessageContains(e, "maxSize");
}
@Test
public void zeroMaximumSize() {
! HeaderTable table = new HeaderTable(0);
table.setMaxSize(0);
assertEquals(table.maxSize(), 0);
}
@Test
public void negativeIndex() {
int idx = -(rnd.nextInt(256) + 1); // [-256, -1]
! IllegalArgumentException e =
! assertVoidThrows(IllegalArgumentException.class,
! () -> new HeaderTable(0).get(idx));
assertExceptionMessageContains(e, "index");
}
@Test
public void zeroIndex() {
! IllegalArgumentException e =
! assertThrows(IllegalArgumentException.class,
! () -> new HeaderTable(0).get(0));
assertExceptionMessageContains(e, "index");
}
@Test
public void length() {
! HeaderTable table = new HeaderTable(0);
assertEquals(table.length(), STATIC_TABLE_LENGTH);
}
@Test
public void indexOutsideStaticRange() {
! HeaderTable table = new HeaderTable(0);
int idx = table.length() + (rnd.nextInt(256) + 1);
! IllegalArgumentException e =
! assertThrows(IllegalArgumentException.class,
() -> table.get(idx));
assertExceptionMessageContains(e, "index");
}
@Test
public void entryPutAfterStaticArea() {
! HeaderTable table = new HeaderTable(256);
int idx = table.length() + 1;
! assertThrows(IllegalArgumentException.class, () -> table.get(idx));
byte[] bytes = new byte[32];
rnd.nextBytes(bytes);
String name = new String(bytes, StandardCharsets.ISO_8859_1);
String value = "custom-value";
--- 157,225 ----
}
@Test
public void constructorSetsMaxSize() {
int size = rnd.nextInt(64);
! HeaderTable t = new HeaderTable(size, HPACK.getLogger());
assertEquals(t.size(), 0);
assertEquals(t.maxSize(), size);
}
@Test
public void negativeMaximumSize() {
int maxSize = -(rnd.nextInt(100) + 1); // [-100, -1]
IllegalArgumentException e =
assertVoidThrows(IllegalArgumentException.class,
! () -> new HeaderTable(0, HPACK.getLogger()).setMaxSize(maxSize));
assertExceptionMessageContains(e, "maxSize");
}
@Test
public void zeroMaximumSize() {
! HeaderTable table = new HeaderTable(0, HPACK.getLogger());
table.setMaxSize(0);
assertEquals(table.maxSize(), 0);
}
@Test
public void negativeIndex() {
int idx = -(rnd.nextInt(256) + 1); // [-256, -1]
! IndexOutOfBoundsException e =
! assertVoidThrows(IndexOutOfBoundsException.class,
! () -> new HeaderTable(0, HPACK.getLogger()).get(idx));
assertExceptionMessageContains(e, "index");
}
@Test
public void zeroIndex() {
! IndexOutOfBoundsException e =
! assertThrows(IndexOutOfBoundsException.class,
! () -> new HeaderTable(0, HPACK.getLogger()).get(0));
assertExceptionMessageContains(e, "index");
}
@Test
public void length() {
! HeaderTable table = new HeaderTable(0, HPACK.getLogger());
assertEquals(table.length(), STATIC_TABLE_LENGTH);
}
@Test
public void indexOutsideStaticRange() {
! HeaderTable table = new HeaderTable(0, HPACK.getLogger());
int idx = table.length() + (rnd.nextInt(256) + 1);
! IndexOutOfBoundsException e =
! assertThrows(IndexOutOfBoundsException.class,
() -> table.get(idx));
assertExceptionMessageContains(e, "index");
}
@Test
public void entryPutAfterStaticArea() {
! HeaderTable table = new HeaderTable(256, HPACK.getLogger());
int idx = table.length() + 1;
! assertThrows(IndexOutOfBoundsException.class, () -> table.get(idx));
byte[] bytes = new byte[32];
rnd.nextBytes(bytes);
String name = new String(bytes, StandardCharsets.ISO_8859_1);
String value = "custom-value";
*** 230,246 ****
assertEquals(value, f.value);
}
@Test
public void staticTableHasZeroSize() {
! HeaderTable table = new HeaderTable(0);
assertEquals(0, table.size());
}
@Test
public void lowerIndexPriority() {
! HeaderTable table = new HeaderTable(256);
int oldLength = table.length();
table.put("bender", "rodriguez");
table.put("bender", "rodriguez");
table.put("bender", "rodriguez");
--- 230,246 ----
assertEquals(value, f.value);
}
@Test
public void staticTableHasZeroSize() {
! HeaderTable table = new HeaderTable(0, HPACK.getLogger());
assertEquals(0, table.size());
}
@Test
public void lowerIndexPriority() {
! HeaderTable table = new HeaderTable(256, HPACK.getLogger());
int oldLength = table.length();
table.put("bender", "rodriguez");
table.put("bender", "rodriguez");
table.put("bender", "rodriguez");
*** 249,259 ****
assertEquals(oldLength + 1, i);
}
@Test
public void lowerIndexPriority2() {
! HeaderTable table = new HeaderTable(256);
int oldLength = table.length();
int idx = rnd.nextInt(oldLength) + 1;
HeaderField f = table.get(idx);
table.put(f.name, f.value);
assertEquals(table.length(), oldLength + 1);
--- 249,259 ----
assertEquals(oldLength + 1, i);
}
@Test
public void lowerIndexPriority2() {
! HeaderTable table = new HeaderTable(256, HPACK.getLogger());
int oldLength = table.length();
int idx = rnd.nextInt(oldLength) + 1;
HeaderField f = table.get(idx);
table.put(f.name, f.value);
assertEquals(table.length(), oldLength + 1);
*** 265,277 ****
// TODO: ensure full table clearance when adding huge header field
// TODO: ensure eviction deletes minimum needed entries, not more
@Test
public void fifo() {
- HeaderTable t = new HeaderTable(Integer.MAX_VALUE);
// Let's add a series of header fields
int NUM_HEADERS = 32;
for (int i = 1; i <= NUM_HEADERS; i++) {
String s = String.valueOf(i);
t.put(s, s);
}
// They MUST appear in a FIFO order:
--- 265,279 ----
// TODO: ensure full table clearance when adding huge header field
// TODO: ensure eviction deletes minimum needed entries, not more
@Test
public void fifo() {
// Let's add a series of header fields
int NUM_HEADERS = 32;
+ HeaderTable t = new HeaderTable((32 + 4) * NUM_HEADERS, HPACK.getLogger());
+ // ^ ^
+ // entry overhead symbols per entry (max 2x2 digits)
for (int i = 1; i <= NUM_HEADERS; i++) {
String s = String.valueOf(i);
t.put(s, s);
}
// They MUST appear in a FIFO order:
*** 291,303 ****
}
}
@Test
public void indexOf() {
- HeaderTable t = new HeaderTable(Integer.MAX_VALUE);
// Let's put a series of header fields
int NUM_HEADERS = 32;
for (int i = 1; i <= NUM_HEADERS; i++) {
String s = String.valueOf(i);
t.put(s, s);
}
// and verify indexOf (reverse lookup) returns correct indexes for
--- 293,307 ----
}
}
@Test
public void indexOf() {
// Let's put a series of header fields
int NUM_HEADERS = 32;
+ HeaderTable t = new HeaderTable((32 + 4) * NUM_HEADERS, HPACK.getLogger());
+ // ^ ^
+ // entry overhead symbols per entry (max 2x2 digits)
for (int i = 1; i <= NUM_HEADERS; i++) {
String s = String.valueOf(i);
t.put(s, s);
}
// and verify indexOf (reverse lookup) returns correct indexes for
*** 324,345 ****
testToString0();
}
@Test
public void testToStringDifferentLocale() {
Locale.setDefault(Locale.FRENCH);
String s = format("%.1f", 3.1);
assertEquals("3,1", s); // assumption of the test, otherwise the test is useless
testToString0();
}
private void testToString0() {
! HeaderTable table = new HeaderTable(0);
{
! table.setMaxSize(2048);
! String expected =
! format("entries: %d; used %s/%s (%.1f%%)", 0, 0, 2048, 0.0);
assertEquals(expected, table.toString());
}
{
String name = "custom-name";
--- 328,356 ----
testToString0();
}
@Test
public void testToStringDifferentLocale() {
+ Locale locale = Locale.getDefault();
Locale.setDefault(Locale.FRENCH);
+ try {
String s = format("%.1f", 3.1);
assertEquals("3,1", s); // assumption of the test, otherwise the test is useless
testToString0();
+ } finally {
+ Locale.setDefault(locale);
+ }
}
private void testToString0() {
! HeaderTable table = new HeaderTable(0, HPACK.getLogger());
{
! int maxSize = 2048;
! table.setMaxSize(maxSize);
! String expected = format(
! "dynamic length: %s, full length: %s, used space: %s/%s (%.1f%%)",
! 0, STATIC_TABLE_LENGTH, 0, maxSize, 0.0);
assertEquals(expected, table.toString());
}
{
String name = "custom-name";
*** 351,379 ****
String s = table.toString();
int used = name.length() + value.length() + 32;
double ratio = used * 100.0 / size;
! String expected =
! format("entries: 1; used %s/%s (%.1f%%)", used, size, ratio);
assertEquals(expected, s);
}
{
table.setMaxSize(78);
table.put(":method", "");
table.put(":status", "");
String s = table.toString();
String expected =
! format("entries: %d; used %s/%s (%.1f%%)", 2, 78, 78, 100.0);
assertEquals(expected, s);
}
}
@Test
public void stateString() {
! HeaderTable table = new HeaderTable(256);
table.put("custom-key", "custom-header");
// @formatter:off
assertEquals("[ 1] (s = 55) custom-key: custom-header\n" +
" Table size: 55", table.getStateString());
// @formatter:on
--- 362,392 ----
String s = table.toString();
int used = name.length() + value.length() + 32;
double ratio = used * 100.0 / size;
! String expected = format(
! "dynamic length: %s, full length: %s, used space: %s/%s (%.1f%%)",
! 1, STATIC_TABLE_LENGTH + 1, used, size, ratio);
assertEquals(expected, s);
}
{
table.setMaxSize(78);
table.put(":method", "");
table.put(":status", "");
String s = table.toString();
String expected =
! format("dynamic length: %s, full length: %s, used space: %s/%s (%.1f%%)",
! 2, STATIC_TABLE_LENGTH + 2, 78, 78, 100.0);
assertEquals(expected, s);
}
}
@Test
public void stateString() {
! HeaderTable table = new HeaderTable(256, HPACK.getLogger());
table.put("custom-key", "custom-header");
// @formatter:off
assertEquals("[ 1] (s = 55) custom-key: custom-header\n" +
" Table size: 55", table.getStateString());
// @formatter:on
< prev index next >