/*
* Copyright 2013-2014 Urs Wolfer
*
* 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.urswolfer.gerrit.client.rest.http.changes;
import com.google.common.base.Function;
import com.google.common.truth.Truth;
import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
import com.google.gerrit.extensions.common.DiffInfo;
import com.google.gerrit.extensions.restapi.BinaryResult;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.Url;
import com.google.gson.JsonElement;
import com.urswolfer.gerrit.client.rest.http.GerritRestClient;
import com.urswolfer.gerrit.client.rest.http.common.GerritRestClientBuilder;
import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.message.BasicHeader;
import org.easymock.EasyMock;
import org.testng.annotations.Test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
/**
* @author Thomas Forrer
*/
public class FileApiRestClientTest {
private static final String FILE_CONTENT = "some new changes";
private static final String FILE_PATH = "gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java";
private RevisionApiRestClient revisionApiRestClient;
@Test
public void testContent() throws Exception {
String requestUrl = getBaseRequestUrl() + "/content";
String base64String = Base64.encodeBase64String(FILE_CONTENT.getBytes("UTF-8"));
HttpResponse httpResponse = EasyMock.createMock(HttpResponse.class);
HttpEntity httpEntity = EasyMock.createMock(HttpEntity.class);
EasyMock.expect(httpEntity.getContent()).andStubReturn(new ByteArrayInputStream(base64String.getBytes("UTF-8")));
EasyMock.expect(httpResponse.getEntity()).andStubReturn(httpEntity);
EasyMock.expect(httpResponse.getFirstHeader("X-FYI-Content-Encoding")).andStubReturn(
new BasicHeader("X-FYI-Content-Type", "base64"));
EasyMock.expect(httpResponse.getFirstHeader("X-FYI-Content-Type")).andStubReturn(
new BasicHeader("X-FYI-Content-Type", "text/plain"));
EasyMock.replay(httpEntity, httpResponse);
setupServices();
GerritRestClient gerritRestClient = new GerritRestClientBuilder()
.expectRequest(requestUrl, null, GerritRestClient.HttpVerb.GET, httpResponse)
.get();
FileApiRestClient fileApiRestClient = new FileApiRestClient(gerritRestClient, revisionApiRestClient, null, FILE_PATH);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
BinaryResult binaryResult = fileApiRestClient.content();
try {
binaryResult.writeTo(byteArrayOutputStream);
String actualContent = new String(Base64.decodeBase64(byteArrayOutputStream.toString()));
Truth.assertThat(actualContent).isEqualTo(FILE_CONTENT);
Truth.assertThat(binaryResult.isBase64()).isTrue();
Truth.assertThat(binaryResult.getContentType()).isEqualTo("text/plain");
EasyMock.verify(gerritRestClient);
} finally {
binaryResult.close();
byteArrayOutputStream.close();
}
}
@Test
public void testDiff() throws Exception {
String requestUrl = getBaseRequestUrl() + "/diff";
testDiff(new Function<FileApiRestClient, Void>() {
@Override
public Void apply(FileApiRestClient fileApiRestClient) {
try {
fileApiRestClient.diff();
} catch (RestApiException e) {
throw new RuntimeException(e);
}
return null;
}
}, requestUrl);
}
@Test
public void testDiffWithBase() throws Exception {
final String base = "2";
String requestUrl = getBaseRequestUrl() + "/diff?base=" + base;
testDiff(new Function<FileApiRestClient, Void>() {
@Override
public Void apply(FileApiRestClient fileApiRestClient) {
try {
fileApiRestClient.diff(base);
} catch (RestApiException e) {
throw new RuntimeException(e);
}
return null;
}
}, requestUrl);
}
@Test
public void testDiffRequest() throws Exception {
final Integer context = 10;
String requestUrl = getBaseRequestUrl() + "/diff?context=" + context;
testDiff(new Function<FileApiRestClient, Void>() {
@Override
public Void apply(FileApiRestClient fileApiRestClient) {
try {
fileApiRestClient.diffRequest()
.withContext(context)
.get();
} catch (RestApiException e) {
throw new RuntimeException(e);
}
return null;
}
}, requestUrl);
final boolean intraline = true;
requestUrl += "&intraline=" + Boolean.toString(intraline);
testDiff(new Function<FileApiRestClient, Void>() {
@Override
public Void apply(FileApiRestClient fileApiRestClient) {
try {
fileApiRestClient.diffRequest()
.withContext(context)
.withIntraline(intraline)
.get();
} catch (RestApiException e) {
throw new RuntimeException(e);
}
return null;
}
}, requestUrl);
final Whitespace whitespace = Whitespace.IGNORE_ALL;
requestUrl += "&whitespace=" + whitespace.name();
testDiff(new Function<FileApiRestClient, Void>() {
@Override
public Void apply(FileApiRestClient fileApiRestClient) {
try {
fileApiRestClient.diffRequest()
.withContext(context)
.withIntraline(intraline)
.withWhitespace(whitespace)
.get();
} catch (RestApiException e) {
throw new RuntimeException(e);
}
return null;
}
}, requestUrl);
}
private void testDiff(Function<FileApiRestClient, Void> method, String expectedRequestUrl) throws Exception {
JsonElement jsonElement = EasyMock.createMock(JsonElement.class);
DiffInfo diffInfo = EasyMock.createMock(DiffInfo.class);
DiffInfoParser diffInfoParser = EasyMock.createMock(DiffInfoParser.class);
EasyMock.expect(diffInfoParser.parseDiffInfo(jsonElement)).andReturn(diffInfo).once();
EasyMock.replay(diffInfoParser);
setupServices();
GerritRestClient gerritRestClient = new GerritRestClientBuilder().expectGet(expectedRequestUrl, jsonElement).get();
FileApiRestClient fileApiRestClient = new FileApiRestClient(gerritRestClient, revisionApiRestClient, diffInfoParser, FILE_PATH);
method.apply(fileApiRestClient);
EasyMock.verify(gerritRestClient, diffInfoParser);
}
private String getBaseRequestUrl() {
String filePathEncoded = Url.encode(FILE_PATH);
return "/changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940/revisions/1/files/" + filePathEncoded;
}
public void setupServices() {
revisionApiRestClient = EasyMock.createMock(RevisionApiRestClient.class);
EasyMock.expect(revisionApiRestClient.getRequestPath())
.andReturn("/changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940/revisions/1").once();
EasyMock.replay(revisionApiRestClient);
}
}