/*
 *
 * Copyright 2015, 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.
 *
 */

#include "src/core/ext/transport/chttp2/alpn/alpn.h"

#include <grpc/support/log.h>
#include "test/core/util/test_config.h"

static void test_alpn_success(void) {
  GPR_ASSERT(grpc_chttp2_is_alpn_version_supported("h2", 2));
  GPR_ASSERT(grpc_chttp2_is_alpn_version_supported("grpc-exp", 8));
}

static void test_alpn_failure(void) {
  GPR_ASSERT(!grpc_chttp2_is_alpn_version_supported("h2-155", 6));
  GPR_ASSERT(!grpc_chttp2_is_alpn_version_supported("h1-15", 5));
}

// First index in ALPN supported version list of a given protocol. Returns a
// value one beyond the last valid element index if not found.
static size_t alpn_version_index(const char *version, size_t size) {
  size_t i;
  for (i = 0; i < grpc_chttp2_num_alpn_versions(); ++i) {
    if (!strncmp(version, grpc_chttp2_get_alpn_version_index(i), size)) {
      return i;
    }
  }
  return i;
}

static void test_alpn_grpc_before_h2(void) {
  // grpc-exp is preferred over h2.
  GPR_ASSERT(alpn_version_index("grpc-exp", 8) < alpn_version_index("h2", 2));
}

int main(int argc, char **argv) {
  grpc_test_init(argc, argv);
  test_alpn_success();
  test_alpn_failure();
  test_alpn_grpc_before_h2();
  return 0;
}
