// Copyright 2012 Google Inc. All Rights Reserved.
//
// Licensed 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 com.google.enterprise.adaptor;

import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpContext;
import com.sun.net.httpserver.HttpPrincipal;
import com.sun.net.httpserver.HttpsExchange;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.URI;

import javax.net.ssl.SSLSession;

/**
 * Mock {@link HttpsExchange} for testing.
 */
public class MockHttpsExchange extends HttpsExchange {
  private MockHttpExchange ex;
  private SSLSession sslSession;

  public MockHttpsExchange(MockHttpExchange ex, SSLSession sslSession) {
    this.ex = ex;
    this.sslSession = sslSession;
  }

  public MockHttpsExchange(String method, String path,
                           HttpContext context, SSLSession sslSession) {
    this.ex = new MockHttpExchange(method, path, context);
    this.sslSession = sslSession;
  }

  @Override
  public void close() {
    ex.close();
  }

  @Override
  public Object getAttribute(String name) {
    return ex.getAttribute(name);
  }

  @Override
  public HttpContext getHttpContext() {
    return ex.getHttpContext();
  }

  @Override
  public InetSocketAddress getLocalAddress() {
    return ex.getLocalAddress();
  }

  @Override
  public HttpPrincipal getPrincipal() {
    return ex.getPrincipal();
  }

  @Override
  public String getProtocol() {
    return ex.getProtocol();
  }

  @Override
  public InetSocketAddress getRemoteAddress() {
    return ex.getRemoteAddress();
  }

  @Override
  public InputStream getRequestBody() {
    return ex.getRequestBody();
  }

  @Override
  public Headers getRequestHeaders() {
    return ex.getRequestHeaders();
  }

  @Override
  public String getRequestMethod() {
    return ex.getRequestMethod();
  }

  @Override
  public URI getRequestURI() {
    return ex.getRequestURI();
  }

  @Override
  public OutputStream getResponseBody() {
    return ex.getResponseBody();
  }

  @Override
  public int getResponseCode() {
    return ex.getResponseCode();
  }

  @Override
  public Headers getResponseHeaders() {
    return ex.getResponseHeaders();
  }

  @Override
  public void sendResponseHeaders(int rCode, long responseLength) {
    ex.sendResponseHeaders(rCode, responseLength);
  }

  @Override
  public void setAttribute(String name, Object value) {
    ex.setAttribute(name, value);
  }

  @Override
  public void setStreams(InputStream i, OutputStream o) {
    ex.setStreams(i, o);
  }

  @Override
  public SSLSession getSSLSession() {
    return sslSession;
  }

  /* ** Additional Methods for Mocking ** */

  public void setRequestBody(byte[] bytes) {
    ex.setRequestBody(bytes);
  }

  public void setRequestBody(InputStream i) {
    ex.setRequestBody(i);
  }

  public byte[] getResponseBytes() {
    return ex.getResponseBytes();
  }
}
