view mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MirrorManagerTest.java @ 908:b39494a5ff96

TW-39095 handle commit messages with non-ascii symbols
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Fri, 05 Dec 2014 14:59:15 +0100
parents 31a1aca3305c
children 7bf4d943d5bb
line wrap: on
line source
/*
 * Copyright 2000-2014 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package jetbrains.buildServer.buildTriggers.vcs.mercurial;

import jetbrains.buildServer.util.Hash;
import org.jetbrains.annotations.NotNull;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import java.io.File;
import java.io.IOException;
import java.util.List;

import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertTrue;

/**
 * @author dmitry.neverov
 */
@Test
public class MirrorManagerTest extends BaseMercurialTestCase {

  private File myRootDir;
  private MirrorManagerImpl myManager;


  @BeforeMethod
  public void setUp() throws Exception {
    super.setUp();
    myRootDir = myTempFiles.createTempDir();
    myManager = new MirrorManagerImpl(new PluginConfig() {
      @NotNull
      public File getCachesDir() {
        return myRootDir;
      }
    });
  }


  public void manager_should_create_an_empty_map_file() {
    assertTrue(myRootDir.listFiles().length == 1);
  }


  public void getMirrorDir_returns_dir_under_root() {
    File mirrorDir = myManager.getMirrorDir("hg://some.com/repository.hg");
    assertEquals(myRootDir, mirrorDir.getParentFile());
    assertTrue(mirrorDir.exists());
  }


  public void getMirrorDir_returns_same_result_for_same_url() {
    String url = "hg://some.com/repository.hg";
    assertEquals(myManager.getMirrorDir(url), myManager.getMirrorDir(url));
  }


  public void getMirrors_remember_created_repositories() {
    File mirrorDir1 = myManager.getMirrorDir("hg://some.com/repository.hg");
    File mirrorDir2 = myManager.getMirrorDir("hg://other.com/repository.hg");
    List<File> mirrors = myManager.getMirrors();
    assertEquals(2, mirrors.size());
    assertTrue(mirrors.contains(mirrorDir1));
    assertTrue(mirrors.contains(mirrorDir2));
  }


  public void should_handle_url_collisions() throws IOException {
    final String url1 = "hg://some.com/repository.hg";
    final String url2 = "hg://other.com/repository.hg";

    MirrorManagerImpl.HashCalculator hashWithCollision = new MirrorManagerImpl.HashCalculator() {
      public long calc(String value) {
        if (value.equals(url1) || value.equals(url2)) {
          return 0;//emulate collision
        } else {
          return Hash.calc(value);
        }
      }
    };

    //alone they get dir with the same name:
    final File dir1 = myTempFiles.createTempDir();
    MirrorManagerImpl mm1 = new MirrorManagerImpl(new PluginConfig() {
      @NotNull
      public File getCachesDir() {
        return dir1;
      }
    });
    mm1.setHashCalculator(hashWithCollision);
    File separateMirrorDir1 = mm1.getMirrorDir(url1);

    final File dir2 = myTempFiles.createTempDir();
    MirrorManagerImpl mm2 = new MirrorManagerImpl(new PluginConfig() {
      @NotNull
      public File getCachesDir() {
        return dir2;
      }
    });
    mm2.setHashCalculator(hashWithCollision);
    File separateMirrorDir2 = mm2.getMirrorDir(url2);

    assertEquals(separateMirrorDir1.getName(), separateMirrorDir2.getName());

    myManager.setHashCalculator(hashWithCollision);
    File mirrorDir1 = myManager.getMirrorDir(url1);
    File mirrorDir2 = myManager.getMirrorDir(url2);
    assertFalse(mirrorDir1.equals(mirrorDir2));
  }


  public void should_survive_restart() throws IOException {
    String url1 = "hg://some.com/repository.hg";
    String url2 = "hg://other.com/repository.hg?param = 1";
    File mirrorDir1 = myManager.getMirrorDir(url1);
    File mirrorDir2 = myManager.getMirrorDir(url2);

    //emulate restart by creating a new manager for the same rootDir
    MirrorManagerImpl manager = new MirrorManagerImpl(new PluginConfig() {
      @NotNull
      public File getCachesDir() {
        return myRootDir;
      }
    });

    assertEquals(2, manager.getMirrors().size());
    assertTrue(manager.getMirrors().contains(mirrorDir1));
    assertTrue(manager.getMirrors().contains(mirrorDir2));
  }


  public void should_be_able_to_forget_directory() throws Exception {
    String url = "hg://some.org/repository";
    File mirror1 = myManager.getMirrorDir(url);
    File dotHg = new File(mirror1, ".hg");
    dotHg.mkdirs();
    myManager.forgetDir(mirror1);
    File mirror2 = myManager.getMirrorDir(url);
    assertFalse(mirror2.equals(mirror1));
  }
}