public async Task GivenExistingDataset_WhenStoring_TheServerShouldReturnConflict()
        {
            var studyInstanceUID = TestUidGenerator.Generate();

            try
            {
                DicomFile dicomFile1 = Samples.CreateRandomDicomFile(studyInstanceUID);

                using DicomWebResponse <DicomDataset> response = await _instancesManager.StoreAsync(new[] { dicomFile1 });

                Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                DicomDataset dataset = await response.GetValueAsync();

                await ValidateReferencedSopSequenceAsync(
                    response,
                    ConvertToReferencedSopSequenceEntry(dicomFile1.Dataset));

                Assert.False(dataset.TryGetSequence(DicomTag.FailedSOPSequence, out DicomSequence _));

                DicomWebException exception = await Assert.ThrowsAsync <DicomWebException>(
                    () => _instancesManager.StoreAsync(new[] { dicomFile1 }));

                Assert.Equal(HttpStatusCode.Conflict, exception.StatusCode);

                ValidationHelpers.ValidateFailedSopSequence(
                    exception.ResponseDataset,
                    ConvertToFailedSopSequenceEntry(dicomFile1.Dataset, SopInstanceAlreadyExistsFailureCode));
            }
            finally
            {
                await _client.DeleteStudyAsync(studyInstanceUID);
            }
        }
Ejemplo n.º 2
0
        private async Task <DicomDataset> PostDicomFileAsync(ResourceType resourceType, string studyInstanceUid, string seriesInstanceUid = null, string sopInstanceUid = null, DicomDataset dataSet = null)
        {
            DicomFile dicomFile = null;

            switch (resourceType)
            {
            case ResourceType.Study:
                dicomFile = Samples.CreateRandomDicomFile(studyInstanceUid);
                break;

            case ResourceType.Series:
                dicomFile = Samples.CreateRandomDicomFile(studyInstanceUid, seriesInstanceUid);
                break;

            case ResourceType.Instance:
                dicomFile = Samples.CreateRandomDicomFile(studyInstanceUid, seriesInstanceUid, sopInstanceUid);
                break;
            }

            if (dataSet != null)
            {
                dicomFile.Dataset.AddOrUpdate(dataSet);
            }

            using DicomWebResponse <DicomDataset> response = await _instancesManager.StoreAsync(new[] { dicomFile });

            return(dicomFile.Dataset);
        }
Ejemplo n.º 3
0
        public async Task GivenAnExistingDicomInstance_WhenStatusIsUpdated_ThenStatusShouldBeUpdated()
        {
            string studyInstanceUid  = TestUidGenerator.Generate();
            string seriesInstanceUid = TestUidGenerator.Generate();
            string sopInstanceUid    = TestUidGenerator.Generate();

            DicomDataset dataset = Samples.CreateRandomDicomFile(studyInstanceUid, seriesInstanceUid, sopInstanceUid).Dataset;

            long version = await _indexDataStore.BeginCreateInstanceIndexAsync(DefaultPartition.Key, dataset);

            Instance instance = await _testHelper.GetInstanceAsync(studyInstanceUid, seriesInstanceUid, sopInstanceUid, version);

            Assert.NotNull(instance);

            DateTimeOffset lastStatusUpdatedDate = instance.LastStatusUpdatedDate;

            // Make sure there is delay between.
            await Task.Delay(50);

            await _indexDataStore.EndCreateInstanceIndexAsync(DefaultPartition.Key, dataset, version);

            IReadOnlyList <Instance> instances = await _testHelper.GetInstancesAsync(studyInstanceUid, seriesInstanceUid, sopInstanceUid);

            Assert.NotNull(instances);
            Assert.Single(instances);

            Instance updatedInstance = instances[0];

            Assert.Equal((byte)IndexStatus.Created, updatedInstance.Status);
            Assert.True(updatedInstance.LastStatusUpdatedDate > lastStatusUpdatedDate);
        }
        public async Task GivenAMultipartRequestWithTypeParameterAndFirstSectionWithoutContentType_WhenStoring_TheServerShouldReturnOK()
        {
            var multiContent = new MultipartContent("related");

            multiContent.Headers.ContentType.Parameters.Add(new System.Net.Http.Headers.NameValueHeaderValue("type", $"\"{DicomWebConstants.MediaTypeApplicationDicom.MediaType}\""));

            string studyInstanceUID = TestUidGenerator.Generate();

            try
            {
                DicomFile dicomFile = Samples.CreateRandomDicomFile(studyInstanceUID);

                await using (MemoryStream stream = _recyclableMemoryStreamManager.GetStream())
                {
                    await dicomFile.SaveAsync(stream);

                    var byteContent = new ByteArrayContent(stream.ToArray());
                    multiContent.Add(byteContent);
                }

                using DicomWebResponse <DicomDataset> response = await _instancesManager.StoreAsync(multiContent, instanceId : DicomInstanceId.FromDicomFile(dicomFile));

                Assert.Equal(HttpStatusCode.OK, response.StatusCode);

                await ValidateReferencedSopSequenceAsync(
                    response,
                    ConvertToReferencedSopSequenceEntry(dicomFile.Dataset));
            }
            finally
            {
                await _client.DeleteStudyAsync(studyInstanceUID);
            }
        }
