// Copyright (C) 2013 The Android Open Source Project
//
// 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.gerrit.acceptance;

import com.google.common.base.Charsets;
import com.google.gerrit.server.OutputFormat;

import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.message.BasicHeader;

import java.io.IOException;

public class RestSession extends HttpSession {

  public RestSession(GerritServer server, TestAccount account) {
    super(server, account);
  }

  @Override
  public RestResponse get(String endPoint) throws IOException {
    HttpGet get = new HttpGet(url + "/a" + endPoint);
    return new RestResponse(getClient().execute(get));
  }

  public RestResponse put(String endPoint) throws IOException {
    return put(endPoint, null);
  }

  public RestResponse put(String endPoint, Object content) throws IOException {
    HttpPut put = new HttpPut(url + "/a" + endPoint);
    if (content != null) {
      put.addHeader(new BasicHeader("Content-Type", "application/json"));
      put.setEntity(new StringEntity(
          OutputFormat.JSON_COMPACT.newGson().toJson(content),
          Charsets.UTF_8.name()));
    }
    return new RestResponse(getClient().execute(put));
  }

  public RestResponse post(String endPoint) throws IOException {
    return post(endPoint, null);
  }

  public RestResponse post(String endPoint, Object content) throws IOException {
    HttpPost post = new HttpPost(url + "/a" + endPoint);
    if (content != null) {
      post.addHeader(new BasicHeader("Content-Type", "application/json"));
      post.setEntity(new StringEntity(
          OutputFormat.JSON_COMPACT.newGson().toJson(content),
          Charsets.UTF_8.name()));
    }
    return new RestResponse(getClient().execute(post));
  }

  public RestResponse delete(String endPoint) throws IOException {
    HttpDelete delete = new HttpDelete(url + "/a" + endPoint);
    return new RestResponse(getClient().execute(delete));
  }
}

@@ -681,16 +681,115 @@
 arsets;%0A
+import com.google.common.base.Preconditions;%0Aimport com.google.gerrit.extensions.restapi.RawInput;%0A
 import c
@@ -1053,93 +1053,257 @@
 ity.
-StringEntity;%0Aimport org.apache.http.message.BasicHeader;%0A%0Aimport java.io.IOException
+BufferedHttpEntity;%0Aimport org.apache.http.entity.InputStreamEntity;%0Aimport org.apache.http.entity.StringEntity;%0Aimport org.apache.http.message.BasicHeader;%0A%0Aimport java.io.ByteArrayInputStream;%0Aimport java.io.IOException;%0Aimport java.io.InputStream
 ;%0A%0Ap
@@ -2167,32 +2167,499 @@
 ute(put));%0A  %7D%0A%0A
+  public RestResponse putRaw(String endPoint, RawInput stream) throws IOException %7B%0A    Preconditions.checkNotNull(stream);%0A    HttpPut put = new HttpPut(url + %22/a%22 + endPoint);%0A    put.addHeader(new BasicHeader(%22Content-Type%22, stream.getContentType()));%0A    put.setEntity(new BufferedHttpEntity(%0A        new InputStreamEntity(%0A            stream.getInputStream(),%0A            stream.getContentLength())));%0A    return new RestResponse(getClient().execute(put));%0A  %7D%0A%0A
   public RestRes
@@ -3381,10 +3381,609 @@
 ));%0A  %7D%0A
+%0A%0A  public static RawInput newRawInput(final String content) throws IOException %7B%0A    Preconditions.checkNotNull(content);%0A    Preconditions.checkArgument(!content.isEmpty());%0A    return new RawInput() %7B%0A      byte bytes%5B%5D = content.getBytes(%22UTF-8%22);%0A%0A      @Override%0A      public InputStream getInputStream() throws IOException %7B%0A        return new ByteArrayInputStream(bytes);%0A      %7D%0A%0A      @Override%0A      public String getContentType() %7B%0A        return %22application/octet-stream%22;%0A      %7D%0A%0A      @Override%0A      public long getContentLength() %7B%0A        return bytes.length;%0A      %7D%0A    %7D;%0A  %7D%0A
 %7D%0A

Add support for raw input to acceptance test framework