Package org.eclipse.orion.server.tests.servlets.git

Source Code of org.eclipse.orion.server.tests.servlets.git.GitUtilsTest

/*******************************************************************************
* 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.assertFalse;
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.net.URI;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jgit.api.InitCommand;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.orion.internal.server.core.metastore.SimpleMetaStore;
import org.eclipse.orion.server.core.ProtocolConstants;
import org.eclipse.orion.server.git.servlets.GitUtils;
import org.eclipse.orion.server.git.servlets.GitUtils.Traverse;
import org.json.JSONObject;
import org.junit.Ignore;
import org.junit.Test;

import com.meterware.httpunit.WebRequest;
import com.meterware.httpunit.WebResponse;

public class GitUtilsTest extends GitTest {
  @Test
  public void testGitDirPathNoGit() throws Exception {
    createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME);
    JSONObject project = createProjectOrLink(workspaceLocation, getMethodName().concat("Project"), null);
    String location = project.getString(ProtocolConstants.KEY_CONTENT_LOCATION);
    URI uri = URI.create(location);
    File dir = GitUtils.getGitDir(new Path(uri.getPath()));
    assertNull(dir == null ? "N/A" : dir.toURI().toURL().toString(), dir);
  }

  @Test
  public void testGitDirPathLinked() throws Exception {
    createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME);
    JSONObject project = createProjectOrLink(workspaceLocation, getMethodName().concat("Project"), gitDir.toURI().toString());
    String location = project.getString(ProtocolConstants.KEY_CONTENT_LOCATION);
    URI uri = URI.create(toRelativeURI(location));
    File gitDirFile = GitUtils.getGitDir(new Path(uri.getPath()));
    assertNotNull(gitDirFile);
    assertEquals(gitDir, gitDirFile.getParentFile());
  }

  @Test
  public void testGitDirPathLinkedToSubfolder() throws Exception {
    createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME);
    JSONObject project = createProjectOrLink(workspaceLocation, getMethodName().concat("Project"), new File(gitDir, "folder").toURI().toString());
    String location = project.getString(ProtocolConstants.KEY_CONTENT_LOCATION);
    URI uri = URI.create(toRelativeURI(location));
    Set<Entry<IPath, File>> set = GitUtils.getGitDirs(new Path(uri.getPath()), Traverse.GO_UP).entrySet();
    assertEquals(1, set.size());
    Entry<IPath, File> entry = set.iterator().next();
    File gitDirFile = entry.getValue();
    assertNotNull(gitDirFile);
    assertEquals(gitDir, gitDirFile.getParentFile());
    IPath path = entry.getKey();
    assertEquals(new Path("../"), path);
  }

  @Test
  public void testGitDirEmptyPath() throws Exception {
    File emptyPathFile = GitUtils.getGitDir(new Path(""));
    assertNull(emptyPathFile == null ? "N/A" : emptyPathFile.toURI().toURL().toString(), emptyPathFile);
  }

  private boolean deleteDir(File dir) {
    if (dir.isDirectory()) {
      String[] children = dir.list();
      for (int i = 0; i < children.length; i++) {
        boolean success = deleteDir(new File(dir, children[i]));
        if (!success) {
          return false;
        }
      }
    }

    // The directory is now empty so delete it
    return dir.delete();
  }

  @Test
  public void testGetGitDirWorkspaceIsInRepo() throws Exception {
    InitCommand command = new InitCommand();
    File workspace = getWorkspaceRoot();
    File parent = workspace.getParentFile();
    command.setDirectory(parent);
    Repository repository = command.call().getRepository();
    assertNotNull(repository);

    createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME);
    JSONObject project = createProjectOrLink(workspaceLocation, getMethodName().concat("Project"), null);
    String location = project.getString(ProtocolConstants.KEY_CONTENT_LOCATION);
    URI uri = URI.create(location);
    File dir = GitUtils.getGitDir(new Path(uri.getPath()));
    assertNull(dir == null ? "N/A" : dir.toURI().toURL().toString(), dir);

    File[] parentChildren = parent.listFiles();
    for (int i = 0; i < parentChildren.length; i++) {
      if (parentChildren[i].getName().equals(".git")) {
        assertTrue(deleteDir(parentChildren[i]));
      }
    }
  }

  @Test
  public void testGitDirsNoGit() throws Exception {
    createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME);
    JSONObject project = createProjectOrLink(workspaceLocation, getMethodName().concat("Project"), null);
    String location = project.getString(ProtocolConstants.KEY_CONTENT_LOCATION);
    URI uri = URI.create(toRelativeURI(location));
    IPath projectPath = new Path(uri.getPath());
    Map<IPath, File> gitDirs = GitUtils.getGitDirs(projectPath, Traverse.GO_DOWN);
    assertTrue(gitDirs.isEmpty());
  }

  @Test
  public void testGitDirPathLinkedRemovedFile() throws Exception {
    createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME);
    JSONObject project = createProjectOrLink(workspaceLocation, getMethodName().concat("Project"), gitDir.toURI().toString());
    String location = project.getString(ProtocolConstants.KEY_CONTENT_LOCATION);

    // drill down to folder/folder.txt and delete it
    WebRequest request = getGetRequest(location);
    WebResponse response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
    JSONObject jsonResponse = new JSONObject(response.getText());
    request = getGetRequest(jsonResponse.getString(ProtocolConstants.KEY_CHILDREN_LOCATION));
    response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
    List<JSONObject> children = getDirectoryChildren(new JSONObject(response.getText()));
    JSONObject testTxt = getChildByName(children, "folder");
    String folderLocation = testTxt.getString(ProtocolConstants.KEY_LOCATION);
    request = getGetRequest(folderLocation);
    response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
    jsonResponse = new JSONObject(response.getText());
    request = getGetRequest(jsonResponse.getString(ProtocolConstants.KEY_CHILDREN_LOCATION));
    response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
    children = getDirectoryChildren(new JSONObject(response.getText()));
    JSONObject folderTxt = getChildByName(children, "folder.txt");
    String folderTxtLocation = folderTxt.getString(ProtocolConstants.KEY_LOCATION);
    request = getDeleteFilesRequest(folderTxtLocation);
    response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());

    // then try to get git directory for the removed file
    URI uri = URI.create(toRelativeURI(folderTxtLocation));
    File gitDirFile = GitUtils.getGitDir(new Path(uri.getPath()));
    assertNotNull(gitDirFile);
    assertEquals(gitDir, gitDirFile.getParentFile());
  }

  @Test
  @Ignore(/*TODO*/"not yet implemented")
  public void testGitDirsLinked() throws Exception {
    createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME);
    JSONObject project = createProjectOrLink(workspaceLocation, getMethodName().concat("Project"), gitDir.toURI().toString());
    String location = project.getString(ProtocolConstants.KEY_CONTENT_LOCATION);
    URI uri = URI.create(location);
    IPath projectPath = new Path(uri.getPath());
    Map<IPath, File> gitDirs = GitUtils.getGitDirs(projectPath, Traverse.GO_DOWN);
    assertFalse(gitDirs.isEmpty());
  }

  @Test
  public void testGitDirsCloned() throws Exception {
    createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME);
    String workspaceId = workspaceIdFromLocation(workspaceLocation);
    JSONObject project = createProjectOrLink(workspaceLocation, getMethodName().concat("Project"), null);
    IPath clonePath = getClonePath(workspaceId, project);
    clone(clonePath);
    String location = project.getString(ProtocolConstants.KEY_CONTENT_LOCATION);
    URI uri = URI.create(toRelativeURI(location));
    IPath projectPath = new Path(uri.getPath());
    Map<IPath, File> gitDirs = GitUtils.getGitDirs(projectPath, Traverse.GO_DOWN);
    assertFalse(gitDirs.isEmpty());
  }

  @Test
  public void testGitDirsClonedIntoSubfolder() throws Exception {
    createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME);
    String workspaceId = workspaceIdFromLocation(workspaceLocation);
    JSONObject project = createProjectOrLink(workspaceLocation, getMethodName().concat("Project"), null);

    // create folder1
    String folderName = "clone1";
    WebRequest request = getPostFilesRequest("", getNewDirJSON(folderName).toString(), folderName);
    WebResponse response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_CREATED, response.getResponseCode());
    JSONObject cloneFolder1 = new JSONObject(response.getText());
    IPath clonePath = getClonePath(workspaceId, project).append(folderName).makeAbsolute();
    clone(clonePath);

    // create folder2
    folderName = "clone2";
    request = getPostFilesRequest("", getNewDirJSON(folderName).toString(), folderName);
    response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_CREATED, response.getResponseCode());
    JSONObject cloneFolder2 = new JSONObject(response.getText());
    clonePath = getClonePath(workspaceId, project).append(folderName).makeAbsolute();
    clone(clonePath);

    String cloneLocation = cloneFolder1.getString(ProtocolConstants.KEY_LOCATION);
    URI subfolderUri = URI.create(toRelativeURI(cloneLocation));
    IPath subfolderPath = new Path(subfolderUri.getPath());
    Map<IPath, File> gitDirs = GitUtils.getGitDirs(subfolderPath, Traverse.GO_DOWN);
    assertFalse(gitDirs.isEmpty());
    gitDirs.clear();

    cloneLocation = cloneFolder2.getString(ProtocolConstants.KEY_LOCATION);
    subfolderUri = URI.create(toRelativeURI(cloneLocation));
    subfolderPath = new Path(subfolderUri.getPath());
    gitDirs = GitUtils.getGitDirs(subfolderPath, Traverse.GO_DOWN);
    assertFalse(gitDirs.isEmpty());
    gitDirs.clear();

    String projectLocation = project.getString(ProtocolConstants.KEY_CONTENT_LOCATION);
    URI projectUri = URI.create(toRelativeURI(projectLocation));
    IPath projectPath = new Path(projectUri.getPath());
    gitDirs = GitUtils.getGitDirs(projectPath, Traverse.GO_DOWN);
    assertFalse(gitDirs.isEmpty());
    assertEquals(2, gitDirs.size());
  }

  @Test
  public void testGetRelativePath() throws Exception {
    assertEquals(Path.EMPTY.toString(), GitUtils.getRelativePath(new Path("/file/a/"), Path.EMPTY));
    assertEquals(Path.EMPTY.toString(), GitUtils.getRelativePath(new Path("/file/a/b/"), Path.EMPTY));
    assertEquals("b/", GitUtils.getRelativePath(new Path("/file/a/b/"), new Path("../")));
    assertEquals("b/c/", GitUtils.getRelativePath(new Path("/file/a/b/c/"), new Path("../../")));
    assertEquals("c/", GitUtils.getRelativePath(new Path("/file/a/b/c/"), new Path("../")));
    assertEquals("b/c", GitUtils.getRelativePath(new Path("/file/a/b/c"), new Path("../")));
  }
}
TOP

Related Classes of org.eclipse.orion.server.tests.servlets.git.GitUtilsTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.