Ejemplo n.º 5
0
        private static DicomDataset CreateTestDicomDataset(string studyInstanceUid = null, string seriesInstanceUid = null, string sopInstanceUid = null)
        {
            if (string.IsNullOrEmpty(studyInstanceUid))
            {
                studyInstanceUid = TestUidGenerator.Generate();
            }

            if (string.IsNullOrEmpty(seriesInstanceUid))
            {
                seriesInstanceUid = TestUidGenerator.Generate();
            }

            if (string.IsNullOrEmpty(sopInstanceUid))
            {
                sopInstanceUid = TestUidGenerator.Generate();
            }

            DicomDataset dataset = Samples.CreateRandomDicomFile(studyInstanceUid, seriesInstanceUid, sopInstanceUid).Dataset;

            dataset.Remove(DicomTag.PatientID);

            dataset.Add(DicomTag.PatientID, "pid");
            dataset.Add(DicomTag.PatientName, "pname");
            dataset.Add(DicomTag.ReferringPhysicianName, "rname");
            dataset.Add(DicomTag.StudyDate, "20200301");
            dataset.Add(DicomTag.StudyDescription, "sd");
            dataset.Add(DicomTag.AccessionNumber, "an");
            dataset.Add(DicomTag.Modality, "M");
            dataset.Add(DicomTag.PerformedProcedureStepStartDate, "20200302");
            return(dataset);
        }
        public async Task GivenOneDifferentStudyInstanceUID_WhenStoringWithProvidedStudyInstanceUID_TheServerShouldReturnAccepted()
        {
            var studyInstanceUID1 = TestUidGenerator.Generate();
            var studyInstanceUID2 = TestUidGenerator.Generate();

            try
            {
                DicomFile dicomFile1 = Samples.CreateRandomDicomFile(studyInstanceUid: studyInstanceUID1);
                DicomFile dicomFile2 = Samples.CreateRandomDicomFile(studyInstanceUid: studyInstanceUID2);

                using DicomWebResponse <DicomDataset> response = await _instancesManager.StoreAsync(new[] { dicomFile1, dicomFile2 }, studyInstanceUid : studyInstanceUID1);

                Assert.Equal(HttpStatusCode.Accepted, response.StatusCode);

                DicomDataset dataset = await response.GetValueAsync();

                Assert.NotNull(dataset);
                Assert.True(dataset.Count() == 3);

                Assert.EndsWith($"studies/{studyInstanceUID1}", dataset.GetSingleValue <string>(DicomTag.RetrieveURL));

                await ValidateReferencedSopSequenceAsync(
                    response,
                    ConvertToReferencedSopSequenceEntry(dicomFile1.Dataset));

                ValidationHelpers.ValidateFailedSopSequence(
                    dataset,
                    ConvertToFailedSopSequenceEntry(dicomFile2.Dataset, MismatchStudyInstanceUidFailureCode));
            }
            finally
            {
                await _client.DeleteStudyAsync(studyInstanceUID1);
            }
        }
