/*
 * Copyright 2016, Google Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *    * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *    * Redistributions in binary form must reproduce the above
 * copyright notice, this list of conditions and the following disclaimer
 * in the documentation and/or other materials provided with the
 * distribution.
 *
 *    * Neither the name of Google Inc. nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package io.grpc.netty;

import io.grpc.Metadata;
import io.grpc.Metadata.AsciiMarshaller;
import io.grpc.netty.Utils;
import io.netty.handler.codec.http2.Http2Headers;
import io.netty.util.AsciiString;

import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Param;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;

import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * Header encoding benchmark.
 */
@State(Scope.Benchmark)
public class HeadersBenchmark {
  @Param({"10", "20", "50", "100"})
  public int headerCount;

  @Param({"false", "true"})
  public boolean validate;

  private final AsciiMarshaller<String> keyMarshaller = new AsciiMarshaller<String>() {
    @Override
    public String toAsciiString(String value) {
      return value;
    }

    @Override
    public String parseAsciiString(String serialized) {
      return serialized;
    }
  };

  private Metadata metadata = new Metadata();
  private AsciiString scheme = new AsciiString("https");
  private AsciiString defaultPath = new AsciiString("/Service.MethodMethodMethod");
  private AsciiString authority = new AsciiString("authority.googleapis.bogus");
  private AsciiString userAgent = new AsciiString("grpc-java-netty");

  @Setup
  public void setUp() throws Exception {
    for (int i = 0; i < headerCount; i++) {
      metadata.put(Metadata.Key.of("key-" + i, keyMarshaller), UUID.randomUUID().toString());
    }
    Utils.validateHeaders = validate;
  }

  @Benchmark
  @BenchmarkMode(Mode.SampleTime)
  @OutputTimeUnit(TimeUnit.NANOSECONDS)
  public Http2Headers convertHeaders() {
    return Utils.convertClientHeaders(metadata, scheme, defaultPath, authority, userAgent);
  }
}


@@ -1648,36 +1648,8 @@
 er;%0A
-import io.grpc.netty.Utils;%0A
 impo
@@ -1694,16 +1694,16 @@
 eaders;%0A
+
 import i
@@ -2309,64 +2309,8 @@
 t;%0A%0A
-  @Param(%7B%22false%22, %22true%22%7D)%0A  public boolean validate;%0A%0A
   pr
@@ -3126,46 +3126,8 @@
   %7D%0A
-    Utils.validateHeaders = validate;%0A
   %7D%0A
@@ -3243,16 +3243,22 @@
  convert
+Client
 Headers(
@@ -3356,12 +3356,200 @@
 nt);%0A  %7D
+%0A%0A  @Benchmark%0A  @BenchmarkMode(Mode.SampleTime)%0A  @OutputTimeUnit(TimeUnit.NANOSECONDS)%0A  public Http2Headers convertServerHeaders() %7B%0A    return Utils.convertServerHeaders(metadata);%0A  %7D
 %0A%7D%0A%0A

add client/server header benchmarks