public async Task CanWriteReadAndDeleteContainer()
        {
            var sut       = CreateAzureBlobRdDataStorage(out var metadataStorage);
            var dataType  = nameof(DataBlob);
            var id        = "BlobStorageTestBlob";
            var dataBlob  = new DataBlob(id, new byte[] { 0x42, 0x43, 0x44 }, "myFile.bin");
            var payload   = DataEncoder.Encode(JsonConvert.SerializeObject(dataBlob));
            var submitter = "jdoe";
            var utcNow    = DateTime.UtcNow;
            var container = new GenericDataContainer(id, submitter, utcNow, submitter, utcNow, ApiVersion.Current, payload);

            if (await sut.ExistsAsync(dataType, id))
            {
                await sut.DeleteDataContainerAsync(dataType, id);
            }

            IdReservationResult idReservation = null;

            Assert.That(async() => idReservation = await sut.ReserveIdAsync(dataType, id, submitter), Throws.Nothing);
            Assert.That(idReservation.IsReserved, Is.True);

            Assert.That(() => sut.StoreAsync(dataType, container, true), Throws.Nothing);
            metadataStorage.Setup(x => x.GetFromIdAsync(dataType, id)).Returns(Task.FromResult(container));
            Assert.That(await sut.ExistsAsync(dataType, id), Is.True);

            GenericDataContainer retreivedContainer = null;

            Assert.That(async() => retreivedContainer = await sut.GetFromIdAsync(dataType, id), Throws.Nothing);
            Assert.That(retreivedContainer, Is.Not.Null);

            Assert.That(async() => await sut.DeleteDataContainerAsync(dataType, id), Throws.Nothing);
            metadataStorage.Setup(x => x.GetFromIdAsync(dataType, id)).Returns(Task.FromResult(default(GenericDataContainer)));
            Assert.That(await sut.ExistsAsync(dataType, id), Is.False);
        }
Exemple #2
0
        public async Task <IdReservationResult> ReserveIdAsync(string dataType, string id, string submitter)
        {
            if (await ExistsAsync(dataType, id))
            {
                return(IdReservationResult.Failed());
            }
            try
            {
                var isNewCollection = await IsNewCollection(dataType);

                var utcNow = DateTime.UtcNow;
                await metadataStorage.StoreAsync(
                    dataType,
                    new GenericDataContainer(id, submitter, utcNow, submitter, utcNow, ApiVersion.Current, new BsonDocument()),
                    false);

                var container = binaryDataStorage.GetContainer(dataType);
                await container.CreateIfNotExistsAsync();

                var blob = binaryDataStorage.GetBlob(dataType, id);
                await blob.WriteAsync(new MemoryStream(Encoding.ASCII.GetBytes("Reserved")));

                return(IdReservationResult.Success(id, isNewCollection));
            }
            catch (DocumentAlreadyExistsException)
            {
                return(IdReservationResult.Failed());
            }
        }
        public async Task <IdReservationResult> ReserveIdAsync(string dataType, string id, string submitter)
        {
            var isNewCollection = await IsNewCollectionAsync(dataType);

            if (isNewCollection)
            {
                await CreateTable(dataType);
            }
            else if (await ExistsAsync(dataType, id))
            {
                return(IdReservationResult.Failed());
            }
            var utcNow = DateTime.UtcNow;
            var query  = $"INSERT INTO {dataType} (Id,OriginalSubmitter,CreatedTimeUtc,Submitter,SubmissionTimeUtc) "
                         + $"VALUES ('{id}','{submitter}','{utcNow:yyyy-MM-dd HH:mm:ss}','{submitter}','{utcNow:yyyy-MM-dd HH:mm:ss}')";

            try
            {
                await sqlQueryExecutor.ExecuteQueryAsync(query);

                return(IdReservationResult.Success(id, isNewCollection));
            }
            catch
            {
                return(IdReservationResult.Failed());
            }
        }
Exemple #4
0
        public async Task RdDataStorageIdIsUsed()
        {
            var rdDataStorageId     = "RdDataStorageId";
            var idReservationResult = IdReservationResult.Success(rdDataStorageId, false);
            var rdDataStorage       = new Mock <IRdDataStorage>();

            rdDataStorage.Setup(x => x.GetIdsAsync(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>())).Returns(Task.FromResult(new List <IdReservationResult> {
                idReservationResult
            }));
            var obj        = new ClassWithoutId("Bob");
            var submitBody = new SubmitDataBody(nameof(ClassWithoutId), obj, false); // ! No ID provided !

            submitBody = JsonConvert.DeserializeObject <SubmitDataBody>(JsonConvert.SerializeObject(submitBody));
            var sut    = new DefaultIdPolicy();
            var actual = await sut.DetermineIdAsync(submitBody, Submitter, rdDataStorage.Object);

            Assert.That(actual.Id, Is.EqualTo(rdDataStorageId));
            rdDataStorage.Verify(x => x.GetIdsAsync(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>()), Times.Once);
        }
Exemple #5
0
        public async Task <IdReservationResult> ReserveIdAsync(string dataType, string id, string submitter)
        {
            var isNewCollection = await IsNewCollectionAsync(dataType);

            var collection = rdDataClient.DataDatabase.GetCollection <GenericDataContainer>(dataType);

            try
            {
                var utcNow = DateTime.UtcNow;
                await collection.InsertOneAsync(new GenericDataContainer(id, submitter, utcNow, submitter, utcNow, ApiVersion.Current, new BsonDocument()));

                return(IdReservationResult.Success(id, isNewCollection));
            }
            catch (MongoWriteException writeException)
            {
                if (writeException.WriteError.Category == ServerErrorCategory.DuplicateKey)
                {
                    return(IdReservationResult.Failed());
                }
                throw;
            }
        }
        public async Task <List <IdReservationResult> > GetIdsAsync(string dataType, string submitter, int count)
        {
            var tableSetup           = tableSetups[dataType];
            var reservationContainer = tableSetup.BuildReservationContainer(submitter);
            var reservationResults   = new List <IdReservationResult>();

            for (int i = 0; i < count; i++)
            {
                IdReservationResult reservationResult;
                try
                {
                    var storeResult = await StoreAsync(dataType, reservationContainer, false);

                    reservationResult = IdReservationResult.Success(storeResult.Id, storeResult.IsNewCollection);
                }
                catch (DocumentAlreadyExistsException)
                {
                    reservationResult = IdReservationResult.Failed();
                }
                reservationResults.Add(reservationResult);
            }
            return(reservationResults);
        }