Ejemplo n.º 7
0
        public async Task GivenDatasetInstancesWithDifferentPartitions_WhenDeleted_OneDeletedAndOtherRemains()
        {
            var newPartition1 = TestUidGenerator.Generate();
            var newPartition2 = TestUidGenerator.Generate();

            string studyInstanceUID  = TestUidGenerator.Generate();
            string seriesInstanceUID = TestUidGenerator.Generate();
            string sopInstanceUID    = TestUidGenerator.Generate();

            DicomFile dicomFile = Samples.CreateRandomDicomFile(studyInstanceUID, seriesInstanceUID, sopInstanceUID);

            using DicomWebResponse <DicomDataset> response1 = await _instancesManager.StoreAsync(new[] { dicomFile }, partitionName : newPartition1);

            using DicomWebResponse <DicomDataset> response2 = await _instancesManager.StoreAsync(new[] { dicomFile }, partitionName : newPartition2);

            using DicomWebResponse response3 = await _client.DeleteInstanceAsync(studyInstanceUID, seriesInstanceUID, sopInstanceUID, newPartition1);

            Assert.True(response3.IsSuccessStatusCode);

            await Assert.ThrowsAsync <DicomWebException>(() => _client.RetrieveInstanceAsync(studyInstanceUID, seriesInstanceUID, sopInstanceUID, partitionName: newPartition1));

            using DicomWebResponse <DicomFile> response5 = await _client.RetrieveInstanceAsync(studyInstanceUID, seriesInstanceUID, sopInstanceUID, partitionName : newPartition2);

            Assert.True(response5.IsSuccessStatusCode);
        }
