public async Task GivenSearchRequest_WithUnsupportedTag_ReturnBadRequest() { DicomWebException exception = await Assert.ThrowsAsync <DicomWebException>( () => _client.QueryAsync(new Uri("/studies?Modality=CT", UriKind.Relative))); Assert.Equal(HttpStatusCode.BadRequest, exception.StatusCode); Assert.Equal(exception.ResponseMessage, string.Format(DicomCoreResource.UnsupportedSearchParameter, "Modality", "study")); }
private static async Task Qido(Message message, CancellationToken token) { string relativeUrl = Encoding.UTF8.GetString(message.Body); await client.QueryAsync(relativeUrl, cancellationToken : token); return; }
public async Task GivenSearchRequest_WithValidParamsAndNoMatchingResult_ThenAuditLogEntriesShouldBeCreated() { await ExecuteAndValidate( () => _client.QueryAsync("/studies?StudyDate=20200101"), AuditEventSubType.Query, "studies?StudyDate=20200101", HttpStatusCode.NoContent); }
public async Task GivenDicomRequest_WithNoAuthenticationToken_ReturnUnauthorized() { if (AuthenticationSettings.SecurityEnabled) { IDicomWebClient client = _fixture.GetDicomWebClient(TestApplications.InvalidClient); DicomWebException exception = await Assert.ThrowsAsync <DicomWebException>( () => client.QueryAsync("/studies")); Assert.Equal(HttpStatusCode.Unauthorized, exception.StatusCode); } }
private async Task EnsureFileIsStoredAsync(DicomFile dicomFile) { var instanceId = dicomFile.Dataset.ToInstanceIdentifier(); DicomWebResponse <IEnumerable <DicomDataset> > tryQuery = await _client.QueryAsync( $"/studies/{instanceId.StudyInstanceUid}/series/{instanceId.SeriesInstanceUid}/instances?SOPInstanceUID={instanceId.SopInstanceUid}"); if (tryQuery.StatusCode == HttpStatusCode.OK) { await _client.DeleteStudyAsync(instanceId.StudyInstanceUid); } await InternalStoreAsync(new[] { dicomFile }); }
public async Task GivenInputAndOutputTransferSyntax_WhenRetrieveFrame_ThenServerShouldReturnExpectedContent(string testDataFolder, string mediaType, string transferSyntax) { TranscoderTestData transcoderTestData = TranscoderTestDataHelper.GetTestData(testDataFolder); DicomFile inputDicomFile = await DicomFile.OpenAsync(transcoderTestData.InputDicomFile); int numberOfFrames = DicomPixelData.Create(inputDicomFile.Dataset).NumberOfFrames; string studyInstanceUid = inputDicomFile.Dataset.GetString(DicomTag.StudyInstanceUID); string seriesInstanceUid = inputDicomFile.Dataset.GetString(DicomTag.SeriesInstanceUID); string sopInstanceUid = inputDicomFile.Dataset.GetString(DicomTag.SOPInstanceUID); DicomWebResponse <IEnumerable <DicomDataset> > tryQuery = await _client.QueryAsync( $"/studies/{studyInstanceUid}/series/{seriesInstanceUid}/instances?SOPInstanceUID={sopInstanceUid}"); if (tryQuery.StatusCode == HttpStatusCode.OK) { await _client.DeleteStudyAsync(studyInstanceUid); } await _client.StoreAsync(new[] { inputDicomFile }); DicomWebResponse <IReadOnlyList <Stream> > response = await _client.RetrieveFramesAsync( studyInstanceUid : studyInstanceUid, seriesInstanceUid : seriesInstanceUid, sopInstanceUid : sopInstanceUid, mediaType : mediaType, dicomTransferSyntax : transferSyntax, frames : GenerateFrames(numberOfFrames), cancellationToken : _defaultCancellationToken); Assert.Equal(HttpStatusCode.OK, response.StatusCode); string byteStreamHash = TranscoderTestDataHelper.GetHashFromStream(response.Value[0]); Assert.Equal(transcoderTestData.MetaData.OutputFramesHashCode, byteStreamHash); await _client.DeleteStudyAsync(studyInstanceUid); }
public async Task GivenValidExtendedQueryTags_WhenGoThroughEndToEndScenario_ThenShouldSucceed() { // Prepare 3 extended query tags. // One is private tag on Instance level // To add private tag, need to add identification code element at first. DicomTag identificationCodeTag = new DicomTag(0x0407, 0x0010); DicomElement identificationCodeElement = new DicomLongString(identificationCodeTag, PrivateCreatorName); DicomTag privateTag = new DicomTag(0x0407, 0x1001, PrivateCreatorName); AddExtendedQueryTagEntry privateQueryTag = new AddExtendedQueryTagEntry { Path = privateTag.GetPath(), VR = DicomVRCode.SS, Level = QueryTagLevel.Instance, PrivateCreator = privateTag.PrivateCreator.Creator }; // One is standard tag on Series level DicomTag standardTagSeries = DicomTag.ManufacturerModelName; AddExtendedQueryTagEntry standardTagSeriesQueryTag = new AddExtendedQueryTagEntry { Path = standardTagSeries.GetPath(), VR = standardTagSeries.GetDefaultVR().Code, Level = QueryTagLevel.Series }; // One is standard tag on Study level DicomTag standardTagStudy = DicomTag.PatientSex; AddExtendedQueryTagEntry standardTagStudyQueryTag = new AddExtendedQueryTagEntry { Path = standardTagStudy.GetPath(), VR = standardTagStudy.GetDefaultVR().Code, Level = QueryTagLevel.Study }; AddExtendedQueryTagEntry[] queryTags = new AddExtendedQueryTagEntry[] { privateQueryTag, standardTagSeriesQueryTag, standardTagStudyQueryTag }; // Create 3 test files on same studyUid. string studyUid = TestUidGenerator.Generate(); string seriesUid1 = TestUidGenerator.Generate(); string seriesUid2 = TestUidGenerator.Generate(); string instanceUid1 = TestUidGenerator.Generate(); string instanceUid2 = TestUidGenerator.Generate(); string instanceUid3 = TestUidGenerator.Generate(); // One is on seriesUid1 and instanceUid1 DicomDataset dataset1 = Samples.CreateRandomInstanceDataset(studyInstanceUid: studyUid, seriesInstanceUid: seriesUid1, sopInstanceUid: instanceUid1); dataset1.Add(identificationCodeElement); dataset1.AddOrUpdate(new DicomSignedShort(privateTag, 1)); dataset1.Add(standardTagSeries, "ManufacturerModelName1"); dataset1.Add(standardTagStudy, "0"); // One is on seriesUid1 and instanceUid2 DicomDataset dataset2 = Samples.CreateRandomInstanceDataset(studyInstanceUid: studyUid, seriesInstanceUid: seriesUid1, sopInstanceUid: instanceUid2); dataset2.Add(identificationCodeElement); dataset2.AddOrUpdate(new DicomSignedShort(privateTag, 2)); dataset2.Add(standardTagSeries, "ManufacturerModelName2"); dataset2.Add(standardTagStudy, "0"); // One is on seriesUid2 and instanceUid3 DicomDataset dataset3 = Samples.CreateRandomInstanceDataset(studyInstanceUid: studyUid, seriesInstanceUid: seriesUid2, sopInstanceUid: instanceUid3); dataset3.Add(identificationCodeElement); dataset3.AddOrUpdate(new DicomSignedShort(privateTag, 3)); dataset3.Add(standardTagSeries, "ManufacturerModelName3"); dataset3.Add(standardTagStudy, "1"); try { // Add extended query tags await _client.AddExtendedQueryTagAsync(queryTags); try { foreach (var queryTag in queryTags) { GetExtendedQueryTagEntry returnTag = await(await _client.GetExtendedQueryTagAsync(queryTag.Path)).GetValueAsync(); CompareExtendedQueryTagEntries(queryTag, returnTag); } // Upload test files IEnumerable <DicomFile> dicomFiles = new DicomDataset[] { dataset1, dataset2, dataset3 }.Select(dataset => new DicomFile(dataset)); await _client.StoreAsync(dicomFiles, studyInstanceUid : string.Empty, cancellationToken : default); // Query on instance for private tag DicomWebAsyncEnumerableResponse <DicomDataset> queryInstanceResponse = await _client.QueryAsync(new Uri($"/instances?{privateTag.GetPath()}=3", UriKind.Relative), cancellationToken : default); DicomDataset[] instanceResult = await queryInstanceResponse.ToArrayAsync(); Assert.Single(instanceResult); Assert.Equal(instanceUid3, instanceResult[0].GetSingleValue <string>(DicomTag.SOPInstanceUID)); // Query on series for standardTagSeries DicomWebAsyncEnumerableResponse <DicomDataset> querySeriesResponse = await _client.QueryAsync(new Uri($"/series?{standardTagSeries.GetPath()}=ManufacturerModelName2", UriKind.Relative), cancellationToken : default); DicomDataset[] seriesResult = await querySeriesResponse.ToArrayAsync(); Assert.Single(seriesResult); Assert.Equal(seriesUid1, seriesResult[0].GetSingleValue <string>(DicomTag.SeriesInstanceUID)); // Query on study for standardTagStudy DicomWebAsyncEnumerableResponse <DicomDataset> queryStudyResponse = await _client.QueryAsync(new Uri($"/studies?{standardTagStudy.GetPath()}=1", UriKind.Relative), cancellationToken : default); DicomDataset[] studyResult = await queryStudyResponse.ToArrayAsync(); Assert.Single(studyResult); Assert.Equal(studyUid, seriesResult[0].GetSingleValue <string>(DicomTag.StudyInstanceUID)); } finally { await _client.DeleteStudyAsync(studyUid); } } finally { // Cleanup extended query tags, also verify GetExtendedQueryTagsAsync. var responseQueryTags = await(await _client.GetExtendedQueryTagsAsync()).GetValueAsync(); foreach (var rTag in responseQueryTags) { if (queryTags.Any(tag => tag.Path == rTag.Path)) { await _client.DeleteExtendedQueryTagAsync(rTag.Path); } } } }
private static void ProcessMessageWithQueryUrl(byte[] message) { DicomWebAsyncEnumerableResponse <DicomDataset> response = client.QueryAsync(Encoding.UTF8.GetString(message)).Result; }
private static async Task Qido(Message message, CancellationToken token) { var relativeUrl = new Uri(Encoding.UTF8.GetString(message.Body)); await s_client.QueryAsync(relativeUrl, cancellationToken : token); }
private static void ProcessMessageWithQueryUrl(Uri url) { s_client.QueryAsync(url).Wait(); }
private static void ProcessMessageWithQueryUrl(byte[] message) { client.QueryAsync(Encoding.UTF8.GetString(message)).Wait(); }