public void GatherDoesNotTransitionToNewState()
        {
            var sut             = new GatheredDataFile("201306158F341A2D6FD7416B87073A0132DD51AE.chk.20150627111406.gathered");
            var messageBodyMock = new Mock <MessageBody>(sut);

            messageBodyMock.SetupAllProperties();

            sut.Gather(messageBodyMock.Object, Path.GetTempPath());

            messageBodyMock.Object.DataFile.Should().BeSameAs(sut);
        }
Example #2
0
        internal override void Lock(MessageBody messageBody)
        {
            if (_logger.IsDebugEnabled)
            {
                _logger.Debug($"Locking {this}.");
            }

            // take a new lock ---update timestamp while staying in gathered state--- so that this agent instance get
            // exclusive ownership of the data file should there be another remote agent instance working concurrently
            var gatheredDataFile = new GatheredDataFile(this);
            var result           = DataFileServant.Instance.TryMoveFile(Path, gatheredDataFile.Path);

            messageBody.DataFile = result
                                ? gatheredDataFile
                                : new AwaitingRetryDataFile(this);
        }
        public void UnlockTransitionsToAwaitingRetryDataFileWhenOperationFails()
        {
            var servantMock = new Mock <DataFileServant>();

            DataFileServant.Instance = servantMock.Object;

            const string filePath        = "201306158F341A2D6FD7416B87073A0132DD51AE.chk.20150627111406.gathered";
            var          sut             = new GatheredDataFile(filePath);
            var          messageBodyMock = new Mock <MessageBody>(sut);

            servantMock.Setup(s => s.TryDeleteFile(filePath)).Returns(false);

            sut.Unlock(messageBodyMock.Object);

            messageBodyMock.Object.DataFile.Should().BeOfType <AwaitingRetryDataFile>();
        }
        public void UnlockDoesNotTransitionToNewStateWhenOperationSucceeds()
        {
            var servantMock = new Mock <DataFileServant>();

            DataFileServant.Instance = servantMock.Object;

            const string filePath        = "201306158F341A2D6FD7416B87073A0132DD51AE.chk.20150627111406.gathered";
            var          sut             = new GatheredDataFile(filePath);
            var          messageBodyMock = new Mock <MessageBody>(sut);

            servantMock.Setup(s => s.TryDeleteFile(filePath)).Returns(true);

            sut.Unlock(messageBodyMock.Object);

            messageBodyMock.Object.DataFile.Should().BeSameAs(sut);
        }
        public void UnlockDeletesDataFile()
        {
            var servantMock = new Mock <DataFileServant>();

            DataFileServant.Instance = servantMock.Object;

            const string filePath        = "201306158F341A2D6FD7416B87073A0132DD51AE.chk.20150627111406.gathered";
            var          sut             = new GatheredDataFile(filePath);
            var          messageBodyMock = new Mock <MessageBody>(sut);

            servantMock.Setup(s => s.TryDeleteFile(filePath)).Returns(true).Verifiable();

            sut.Unlock(messageBodyMock.Object);

            servantMock.VerifyAll();
        }
        public void ReleaseRenamesDataFileAndReleaseClaimTokenFromDatabase()
        {
            var servantMock = new Mock <DataFileServant>();

            DataFileServant.Instance = servantMock.Object;

            const string filePath        = "201306158F341A2D6FD7416B87073A0132DD51AE.chk.20150627111406.gathered";
            var          sut             = new GatheredDataFile(filePath);
            var          messageBodyMock = new Mock <MessageBody>(sut);

            servantMock.Setup(s => s.TryReleaseToken(sut.ClaimStoreRelativePath)).Returns(true).Verifiable();
            servantMock.Setup(s => s.TryMoveFile(filePath, It.Is <string>(path => path.Tokenize().State == ReleasedDataFile.STATE_TOKEN))).Returns(true).Verifiable();

            sut.Release(messageBodyMock.Object);

            servantMock.VerifyAll();
        }
        public void ReleaseTransitionsToAwaitingRetryDataFileWhenOperationFails()
        {
            var servantMock = new Mock <DataFileServant>();

            DataFileServant.Instance = servantMock.Object;

            const string filePath        = "201306158F341A2D6FD7416B87073A0132DD51AE.chk.20150627111406.gathered";
            var          sut             = new GatheredDataFile(filePath);
            var          messageBodyMock = new Mock <MessageBody>(sut);

            messageBodyMock.SetupAllProperties();

            servantMock.Setup(s => s.TryReleaseToken(sut.ClaimStoreRelativePath)).Returns(true);
            servantMock.Setup(s => s.TryMoveFile(filePath, It.IsAny <string>())).Returns(false);

            sut.Release(messageBodyMock.Object);

            messageBodyMock.Object.DataFile.Should().BeOfType <AwaitingRetryDataFile>();
        }
        public void LockTransitionsToNewGatheredDataFileWhenOperationSucceeds()
        {
            var servantMock = new Mock <DataFileServant>();

            DataFileServant.Instance = servantMock.Object;

            const string filePath        = "201306158F341A2D6FD7416B87073A0132DD51AE.chk.20150627111406.gathered";
            var          sut             = new GatheredDataFile(filePath);
            var          messageBodyMock = new Mock <MessageBody>(sut);

            messageBodyMock.SetupAllProperties();

            servantMock.Setup(s => s.TryMoveFile(filePath, It.IsAny <string>())).Returns(true);

            sut.Lock(messageBodyMock.Object);

            messageBodyMock.Object.DataFile.Should().BeOfType <GatheredDataFile>();
            messageBodyMock.Object.DataFile.Should().NotBeSameAs(sut);
            (sut.Path.Tokenize().LockTime < messageBodyMock.Object.DataFile.Path.Tokenize().LockTime).Should().BeTrue();
        }
        internal override void Gather(MessageBody messageBody, string gatheringDirectory)
        {
            if (gatheringDirectory.IsNullOrEmpty())
            {
                throw new ArgumentNullException(nameof(gatheringDirectory));
            }

            if (_logger.IsDebugEnabled)
            {
                _logger.Debug($"Gathering {this}.");
            }

            var claimStoreAbsolutePath = System.IO.Path.Combine(gatheringDirectory, ClaimStoreRelativePath);
            var gatheredDataFile       = new GatheredDataFile(this);
            // message body is not moved but copied to central claim store; it will be deleted only after it has been
            // successfully gathered and released
            var result = DataFileServant.Instance.TryCreateDirectory(claimStoreAbsolutePath) &&
                         DataFileServant.Instance.TryCopyFile(Path, claimStoreAbsolutePath) &&
                         DataFileServant.Instance.TryMoveFile(Path, gatheredDataFile.Path);

            messageBody.DataFile = result
                                ? gatheredDataFile
                                : new AwaitingRetryDataFile(this);
        }