/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* 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:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.git.impl;
import com.google.common.io.Files;
import org.eclipse.che.api.git.GitConnection;
import org.eclipse.che.api.git.GitConnectionFactory;
import org.eclipse.che.api.git.exception.GitException;
import org.eclipse.che.api.git.params.RemoteAddParams;
import org.eclipse.che.api.git.params.RemoteUpdateParams;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import static java.util.Collections.singletonList;
import static org.eclipse.che.git.impl.GitTestUtil.cleanupTestRepo;
import static org.eclipse.che.git.impl.GitTestUtil.connectToGitRepositoryWithContent;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
/**
* @author Eugene Voevodin
*/
public class RemoteUpdateTest {
private File repository;
@BeforeMethod
public void setUp() {
repository = Files.createTempDir();
}
@AfterMethod
public void cleanUp() {
cleanupTestRepo(repository);
}
@Test(dataProvider = "GitConnectionFactory", dataProviderClass = GitConnectionFactoryProvider.class)
public void testUpdateBranches(GitConnectionFactory connectionFactory) throws GitException, IOException {
//given
GitConnection connection = connectToGitRepositoryWithContent(connectionFactory, repository);
addInitialRemote(connection);
//when
//change branch1 to branch2
RemoteUpdateParams request = RemoteUpdateParams.create("newRemote").withBranches(singletonList("branch2"));
connection.remoteUpdate(request);
//then
assertEquals(parseAllConfig(connection).get("remote.newRemote.fetch").get(0),
"+refs/heads/branch2:refs/remotes/newRemote/branch2");
}
@Test(dataProvider = "GitConnectionFactory", dataProviderClass = GitConnectionFactoryProvider.class)
public void testAddUrl(GitConnectionFactory connectionFactory) throws GitException, IOException {
//given
GitConnection connection = connectToGitRepositoryWithContent(connectionFactory, repository);
addInitialRemote(connection);
//when
connection.remoteUpdate(RemoteUpdateParams.create("newRemote").withAddUrl(singletonList("new.com")));
//then
assertTrue(parseAllConfig(connection).get("remote.newRemote.url").contains("new.com"));
}
@Test(dataProvider = "GitConnectionFactory", dataProviderClass = GitConnectionFactoryProvider.class)
public void testAddPushUrl(GitConnectionFactory connectionFactory) throws GitException, IOException {
//given
GitConnection connection = connectToGitRepositoryWithContent(connectionFactory, repository);
addInitialRemote(connection);
//when
connection.remoteUpdate(RemoteUpdateParams.create("newRemote").withAddPushUrl(singletonList("pushurl1")));
//then
assertTrue(parseAllConfig(connection).get("remote.newRemote.pushurl").contains("pushurl1"));
}
@Test(dataProvider = "GitConnectionFactory", dataProviderClass = GitConnectionFactoryProvider.class)
public void testDeleteUrl(GitConnectionFactory connectionFactory) throws GitException, IOException {
//given
//add url
GitConnection connection = connectToGitRepositoryWithContent(connectionFactory, repository);
addInitialRemote(connection);
connection.remoteUpdate(RemoteUpdateParams.create("newRemote").withAddUrl(singletonList("newUrl")));
//when
connection.remoteUpdate(RemoteUpdateParams.create("newRemote").withRemoveUrl(singletonList("newUrl")));
//then
assertFalse(parseAllConfig(connection).containsKey("remote.newRemote.newUrl"));
}
@Test(dataProvider = "GitConnectionFactory", dataProviderClass = GitConnectionFactoryProvider.class)
public void testDeletePushUrl(GitConnectionFactory connectionFactory) throws GitException, IOException {
//given
GitConnection connection = connectToGitRepositoryWithContent(connectionFactory, repository);
addInitialRemote(connection);
//add push url
connection.remoteUpdate(RemoteUpdateParams.create("newRemote").withAddPushUrl(singletonList("pushurl")));
//when
connection.remoteUpdate(RemoteUpdateParams.create("newRemote").withRemovePushUrl(singletonList("pushurl")));
//then
assertNull(parseAllConfig(connection).get("remote.newRemote.pushurl"));
}
private Map<String, List<String>> parseAllConfig(GitConnection connection) throws GitException {
Map<String, List<String>> config = new HashMap<>();
List<String> lines = connection.getConfig().getList();
for (String outLine : lines) {
String[] pair = outLine.split("=");
List<String> list = config.get(pair[0]);
if (list == null) {
list = new LinkedList<>();
}
if (pair.length == 2) {
list.add(pair[1]);
}
config.put(pair[0], list);
}
return config;
}
private void addInitialRemote(GitConnection connection) throws GitException {
RemoteAddParams params = RemoteAddParams.create("newRemote", "newRemote.url")
.withBranches(singletonList("branch1"));
connection.remoteAdd(params);
}
}