// // ======================================================================== // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // and Apache License v2.0 which accompanies this distribution. // // The Eclipse Public License is available at // http://www.eclipse.org/legal/epl-v10.html // // The Apache License v2.0 is available at // http://www.opensource.org/licenses/apache2.0.php // // You may elect to redistribute this code under either of these licenses. // ======================================================================== // package org.eclipse.jetty.http2.hpack; import java.io.File; import java.io.FileReader; import java.io.FilenameFilter; import java.nio.ByteBuffer; import java.util.Map; import org.eclipse.jetty.http.HttpFields; import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.http.MetaData; import org.eclipse.jetty.toolchain.test.MavenTestingUtils; import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.ajax.JSON; import org.junit.After; import org.junit.Before; import org.junit.Test; public class HpackPerfTest { int _maxDynamicTableSize=4*1024; int _unencodedSize; int _encodedSize; @Before public void before() { _unencodedSize=0; _encodedSize=0; } @After public void after() { System.err.printf("dynamictable=%d unencoded=%d encoded=%d p=%3.1f%%%n",_maxDynamicTableSize,_unencodedSize,_encodedSize,100.0*_encodedSize/_unencodedSize); } @Test public void simpleTest() throws Exception { runStories(_maxDynamicTableSize); } private void runStories(int maxDynamicTableSize) throws Exception { // Find files File data = MavenTestingUtils.getTestResourceDir("data"); String[] files = data.list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.startsWith("story_"); } }); // Parse JSON Map<String,Object>[] stories = new Map[files.length]; int i=0; for (String story : files) stories[i++]=(Map<String,Object>)JSON.parse(new FileReader(new File(data,story))); ByteBuffer buffer = BufferUtil.allocate(256*1024); // Encode all the requests encodeStories(buffer,stories,"request"); // clear table BufferUtil.clearToFill(buffer); BufferUtil.flipToFlush(buffer,0); // Encode all the responses encodeStories(buffer,stories,"response"); } private void encodeStories(ByteBuffer buffer,Map<String,Object>[] stories, String type) throws Exception { for (Map<String,Object> story : stories) { if (type.equals(story.get("context"))) { HpackEncoder encoder = new HpackEncoder(_maxDynamicTableSize,_maxDynamicTableSize); // System.err.println(story); Object[] cases = (Object[])story.get("cases"); for (Object c : cases) { // System.err.println(" "+c); Object[] headers = (Object[])((Map<String,Object>)c).get("headers"); // System.err.println(" "+headers); HttpFields fields = new HttpFields(); for (Object header:headers) { Map<String,String> h = (Map<String,String>)header; Map.Entry<String, String> e = h.entrySet().iterator().next(); fields.add(e.getKey(),e.getValue()); _unencodedSize+=e.getKey().length()+e.getValue().length(); } BufferUtil.clearToFill(buffer); encoder.encode(buffer,new MetaData(HttpVersion.HTTP_2,fields)); BufferUtil.flipToFlush(buffer,0); _encodedSize+=buffer.remaining(); } } } } }