Ejemplo n.º 8
0
        public async Task GivenMatchingStudiesInDifferentPartitions_WhenSearchForStudySeriesLevel_OnePartitionMatchesResult()
        {
            var newPartition1 = TestUidGenerator.Generate();
            var newPartition2 = TestUidGenerator.Generate();

            var studyUid = TestUidGenerator.Generate();

            DicomFile file1 = Samples.CreateRandomDicomFile(studyUid);

            file1.Dataset.AddOrUpdate(new DicomDataset()
            {
                { DicomTag.Modality, "MRI" },
            });

            DicomFile file2 = Samples.CreateRandomDicomFile(studyUid);

            file2.Dataset.AddOrUpdate(new DicomDataset()
            {
                { DicomTag.Modality, "MRI" },
            });

            using DicomWebResponse <DicomDataset> response1 = await _instancesManager.StoreAsync(new[] { file1 }, partitionName : newPartition1);

            using DicomWebResponse <DicomDataset> response2 = await _instancesManager.StoreAsync(new[] { file2 }, partitionName : newPartition2);

            using DicomWebAsyncEnumerableResponse <DicomDataset> response = await _client.QueryStudySeriesAsync(studyUid, "Modality=MRI", newPartition1);

            DicomDataset[] datasets = await response.ToArrayAsync();

            Assert.Single(datasets);
            ValidationHelpers.ValidateResponseDataset(QueryResource.StudySeries, file1.Dataset, datasets[0]);
        }
        public async Task GivenStoredDicomFileWithNoContent_WhenRetrieved_TheFileIsRetrievedCorrectly()
        {
            var       studyInstanceUid = TestUidGenerator.Generate();
            DicomFile dicomFile1       = Samples.CreateRandomDicomFile(studyInstanceUid);
            var       dicomInstance    = dicomFile1.Dataset.ToInstanceIdentifier();
            DicomWebResponse <DicomDataset> response = await _client.StoreAsync(new[] { dicomFile1 }, studyInstanceUid);

            DicomSequence successSequence = response.Value.GetSequence(DicomTag.ReferencedSOPSequence);

            string studyRetrieveLocation    = response.Value.GetSingleValue <string>(DicomTag.RetrieveURL);
            string instanceRetrieveLocation = successSequence.Items[0].GetSingleValue <string>(DicomTag.RetrieveURL);

            DicomWebResponse <IReadOnlyList <DicomFile> > studyByUrlRetrieve = await _client.RetrieveInstancesAsync(new Uri(studyRetrieveLocation));

            ValidateRetrieveTransaction(studyByUrlRetrieve, HttpStatusCode.OK, DicomTransferSyntax.ExplicitVRLittleEndian, singleInstance: false, dicomFile1);

            DicomWebResponse <IReadOnlyList <DicomFile> > instanceByUrlRetrieve = await _client.RetrieveInstancesAsync(new Uri(instanceRetrieveLocation), true);

            ValidateRetrieveTransaction(instanceByUrlRetrieve, HttpStatusCode.OK, DicomTransferSyntax.ExplicitVRLittleEndian, singleInstance: true, dicomFile1);

            DicomWebResponse <IReadOnlyList <DicomFile> > studyRetrieve = await _client.RetrieveStudyAsync(dicomInstance.StudyInstanceUid);

            ValidateRetrieveTransaction(studyRetrieve, HttpStatusCode.OK, DicomTransferSyntax.ExplicitVRLittleEndian, singleInstance: false, dicomFile1);

            DicomWebResponse <IReadOnlyList <DicomFile> > seriesRetrieve = await _client.RetrieveSeriesAsync(dicomInstance.StudyInstanceUid, dicomInstance.SeriesInstanceUid);

            ValidateRetrieveTransaction(seriesRetrieve, HttpStatusCode.OK, DicomTransferSyntax.ExplicitVRLittleEndian, singleInstance: false, dicomFile1);

            DicomWebResponse <IReadOnlyList <DicomFile> > instanceRetrieve = await _client.RetrieveInstanceAsync(dicomInstance.StudyInstanceUid, dicomInstance.SeriesInstanceUid, dicomInstance.SopInstanceUid);

            ValidateRetrieveTransaction(instanceRetrieve, HttpStatusCode.OK, DicomTransferSyntax.ExplicitVRLittleEndian, singleInstance: true, dicomFile1);
        }
Ejemplo n.º 10
0
        private async Task <DicomDataset> PostDicomFileAsync(ResourceType resourceType, string studyInstanceUid, string seriesInstanceUid = null, string sopInstanceUid = null, DicomDataset dataSet = null)
        {
            DicomFile dicomFile = null;

            switch (resourceType)
            {
            case ResourceType.Study:
                dicomFile = Samples.CreateRandomDicomFile(studyInstanceUid);
                break;

            case ResourceType.Series:
                dicomFile = Samples.CreateRandomDicomFile(studyInstanceUid, seriesInstanceUid);
                break;

            case ResourceType.Instance:
                dicomFile = Samples.CreateRandomDicomFile(studyInstanceUid, seriesInstanceUid, sopInstanceUid);
                break;
            }

            if (dataSet != null)
            {
                dicomFile.Dataset.AddOrUpdate(dataSet);
            }

            using (DicomWebResponse <DicomDataset> response = await _client.StoreAsync(new[] { dicomFile }))
            {
                Assert.Equal(HttpStatusCode.OK, response.StatusCode);
            }

            return(dicomFile.Dataset);
        }
Ejemplo n.º 11
0
        public async void StoreSinglepartWithStudyUID_ServerShouldReturnOK()
        {
            var       studyInstanceUID = TestUidGenerator.Generate();
            DicomFile dicomFile        = Samples.CreateRandomDicomFile(studyInstanceUid: studyInstanceUID);
            DicomWebResponse <DicomDataset> response = await _client.StoreAsync(dicomFile, studyInstanceUID);

            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
        }
