org.eclipse.orion.server.tests.servlets.git.GitStatusTest.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.orion.server.tests.servlets.git.GitStatusTest.java

Source

/*******************************************************************************
 * Copyright (c) 2011, 2012 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.assertTrue;

import java.net.HttpURLConnection;
import java.net.URI;

import org.eclipse.core.runtime.IPath;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.MergeResult.MergeStatus;
import org.eclipse.jgit.api.PullResult;
import org.eclipse.jgit.api.RmCommand;
import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.dircache.DirCacheEntry;
import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.orion.internal.server.servlets.ProtocolConstants;
import org.eclipse.orion.server.core.ServerStatus;
import org.eclipse.orion.server.git.GitConstants;
import org.json.JSONArray;
import org.json.JSONObject;
import org.junit.Ignore;
import org.junit.Test;

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

public class GitStatusTest extends GitTest {

    @Test
    public void testStatusCleanClone() throws Exception {
        URI workspaceLocation = createWorkspace(getMethodName());
        IPath[] clonePaths = createTestProjects(workspaceLocation);

        for (IPath clonePath : clonePaths) {
            // clone a  repo
            JSONObject clone = clone(clonePath);
            String cloneContentLocation = clone.getString(ProtocolConstants.KEY_CONTENT_LOCATION);

            // get project/folder metadata
            WebRequest request = getGetRequest(cloneContentLocation);
            WebResponse response = webConversation.getResponse(request);
            assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
            JSONObject folder = new JSONObject(response.getText());

            JSONObject gitSection = folder.getJSONObject(GitConstants.KEY_GIT);
            String gitStatusUri = gitSection.getString(GitConstants.KEY_STATUS);

            assertStatus(StatusResult.CLEAN, gitStatusUri);
        }
    }

    // "status -s" > ""
    @Test
    public void testStatusCleanLink() throws Exception {
        URI workspaceLocation = createWorkspace(getMethodName());

        String projectName = getMethodName();
        JSONObject project = createProjectOrLink(workspaceLocation, projectName, gitDir.toString());

        JSONObject gitSection = project.getJSONObject(GitConstants.KEY_GIT);
        String gitStatusUri = gitSection.getString(GitConstants.KEY_STATUS);

        assertStatus(StatusResult.CLEAN, gitStatusUri);
    }

    // "status -s" > "A  new.txt", staged
    @Test
    public void testStatusAdded() throws Exception {
        URI workspaceLocation = createWorkspace(getMethodName());
        IPath[] clonePaths = createTestProjects(workspaceLocation);

        for (IPath clonePath : clonePaths) {
            // clone a  repo
            JSONObject clone = clone(clonePath);
            String cloneContentLocation = clone.getString(ProtocolConstants.KEY_CONTENT_LOCATION);

            // get project/folder metadata
            WebRequest request = getGetRequest(cloneContentLocation);
            WebResponse response = webConversation.getResponse(request);
            assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
            JSONObject folder = new JSONObject(response.getText());

            String fileName = "new.txt";
            request = getPostFilesRequest(folder.getString(ProtocolConstants.KEY_LOCATION),
                    getNewFileJSON(fileName).toString(), fileName);
            response = webConversation.getResponse(request);
            assertEquals(HttpURLConnection.HTTP_CREATED, response.getResponseCode());

            // git section for the new file
            JSONObject newFile = getChild(folder, "new.txt");

            // "git add {path}"
            addFile(newFile);

            // git section for the folder
            JSONObject gitSection = folder.getJSONObject(GitConstants.KEY_GIT);
            gitSection.getString(GitConstants.KEY_INDEX);
            String gitStatusUri = gitSection.getString(GitConstants.KEY_STATUS);

            assertStatus(new StatusResult().setAddedNames(fileName), gitStatusUri);
        }
    }

    @Test
    @Ignore("not yet implemented")
    public void testStatusAssumeUnchanged() {
        // TODO: see bug 338913
    }

    // "status -s" > "M  test.txt", staged
    @Test
    public void testStatusChanged() throws Exception {
        URI workspaceLocation = createWorkspace(getMethodName());

        String projectName = getMethodName();
        JSONObject project = createProjectOrLink(workspaceLocation, projectName, gitDir.toString());

        JSONObject testTxt = getChild(project, "test.txt");
        modifyFile(testTxt, "change");

        JSONObject gitSection = project.getJSONObject(GitConstants.KEY_GIT);
        String gitStatusUri = gitSection.getString(GitConstants.KEY_STATUS);

        addFile(testTxt);

        assertStatus(new StatusResult().setChangedNames("test.txt"), gitStatusUri);
    }

    // "status -s" > "MM test.txt", portions staged for commit
    @Test
    public void testStatusChangedAndModified() throws Exception {
        URI workspaceLocation = createWorkspace(getMethodName());

        String projectName = getMethodName();
        JSONObject project = createProjectOrLink(workspaceLocation, projectName, gitDir.toString());

        JSONObject testTxt = getChild(project, "test.txt");
        modifyFile(testTxt, "change in index");

        JSONObject gitSection = project.getJSONObject(GitConstants.KEY_GIT);
        String gitStatusUri = gitSection.getString(GitConstants.KEY_STATUS);

        addFile(testTxt);

        modifyFile(testTxt, "second change, in working tree");

        assertStatus(new StatusResult().setChangedNames("test.txt").setModifiedNames("test.txt"), gitStatusUri);
    }

    // "status -s" > " D test.txt", not staged
    @Test
    public void testStatusMissing() throws Exception {
        URI workspaceLocation = createWorkspace(getMethodName());

        String projectName = getMethodName();
        JSONObject project = createProjectOrLink(workspaceLocation, projectName, gitDir.toString());

        JSONObject testTxt = getChild(project, "test.txt");
        deleteFile(testTxt);

        JSONObject gitSection = project.getJSONObject(GitConstants.KEY_GIT);
        String gitStatusUri = gitSection.getString(GitConstants.KEY_STATUS);

        assertStatus(new StatusResult().setMissingNames("test.txt"), gitStatusUri);
    }

    // "status -s" > " M test.txt", not staged
    @Test
    public void testStatusModified() throws Exception {
        URI workspaceLocation = createWorkspace(getMethodName());

        String projectName = getMethodName();
        JSONObject project = createProjectOrLink(workspaceLocation, projectName, gitDir.toString());

        JSONObject testTxt = getChild(project, "test.txt");
        modifyFile(testTxt, "change");

        JSONObject gitSection = project.getJSONObject(GitConstants.KEY_GIT);
        String gitStatusUri = gitSection.getString(GitConstants.KEY_STATUS);

        assertStatus(new StatusResult().setModifiedNames("test.txt"), gitStatusUri);
    }

    // "status -s" > "D  test.txt", staged
    @Test
    public void testStatusRemoved() throws Exception {
        URI workspaceLocation = createWorkspace(getMethodName());

        String projectName = getMethodName();
        JSONObject project = createProjectOrLink(workspaceLocation, projectName, gitDir.toString());

        JSONObject testTxt = getChild(project, "test.txt");

        // delete the file (required until bug 349299 is fixed)
        deleteFile(testTxt);

        // stage the deletion: 'git add -u test.txt', should be 'git rm test.txt'
        addFile(testTxt);

        // check status of the project
        JSONObject gitSection = project.getJSONObject(GitConstants.KEY_GIT);
        String gitStatusUri = gitSection.getString(GitConstants.KEY_STATUS);

        assertStatus(new StatusResult().setRemovedNames("test.txt"), gitStatusUri);
    }

    // "status -s" > "?? new.txt", not staged
    @Test
    public void testStatusUntracked() throws Exception {
        URI workspaceLocation = createWorkspace(getMethodName());
        IPath[] clonePaths = createTestProjects(workspaceLocation);

        for (IPath clonePath : clonePaths) {
            // clone a  repo
            JSONObject clone = clone(clonePath);
            String cloneContentLocation = clone.getString(ProtocolConstants.KEY_CONTENT_LOCATION);

            // get project/folder metadata
            WebRequest request = getGetRequest(cloneContentLocation);
            WebResponse response = webConversation.getResponse(request);
            assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
            JSONObject folder = new JSONObject(response.getText());

            String fileName = "new.txt";
            request = getPostFilesRequest(folder.getString(ProtocolConstants.KEY_LOCATION),
                    getNewFileJSON(fileName).toString(), fileName);
            response = webConversation.getResponse(request);
            assertEquals(HttpURLConnection.HTTP_CREATED, response.getResponseCode());

            JSONObject gitSection = folder.getJSONObject(GitConstants.KEY_GIT);
            String gitStatusUri = gitSection.getString(GitConstants.KEY_STATUS);

            assertStatus(new StatusResult().setUntrackedNames(fileName), gitStatusUri);
        }
    }

    @Test
    public void testStatusWithPath() throws Exception {
        URI workspaceLocation = createWorkspace(getMethodName());

        String projectName = getMethodName();
        JSONObject project = createProjectOrLink(workspaceLocation, projectName, gitDir.toString());

        JSONObject testTxt = getChild(project, "test.txt");
        modifyFile(testTxt, "file change");

        JSONObject folder = getChild(project, "folder");
        JSONObject folderTxt = getChild(folder, "folder.txt");
        modifyFile(folderTxt, "folder change");

        JSONObject gitSection = project.getJSONObject(GitConstants.KEY_GIT);
        String gitStatusUri = gitSection.getString(GitConstants.KEY_STATUS);

        // GET /git/status/file/{proj}/
        assertStatus(new StatusResult().setModifiedNames("folder/folder.txt", "test.txt")
                .setModifiedPaths("folder/folder.txt", "test.txt"), gitStatusUri);

        // GET /git/status/file/{proj}/test.txt
        WebRequest request = getGetGitStatusRequest(gitStatusUri + "test.txt");
        WebResponse response = webConversation.getResponse(request);
        assertEquals(HttpURLConnection.HTTP_BAD_REQUEST, response.getResponseCode());

        gitSection = folder.getJSONObject(GitConstants.KEY_GIT);
        gitStatusUri = gitSection.getString(GitConstants.KEY_STATUS);

        // GET /git/status/file/{proj}/folder/
        assertStatus(new StatusResult().setModifiedNames("folder/folder.txt", "test.txt")
                .setModifiedPaths("folder.txt", "../test.txt"), gitStatusUri);
    }

    @Test
    public void testStatusLocation() throws Exception {
        URI workspaceLocation = createWorkspace(getMethodName());
        IPath[] clonePaths = createTestProjects(workspaceLocation);

        for (IPath clonePath : clonePaths) {
            // clone a  repo
            JSONObject clone = clone(clonePath);
            String cloneContentLocation = clone.getString(ProtocolConstants.KEY_CONTENT_LOCATION);

            // get project/folder metadata
            WebRequest request = getGetRequest(cloneContentLocation);
            WebResponse response = webConversation.getResponse(request);
            assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
            JSONObject folder = new JSONObject(response.getText());

            JSONObject testTxt = getChild(folder, "test.txt");
            modifyFile(testTxt, "file change");

            JSONObject folder1 = getChild(folder, "folder");
            JSONObject folderTxt = getChild(folder1, "folder.txt");
            modifyFile(folderTxt, "folder change");

            // git section for the folder
            JSONObject gitSection = folder.getJSONObject(GitConstants.KEY_GIT);
            String gitStatusUri = gitSection.getString(GitConstants.KEY_STATUS);

            JSONObject statusResponse = assertStatus(
                    new StatusResult().setModifiedNames("folder/folder.txt", "test.txt")
                            .setModifiedContents("folder change", "file change"),
                    gitStatusUri);

            String stageAll = statusResponse.getString(GitConstants.KEY_INDEX);
            String commitAll = statusResponse.getString(GitConstants.KEY_COMMIT);

            request = GitAddTest.getPutGitIndexRequest(stageAll);
            response = webConversation.getResponse(request);
            assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());

            assertStatus(new StatusResult().setChangedNames("folder/folder.txt", "test.txt")
                    .setChangedContents("folder change", "file change"), gitStatusUri);

            request = GitCommitTest.getPostGitCommitRequest(commitAll, "committing all changes", false);
            response = webConversation.getResponse(request);
            assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());

            assertStatus(StatusResult.CLEAN, gitStatusUri);
        }
    }

    @Test
    public void testStatusDiff() throws Exception {
        URI workspaceLocation = createWorkspace(getMethodName());
        IPath[] clonePaths = createTestProjects(workspaceLocation);

        for (IPath clonePath : clonePaths) {
            // clone a  repo
            JSONObject clone = clone(clonePath);
            String cloneContentLocation = clone.getString(ProtocolConstants.KEY_CONTENT_LOCATION);

            // get project/folder metadata
            WebRequest request = getGetRequest(cloneContentLocation);
            WebResponse response = webConversation.getResponse(request);
            assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
            JSONObject folder = new JSONObject(response.getText());

            JSONObject testTxt = getChild(folder, "test.txt");
            modifyFile(testTxt, "in index");
            addFile(testTxt);

            modifyFile(testTxt, "in working tree");

            // git section for the folder
            JSONObject gitSection = folder.getJSONObject(GitConstants.KEY_GIT);
            String gitStatusUri = gitSection.getString(GitConstants.KEY_STATUS);

            StringBuilder changedDiff = new StringBuilder();
            changedDiff.append("diff --git a/test.txt b/test.txt").append("\n");
            changedDiff.append("index 30d74d2..0123892 100644").append("\n");
            changedDiff.append("--- a/test.txt").append("\n");
            changedDiff.append("+++ b/test.txt").append("\n");
            changedDiff.append("@@ -1 +1 @@").append("\n");
            changedDiff.append("-test").append("\n");
            changedDiff.append("\\ No newline at end of file").append("\n");
            changedDiff.append("+in index").append("\n");
            changedDiff.append("\\ No newline at end of file").append("\n");

            StringBuilder modifiedDiff = new StringBuilder();
            modifiedDiff.append("diff --git a/test.txt b/test.txt").append("\n");
            modifiedDiff.append("index 0123892..791a2b7 100644").append("\n");
            modifiedDiff.append("--- a/test.txt").append("\n");
            modifiedDiff.append("+++ b/test.txt").append("\n");
            modifiedDiff.append("@@ -1 +1 @@").append("\n");
            modifiedDiff.append("-in index").append("\n");
            modifiedDiff.append("\\ No newline at end of file").append("\n");
            modifiedDiff.append("+in working tree").append("\n");
            modifiedDiff.append("\\ No newline at end of file").append("\n");

            assertStatus(new StatusResult().setChangedNames("test.txt").setChangedDiffs(changedDiff.toString())
                    .setModifiedNames("test.txt").setModifiedDiffs(modifiedDiff.toString()), gitStatusUri);
        }
    }

    @Test
    public void testStatusSubfolderDiff() throws Exception {
        URI workspaceLocation = createWorkspace(getMethodName());
        IPath[] clonePaths = createTestProjects(workspaceLocation);

        for (IPath clonePath : clonePaths) {
            // clone a  repo
            JSONObject clone = clone(clonePath);
            String cloneContentLocation = clone.getString(ProtocolConstants.KEY_CONTENT_LOCATION);

            // get project/folder metadata
            WebRequest request = getGetRequest(cloneContentLocation);
            WebResponse response = webConversation.getResponse(request);
            assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
            JSONObject folder = new JSONObject(response.getText());

            // modify file
            JSONObject testTxt = getChild(folder, "test.txt");
            modifyFile(testTxt, "hello");

            // git section for the subfolder
            JSONObject subfolder = getChild(folder, "folder");
            JSONObject gitSection = subfolder.getJSONObject(GitConstants.KEY_GIT);
            String gitStatusUri = gitSection.getString(GitConstants.KEY_STATUS);

            StringBuilder sb = new StringBuilder();
            sb.append("diff --git a/test.txt b/test.txt").append("\n");
            sb.append("index 30d74d2..b6fc4c6 100644").append("\n");
            sb.append("--- a/test.txt").append("\n");
            sb.append("+++ b/test.txt").append("\n");
            sb.append("@@ -1 +1 @@").append("\n");
            sb.append("-test").append("\n");
            sb.append("\\ No newline at end of file").append("\n");
            sb.append("+hello").append("\n");
            sb.append("\\ No newline at end of file").append("\n");

            assertStatus(new StatusResult().setModifiedNames("test.txt").setModifiedDiffs(sb.toString())
                    .setModifiedPaths("../test.txt"), gitStatusUri);
        }
    }

    @Test
    public void testStatusCommit() throws Exception {
        URI workspaceLocation = createWorkspace(getMethodName());
        IPath[] clonePaths = createTestProjects(workspaceLocation);

        for (IPath clonePath : clonePaths) {
            // clone a  repo
            JSONObject clone = clone(clonePath);
            String cloneContentLocation = clone.getString(ProtocolConstants.KEY_CONTENT_LOCATION);

            // get project/folder metadata
            WebRequest request = getGetRequest(cloneContentLocation);
            WebResponse response = webConversation.getResponse(request);
            assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
            JSONObject folder = new JSONObject(response.getText());

            JSONObject testTxt = getChild(folder, "test.txt");
            modifyFile(testTxt, "index");

            addFile(testTxt);

            modifyFile(testTxt, "working tree");

            // git section for the folder
            JSONObject gitSection = folder.getJSONObject(GitConstants.KEY_GIT);
            String gitStatusUri = gitSection.getString(GitConstants.KEY_STATUS);
            String gitHeadUri = gitSection.getString(GitConstants.KEY_HEAD);

            assertStatus(new StatusResult().setChangedNames("test.txt").setChangedIndexContents("index")
                    .setChangedHeadContents("test").setModifiedNames("test.txt")
                    .setModifiedContents("working tree"), gitStatusUri);

            request = GitCommitTest.getPostGitCommitRequest(gitHeadUri, "committing all changes", false);
            response = webConversation.getResponse(request);
            assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());

            assertStatus(new StatusResult().setModifiedNames("test.txt").setModifiedContents("working tree"),
                    gitStatusUri);
        }
    }

    // "status -s" > "UU test.txt", both modified
    @Test
    public void testConflict() throws Exception {
        URI workspaceLocation = createWorkspace(getMethodName());
        String workspaceId = workspaceIdFromLocation(workspaceLocation);

        // clone1: create
        JSONObject project1 = createProjectOrLink(workspaceLocation, getMethodName() + "1", null);
        IPath clonePath1 = getClonePath(workspaceId, project1);
        String contentLocation1 = clone(clonePath1).getString(ProtocolConstants.KEY_CONTENT_LOCATION);

        // get project metadata
        WebRequest request = getGetRequest(project1.getString(ProtocolConstants.KEY_CONTENT_LOCATION));
        WebResponse response = webConversation.getResponse(request);
        assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
        project1 = new JSONObject(response.getText());
        JSONObject gitSection1 = project1.getJSONObject(GitConstants.KEY_GIT);
        String gitHeadUri1 = gitSection1.getString(GitConstants.KEY_HEAD);
        String gitRemoteUri1 = gitSection1.getString(GitConstants.KEY_REMOTE);

        // clone2: create
        JSONObject project2 = createProjectOrLink(workspaceLocation, getMethodName() + "2", null);
        IPath clonePath2 = getClonePath(workspaceId, project2);
        String contentLocation2 = clone(clonePath2).getString(ProtocolConstants.KEY_CONTENT_LOCATION);

        // overwrite user settings, do not rebase when pulling, see bug 372489
        StoredConfig cfg = getRepositoryForContentLocation(contentLocation2).getConfig();
        cfg.setBoolean(ConfigConstants.CONFIG_BRANCH_SECTION, Constants.MASTER, ConfigConstants.CONFIG_KEY_REBASE,
                false);
        cfg.save();

        // get project metadata
        request = getGetRequest(project2.getString(ProtocolConstants.KEY_CONTENT_LOCATION));
        response = webConversation.getResponse(request);
        assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
        project2 = new JSONObject(response.getText());
        JSONObject gitSection2 = project2.getJSONObject(GitConstants.KEY_GIT);
        String gitHeadUri2 = gitSection2.getString(GitConstants.KEY_HEAD);
        String gitStatusUri2 = gitSection2.getString(GitConstants.KEY_STATUS);

        // clone1: change
        JSONObject testTxt1 = getChild(project1, "test.txt");
        modifyFile(testTxt1, "change from clone1");

        // clone1: add
        addFile(testTxt1);

        // clone1: commit
        request = GitCommitTest.getPostGitCommitRequest(gitHeadUri1, "change from clone1", false);
        response = webConversation.getResponse(request);
        assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());

        // clone1: push
        ServerStatus pushStatus = push(gitRemoteUri1, 1, 0, Constants.MASTER, Constants.HEAD, false);
        assertEquals(true, pushStatus.isOK());

        // this is how EGit checks for conflicts
        Repository db1 = getRepositoryForContentLocation(contentLocation1);
        Git git = new Git(db1);
        DirCache cache = db1.readDirCache();
        DirCacheEntry entry = cache.getEntry("test.txt");
        assertTrue(entry.getStage() == 0);

        // clone2: change
        JSONObject testTxt2 = getChild(project2, "test.txt");
        modifyFile(testTxt2, "change from clone2");

        // clone2: add
        addFile(testTxt2);

        // clone2: commit
        request = GitCommitTest.getPostGitCommitRequest(gitHeadUri2, "change from clone2", false);
        response = webConversation.getResponse(request);
        assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());

        // clone2: pull
        // TODO: replace with REST API for git pull once bug 339114 is fixed
        Repository db2 = getRepositoryForContentLocation(contentLocation2);
        git = new Git(db2);
        PullResult pullResult = git.pull().call();
        assertEquals(pullResult.getMergeResult().getMergeStatus(), MergeStatus.CONFLICTING);

        // this is how EGit checks for conflicts
        cache = db2.readDirCache();
        entry = cache.getEntry("test.txt");
        assertTrue(entry.getStage() > 0);

        assertStatus(new StatusResult().setConflictingNames("test.txt"), gitStatusUri2);
    }

    @Test
    public void testFileLogFromStatus() throws Exception {
        URI workspaceLocation = createWorkspace(getMethodName());
        IPath[] clonePaths = createTestProjects(workspaceLocation);

        for (IPath clonePath : clonePaths) {
            // clone a  repo
            JSONObject clone = clone(clonePath);
            String cloneContentLocation = clone.getString(ProtocolConstants.KEY_CONTENT_LOCATION);

            // get project/folder metadata
            WebRequest request = getGetRequest(cloneContentLocation);
            WebResponse response = webConversation.getResponse(request);
            assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
            JSONObject folder = new JSONObject(response.getText());

            // add new files to the local repository so they can be deleted and removed in the test later on
            // missing
            String missingFileName = "missing.txt";
            request = getPutFileRequest(folder.getString(ProtocolConstants.KEY_LOCATION) + missingFileName,
                    "you'll miss me");
            response = webConversation.getResponse(request);
            assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());

            JSONObject missingTxt = getChild(folder, missingFileName);
            addFile(missingTxt);

            String removedFileName = "removed.txt";
            request = getPutFileRequest(folder.getString(ProtocolConstants.KEY_LOCATION) + removedFileName,
                    "I'll be removed");
            response = webConversation.getResponse(request);
            assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());

            JSONObject removedTxt = getChild(folder, removedFileName);
            addFile(removedTxt);

            // git section for the folder
            JSONObject gitSection = folder.getJSONObject(GitConstants.KEY_GIT);
            String gitHeadUri = gitSection.getString(GitConstants.KEY_HEAD);

            request = GitCommitTest.getPostGitCommitRequest(gitHeadUri, "committing all changes", false);
            response = webConversation.getResponse(request);
            assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());

            // make the file missing
            deleteFile(missingTxt);

            // remove the file
            Repository repository = getRepositoryForContentLocation(cloneContentLocation);
            Git git = new Git(repository);
            RmCommand rm = git.rm();
            rm.addFilepattern(removedFileName);
            rm.call();

            // untracked file
            String untrackedFileName = "untracked.txt";
            request = getPostFilesRequest(folder.getString(ProtocolConstants.KEY_LOCATION),
                    getNewFileJSON(untrackedFileName).toString(), untrackedFileName);
            response = webConversation.getResponse(request);
            assertEquals(HttpURLConnection.HTTP_CREATED, response.getResponseCode());

            // added file
            String addedFileName = "added.txt";
            request = getPostFilesRequest(folder.getString(ProtocolConstants.KEY_LOCATION),
                    getNewFileJSON(addedFileName).toString(), addedFileName);
            response = webConversation.getResponse(request);
            assertEquals(HttpURLConnection.HTTP_CREATED, response.getResponseCode());

            JSONObject addedTxt = getChild(folder, addedFileName);
            addFile(addedTxt);

            // changed file
            JSONObject testTxt = getChild(folder, "test.txt");
            modifyFile(testTxt, "change");
            addFile(testTxt);

            // modified file
            modifyFile(testTxt, "second change, in working tree");

            // get status
            assertStatus(
                    new StatusResult().setAddedNames(addedFileName).setAddedLogLengths(0)
                            .setChangedNames("test.txt").setChangedLogLengths(1).setMissingNames(missingFileName)
                            .setMissingLogLengths(1).setModifiedNames("test.txt").setModifiedLogLengths(1)
                            .setRemovedNames(removedFileName).setRemovedLogLengths(1)
                            .setUntrackedNames(untrackedFileName).setUntrackedLogLengths(0),
                    folder.getJSONObject(GitConstants.KEY_GIT).getString(GitConstants.KEY_STATUS));
        }
    }

    @Test
    public void testCloneAndBranchNameFromStatus() throws Exception {
        URI workspaceLocation = createWorkspace(getMethodName());
        IPath[] clonePaths = createTestProjects(workspaceLocation);

        for (IPath clonePath : clonePaths) {
            // clone a  repo
            JSONObject clone = clone(clonePath);
            String cloneContentLocation = clone.getString(ProtocolConstants.KEY_CONTENT_LOCATION);

            // get project/folder metadata
            WebRequest request = getGetRequest(cloneContentLocation);
            WebResponse response = webConversation.getResponse(request);
            assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
            JSONObject folder = new JSONObject(response.getText());

            // get status
            request = getGetGitStatusRequest(
                    folder.getJSONObject(GitConstants.KEY_GIT).getString(GitConstants.KEY_STATUS));
            response = webConversation.getResponse(request);
            assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
            JSONObject statusResponse = new JSONObject(response.getText());
            String cloneLocation = statusResponse.getString(GitConstants.KEY_CLONE);
            assertCloneUri(cloneLocation);

            request = getGetRequest(cloneLocation);
            response = webConversation.getResponse(request);
            assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
            clone = new JSONObject(response.getText());
            JSONArray clonesArray = clone.getJSONArray(ProtocolConstants.KEY_CHILDREN);
            assertEquals(1, clonesArray.length());
            clone = clonesArray.getJSONObject(0);
            assertEquals(folder.getString(ProtocolConstants.KEY_NAME), clone.getString(ProtocolConstants.KEY_NAME));

            // get branch details
            String branchLocation = clone.getString(GitConstants.KEY_BRANCH);
            request = getGetRequest(branchLocation);
            response = webConversation.getResponse(request);
            ServerStatus status = waitForTask(response);
            assertTrue(status.toString(), status.isOK());
            JSONObject branches = status.getJsonData();
            assertEquals(Constants.MASTER,
                    GitBranchTest.getCurrentBranch(branches).getString(ProtocolConstants.KEY_NAME));
        }
    }
}