/******************************************************************************* * 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.eclipse.orion.server.tests.IsJSONObjectEqual.isJSONObjectEqual; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.File; import java.net.HttpURLConnection; import java.net.URI; import org.eclipse.core.runtime.IPath; import org.eclipse.jgit.lib.Constants; import org.eclipse.orion.internal.server.core.metastore.SimpleMetaStore; import org.eclipse.orion.server.core.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.Assume; import org.junit.Test; import com.meterware.httpunit.WebRequest; import com.meterware.httpunit.WebResponse; public class GitTagTest extends GitTest { @Test public void testTag() throws Exception { createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME); IPath[] clonePaths = createTestProjects(workspaceLocation); for (IPath clonePath : clonePaths) { // clone a repo JSONObject clone = clone(clonePath); String cloneContentLocation = clone.getString(ProtocolConstants.KEY_CONTENT_LOCATION); String tagLocation = clone.getString(GitConstants.KEY_TAG); // 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 gitTagUri = gitSection.getString(GitConstants.KEY_TAG); assertEquals(tagLocation, gitTagUri); String[] tagNames = {"tag", "t/a/g"}; for (String tagName : tagNames) { // tag HEAD with the tagName JSONObject tag = tag(gitTagUri, tagName, Constants.HEAD); assertEquals(tagName, tag.getString(ProtocolConstants.KEY_NAME)); URI tagUri = new URI(tag.getString(ProtocolConstants.KEY_LOCATION)); // check tag metadata request = getGetGitTagRequest(tagUri.toString()); response = webConversation.getResponse(request); assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode()); JSONObject tag1 = new JSONObject(response.getText()); assertThat(tag1, isJSONObjectEqual(tag)); } } } @Test public void testListDeleteTags() throws Exception { createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME); 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 gitHeadUri = gitSection.getString(GitConstants.KEY_HEAD); String gitTagUri = gitSection.getString(GitConstants.KEY_TAG); JSONArray tags = listTags(gitTagUri); assertEquals(0, tags.length()); // log JSONArray commitsArray = log(gitHeadUri); assertEquals(1, commitsArray.length()); JSONObject commit = commitsArray.getJSONObject(0); String commitId = commit.getString(ProtocolConstants.KEY_NAME); String commitLocation = commit.getString(ProtocolConstants.KEY_LOCATION); tag(gitTagUri, "tag1", commitId); tags = listTags(gitTagUri); assertEquals(1, tags.length()); assertEquals("tag1", tags.getJSONObject(0).get(ProtocolConstants.KEY_NAME)); // update commit with tag tag(commitLocation, "tag2"); tags = listTags(gitTagUri); assertEquals(2, tags.length()); assertEquals("tag2", tags.getJSONObject(0).get(ProtocolConstants.KEY_NAME)); // delete 'tag1' JSONObject tag1 = tags.getJSONObject(1); assertEquals("tag1", tag1.get(ProtocolConstants.KEY_NAME)); String tag1Uri = tag1.getString(ProtocolConstants.KEY_LOCATION); deleteTag(tag1Uri); tags = listTags(gitTagUri); assertEquals(1, tags.length()); assertEquals("tag2", tags.getJSONObject(0).get(ProtocolConstants.KEY_NAME)); // check if the deleted tag is gone request = getGetGitTagRequest(tag1Uri); response = webConversation.getResponse(request); assertEquals(HttpURLConnection.HTTP_NOT_FOUND, response.getResponseCode()); } } @Test public void testTagFailed() throws Exception { createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME); 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 gitTagUri = gitSection.getString(GitConstants.KEY_TAG); String gitHeadUri = gitSection.getString(GitConstants.KEY_HEAD); // tag HEAD with 'tag' JSONObject tag = tag(gitTagUri, "tag", Constants.HEAD); assertEquals("tag", tag.getString(ProtocolConstants.KEY_NAME)); new URI(tag.getString(ProtocolConstants.KEY_LOCATION)); // tag HEAD with 'tag' again (TagHandler) - should fail request = getPostGitTagRequest(gitTagUri, "tag", Constants.HEAD); response = webConversation.getResponse(request); assertEquals(HttpURLConnection.HTTP_INTERNAL_ERROR, response.getResponseCode()); // tag HEAD with 'tag' again (CommitHandler) - should fail request = getPutGitCommitRequest(gitHeadUri, "tag"); response = webConversation.getResponse(request); assertEquals(HttpURLConnection.HTTP_INTERNAL_ERROR, response.getResponseCode()); // modify JSONObject testTxt = getChild(folder, "test.txt"); modifyFile(testTxt, "test.txt change"); // add JSONObject folder1 = getChild(folder, "folder"); JSONObject folderTxt = getChild(folder1, "folder.txt"); addFile(folderTxt); // commit request = GitCommitTest.getPostGitCommitRequest(gitHeadUri, "commit", false); response = webConversation.getResponse(request); assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode()); // tag next commit with 'tag' again (TagHandler) - should fail request = getPostGitTagRequest(gitTagUri, "tag", Constants.HEAD); response = webConversation.getResponse(request); assertEquals(HttpURLConnection.HTTP_INTERNAL_ERROR, response.getResponseCode()); JSONObject result = new JSONObject(response.getText()); assertEquals(HttpURLConnection.HTTP_INTERNAL_ERROR, result.getInt("HttpCode")); assertEquals("Error", result.getString("Severity")); assertEquals("An error occurred when tagging.", result.getString("Message")); assertTrue(result.toString(), result.getString("DetailedMessage").endsWith("already exists")); // tag HEAD with 'tag' again (CommitHandler) - should fail request = getPutGitCommitRequest(gitHeadUri, "tag"); response = webConversation.getResponse(request); assertEquals(HttpURLConnection.HTTP_INTERNAL_ERROR, response.getResponseCode()); result = new JSONObject(response.getText()); assertEquals(HttpURLConnection.HTTP_INTERNAL_ERROR, result.getInt("HttpCode")); assertEquals("Error", result.getString("Severity")); assertEquals("An error occurred when tagging.", result.getString("Message")); assertTrue(result.toString(), result.getString("DetailedMessage").endsWith("already exists")); } } @Test public void testTagFromLogAll() throws Exception { createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME); IPath[] clonePaths = createTestProjects(workspaceLocation); for (IPath clonePath : clonePaths) { // clone a repo JSONObject clone = clone(clonePath); String cloneContentLocation = clone.getString(ProtocolConstants.KEY_CONTENT_LOCATION); String cloneCommitUri = clone.getString(GitConstants.KEY_COMMIT); // 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 folderTagUri = gitSection.getString(GitConstants.KEY_TAG); // get the full log JSONArray commits = log(cloneCommitUri); assertEquals(1, commits.length()); String commitLocation = commits.getJSONObject(0).getString(ProtocolConstants.KEY_LOCATION); // tag tag(commitLocation, "tag1"); // check JSONArray tags = listTags(folderTagUri); assertEquals(1, tags.length()); assertEquals("tag1", tags.getJSONObject(0).get(ProtocolConstants.KEY_NAME)); } } @Test public void testCheckoutTag() throws Exception { createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME); IPath[] clonePaths = createTestProjects(workspaceLocation); for (IPath clonePath : clonePaths) { // clone a repo JSONObject clone = clone(clonePath); String cloneContentLocation = clone.getString(ProtocolConstants.KEY_CONTENT_LOCATION); String cloneLocation = clone.getString(ProtocolConstants.KEY_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, "tag me"); addFile(testTxt); commitFile(testTxt, "tag me", false); // tag HEAD with 'tag' JSONObject gitSection = folder.getJSONObject(GitConstants.KEY_GIT); String gitTagUri = gitSection.getString(GitConstants.KEY_TAG); String gitHeadUri = gitSection.getString(GitConstants.KEY_HEAD); tag(gitTagUri, "tag", Constants.HEAD); modifyFile(testTxt, "after tag"); addFile(testTxt); commitFile(testTxt, "after tag", false); assertEquals("after tag", getFileContent(testTxt)); response = checkoutTag(cloneLocation, "tag"); assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode()); assertEquals("tag me", getFileContent(testTxt)); // check current branch request = getGetRequest(clone.getString(GitConstants.KEY_BRANCH)); response = webConversation.getResponse(request); ServerStatus status = waitForTask(response); assertTrue(status.toString(), status.isOK()); JSONObject branches = status.getJsonData(); assertEquals("tag_tag", GitBranchTest.getCurrentBranch(branches).getString(ProtocolConstants.KEY_NAME)); // log JSONArray commitsArray = log(gitHeadUri); assertEquals(2, commitsArray.length()); JSONObject commit = commitsArray.getJSONObject(0); assertEquals("tag me", commit.get(GitConstants.KEY_COMMIT_MESSAGE)); commit = commitsArray.getJSONObject(1); assertEquals("Initial commit", commit.get(GitConstants.KEY_COMMIT_MESSAGE)); response = checkoutBranch(cloneLocation, Constants.MASTER); assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode()); assertEquals("after tag", getFileContent(testTxt)); } } @Test public void testListOrionServerTags() throws Exception { File orionServer = new File("").getAbsoluteFile().getParentFile(/*org.eclipse.orion.server.tests*/).getParentFile(/*tests*/); Assume.assumeTrue(new File(orionServer, Constants.DOT_GIT).exists()); createWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME); JSONObject project = createProjectOrLink(workspaceLocation, getMethodName().concat("Project"), orionServer.toURI().toString()); String location = project.getString(ProtocolConstants.KEY_CONTENT_LOCATION); // get project/folder metadata WebRequest request = getGetRequest(location); 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 gitTagUri = gitSection.getString(GitConstants.KEY_TAG); JSONArray tags = listTags(gitTagUri); assertTrue(tags.length() > 0); long lastTime = Long.MAX_VALUE; for (int i = 0; i < 5; i++) { JSONObject tag = tags.getJSONObject(i); // assert properly sorted, new first long t = tag.getLong(ProtocolConstants.KEY_LOCAL_TIMESTAMP); assertTrue(t <= lastTime); lastTime = t; // get 'tag' metadata request = getGetGitTagRequest(tag.getString(ProtocolConstants.KEY_LOCATION).toString()); response = webConversation.getResponse(request); assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode()); } for (int i = tags.length() - 5; i < tags.length(); i++) { JSONObject tag = tags.getJSONObject(i); // assert properly sorted, new first long t = tag.getLong(ProtocolConstants.KEY_LOCAL_TIMESTAMP); assertTrue(t <= lastTime); lastTime = t; // get 'tag' metadata request = getGetGitTagRequest(tag.getString(ProtocolConstants.KEY_LOCATION).toString()); response = webConversation.getResponse(request); assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode()); } } }