Ejemplo n.º 12
0
        private async Task <InstanceIdentifier> CreateDicomFileAndGetInstanceIdentifierAsync()
        {
            string             studyInstanceUid = TestUidGenerator.Generate();
            DicomFile          dicomFile        = Samples.CreateRandomDicomFile(studyInstanceUid);
            InstanceIdentifier dicomInstance    = dicomFile.Dataset.ToInstanceIdentifier();
            await _client.StoreAsync(new[] { dicomFile }, studyInstanceUid);

            return(dicomInstance);
        }
Ejemplo n.º 13
0
        public async Task StoreSinglepartWithStudyUID_ServerShouldReturnOK()
        {
            var       studyInstanceUID = TestUidGenerator.Generate();
            DicomFile dicomFile        = Samples.CreateRandomDicomFile(studyInstanceUid: studyInstanceUID);

            using DicomWebResponse <DicomDataset> response = await _instancesManager.StoreAsync(dicomFile, studyInstanceUid : studyInstanceUID);

            Assert.Equal(KnownContentTypes.ApplicationDicomJson, response.ContentHeaders.ContentType.MediaType);
            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
        }
        public async Task StoreSinglepart_ServerShouldReturnOK()
        {
            DicomFile dicomFile = Samples.CreateRandomDicomFile();

            await using MemoryStream stream = _recyclableMemoryStreamManager.GetStream();
            await dicomFile.SaveAsync(stream);

            using DicomWebResponse <DicomDataset> response = await _client.StoreAsync(stream);

            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
        }
        public async Task GivenInstanceWithoutPixelData_WhenRetrieveStudy_ThenThenServerShouldReturnExpectedContent()
        {
            var       studyInstanceUid = TestUidGenerator.Generate();
            DicomFile dicomFile1       = Samples.CreateRandomDicomFile(studyInstanceUid);

            await InternalStoreAsync(new[] { dicomFile1 });

            DicomWebResponse <IReadOnlyList <DicomFile> > studyRetrieve = await _client.RetrieveStudyAsync(studyInstanceUid, dicomTransferSyntax : "*");

            Assert.Equal(dicomFile1.ToByteArray(), studyRetrieve.Value[0].ToByteArray());
        }
Ejemplo n.º 16
0
        public async Task GivenAPendingDicomInstance_WhenAdded_ThenPendingDicomInstanceExceptionShouldBeThrown()
        {
            string studyInstanceUid  = TestUidGenerator.Generate();
            string seriesInstanceUid = TestUidGenerator.Generate();
            string sopInstanceUid    = TestUidGenerator.Generate();

            DicomDataset dataset = Samples.CreateRandomDicomFile(studyInstanceUid, seriesInstanceUid, sopInstanceUid).Dataset;

            await _indexDataStore.CreateInstanceIndexAsync(dataset);

            await Assert.ThrowsAsync <PendingInstanceException>(() => _indexDataStore.CreateInstanceIndexAsync(dataset));
        }
Ejemplo n.º 17
0
        public async Task GivenStoreRequest_WhenStoringUsingStudyInstanceUid_ThenAuditLogEntriesShouldBeCreated()
        {
            string             studyInstanceUid = TestUidGenerator.Generate();
            DicomFile          dicomFile        = Samples.CreateRandomDicomFile(studyInstanceUid);
            InstanceIdentifier dicomInstance    = dicomFile.Dataset.ToInstanceIdentifier();

            await ExecuteAndValidate(
                () => _client.StoreAsync(new[] { dicomFile }, studyInstanceUid),
                AuditEventSubType.Store,
                $"studies/{dicomInstance.StudyInstanceUid}",
                HttpStatusCode.OK);
        }
Ejemplo n.º 18
0
        public async Task StoreSinglepart_ServerShouldReturnOK()
        {
            DicomFile dicomFile = Samples.CreateRandomDicomFile();

            await using MemoryStream stream = _recyclableMemoryStreamManager.GetStream();
            await dicomFile.SaveAsync(stream);

            using DicomWebResponse <DicomDataset> response = await _instancesManager.StoreAsync(stream, instanceId : DicomInstanceId.FromDicomFile(dicomFile));

            Assert.Equal(KnownContentTypes.ApplicationDicomJson, response.ContentHeaders.ContentType.MediaType);
            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
        }
