/*******************************************************************************
* Copyright (c) 2011, 2014 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.orion.server.tests.servlets.git;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.net.HttpURLConnection;
import java.util.List;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.util.FileUtils;
import org.eclipse.orion.internal.server.core.metastore.SimpleMetaStore;
import org.eclipse.orion.internal.server.servlets.workspace.ServletTestingSupport;
import org.eclipse.orion.server.core.ProtocolConstants;
import org.eclipse.orion.server.git.GitConstants;
import org.json.JSONObject;
import org.junit.Test;
import com.meterware.httpunit.WebRequest;
import com.meterware.httpunit.WebResponse;
public class GitUriTest extends GitTest {
@Test
public void testGitUrisAfterLinkingToExistingClone() throws Exception {
createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME);
String projectName = getMethodName().concat("Project");
JSONObject project = createProjectOrLink(workspaceLocation, projectName, gitDir.toString());
assertGitSectionExists(project);
// TODO: it's a linked repo, see bug 346114
// assertCloneUri(gitSection.optString(GitConstants.KEY_CLONE, null));
}
@Test
public void testGitUrisInContentLocation() throws Exception {
createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME);
String projectName = getMethodName().concat("Project");
// http://<host>/workspace/<workspaceId>/
JSONObject newProject = createProjectOrLink(workspaceLocation, projectName, gitDir.toString());
String contentLocation = newProject.optString(ProtocolConstants.KEY_CONTENT_LOCATION, null);
assertNotNull(contentLocation);
// http://<host>/file/<projectId>/
WebRequest request = getGetRequest(contentLocation);
WebResponse response = webConversation.getResponse(request);
assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
JSONObject project = new JSONObject(response.getText());
assertGitSectionExists(project);
// TODO: it's a linked repo, see bug 346114
// assertCloneUri(gitSection.optString(GitConstants.KEY_CLONE, null));
String childrenLocation = project.getString(ProtocolConstants.KEY_CHILDREN_LOCATION);
assertNotNull(childrenLocation);
// http://<host>/file/<projectId>/?depth=1
request = getGetRequest(childrenLocation);
response = webConversation.getResponse(request);
assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
List<JSONObject> children = getDirectoryChildren(new JSONObject(response.getText()));
String[] expectedChildren = new String[] {Constants.DOT_GIT, "folder", "test.txt"};
assertEquals("Wrong number of directory children", expectedChildren.length, children.size());
for (JSONObject child : children) {
assertGitSectionExists(child);
// TODO: it's a linked repo, see bug 346114
// assertCloneUri(gitSection.optString(GitConstants.KEY_CLONE, null));
}
childrenLocation = getChildByName(children, "folder").getString(ProtocolConstants.KEY_CHILDREN_LOCATION);
// http://<host>/file/<projectId>/folder/?depth=1
request = getGetRequest(childrenLocation);
response = webConversation.getResponse(request);
assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
children = getDirectoryChildren(new JSONObject(response.getText()));
expectedChildren = new String[] {"folder.txt"};
assertEquals("Wrong number of directory children", expectedChildren.length, children.size());
for (JSONObject child : children) {
assertGitSectionExists(child);
// TODO: it's a linked repo, see bug 346114
// assertCloneUri(gitSection.optString(GitConstants.KEY_CLONE, null));
}
}
@Test
public void testGitUrisForEmptyDir() throws Exception {
createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME);
File emptyDir = createTempDir().toFile();
emptyDir.mkdir();
ServletTestingSupport.allowedPrefixes = emptyDir.toString();
JSONObject project = createProjectOrLink(workspaceLocation, getMethodName().concat("Project"), emptyDir.toString());
project.getString(ProtocolConstants.KEY_ID);
String location = project.getString(ProtocolConstants.KEY_CONTENT_LOCATION);
WebRequest request = getGetRequest(location);
WebResponse response = webConversation.getResponse(request);
assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
JSONObject files = new JSONObject(response.getText());
// FIXME: these assertions do nothing useful
assertNull(files.optString(GitConstants.KEY_STATUS, null));
assertNull(files.optString(GitConstants.KEY_DIFF, null));
assertNull(files.optString(GitConstants.KEY_DIFF, null));
assertNull(files.optString(GitConstants.KEY_COMMIT, null));
assertNull(files.optString(GitConstants.KEY_REMOTE, null));
assertNull(files.optString(GitConstants.KEY_TAG, null));
assertNull(files.optString(GitConstants.KEY_CLONE, null));
assertTrue(emptyDir.delete());
}
@Test
public void testGitUrisForFile() throws Exception {
createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME);
File dir = createTempDir().toFile();
dir.mkdir();
File file = new File(dir, "test.txt");
file.createNewFile();
ServletTestingSupport.allowedPrefixes = dir.toString();
String projectName = getMethodName().concat("Project");
JSONObject project = createProjectOrLink(workspaceLocation, projectName, dir.toString());
String location = project.getString(ProtocolConstants.KEY_CONTENT_LOCATION);
WebRequest request = getGetRequest(location);
WebResponse response = webConversation.getResponse(request);
assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
JSONObject files = new JSONObject(response.getText());
assertNull(files.optString(GitConstants.KEY_STATUS, null));
assertNull(files.optString(GitConstants.KEY_DIFF, null));
assertNull(files.optString(GitConstants.KEY_DIFF, null));
assertNull(files.optString(GitConstants.KEY_COMMIT, null));
assertNull(files.optString(GitConstants.KEY_REMOTE, null));
assertNull(files.optString(GitConstants.KEY_TAG, null));
assertNull(files.optString(GitConstants.KEY_CLONE, null));
FileUtils.delete(dir, FileUtils.RECURSIVE);
}
@Test
public void testGitUrisForRepositoryClonedIntoSubfolder() throws Exception {
createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME);
String workspaceId = workspaceIdFromLocation(workspaceLocation);
JSONObject project = createProjectOrLink(workspaceLocation, getMethodName().concat("Project"), null);
String folderName = "subfolder";
WebRequest request = getPostFilesRequest("", getNewDirJSON(folderName).toString(), folderName);
WebResponse response = webConversation.getResponse(request);
assertEquals(HttpURLConnection.HTTP_CREATED, response.getResponseCode());
IPath clonePath = getClonePath(workspaceId, project).append(folderName).makeAbsolute();
clone(clonePath);
String location = project.getString(ProtocolConstants.KEY_CONTENT_LOCATION);
request = getGetRequest(location);
response = webConversation.getResponse(request);
assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
JSONObject responseJSON = new JSONObject(response.getText());
// no Git section for /file/{projectId}
assertNull(responseJSON.optString(GitConstants.KEY_STATUS, null));
assertNull(responseJSON.optString(GitConstants.KEY_DIFF, null));
assertNull(responseJSON.optString(GitConstants.KEY_DIFF, null));
assertNull(responseJSON.optString(GitConstants.KEY_COMMIT, null));
assertNull(responseJSON.optString(GitConstants.KEY_REMOTE, null));
assertNull(responseJSON.optString(GitConstants.KEY_TAG, null));
assertNull(responseJSON.optString(GitConstants.KEY_CLONE, null));
request = getGetRequest(responseJSON.getString(ProtocolConstants.KEY_CHILDREN_LOCATION));
response = webConversation.getResponse(request);
assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
List<JSONObject> children = getDirectoryChildren(new JSONObject(response.getText()));
assertEquals(1, children.size());
// expected Git section for /file/{projectId}/?depth=1
assertGitSectionExists(children.get(0));
JSONObject gitSection = children.get(0).getJSONObject(GitConstants.KEY_GIT);
assertCloneUri(gitSection.optString(GitConstants.KEY_CLONE, null));
location = children.get(0).getString(ProtocolConstants.KEY_LOCATION);
request = getGetRequest(location);
response = webConversation.getResponse(request);
assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
responseJSON = new JSONObject(response.getText());
// expected Git section for /file/{projectId}/subfolder
assertGitSectionExists(responseJSON);
gitSection = responseJSON.getJSONObject(GitConstants.KEY_GIT);
assertCloneUri(gitSection.optString(GitConstants.KEY_CLONE, null));
}
}