public async Task TestResourceIsUpdatedShouldReturnAskedVersionOnVRead() { var resourceTracker = new InMemoryResourceTracker(); var repository = new IotaFhirRepository( IotaResourceProvider.Repository, new FhirJsonTryteSerializer(), resourceTracker, new RandomSeedManager()); var createdResource = await repository.CreateResourceAsync(FhirResourceProvider.Patient); var initialVersion = createdResource.VersionId; var updatedResource = await repository.UpdateResourceAsync(createdResource); var updatedVersionId = updatedResource.VersionId; await repository.UpdateResourceAsync(updatedResource); var readResource = await repository.ReadResourceVersionAsync(updatedVersionId); Assert.AreNotEqual(initialVersion, readResource.Meta.VersionId); Assert.AreEqual(updatedVersionId, readResource.Meta.VersionId); Assert.AreEqual(3, resourceTracker.Entries.First().ResourceRoots.Count); }
static DependencyResolver() { var iotaRepository = new CachedIotaRestRepository( new FallbackIotaClient(new List <string> { "https://nodes.devnet.thetangle.org:443" }, 5000), new PoWSrvService()); var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository); var subscriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, CurlMask.Default); var encryption = new RijndaelEncryption("somenicekey", "somenicesalt"); var resourceTracker = new SqlLiteResourceTracker(channelFactory, subscriptionFactory, encryption); var fhirRepository = new IotaFhirRepository( iotaRepository, new FhirJsonTryteSerializer(), resourceTracker, new SqlLiteDeterministicSeedManager( resourceTracker, new IssSigningHelper(new Curl(), new Curl(), new Curl()), new AddressGenerator(), iotaRepository, encryption)); var fhirParser = new FhirJsonParser(); var searchRepository = new SqlLiteSearchRepository(fhirParser); CreateResourceInteractor = new CreateResourceInteractor(fhirRepository, fhirParser, searchRepository); ReadResourceInteractor = new ReadResourceInteractor(fhirRepository, searchRepository); ValidateResourceInteractor = new ValidateResourceInteractor(fhirRepository, fhirParser); SearchResourcesInteractor = new SearchResourcesInteractor(fhirRepository, searchRepository); ResourceTracker = resourceTracker; }
public async Task TestResourceIsNotRegisteredInTrackerOnUpdateShouldThrowException() { var repository = new IotaFhirRepository( IotaResourceProvider.Repository, new FhirJsonTryteSerializer(), new InMemoryResourceTracker(), new RandomSeedManager()); await repository.UpdateResourceAsync(FhirResourceProvider.Patient); }
public async Task TestResourceCanBeReadFromTangle() { var resourceTracker = new InMemoryResourceTracker(); var iotaRepository = IotaResourceProvider.Repository; var repository = new IotaFhirRepository(iotaRepository, new FhirJsonTryteSerializer(), resourceTracker, new RandomSeedManager(resourceTracker)); var createdResource = await repository.CreateResourceAsync(FhirResourceProvider.Patient); var readResource = await repository.ReadResourceAsync(createdResource.Id); Assert.IsTrue(createdResource.IsExactly(readResource)); }
/// <inheritdoc /> protected override void Load(ContainerBuilder builder) { var connectionSupplier = new DefaultDbConnectionSupplier(); var iotaRepository = new CachedIotaRestRepository( new FallbackIotaClient(new List <string> { "https://nodes.devnet.thetangle.org:443" }, 5000), new PoWSrvService(), null, connectionSupplier, $"{DependencyResolver.LocalStoragePath}\\iotacache.sqlite"); var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository); var subscriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, CurlMask.Default); var encryption = new RijndaelEncryption("somenicekey", "somenicesalt"); var resourceTracker = new SqlLiteResourceTracker( channelFactory, subscriptionFactory, encryption, connectionSupplier, $"{DependencyResolver.LocalStoragePath}\\iotafhir.sqlite"); var seedManager = new SqlLiteDeterministicSeedManager( resourceTracker, new IssSigningHelper(new Curl(), new Curl(), new Curl()), new AddressGenerator(), iotaRepository, encryption, connectionSupplier, $"{DependencyResolver.LocalStoragePath}\\iotafhir.sqlite"); var fhirRepository = new IotaFhirRepository(iotaRepository, new FhirJsonTryteSerializer(), resourceTracker, seedManager); var fhirParser = new FhirJsonParser(); var searchRepository = new SqlLiteSearchRepository(fhirParser, connectionSupplier, $"{DependencyResolver.LocalStoragePath}\\resources.sqlite"); var createInteractor = new CreateResourceInteractor(fhirRepository, fhirParser, searchRepository); var readInteractor = new ReadResourceInteractor(fhirRepository, searchRepository); var validationInteractor = new ValidateResourceInteractor(fhirRepository, fhirParser); var searchInteractor = new SearchResourcesInteractor(fhirRepository, searchRepository); var resourceImporter = new ResourceImporter(searchRepository, fhirRepository, seedManager); builder.RegisterInstance(createInteractor); builder.RegisterInstance(readInteractor); builder.RegisterInstance(validationInteractor); builder.RegisterInstance(searchInteractor); builder.RegisterInstance(resourceImporter); builder.RegisterInstance(seedManager).As <ISeedManager>(); builder.RegisterInstance(subscriptionFactory); }
public async Task TestUpdatedResourceShouldReturnAllEntriesInHistory() { var resourceTracker = new InMemoryResourceTracker(); var iotaRepository = IotaResourceProvider.Repository; var repository = new IotaFhirRepository(iotaRepository, new FhirJsonTryteSerializer(), resourceTracker, new RandomSeedManager(resourceTracker)); var createdResource = await repository.CreateResourceAsync(FhirResourceProvider.Patient); var updatedResource = await repository.UpdateResourceAsync(createdResource); var resources = await repository.ReadResourceHistoryAsync(updatedResource.Id); Assert.AreEqual(2, resources.Count); }
private void InjectDependencies(IServiceCollection services) { var iotaRepository = new CachedIotaRestRepository( new FallbackIotaClient(new List <string> { "https://nodes.devnet.thetangle.org:443" }, 5000), new PoWService(new CpuPearlDiver())); var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository); var subscriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, CurlMask.Default); var encryption = new RijndaelEncryption("somenicekey", "somenicesalt"); var resourceTracker = new SqlLiteResourceTracker(channelFactory, subscriptionFactory, encryption); var seedManager = new SqlLiteDeterministicSeedManager( resourceTracker, new IssSigningHelper(new Curl(), new Curl(), new Curl()), new AddressGenerator(), iotaRepository, encryption); var fhirRepository = new IotaFhirRepository(iotaRepository, new FhirJsonTryteSerializer(), resourceTracker, seedManager); var fhirParser = new FhirJsonParser(); var searchRepository = new SqlLiteSearchRepository(fhirParser); var createInteractor = new CreateResourceInteractor(fhirRepository, fhirParser, searchRepository); var readInteractor = new ReadResourceInteractor(fhirRepository, searchRepository); var readVersionInteractor = new ReadResourceVersionInteractor(fhirRepository); var readHistoryInteractor = new ReadResourceHistoryInteractor(fhirRepository); var capabilitiesInteractor = new GetCapabilitiesInteractor(fhirRepository, new AppConfigSystemInformation(this.Configuration)); var validationInteractor = new ValidateResourceInteractor(fhirRepository, fhirParser); var searchInteractor = new SearchResourcesInteractor(fhirRepository, searchRepository); var deleteInteractor = new DeleteResourceInteractor(fhirRepository, searchRepository); var resourceImporter = new ResourceImporter(searchRepository, fhirRepository, seedManager); services.AddScoped(provider => createInteractor); services.AddScoped(provider => readInteractor); services.AddScoped(provider => capabilitiesInteractor); services.AddScoped(provider => validationInteractor); services.AddScoped(provider => searchInteractor); services.AddScoped(provider => resourceImporter); services.AddScoped(provider => readVersionInteractor); services.AddScoped(provider => readHistoryInteractor); services.AddScoped(provider => deleteInteractor); services.AddScoped <ISeedManager>(provider => seedManager); services.AddSingleton <IMemoryCache>(new Microsoft.Extensions.Caching.Memory.MemoryCache(new MemoryCacheOptions())); }
public async Task TestResourceIsReadOnlyShouldThrowException() { var resourceTracker = new InMemoryResourceTracker(); await resourceTracker.AddEntryAsync(new ResourceEntry { ResourceRoots = new List <string> { "SOMEID" } }); var repository = new IotaFhirRepository( IotaResourceProvider.Repository, new FhirJsonTryteSerializer(), resourceTracker, new RandomSeedManager()); var resource = FhirResourceProvider.Patient; resource.Id = "SOMEID"; await repository.UpdateResourceAsync(resource); }
public async Task TestResourceHasValidReferenceShouldUseExistingSeed() { var seedManager = new RandomSeedManager(); var repository = new IotaFhirRepository( IotaResourceProvider.Repository, new FhirJsonTryteSerializer(), new InMemoryResourceTracker(), seedManager); var reference = $"did:iota:JHAGDJAHDJAHGDAJHGD"; await seedManager.AddReferenceAsync(reference, Seed.Random()); var observation = new Observation { Subject = new ResourceReference(reference) }; var resource = await repository.CreateResourceAsync(observation); Assert.AreEqual(1, seedManager.References.Count); }
public async Task TestResourceCreationOnTangleShouldAssignHashesAsIds() { var resourceTracker = new InMemoryResourceTracker(); var seedManager = new RandomSeedManager(); var repository = new IotaFhirRepository( IotaResourceProvider.Repository, new FhirJsonTryteSerializer(), resourceTracker, seedManager); var resource = await repository.CreateResourceAsync(FhirResourceProvider.Patient); Assert.AreEqual(1, Regex.Matches(resource.Id, Id.PATTERN).Count); Assert.AreEqual(resource.Id, resource.VersionId); Assert.AreEqual(resource.VersionId, resource.Meta.VersionId); Assert.AreEqual(DateTime.UtcNow.Day, resource.Meta.LastUpdated?.DateTime.Day); Assert.AreEqual(DateTime.UtcNow.Month, resource.Meta.LastUpdated?.DateTime.Month); Assert.AreEqual(DateTime.UtcNow.Year, resource.Meta.LastUpdated?.DateTime.Year); Assert.IsTrue(InputValidator.IsTrytes(resource.Id)); Assert.AreEqual(1, resourceTracker.Entries.Count); Assert.IsTrue(seedManager.References.Any(e => e.Key == $"did:iota:{resource.Id}")); }
public async Task TestNoMessagesAreOnMamStreamShouldThrowException() { var iotaRepository = IotaResourceProvider.Repository; var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository); var subscriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, CurlMask.Default); var resourceTracker = new InMemoryResourceTracker(); await resourceTracker.AddEntryAsync( new ResourceEntry { Channel = channelFactory.Create(Mode.Restricted, Seed.Random(), SecurityLevel.Medium, Seed.Random().Value, true), Subscription = subscriptionFactory.Create(new Hash(Seed.Random().Value), Mode.Restricted, Seed.Random().Value, true), ResourceRoots = new List <string> { "SOMEID" } }); var repository = new IotaFhirRepository( iotaRepository, new FhirJsonTryteSerializer(), resourceTracker, new RandomSeedManager()); await repository.ReadResourceAsync("SOMEID"); }
public async Task RunAsync(int rounds) { var repository = new RestIotaRepository( new FallbackIotaClient( new List <string> { "https://nodes.thetangle.org:443", "http://node04.iotatoken.nl:14265", "http://node05.iotatoken.nl:16265", "https://nodes.thetangle.org:443", "http://iota1.heidger.eu:14265", "https://nodes.iota.cafe:443", "https://potato.iotasalad.org:14265", "https://durian.iotasalad.org:14265", "https://turnip.iotasalad.org:14265", "https://nodes.iota.fm:443", "https://tuna.iotasalad.org:14265", "https://iotanode2.jlld.at:443", "https://node.iota.moe:443", "https://wallet1.iota.town:443", "https://wallet2.iota.town:443", "http://node03.iotatoken.nl:15265", "https://node.iota-tangle.io:14265", "https://pow4.iota.community:443", "https://dyn.tangle-nodes.com:443", "https://pow5.iota.community:443", }, 5000), new PoWSrvService()); var fhirRepository = new IotaFhirRepository(repository, new FhirJsonTryteSerializer(), new InMemoryResourceTracker()); var resourceInteractor = new CreateResourceInteractor(fhirRepository); var readInteractor = new ReadResourceInteractor(fhirRepository); var measurement = new GlucoseMeasurementValue { GlucoseConcentrationMolL = 5.4f, BaseTime = DateTime.UtcNow }; var resourceId = string.Empty; var n = 0; while (n < rounds) { n++; this.Tracker.Update(n); // The example sends an observation. Nevertheless it does not make a difference from a technical perspective // what resource is sent, as long as its size fits one IOTA transaction var response = await resourceInteractor.ExecuteAsync(new CreateResourceRequest { Resource = ObservationFactory.FromMeasurement(measurement) }); if (string.IsNullOrEmpty(resourceId)) { resourceId = response.LogicalId; } } foreach (var trackingEntry in fhirRepository.ResultTimes) { this.Logger.Log($"Create: {trackingEntry.CreateTime:0000} | Attach: {trackingEntry.AttachTime:0000}"); } await readInteractor.ExecuteAsync(new ReadResourceRequest { ResourceId = resourceId }); foreach (var readEntry in fhirRepository.ReadTimes) { this.Logger.Log($"Read: {readEntry.ReadTime:0000}"); } }
/// <inheritdoc /> protected override void Load(ContainerBuilder builder) { var iotaRepository = new RestIotaRepository( new FallbackIotaClient(new List <string> { "https://nodes.devnet.thetangle.org:443" }, 5000), new PoWService(new CpuPearlDiver())); var channelFactory = new MamChannelFactory(CurlMamFactory.Default, CurlMerkleTreeFactory.Default, iotaRepository); var subscriptionFactory = new MamChannelSubscriptionFactory(iotaRepository, CurlMamParser.Default, CurlMask.Default); var encryption = new RijndaelEncryption("somenicekey", "somenicesalt"); var resourceTracker = new ResourceTracker( channelFactory, subscriptionFactory, encryption, $"{DependencyResolver.LocalStoragePath}\\resources.sqlite"); var seedManager = new SeedManager( resourceTracker, new IssSigningHelper(new Curl(), new Curl(), new Curl()), new AddressGenerator(), iotaRepository, encryption, $"{DependencyResolver.LocalStoragePath}\\seedmanager.sqlite"); var fhirRepository = new IotaFhirRepository(iotaRepository, new FhirJsonTryteSerializer(), resourceTracker, seedManager); var fhirParser = new FhirJsonParser(); var searchRepository = new SearchRepository($"{DependencyResolver.LocalStoragePath}\\search.sqlite"); var createInteractor = new CreateResourceInteractor(fhirRepository, fhirParser, searchRepository); var readInteractor = new ReadResourceInteractor(fhirRepository, searchRepository); var validationInteractor = new ValidateResourceInteractor(fhirRepository, fhirParser); var searchInteractor = new SearchResourcesInteractor(fhirRepository, searchRepository); var resourceImporter = new ResourceImporter(searchRepository, fhirRepository, seedManager); builder.RegisterInstance(searchRepository).As <ISearchRepository>(); builder.RegisterInstance(resourceTracker).As <IResourceTracker>(); builder.RegisterInstance(createInteractor); builder.RegisterInstance(readInteractor); builder.RegisterInstance(validationInteractor); builder.RegisterInstance(searchInteractor); builder.RegisterInstance(resourceImporter); builder.RegisterInstance(seedManager).As <ISeedManager>(); builder.RegisterInstance(subscriptionFactory); builder.RegisterInstance(fhirRepository).As <IFhirRepository>(); builder.RegisterInstance(new AndroidLogout()).As <ILogout>(); var backgroundWorker = new BackgroundWorkerService(); var glucoseService = new FhirGlucoseService( new CreateResourceInteractor(fhirRepository, fhirParser, searchRepository), new UpdateResourceInteractor(fhirRepository, fhirParser), new ReadResourceInteractor(fhirRepository, searchRepository), searchRepository); var glucoseRepository = new DexcomGlucoseManagementRepository(new RestClient("https://sandbox-api.dexcom.com")); //backgoundWorker.RegisterTaskWorker(new ContinuousGlucoseTaskWorker(glucoseService, glucoseRepository)); backgroundWorker.RegisterTaskWorker(new AggregateGlucoseTaskWorker(glucoseService, glucoseRepository)); }