Ejemplo n.º 19
0
        public async Task GivenInstanceWithoutPixelData_WhenRetrieveInstance_ThenServerShouldReturnExpectedContent()
        {
            var       studyInstanceUid  = TestUidGenerator.Generate();
            var       seriesInstanceUid = TestUidGenerator.Generate();
            var       sopInstanceUid    = TestUidGenerator.Generate();
            DicomFile dicomFile1        = Samples.CreateRandomDicomFile(studyInstanceUid, seriesInstanceUid, sopInstanceUid);
            await _instancesManager.StoreAsync(new[] { dicomFile1 });

            using DicomWebResponse <DicomFile> instanceRetrieve = await _client.RetrieveInstanceAsync(studyInstanceUid, seriesInstanceUid, sopInstanceUid, dicomTransferSyntax : "*");

            Assert.Equal(dicomFile1.ToByteArray(), (await instanceRetrieve.GetValueAsync()).ToByteArray());
        }
Ejemplo n.º 20
0
        private async Task <DicomDataset> PostDicomFileAsync(DicomDataset metadataItems = null)
        {
            DicomFile dicomFile1 = Samples.CreateRandomDicomFile();

            if (metadataItems != null)
            {
                dicomFile1.Dataset.AddOrUpdate(metadataItems);
            }

            await _instancesManager.StoreAsync(new[] { dicomFile1 });

            return(dicomFile1.Dataset);
        }
Ejemplo n.º 21
0
        public async Task GivenAnExistingDicomInstance_WhenAdded_ThenDicomInstanceAlreadyExistsExceptionShouldBeThrown()
        {
            string studyInstanceUid  = TestUidGenerator.Generate();
            string seriesInstanceUid = TestUidGenerator.Generate();
            string sopInstanceUid    = TestUidGenerator.Generate();

            DicomDataset dataset = Samples.CreateRandomDicomFile(studyInstanceUid, seriesInstanceUid, sopInstanceUid).Dataset;

            long version = await _indexDataStore.BeginCreateInstanceIndexAsync(DefaultPartition.Key, dataset);

            await _indexDataStore.EndCreateInstanceIndexAsync(DefaultPartition.Key, dataset, version);

            await Assert.ThrowsAsync <InstanceAlreadyExistsException>(() => _indexDataStore.BeginCreateInstanceIndexAsync(DefaultPartition.Key, dataset));
        }
Ejemplo n.º 22
0
        public async Task GivenDatasetWithInvalidUid_WhenStoring_TheServerShouldReturnConflict(string studyInstanceUID)
        {
            DicomFile dicomFile1 = Samples.CreateRandomDicomFile(studyInstanceUID, validateItems: false);

            DicomWebException exception = await Assert.ThrowsAsync <DicomWebException>(() => _instancesManager.StoreAsync(new[] { dicomFile1 }));

            Assert.Equal(HttpStatusCode.Conflict, exception.StatusCode);

            Assert.False(exception.ResponseDataset.TryGetSequence(DicomTag.ReferencedSOPSequence, out DicomSequence _));

            ValidationHelpers.ValidateFailedSopSequence(
                exception.ResponseDataset,
                ConvertToFailedSopSequenceEntry(dicomFile1.Dataset, ValidationFailedFailureCode));
        }
        public async Task GivenInstanceWithoutPixelData_WhenRetrieveStudy_ThenThenServerShouldReturnExpectedContent()
        {
            var       studyInstanceUid = TestUidGenerator.Generate();
            DicomFile dicomFile1       = Samples.CreateRandomDicomFile(studyInstanceUid);
            await _instancesManager.StoreAsync(new[] { dicomFile1 });

            using DicomWebAsyncEnumerableResponse <DicomFile> response = await _client.RetrieveStudyAsync(studyInstanceUid, dicomTransferSyntax : "*");

            DicomFile[] studyRetrieve = await response.ToArrayAsync();

            Assert.Equal(
                new[] { dicomFile1.ToByteArray() },
                studyRetrieve.Select(item => item.ToByteArray()));
        }
