public void DeleteCacheDuringHydrations() { GVFSFunctionalTestEnlistment enlistment1 = this.CloneAndMountEnlistment(); string objectsRoot = GVFSHelpers.GetPersistedGitObjectsRoot(enlistment1.DotGVFSRoot).ShouldNotBeNull(); objectsRoot.ShouldBeADirectory(this.fileSystem); Task task1 = Task.Run(() => { this.HydrateEntireRepo(enlistment1); }); while (!task1.IsCompleted) { try { // Delete objectsRoot rather than this.localCachePath as the blob sizes database cannot be deleted while GVFS is mounted this.DeleteDirectoryWithUnlimitedRetries(objectsRoot); Thread.Sleep(100); } catch (IOException) { // Hydration may have handles into the cache, so failing this delete is expected. } } task1.Exception.ShouldBeNull(); enlistment1.Status().ShouldContain("Mount status: Ready"); }
public void DeleteObjectsCacheAndCacheMappingBeforeMount() { GVFSFunctionalTestEnlistment enlistment1 = this.CloneAndMountEnlistment(); GVFSFunctionalTestEnlistment enlistment2 = this.CloneAndMountEnlistment(); enlistment1.UnmountGVFS(); string objectsRoot = GVFSHelpers.GetPersistedGitObjectsRoot(enlistment1.DotGVFSRoot).ShouldNotBeNull(); objectsRoot.ShouldBeADirectory(this.fileSystem); this.DeleteDirectoryWithUnlimitedRetries(objectsRoot); string metadataPath = Path.Combine(this.localCachePath, "mapping.dat"); metadataPath.ShouldBeAFile(this.fileSystem); this.fileSystem.DeleteFile(metadataPath); enlistment1.MountGVFS(); Task task1 = Task.Run(() => this.HydrateRootFolder(enlistment1)); Task task2 = Task.Run(() => this.HydrateRootFolder(enlistment2)); task1.Wait(); task2.Wait(); task1.Exception.ShouldBeNull(); task2.Exception.ShouldBeNull(); enlistment1.Status().ShouldContain("Mount status: Ready"); enlistment2.Status().ShouldContain("Mount status: Ready"); this.AlternatesFileShouldHaveGitObjectsRoot(enlistment1); this.AlternatesFileShouldHaveGitObjectsRoot(enlistment2); }
public void ParallelReadsInASharedCache() { GVFSFunctionalTestEnlistment enlistment1 = this.CloneAndMountEnlistment(); GVFSFunctionalTestEnlistment enlistment2 = this.CloneAndMountEnlistment(); GVFSFunctionalTestEnlistment enlistment3 = null; Task task1 = Task.Run(() => this.HydrateEntireRepo(enlistment1)); Task task2 = Task.Run(() => this.HydrateEntireRepo(enlistment2)); Task task3 = Task.Run(() => enlistment3 = this.CloneAndMountEnlistment()); task1.Wait(); task2.Wait(); task3.Wait(); task1.Exception.ShouldBeNull(); task2.Exception.ShouldBeNull(); task3.Exception.ShouldBeNull(); enlistment1.Status().ShouldContain("Mount status: Ready"); enlistment2.Status().ShouldContain("Mount status: Ready"); enlistment3.Status().ShouldContain("Mount status: Ready"); this.AlternatesFileShouldHaveGitObjectsRoot(enlistment1); this.AlternatesFileShouldHaveGitObjectsRoot(enlistment2); this.AlternatesFileShouldHaveGitObjectsRoot(enlistment3); }
public void DeleteCacheDuringHydrations() { GVFSFunctionalTestEnlistment enlistment1 = this.CloneAndMountEnlistment(); Task task1 = Task.Run(() => { this.HydrateEntireRepo(enlistment1); }); while (!task1.IsCompleted) { try { CmdRunner.DeleteDirectoryWithRetry(this.localCachePath); Thread.Sleep(100); } catch (IOException) { // Hydration may have handles into the cache, so failing this delete is expected. } } task1.Exception.ShouldBeNull(); enlistment1.Status().ShouldContain("Mount status: Ready"); }
public void DeleteCacheBeforeMount() { GVFSFunctionalTestEnlistment enlistment1 = this.CloneAndMountEnlistment(); GVFSFunctionalTestEnlistment enlistment2 = this.CloneAndMountEnlistment(); enlistment1.UnmountGVFS(); CmdRunner.DeleteDirectoryWithRetry(this.localCachePath); enlistment1.MountGVFS(); Task task1 = Task.Run(() => this.HydrateRootFolder(enlistment1)); Task task2 = Task.Run(() => this.HydrateRootFolder(enlistment2)); task1.Wait(); task2.Wait(); task1.Exception.ShouldBeNull(); task2.Exception.ShouldBeNull(); enlistment1.Status().ShouldContain("Mount status: Ready"); enlistment2.Status().ShouldContain("Mount status: Ready"); this.AlternatesFileShouldHaveGitObjectsRoot(enlistment1); this.AlternatesFileShouldHaveGitObjectsRoot(enlistment2); }
public void DownloadingACommitWithoutTreesDoesntBreakNextClone() { GVFSFunctionalTestEnlistment enlistment1 = this.CreateNewEnlistment(this.pathToObjectCache); GitProcess.Invoke(enlistment1.RepoRoot, "cat-file -s " + WellKnownCommitSha).ShouldEqual("293\n"); GVFSFunctionalTestEnlistment enlistment2 = this.CreateNewEnlistment(this.pathToObjectCache, WellKnownBranch); enlistment2.Status().ShouldContain("Mount status: Ready"); }
public void CloneCleansUpStaleMetadataLock() { GVFSFunctionalTestEnlistment enlistment1 = this.CloneAndMountEnlistment(); string metadataLockPath = Path.Combine(this.localCachePath, "mapping.dat.lock"); metadataLockPath.ShouldNotExistOnDisk(this.fileSystem); this.fileSystem.WriteAllText(metadataLockPath, enlistment1.EnlistmentRoot); metadataLockPath.ShouldBeAFile(this.fileSystem); GVFSFunctionalTestEnlistment enlistment2 = this.CloneAndMountEnlistment(); metadataLockPath.ShouldNotExistOnDisk(this.fileSystem); enlistment1.Status().ShouldContain("Mount status: Ready"); enlistment2.Status().ShouldContain("Mount status: Ready"); }
public void ParallelReadsInASharedCache() { GVFSFunctionalTestEnlistment enlistment1 = this.CreateNewEnlistment(this.pathToObjectCache); GVFSFunctionalTestEnlistment enlistment2 = this.CreateNewEnlistment(this.pathToObjectCache); GVFSFunctionalTestEnlistment enlistment3 = null; Task task1 = Task.Run(() => this.HydrateEntireRepo(enlistment1)); Task task2 = Task.Run(() => this.HydrateEntireRepo(enlistment2)); Task task3 = Task.Run(() => enlistment3 = this.CreateNewEnlistment(this.pathToObjectCache)); task1.Wait(); task2.Wait(); task3.Wait(); enlistment1.Status().ShouldContain("Mount status: Ready"); enlistment2.Status().ShouldContain("Mount status: Ready"); enlistment3.Status().ShouldContain("Mount status: Ready"); }
public void DeleteCacheBeforeMount() { GVFSFunctionalTestEnlistment enlistment1 = this.CreateNewEnlistment(this.pathToObjectCache); GVFSFunctionalTestEnlistment enlistment2 = this.CreateNewEnlistment(this.pathToObjectCache); enlistment1.UnmountGVFS(); this.DeleteSharedCache(); enlistment1.MountGVFS(); Task task1 = Task.Run(() => this.HydrateEntireRepo(enlistment1)); Task task2 = Task.Run(() => this.HydrateEntireRepo(enlistment2)); task1.Wait(); task2.Wait(); enlistment1.Status().ShouldContain("Mount status: Ready"); enlistment2.Status().ShouldContain("Mount status: Ready"); }
public void DeleteCacheAtOffsetBetweenHydrations() { GVFSFunctionalTestEnlistment enlistment1 = this.CreateNewEnlistment(this.pathToObjectCache); Task task1 = Task.Run(() => { this.HydrateEntireRepo(enlistment1); }); while (!task1.IsCompleted) { try { this.DeleteSharedCache(); Thread.Sleep(100); } catch (IOException) { // Hydration may have handles into the cache, so failing this delete is expected. } } enlistment1.Status().ShouldContain("Mount status: Ready"); }