示例#1
0
        public void WriteLockReturnsFalseIfUnknownException()
        {
            var fileSystem   = Substitute.For <ICalamariFileSystem>();
            var lockFilePath = "fake path";
            var lockIo       = new LockIo(fileSystem);

            fileSystem.FileExists(lockFilePath).Returns(true);
            fileSystem.OpenFileExclusively(lockFilePath, Arg.Any <FileMode>(), Arg.Any <FileAccess>())
            .Returns(x => { throw new Exception("Unknown exception"); });
            var currentProcess = System.Diagnostics.Process.GetCurrentProcess();
            var result         = lockIo.WriteLock(lockFilePath, new FileLock(currentProcess.Id, currentProcess.ProcessName, Thread.CurrentThread.ManagedThreadId, 636114372739676700));

            Assert.That(result, Is.False);
        }
示例#2
0
        public void WriteLockDoesNotOverwriteLockFileIfItsIdenticalToWhatWeAreWantingToWrite()
        {
            var fileSystem   = Substitute.For <ICalamariFileSystem>();
            var lockFilePath = "fake path";
            var lockIo       = new LockIo(fileSystem);

            fileSystem.FileExists(lockFilePath).Returns(true);
            var currentProcess = System.Diagnostics.Process.GetCurrentProcess();
            var fileContent    = $"{{\"__type\":\"FileLock:#Calamari.Integration.Processes.Semaphores\",\"ProcessId\":{currentProcess.Id},\"ProcessName\":\"{currentProcess.ProcessName}\",\"ThreadId\":{Thread.CurrentThread.ManagedThreadId},\"Timestamp\":636114372739676700}}";

            fileSystem.OpenFileExclusively(lockFilePath, FileMode.Open, FileAccess.Read)
            .Returns(x => new MemoryStream(Encoding.UTF8.GetBytes(fileContent)));
            var lockFile = lockIo.ReadLock(lockFilePath);

            lockIo.WriteLock(lockFilePath, lockFile);
        }
示例#3
0
        public void WriteLockDeletesLockIfUnableToDeserialise()
        {
            var fileSystem   = Substitute.For <ICalamariFileSystem>();
            var lockFilePath = "fake path";
            var lockIo       = new LockIo(fileSystem);

            fileSystem.FileExists(lockFilePath).Returns(true);
            var currentProcess      = System.Diagnostics.Process.GetCurrentProcess();
            var expectedFileContent = $"{{\"__type\":\"FileLock:#Calamari.Integration.Processes.Semaphores\",\"ProcessId\":{currentProcess.Id},\"ProcessName\":\"{currentProcess.ProcessName}\",\"ThreadId\":{Thread.CurrentThread.ManagedThreadId},\"Timestamp\":636114372739676700}}";

            fileSystem.OpenFileExclusively(lockFilePath, FileMode.Open, FileAccess.Read)
            .Returns(x => new MemoryStream(Encoding.UTF8.GetBytes("non deserialisable content")), x => new MemoryStream(Encoding.UTF8.GetBytes(expectedFileContent)));
            fileSystem.OpenFileExclusively(lockFilePath, FileMode.CreateNew, FileAccess.Write)
            .Returns(x => new MemoryStream());
            var result = lockIo.WriteLock(lockFilePath, new FileLock(currentProcess.Id, currentProcess.ProcessName, Thread.CurrentThread.ManagedThreadId, 636114372739676700));

            fileSystem.Received().DeleteFile(lockFilePath);
            Assert.That(result, Is.True);
        }
示例#4
0
        public void WriteLockOverwritesLockFileIfTimestampIsDifferent()
        {
            var fileSystem   = Substitute.For <ICalamariFileSystem>();
            var lockFilePath = "fake path";
            var lockIo       = new LockIo(fileSystem);

            fileSystem.FileExists(lockFilePath).Returns(true);
            var currentProcess = System.Diagnostics.Process.GetCurrentProcess();
            var fileContent    = $"{{\"__type\":\"FileLock:#Calamari.Integration.Processes.Semaphores\",\"ProcessId\":{currentProcess.Id},\"ProcessName\":\"{currentProcess.ProcessName}\",\"ThreadId\":{Thread.CurrentThread.ManagedThreadId},\"Timestamp\":636114372739676700}}";

            fileSystem.OpenFileExclusively(lockFilePath, FileMode.Open, FileAccess.Read)
            .Returns(x => new MemoryStream(Encoding.UTF8.GetBytes(fileContent)));
            var lockFile = (FileLock)lockIo.ReadLock(lockFilePath);

            lockFile.Timestamp = lockFile.Timestamp + 1;
            fileSystem.OpenFileExclusively(lockFilePath, FileMode.Create, FileAccess.Write)
            .Returns(x => new MemoryStream());
            var result = lockIo.WriteLock(lockFilePath, lockFile);

            Assert.That(result, Is.True);
        }