Ejemplo n.º 24
0
        public async Task GivenDatasetWithNewPartitionName_WhenStoringWithStudyUid_TheServerShouldReturnWithNewPartition()
        {
            var newPartition = TestUidGenerator.Generate();

            var       studyInstanceUID = TestUidGenerator.Generate();
            DicomFile dicomFile        = Samples.CreateRandomDicomFile(studyInstanceUid: studyInstanceUID);

            using DicomWebResponse <DicomDataset> response = await _instancesManager.StoreAsync(dicomFile, studyInstanceUID, newPartition);

            Assert.True(response.IsSuccessStatusCode);

            ValidationHelpers.ValidateReferencedSopSequence(
                await response.GetValueAsync(),
                ConvertToReferencedSopSequenceEntry(dicomFile.Dataset, newPartition));
        }
Ejemplo n.º 25
0
        public async void GivenDatasetWithDuplicateIdentifiers_WhenStoring_TheServerShouldReturnConflict()
        {
            var       studyInstanceUID = TestUidGenerator.Generate();
            DicomFile dicomFile1       = Samples.CreateRandomDicomFile(studyInstanceUID, studyInstanceUID);

            DicomWebException <DicomDataset> exception = await Assert.ThrowsAsync <DicomWebException <DicomDataset> >(
                () => _client.StoreAsync(new[] { dicomFile1 }));

            Assert.Equal(HttpStatusCode.Conflict, exception.StatusCode);
            Assert.False(exception.Value.TryGetSequence(DicomTag.ReferencedSOPSequence, out DicomSequence _));

            ValidationHelpers.ValidateFailedSopSequence(
                exception.Value,
                ConvertToFailedSopSequenceEntry(dicomFile1.Dataset, ValidationFailedFailureCode));
        }
Ejemplo n.º 26
0
        public async Task GivenAnExistingDicomInstance_WhenAdded_ThenDicomInstanceAlreadyExistsExceptionShouldBeThrown()
        {
            string studyInstanceUid  = TestUidGenerator.Generate();
            string seriesInstanceUid = TestUidGenerator.Generate();
            string sopInstanceUid    = TestUidGenerator.Generate();

            DicomDataset dataset = Samples.CreateRandomDicomFile(studyInstanceUid, seriesInstanceUid, sopInstanceUid).Dataset;

            long version = await _indexDataStore.CreateInstanceIndexAsync(dataset);

            await _indexDataStore.UpdateInstanceIndexStatusAsync(
                dataset.ToVersionedInstanceIdentifier(version),
                IndexStatus.Created);

            await Assert.ThrowsAsync <InstanceAlreadyExistsException>(() => _indexDataStore.CreateInstanceIndexAsync(dataset));
        }
Ejemplo n.º 27
0
        public async void GivenAMultipartRequestWithAnInvalidMultipartSection_WhenStoring_TheServerShouldReturnAccepted()
        {
            var request = new HttpRequestMessage(HttpMethod.Post, "studies");

            request.Headers.Add(HeaderNames.Accept, DicomWebClient.MediaTypeApplicationDicomJson.MediaType);

            var multiContent = new MultipartContent("related");

            multiContent.Headers.ContentType.Parameters.Add(new System.Net.Http.Headers.NameValueHeaderValue("type", $"\"{DicomWebClient.MediaTypeApplicationDicom.MediaType}\""));

            var byteContent = new ByteArrayContent(Array.Empty <byte>());

            byteContent.Headers.ContentType = DicomWebClient.MediaTypeApplicationDicom;
            multiContent.Add(byteContent);

            string studyInstanceUID = TestUidGenerator.Generate();

            try
            {
                DicomFile validFile = Samples.CreateRandomDicomFile(studyInstanceUID);

                await using (MemoryStream stream = _recyclableMemoryStreamManager.GetStream())
                {
                    await validFile.SaveAsync(stream);

                    var validByteContent = new ByteArrayContent(stream.ToArray());
                    validByteContent.Headers.ContentType = DicomWebClient.MediaTypeApplicationDicom;
                    multiContent.Add(validByteContent);
                }

                request.Content = multiContent;

                DicomWebResponse <DicomDataset> response = await _client.PostMultipartContentAsync(multiContent, "studies");

                Assert.Equal(HttpStatusCode.Accepted, response.StatusCode);

                ValidationHelpers.ValidateReferencedSopSequence(
                    response.Value,
                    ConvertToReferencedSopSequenceEntry(validFile.Dataset));
            }
            finally
            {
                await _client.DeleteStudyAsync(studyInstanceUID);
            }
        }
