/*******************************************************************************
* Copyright (c) 2010-2014 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.skalli.core.rest;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.io.IOException;
import java.text.MessageFormat;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.util.EntityUtils;
import org.eclipse.skalli.commons.URLUtils;
import org.eclipse.skalli.commons.XMLUtils;
import org.eclipse.skalli.services.destination.Destinations;
import org.eclipse.skalli.testutil.XMLDiffUtil;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
@SuppressWarnings("nls")
public class CompareAPIVersionsTest {
private static final String SKALLI_ITEST_HOST = StringUtils.removeEnd(System.getProperty("skalli.itest.host"), "/");
@Test
public void testCompareAllProjects() throws Exception {
if (SKALLI_ITEST_HOST != null) {
HttpClient client = Destinations.getClient(URLUtils.asURL(SKALLI_ITEST_HOST));
int start = 0;
int count = 10;
while (count > 0) {
HttpGet reqV1 = new HttpGet(getAllProjectSliceRestPath("v1", start, count));
HttpResponse respV1 = client.execute(reqV1);
assertEquals(200, respV1.getStatusLine().getStatusCode());
HttpGet reqV2 = new HttpGet(getAllProjectSliceRestPath("v2", start, count));
HttpResponse respV2 = client.execute(reqV2);
assertEquals(200, respV2.getStatusLine().getStatusCode());
Document expected = XMLUtils.documentFromString(getContent(respV1));
Document actual = XMLUtils.documentFromString(getContent(respV2));
ProjectsV1V2Diff projectsDiff = new ProjectsV1V2Diff(SKALLI_ITEST_HOST);
XMLDiffUtil.assertEquals(expected, actual, projectsDiff);
NodeList projectNodes = expected.getDocumentElement().getElementsByTagName("project");
count = NumberUtils.toInt(expected.getDocumentElement().getAttribute("count"), 0);
assertEquals(count, projectNodes.getLength());
assertProjectDetails(client,projectNodes);
start += count;
}
}
}
private void assertProjectDetails(HttpClient client, NodeList projectNodes) throws Exception {
for (int i = 0; i < projectNodes.getLength(); ++i) {
Element projectNode = (Element)projectNodes.item(i);
boolean hasLinkNode = false;
NodeList linkNodes = projectNode.getElementsByTagName("link");
for (int j = 0; j < linkNodes.getLength(); ++j) {
Element linkNode = (Element)linkNodes.item(j);
if ("project".equals(linkNode.getAttribute("rel"))) {
hasLinkNode = true;
String href = linkNode.getAttribute("href");
HttpGet reqV1 = new HttpGet(href + "?rest=v1");
HttpResponse respV1 = client.execute(reqV1);
assertEquals(200, respV1.getStatusLine().getStatusCode());
HttpGet reqV2 = new HttpGet(href + "?rest=v2");
HttpResponse respV2 = client.execute(reqV2);
assertEquals(200, respV2.getStatusLine().getStatusCode());
Document expected = XMLUtils.documentFromString(getContent(respV1));
Document actual = XMLUtils.documentFromString(getContent(respV2));
ProjectDetailsV1V2Diff projectDetailsDiff = new ProjectDetailsV1V2Diff(SKALLI_ITEST_HOST);
XMLDiffUtil.assertEquals(expected, actual, projectDetailsDiff);
}
}
if (!hasLinkNode) {
fail("project has no detail link");
}
}
}
private String getAllProjectSliceRestPath(String apiVersion, int start, int count) {
return URLUtils.concat(SKALLI_ITEST_HOST, MessageFormat.format(
"/api/projects?orderBy=uuid&rest={0}&start={1}&count={2}",
apiVersion, Integer.toString(start), Integer.toString(count)));
}
private String getContent(HttpResponse resp) throws IOException {
HttpEntity responseEntity = resp.getEntity();
if (responseEntity != null) {
byte[] bytes = EntityUtils.toByteArray(responseEntity);
return new String(bytes, "UTF-8");
}
return null;
}
}