// Trigger delta update correctly to see if it performs correctly on an empty cache public async Task Delta_Update_Perform_Correctly_On_Empty_Cache() { string gatewayId = NewUniqueEUI64(); DateTime dateTime = DateTime.UtcNow; List <DevAddrCacheInfo> managerInput = new List <DevAddrCacheInfo>(); for (int i = 0; i < 5; i++) { managerInput.Add(new DevAddrCacheInfo() { DevEUI = NewUniqueEUI64(), DevAddr = NewUniqueEUI32(), GatewayId = gatewayId, LastUpdatedTwins = dateTime }); } var devAddrJoining = managerInput[0].DevAddr; // The cache start as empty var registryManagerMock = this.InitRegistryManager(managerInput); // initialize locks for test to run correctly string[] neededLocksForTestToRun = new string[2] { GlobalDevAddrUpdateKey, DeltaUpdateKey }; var locksGuideTest = new string[1] { FullUpdateKey }; await LockDevAddrHelper.PrepareLocksForTests(this.cache, neededLocksForTestToRun, locksGuideTest); LoRaDevAddrCache devAddrCache = new LoRaDevAddrCache(this.cache, null, gatewayId); await devAddrCache.PerformNeededSyncs(registryManagerMock.Object); while (!string.IsNullOrEmpty(this.cache.StringGet(GlobalDevAddrUpdateKey))) { await Task.Delay(100); } var foundItem = 0; // we expect the devices are saved for (int i = 0; i < 5; i++) { var queryResult = this.cache.GetHashObject(string.Concat(CacheKeyPrefix, managerInput[i].DevAddr)); if (queryResult.Length > 0) { foundItem++; Assert.Single(queryResult); var resultObject = JsonConvert.DeserializeObject <DevAddrCacheInfo>(queryResult[0].Value); Assert.Equal(managerInput[i].GatewayId, resultObject.GatewayId); Assert.Equal(managerInput[i].DevEUI, resultObject.DevEUI); } } // Only two items should be updated by the delta updates Assert.Equal(2, foundItem); // Iot hub should never have been called. registryManagerMock.Verify(x => x.CreateQuery(It.IsAny <string>()), Times.Once); registryManagerMock.Verify(x => x.GetTwinAsync(It.IsAny <string>()), Times.Never); // We expect to query for the key once (the device with an active connection) registryManagerMock.Verify(x => x.GetDeviceAsync(It.IsAny <string>()), Times.Never); }