/******************************************************************************* * Copyright (c) 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.assertTrue; import org.eclipse.orion.internal.server.core.metastore.SimpleMetaStore; import org.eclipse.orion.server.core.IOUtilities; import org.eclipse.orion.server.core.ProtocolConstants; import org.eclipse.orion.server.core.ServerStatus; import org.eclipse.orion.server.git.GitConstants; import org.eclipse.orion.server.tests.servlets.internal.DeleteMethodWebRequest; import org.json.JSONObject; import org.junit.Test; import com.meterware.httpunit.GetMethodWebRequest; import com.meterware.httpunit.PostMethodWebRequest; import com.meterware.httpunit.PutMethodWebRequest; import com.meterware.httpunit.WebRequest; public class GitStashTest extends GitTest { @Test public void testEmptyStashList() throws Exception { String projectName = getMethodName(); createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME); JSONObject project = createProjectOrLink(workspaceLocation, projectName, gitDir.toString()); String stashLocation = getStashLocation(project); ServerStatus status = getStashList(stashLocation); assertTrue(status.isOK()); JSONObject stash = status.getJsonData(); assertTrue(stash.has(ProtocolConstants.KEY_CHILDREN)); assertEquals(0, stash.getJSONArray(ProtocolConstants.KEY_CHILDREN).length()); } @Test public void testStashListPagination() throws Exception { String projectName = getMethodName(); createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME); JSONObject project = createProjectOrLink(workspaceLocation, projectName, gitDir.toString()); String stashLocation = getStashLocation(project); int CHANGES = 12; int pageSize = 5; int k = CHANGES; while (k-- > 0) { JSONObject testTxt = getChild(project, "test.txt"); //$NON-NLS-1$ modifyFile(testTxt, "change to stash " + String.valueOf(k)); //$NON-NLS-1$ ServerStatus status = createStash(stashLocation); assertTrue(status.isOK()); } ServerStatus status = getStashList(stashLocation, 1, pageSize); assertTrue(status.isOK()); /* first page */ JSONObject stash = status.getJsonData(); assertTrue(stash.has(ProtocolConstants.KEY_CHILDREN)); assertEquals(pageSize, stash.getJSONArray(ProtocolConstants.KEY_CHILDREN).length()); assertTrue(stash.has(ProtocolConstants.KEY_NEXT_LOCATION)); assertFalse(stash.has(ProtocolConstants.KEY_PREVIOUS_LOCATION)); status = getStashList(stash.getString(ProtocolConstants.KEY_NEXT_LOCATION)); assertTrue(status.isOK()); /* second page */ stash = status.getJsonData(); assertTrue(stash.has(ProtocolConstants.KEY_CHILDREN)); assertEquals(pageSize, stash.getJSONArray(ProtocolConstants.KEY_CHILDREN).length()); assertTrue(stash.has(ProtocolConstants.KEY_NEXT_LOCATION)); assertTrue(stash.has(ProtocolConstants.KEY_PREVIOUS_LOCATION)); status = getStashList(stash.getString(ProtocolConstants.KEY_NEXT_LOCATION)); assertTrue(status.isOK()); /* third page */ stash = status.getJsonData(); assertTrue(stash.has(ProtocolConstants.KEY_CHILDREN)); assertEquals((CHANGES - 2 * pageSize), stash.getJSONArray(ProtocolConstants.KEY_CHILDREN).length()); assertFalse(stash.has(ProtocolConstants.KEY_NEXT_LOCATION)); assertTrue(stash.has(ProtocolConstants.KEY_PREVIOUS_LOCATION)); } @Test public void testStashCreateWithUntracked() throws Exception { String projectName = getMethodName(); createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME); JSONObject project = createProjectOrLink(workspaceLocation, projectName, gitDir.toString()); JSONObject testTxt = getChild(project, "test.txt"); //$NON-NLS-1$ modifyFile(testTxt, "change to stash"); //$NON-NLS-1$ String stashLocation = getStashLocation(project); ServerStatus status = getStashList(stashLocation); assertTrue(status.isOK()); JSONObject stash = status.getJsonData(); assertTrue(stash.has(ProtocolConstants.KEY_CHILDREN)); assertEquals(0, stash.getJSONArray(ProtocolConstants.KEY_CHILDREN).length()); status = createStash(stashLocation); assertTrue(status.isOK()); status = getStashList(stashLocation); assertTrue(status.isOK()); stash = status.getJsonData(); assertTrue(stash.has(ProtocolConstants.KEY_CHILDREN)); assertEquals(1, stash.getJSONArray(ProtocolConstants.KEY_CHILDREN).length()); } @Test public void testStashCreateWithUntrackedAndIndex() throws Exception { String projectName = getMethodName(); createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME); JSONObject project = createProjectOrLink(workspaceLocation, projectName, gitDir.toString()); JSONObject testTxt = getChild(project, "test.txt"); //$NON-NLS-1$ modifyFile(testTxt, "change to stash"); //$NON-NLS-1$ /* stage folder.txt */ JSONObject folder1 = getChild(project, "folder"); //$NON-NLS-1$ JSONObject folderTxt = getChild(folder1, "folder.txt"); //$NON-NLS-1$ modifyFile(folderTxt, "change to stash"); //$NON-NLS-1$ addFile(folderTxt); String stashLocation = getStashLocation(project); ServerStatus status = getStashList(stashLocation); assertTrue(status.isOK()); JSONObject stash = status.getJsonData(); assertTrue(stash.has(ProtocolConstants.KEY_CHILDREN)); assertEquals(0, stash.getJSONArray(ProtocolConstants.KEY_CHILDREN).length()); status = createStash(stashLocation); assertTrue(status.isOK()); status = getStashList(stashLocation); assertTrue(status.isOK()); stash = status.getJsonData(); assertTrue(stash.has(ProtocolConstants.KEY_CHILDREN)); assertEquals(1, stash.getJSONArray(ProtocolConstants.KEY_CHILDREN).length()); JSONObject stashChange = stash.getJSONArray(ProtocolConstants.KEY_CHILDREN).getJSONObject(0); assertTrue(stashChange.has(GitConstants.KEY_COMMIT_DIFFS)); assertEquals(2, ((JSONObject) stashChange.get(GitConstants.KEY_COMMIT_DIFFS)).get("Length")); } @Test public void testStashApply() throws Exception { String projectName = getMethodName(); createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME); JSONObject project = createProjectOrLink(workspaceLocation, projectName, gitDir.toString()); JSONObject testTxt = getChild(project, "test.txt"); //$NON-NLS-1$ modifyFile(testTxt, "change to stash"); //$NON-NLS-1$ String beforeStash = getFileContent(testTxt); String stashLocation = getStashLocation(project); ServerStatus status = createStash(stashLocation); assertTrue(status.isOK()); String afterStash = getFileContent(testTxt); assertFalse(beforeStash.equals(afterStash)); status = getStashList(stashLocation); assertTrue(status.isOK()); JSONObject stash = status.getJsonData(); assertTrue(stash.has(ProtocolConstants.KEY_CHILDREN)); assertEquals(1, stash.getJSONArray(ProtocolConstants.KEY_CHILDREN).length()); JSONObject change = stash.getJSONArray(ProtocolConstants.KEY_CHILDREN).getJSONObject(0); assertTrue(change.has(GitConstants.KEY_STASH_APPLY_LOCATION)); status = applyStash(change.getString(GitConstants.KEY_STASH_APPLY_LOCATION)); assertTrue(status.isOK()); status = getStashList(stashLocation); assertTrue(status.isOK()); stash = status.getJsonData(); assertTrue(stash.has(ProtocolConstants.KEY_CHILDREN)); assertEquals(1, stash.getJSONArray(ProtocolConstants.KEY_CHILDREN).length()); String afterApply = getFileContent(testTxt); assertTrue(beforeStash.equals(afterApply)); } @Test public void testStashDrop() throws Exception { String projectName = getMethodName(); createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME); JSONObject project = createProjectOrLink(workspaceLocation, projectName, gitDir.toString()); JSONObject testTxt = getChild(project, "test.txt"); //$NON-NLS-1$ modifyFile(testTxt, "change to stash"); //$NON-NLS-1$ String stashLocation = getStashLocation(project); ServerStatus status = createStash(stashLocation); assertTrue(status.isOK()); status = getStashList(stashLocation); assertTrue(status.isOK()); JSONObject stash = status.getJsonData(); assertTrue(stash.has(ProtocolConstants.KEY_CHILDREN)); assertEquals(1, stash.getJSONArray(ProtocolConstants.KEY_CHILDREN).length()); JSONObject change = stash.getJSONArray(ProtocolConstants.KEY_CHILDREN).getJSONObject(0); assertTrue(change.has(GitConstants.KEY_STASH_DROP_LOCATION)); status = dropStash(change.getString(GitConstants.KEY_STASH_DROP_LOCATION)); assertTrue(status.isOK()); status = getStashList(stashLocation); assertTrue(status.isOK()); stash = status.getJsonData(); assertTrue(stash.has(ProtocolConstants.KEY_CHILDREN)); assertEquals(0, stash.getJSONArray(ProtocolConstants.KEY_CHILDREN).length()); } protected String getStashLocation(JSONObject project) throws Exception { JSONObject clone = getCloneForGitResource(project); assertTrue(clone.has(GitConstants.KEY_STASH)); return clone.getString(GitConstants.KEY_STASH); } protected ServerStatus getStashList(String stashLocation) throws Exception { WebRequest request = new GetMethodWebRequest(toAbsoluteURI(stashLocation)); request.setHeaderField(ProtocolConstants.HEADER_ORION_VERSION, "1"); //$NON-NLS-1$ setAuthentication(request); return waitForTask(webConversation.getResponse(request)); } protected ServerStatus getStashList(String stashLocation, int page, int pageSize) throws Exception { WebRequest request = new GetMethodWebRequest(toAbsoluteURI(stashLocation)); request.setParameter("page", String.valueOf(page)); //$NON-NLS-1$ request.setParameter("pageSize", String.valueOf(pageSize)); //$NON-NLS-1$ request.setHeaderField(ProtocolConstants.HEADER_ORION_VERSION, "1"); //$NON-NLS-1$ setAuthentication(request); return waitForTask(webConversation.getResponse(request)); } protected ServerStatus createStash(String stashLocation) throws Exception { WebRequest request = new PostMethodWebRequest(toAbsoluteURI(stashLocation)); request.setHeaderField(ProtocolConstants.HEADER_ORION_VERSION, "1"); //$NON-NLS-1$ setAuthentication(request); return waitForTask(webConversation.getResponse(request)); } protected ServerStatus dropStash(String dropStashLocation) throws Exception { WebRequest request = new DeleteMethodWebRequest(toAbsoluteURI(dropStashLocation)); request.setHeaderField(ProtocolConstants.HEADER_ORION_VERSION, "1"); //$NON-NLS-1$ setAuthentication(request); return waitForTask(webConversation.getResponse(request)); } protected ServerStatus applyStash(String applyStashLocation) throws Exception { JSONObject body = new JSONObject(); WebRequest request = new PutMethodWebRequest(toAbsoluteURI(applyStashLocation), IOUtilities.toInputStream(body.toString()), "application/json"); //$NON-NLS-1$ request.setHeaderField(ProtocolConstants.HEADER_ORION_VERSION, "1"); //$NON-NLS-1$ setAuthentication(request); return waitForTask(webConversation.getResponse(request)); } }