org.eclipse.egit.core.test.LinkedResourcesTest.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.egit.core.test.LinkedResourcesTest.java

Source

/*******************************************************************************
 * Copyright (C) 2013, Franois Rey <eclipse.org_@_francois_._rey_._name>
 *
 * 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:
 *    Franois Rey - First implementation as part of handling linked resources
 *******************************************************************************/
package org.eclipse.egit.core.test;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import java.io.File;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.egit.core.Activator;
import org.eclipse.egit.core.ContainerTreeIterator;
import org.eclipse.egit.core.GitProvider;
import org.eclipse.egit.core.IteratorService;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.treewalk.WorkingTreeIterator;
import org.eclipse.team.core.RepositoryProvider;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class LinkedResourcesTest {

    TestUtils testUtils;

    File project1Dir;

    File project2Dir;

    TestRepository repository1;

    TestRepository repository2;

    String project1Name = "project1";

    String project2Name = "project2";

    IProject project1;

    IProject project2;

    GitResourceDeltaTestHelper resourceDeltaTestHelper1;

    GitResourceDeltaTestHelper resourceDeltaTestHelper2;

    @Before
    public void setUp() throws Exception {
        testUtils = new TestUtils();
        // Create first repo and project
        project1 = testUtils.createProjectInLocalFileSystem(project1Name);
        project1Dir = project1.getRawLocation().toFile();
        repository1 = new TestRepository(new File(project1Dir, Constants.DOT_GIT));
        testUtils.addFileToProject(project1, "project1folder1/project1folder1file1.txt", "Hello world");
        repository1.connect(project1);
        repository1.trackAllFiles(project1);
        repository1.commit("Initial commit");
        // Create 2nd repo and project
        project2 = testUtils.createProjectInLocalFileSystem(project2Name);
        project2Dir = project2.getRawLocation().toFile();
        repository2 = new TestRepository(new File(project2Dir, Constants.DOT_GIT));
        testUtils.addFileToProject(project2, "project2folder1/project2folder1file1.txt", "Hello world");
        repository2.connect(project2);
        repository2.trackAllFiles(project2);
        repository2.commit("Initial commit");
        // Set up git delta listener
        resourceDeltaTestHelper1 = new GitResourceDeltaTestHelper(repository1.getRepository());
        resourceDeltaTestHelper1.setUp();
        resourceDeltaTestHelper2 = new GitResourceDeltaTestHelper(repository2.getRepository());
        resourceDeltaTestHelper2.setUp();
    }

    @After
    public void tearDown() throws Exception {
        if (resourceDeltaTestHelper1 != null)
            resourceDeltaTestHelper1.tearDown();
        if (resourceDeltaTestHelper2 != null)
            resourceDeltaTestHelper2.tearDown();
        project1.delete(true, null);
        project2.delete(true, null);
        project1 = null;
        project2 = null;
        repository1.dispose();
        repository2.dispose();
        repository1 = null;
        repository2 = null;
        testUtils.deleteTempDirs();
        testUtils = null;
        Activator.getDefault().getRepositoryCache().clear();
    }

    @Test
    public void testGitProviderCanHandleLinkedResources() throws Exception {
        GitProvider provider = (GitProvider) RepositoryProvider.getProvider(project1);
        assertTrue(provider.canHandleLinkedResourceURI());
    }

    @Test
    public void testLinkedResourcesIgnoredByGitResourceDeltaVisitor() throws Exception {
        // Create linked folder in project1 that points to project2
        IFolder folder = project1.getFolder("link2project2");
        folder.createLink(project2.getLocation(), IResource.ALLOW_MISSING_LOCAL, null);
        // Create linked file in project1 that points to a file in project2
        IFile file = project1.getFile("link2project2folder1file1.txt");
        file.createLink(project2.getFile("project2folder1/project2folder1file1.txt").getLocation(),
                IResource.ALLOW_MISSING_LOCAL, null);
        // Add file to project2
        testUtils.addFileToProject(project2, "project2folder1/project2folder1file2.txt", "Hello world");
        // Links are written to the .project file
        resourceDeltaTestHelper1.assertChangedResources(new String[] { "/project1/.project" });
        // Changes to linked resources are reported against their repository
        resourceDeltaTestHelper2.assertChangedResources(new String[] { "/project1/link2project2/project2folder1",
                "/project1/link2project2/project2folder1/project2folder1file2.txt",
                "/project1/link2project2/.project",
                "/project1/link2project2/project2folder1/project2folder1file1.txt", "/project1/link2project2",
                "/project2/project2folder1/project2folder1file2.txt" });
    }

    @Test
    public void testLinkedResourcesIgnoredByIteratorService() throws Exception {
        // Create linked folder in project1 that points to project2
        IFolder folder = project1.getFolder("link2project2");
        folder.createLink(project2.getLocation(), IResource.ALLOW_MISSING_LOCAL, null);
        // Linked resources are ignored when searching the container of a folder
        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
        IContainer container = IteratorService.findContainer(root, folder.getRawLocation().makeAbsolute().toFile());
        assertTrue(project2.equals(container));
        // Also test when the only project left is the one linking to the folder
        repository2.disconnect(project2);
        container = IteratorService.findContainer(root, folder.getRawLocation().makeAbsolute().toFile());
        assertNull(container);
    }

    @Test
    public void testLinkedResourcesIgnoredByContainerTreeIterator() throws Exception {
        // Create linked folder in project1 that points to project2
        IFolder folder = project1.getFolder("link2project2");
        folder.createLink(project2.getLocation(), IResource.ALLOW_MISSING_LOCAL, null);
        // Create linked file in project1 that points to a file in project2
        IFile file = project1.getFile("link2project2folder1file1.txt");
        file.createLink(project2.getFile("project2folder1/project2folder1file1.txt").getLocation(),
                IResource.ALLOW_MISSING_LOCAL, null);
        // Test iterator
        WorkingTreeIterator iterator = IteratorService.createInitialIterator(repository1.repository);
        assertTrue(iterator instanceof ContainerTreeIterator);
        while (!iterator.eof()) {
            assertFalse(iterator.getEntryPathString().startsWith("link2"));
            iterator.next(1);
        }
    }
}