Ejemplo n.º 28
0
        public async void GivenAllDifferentStudyInstanceUIDs_WhenStoringWithProvidedStudyInstanceUID_TheServerShouldReturnConflict()
        {
            DicomFile dicomFile1 = Samples.CreateRandomDicomFile();
            DicomFile dicomFile2 = Samples.CreateRandomDicomFile();

            var studyInstanceUID = TestUidGenerator.Generate();

            DicomWebException <DicomDataset> exception = await Assert.ThrowsAsync <DicomWebException <DicomDataset> >(() => _client.StoreAsync(
                                                                                                                          new[] { dicomFile1, dicomFile2 }, studyInstanceUID));

            Assert.Equal(HttpStatusCode.Conflict, exception.StatusCode);
            Assert.NotNull(exception.Value);
            Assert.True(exception.Value.Count() == 1);

            ValidationHelpers.ValidateFailedSopSequence(
                exception.Value,
                ConvertToFailedSopSequenceEntry(dicomFile1.Dataset, MismatchStudyInstanceUidFailureCode),
                ConvertToFailedSopSequenceEntry(dicomFile2.Dataset, MismatchStudyInstanceUidFailureCode));
        }
Ejemplo n.º 29
0
        public async Task WhenRetrievingPartitions_TheServerShouldReturnAllPartitions()
        {
            var newPartition1 = TestUidGenerator.Generate();
            var newPartition2 = TestUidGenerator.Generate();

            DicomFile dicomFile = Samples.CreateRandomDicomFile();

            using DicomWebResponse <DicomDataset> response1 = await _instancesManager.StoreAsync(new[] { dicomFile }, partitionName : newPartition1);

            using DicomWebResponse <DicomDataset> response2 = await _instancesManager.StoreAsync(new[] { dicomFile }, partitionName : newPartition2);

            using DicomWebResponse <IEnumerable <PartitionEntry> > response3 = await _client.GetPartitionsAsync();

            Assert.True(response3.IsSuccessStatusCode);

            IEnumerable <PartitionEntry> values = await response3.GetValueAsync();

            Assert.Contains(values, x => x.PartitionName == newPartition1);
            Assert.Contains(values, x => x.PartitionName == newPartition2);
        }
        public async Task GivenDatasetWithInvalidUid_WhenStoring_TheServerShouldReturnConflict(string studyInstanceUID)
        {
#pragma warning disable CS0618 // Type or member is obsolete
            DicomValidation.AutoValidation = false;
#pragma warning restore CS0618 // Type or member is obsolete

            DicomFile dicomFile1 = Samples.CreateRandomDicomFile(studyInstanceUID);

#pragma warning disable CS0618 // Type or member is obsolete
            DicomValidation.AutoValidation = true;
#pragma warning restore CS0618 // Type or member is obsolete

            DicomWebException exception = await Assert.ThrowsAsync <DicomWebException>(() => _client.StoreAsync(new[] { dicomFile1 }));

            Assert.Equal(HttpStatusCode.Conflict, exception.StatusCode);

            Assert.False(exception.ResponseDataset.TryGetSequence(DicomTag.ReferencedSOPSequence, out DicomSequence _));

            ValidationHelpers.ValidateFailedSopSequence(
                exception.ResponseDataset,
                ConvertToFailedSopSequenceEntry(dicomFile1.Dataset, ValidationFailedFailureCode));
        }