public void AsyncGetExtenderConfigTest(KsiService service) { if (TestSetup.PduVersion == PduVersion.v1) { return; } ManualResetEvent waitHandle = new ManualResetEvent(false); ExtenderConfig config = null; object testObject = new object(); bool isAsyncCorrect = false; service.BeginGetExtenderConfig(delegate(IAsyncResult ar) { try { isAsyncCorrect = ar.AsyncState == testObject; config = service.EndGetExtenderConfig(ar); } finally { waitHandle.Set(); } }, testObject); Assert.IsTrue(waitHandle.WaitOne(10000), "Wait handle timed out."); Assert.IsNotNull(config, "Extender configuration should not be null."); Assert.AreEqual(true, isAsyncCorrect, "Unexpected async state."); }
public void HAExtenderConfigRequestUsingEventHandlerTest() { // Test getting extender configuration with 1 successful and 2 unsuccessful sub-service responses. // Get response using ExtenderConfigChanged event handler IKsiService haService = new HAKsiService( null, new List <IKsiService>() { GetStaticKsiService(File.ReadAllBytes(Path.Combine(TestSetup.LocalPath, Resources.KsiService_ExtendResponsePdu_RequestId_1043101455)), 1043101455), GetStaticKsiService(File.ReadAllBytes(Path.Combine(TestSetup.LocalPath, Resources.KsiService_ExtenderConfigResponsePdu)), 1584727637), GetStaticKsiService(File.ReadAllBytes(Path.Combine(TestSetup.LocalPath, Resources.KsiService_ExtendResponsePdu_RequestId_1043101455)), 1043101454) }, null); ManualResetEvent waitHandle = new ManualResetEvent(false); ExtenderConfig config = null; haService.ExtenderConfigChanged += delegate(object sender, ExtenderConfigChangedEventArgs e) { config = e.ExtenderConfig; waitHandle.Set(); }; haService.GetExtenderConfig(); waitHandle.WaitOne(1000); Assert.IsNotNull(config, "Could not get extender config using event handler."); Assert.AreEqual(273, config.MaxRequests, "Unexpected max requests value"); Assert.AreEqual(0, config.ParentsUris.Count, "Unexpected parent uri count"); Assert.AreEqual(1455478441, config.CalendarFirstTime, "Unexpected calendar first time value"); Assert.AreEqual(1455478442, config.CalendarLastTime, "Unexpected calendar last time value"); }
public void HAGetConfigTwoResultsTest3() { // Test getting extender configuration with 2 successful sub-service responses IKsiService haService = GetHAService( new List <PduPayload>() { GetExtenderConfigResponsePayload(null, null, null, null), }, new List <PduPayload>() { GetExtenderConfigResponsePayload(4, new List <string>() { "uri-2" }, 1136073600, 2136073600) }); ExtenderConfig config = haService.GetExtenderConfig(); Assert.AreEqual(4, config.MaxRequests, "Unexpected max requests value"); Assert.AreEqual(1, config.ParentsUris.Count, "Unexpected parent uri count"); Assert.AreEqual("uri-2", config.ParentsUris[0], "Unexpected parent uri value at position 0"); Assert.AreEqual(1136073600, config.CalendarFirstTime, "Unexpected calendar first time value"); Assert.AreEqual(2136073600, config.CalendarLastTime, "Unexpected calendar last time value"); }
public void HAGetConfigResultsOutOfLimitTest() { // Test getting extender configuration with 2 successful sub-service responses // Some values are out of bounds IKsiService haService = GetHAService( new List <PduPayload>() { GetExtenderConfigResponsePayload(4, new List <string>() { "uri-1" }, 1136073601, 1136073600) }, new List <PduPayload>() { GetExtenderConfigResponsePayload(16001, null, 1136073599, 1136073598) }); ExtenderConfig config = haService.GetExtenderConfig(); Assert.AreEqual(4, config.MaxRequests, "Unexpected max requests value"); Assert.AreEqual(1, config.ParentsUris.Count, "Unexpected parent uri count"); Assert.AreEqual("uri-1", config.ParentsUris[0], "Unexpected parent uri value at position 0"); Assert.AreEqual(1136073601, config.CalendarFirstTime, "Unexpected calendar first time value"); Assert.IsNull(config.CalendarLastTime, "Unexpected calendar last time value"); }
private void RecalculateExtenderConfig() { ExtenderConfig mergedConfig = null; foreach (IKsiService service in ExtendingServices) { if (!_currentExtenderConfigList.ContainsKey(service)) { continue; } ExtenderConfig config = _currentExtenderConfigList[service]; Logger.Debug("ExtenderConfig in cache: " + config + "; Sub-service: " + service.ExtenderAddress); mergedConfig = HAExtenderConfigRequestRunner.MergeConfigs(mergedConfig, config); } if (_currentExtenderConfig == null || !_currentExtenderConfig.Equals(mergedConfig)) { Logger.Debug("New merged ExtenderConfig: " + mergedConfig); _currentExtenderConfig = mergedConfig; ExtenderConfigChanged?.Invoke(this, new ExtenderConfigChangedEventArgs(mergedConfig, this)); } else { Logger.Debug("Merged ExtenderConfig not changed."); } }
public void AsyncGetExtenderConfigTest() { HAKsiService haService = new HAKsiService(SigningServices, ExtendingServices, PublicationsFileService); ManualResetEvent waitHandle = new ManualResetEvent(false); ExtenderConfig config = null; object testObject = new object(); bool isAsyncCorrect = false; haService.BeginGetExtenderConfig(delegate(IAsyncResult ar) { try { isAsyncCorrect = ar.AsyncState == testObject; config = haService.EndGetExtenderConfig(ar); } finally { waitHandle.Set(); } }, testObject); Assert.IsTrue(waitHandle.WaitOne(10000), "Wait handle timed out."); Assert.IsNotNull(config, "Extender configuration should not be null."); Assert.AreEqual(true, isAsyncCorrect, "Unexpected async state."); }
public void HAExtenderGetConfTest() { Ksi ksi = new Ksi(new HAKsiService(null, ExtendingServices, null)); ExtenderConfig conf = ksi.GetExtenderConfig(); Assert.NotNull(conf); }
public void ExtenderConfigRequestStaticTest() { Ksi ksi = GetStaticKsi(Resources.KsiService_ExtenderConfigResponsePdu); ExtenderConfig config = ksi.GetExtenderConfig(); Assert.AreEqual(273, config.MaxRequests, "Unexpected max requests value"); Assert.AreEqual(1455478441, config.CalendarFirstTime, "Unexpected calendar first time value"); Assert.AreEqual(1455478442, config.CalendarLastTime, "Unexpected calendar last time value"); }
public void ExtenderConfigRequestWithMultiPayloadsResponseStaticTest() { // Response has multiple payloads (2 extending payloads and a configuration payload) Ksi ksi = GetStaticKsi(Resources.KsiService_ExtendResponsePdu_Multi_Payloads); ExtenderConfig config = ksi.GetExtenderConfig(); Assert.AreEqual(273, config.MaxRequests, "Unexpected max requests value"); Assert.AreEqual(1455478441, config.CalendarFirstTime, "Unexpected calendar first time value"); Assert.AreEqual(1455478442, config.CalendarLastTime, "Unexpected calendar last time value"); }
/// <summary> /// Merge two configurations into one taking into account consolidation rules. /// </summary> /// <param name="currentConfig"></param> /// <param name="newConfig"></param> /// <returns></returns> public static ExtenderConfig MergeConfigs(ExtenderConfig currentConfig, ExtenderConfig newConfig) { if (newConfig == null) { throw new ArgumentNullException(nameof(newConfig)); } ulong?maxRequests = GetMergedMaxRequests(currentConfig?.MaxRequests, newConfig.MaxRequests); ulong?calendarFirstTime = GetMergedCalendarFirstTime(currentConfig?.CalendarFirstTime, newConfig.CalendarFirstTime); ulong?calendarLastTime = GetMergedCalendarLastTime(currentConfig?.CalendarLastTime, newConfig.CalendarLastTime, calendarFirstTime); return(new ExtenderConfig( maxRequests, currentConfig?.ParentsUris == null || currentConfig.ParentsUris.Count == 0 ? newConfig.ParentsUris : currentConfig.ParentsUris, calendarFirstTime, calendarLastTime)); }
public void HAGetConfigSingleResultAllNullsTest() { // Test getting extender configuration with 1 successful sub-service response // All the values are empty IKsiService haService = GetHAService( new List <PduPayload>() { GetExtenderConfigResponsePayload(null, null, null, null), }); ExtenderConfig config = haService.GetExtenderConfig(); Assert.IsNull(config.MaxRequests, "Unexpected max requests value"); Assert.AreEqual(0, config.ParentsUris.Count, "Unexpected parent uri list"); Assert.IsNull(config.CalendarFirstTime, "Unexpected calendar first time value"); Assert.IsNull(config.CalendarLastTime, "Unexpected calendar last time value"); }
/// <summary> /// Ends HA extender configuration request and returns consolidated successful sub-service configurations. /// </summary> /// <param name="asyncResult"></param> /// <returns></returns> public ExtenderConfig EndGetExtenderConfig(HAAsyncResult asyncResult) { object[] list = EndRequestMulti(asyncResult); ExtenderConfig config = null; foreach (object obj in list) { ExtenderConfig conf = obj as ExtenderConfig; if (conf == null) { throw new HAKsiServiceException(string.Format("Invalid request result object. Expected type: ExtenderConfig; Received type: {0}", obj?.GetType().ToString() ?? "")); } config = MergeConfigs(config, conf); } return(config); }
/// <summary> /// End get additional extender configuration data (async) /// </summary> /// <param name="asyncResult"></param> /// <returns>Extender configuration data</returns> public ExtenderConfig EndGetExtenderConfig(IAsyncResult asyncResult) { HAAsyncResult haAsyncResult = GetHAAsyncResult(asyncResult); HAExtenderConfigRequestRunner runner = GetRequestRunner <HAExtenderConfigRequestRunner>(haAsyncResult); ExtenderConfig config = runner.EndGetExtenderConfig(haAsyncResult); if (config == null) { lock (_extenderConfigChangedLock) { _currentExtenderConfigList.Clear(); _currentExtenderConfig = null; } HAKsiServiceException ex = new HAKsiServiceException("Could not get extender configuration.", runner.SubServiceErrors); Logger.Warn(ex); ExtenderConfigChangedEventArgs extenderConfigChangedEventArgs = new ExtenderConfigChangedEventArgs(ex, this); ExtenderConfigChanged?.Invoke(this, extenderConfigChangedEventArgs); throw ex; } // if sub-service config request failed then remove corresponding config from cache foreach (HAKsiSubServiceException ex in runner.SubServiceErrors) { if (ex.ThrownBySubService == null) { continue; } lock (_extenderConfigChangedLock) { if (_currentExtenderConfigList.ContainsKey(ex.ThrownBySubService)) { _currentExtenderConfigList.Remove(ex.ThrownBySubService); RecalculateExtenderConfig(); } } } return(config); }
public void HAExtenderConfigRequestTest() { // Test getting extender configuration with 1 successful and 2 unsuccessful sub-service responses IKsiService haService = new HAKsiService( null, new List <IKsiService>() { GetStaticKsiService(File.ReadAllBytes(Path.Combine(TestSetup.LocalPath, Resources.KsiService_ExtendResponsePdu_RequestId_1043101455)), 1043101455), GetStaticKsiService(File.ReadAllBytes(Path.Combine(TestSetup.LocalPath, Resources.KsiService_ExtenderConfigResponsePdu)), 1584727637), GetStaticKsiService(File.ReadAllBytes(Path.Combine(TestSetup.LocalPath, Resources.KsiService_ExtendResponsePdu_RequestId_1043101455)), 1043101454) }, null); ExtenderConfig config = haService.GetExtenderConfig(); Assert.AreEqual(273, config.MaxRequests, "Unexpected max requests value"); Assert.AreEqual(0, config.ParentsUris.Count, "Unexpected parent uri count"); Assert.AreEqual(1455478441, config.CalendarFirstTime, "Unexpected calendar first time value"); Assert.AreEqual(1455478442, config.CalendarLastTime, "Unexpected calendar last time value"); }
public void HAExtenderConfigRequestWithSingleServiceTest() { // Test getting extender configuration with single sub-service IKsiService haService = GetHAService( new List <PduPayload>() { GetExtenderConfigResponsePayload(4, new List <string>() { "uri-1" }, 1136073600, 2136073600) }); haService.GetExtenderConfig(); ExtenderConfig config = haService.GetExtenderConfig(); Assert.AreEqual(4, config.MaxRequests, "Unexpected max requests value"); Assert.AreEqual(1, config.ParentsUris.Count, "Unexpected parent uri count"); Assert.AreEqual("uri-1", config.ParentsUris[0], "Unexpected parent uri value at position 0"); Assert.AreEqual(1136073600, config.CalendarFirstTime, "Unexpected calendar first time value"); Assert.AreEqual(2136073600, config.CalendarLastTime, "Unexpected calendar last time value"); }
public void HAGetConfigResultsWithExtendRequestTest() { // Test getting extender configurations via ExtenderConfigChanged event handler when using Extend method. // Testing getting different configurations in a sequence HAKsiService haService = GetHAService( new List <PduPayload>() { GetExtendResponsePayload(Resources.KsiService_ExtendResponsePdu_RequestId_1043101454), GetExtenderConfigResponsePayload(4, new List <string>() { "uri-1" }, 1136073601, 1136073602) }, new List <PduPayload>() { GetExtendResponsePayload(Resources.KsiService_ExtendResponsePdu_RequestId_1043101455), GetExtenderConfigResponsePayload(4, new List <string>() { "uri-2" }, 1136073601, 1136073602) }); TestKsiService secondService = (TestKsiService)haService.ExtendingServices[1]; secondService.RequestId = 1043101455; ExtenderConfig resultConf = null; int changeCount = 0; ManualResetEvent waitHandle = new ManualResetEvent(false); haService.ExtenderConfigChanged += delegate(object sender, ExtenderConfigChangedEventArgs e) { resultConf = e.ExtenderConfig; changeCount++; if (changeCount == 2) { waitHandle.Set(); } }; CalendarHashChain cal = haService.Extend(123); Assert.AreEqual(1455494400, cal.PublicationTime, "Unexpected calendar hash chain publication time."); waitHandle.WaitOne(1000); Assert.IsNotNull(resultConf, "Could not get extender config using event handler."); Assert.AreEqual(4, resultConf.MaxRequests, "Unexpected max requests value"); Assert.AreEqual(1, resultConf.ParentsUris.Count, "Unexpected parent uri count"); Assert.IsTrue(resultConf.ParentsUris[0] == "uri-1" || resultConf.ParentsUris[0] == "uri-2", "Unexpected parent uri value at position 0"); Assert.AreEqual(1136073601, resultConf.CalendarFirstTime, "Unexpected calendar first time value"); Assert.AreEqual(1136073602, resultConf.CalendarLastTime, "Unexpected calendar last time value"); // changing extender algorithm or parent uri should not change merged config TestKsiService newService = (TestKsiService)GetService(new List <PduPayload>() { GetExtendResponsePayload(Resources.KsiService_ExtendResponsePdu_RequestId_1043101455), GetExtenderConfigResponsePayload(4, new List <string>() { "uri-2-changed" }, 1136073601, 1136073602) }); secondService.ExtendingServiceProtocol.RequestResult = newService.ExtendingServiceProtocol.RequestResult; resultConf = null; changeCount = 0; haService.Extend(123); Thread.Sleep(1000); Assert.IsNull(resultConf, "Extender config should have not changed (2nd request)"); Assert.AreEqual(0, changeCount, "Unexpected change count (2nd request)"); // changing max requests should change merged config newService = (TestKsiService)GetService(new List <PduPayload>() { GetExtendResponsePayload(Resources.KsiService_ExtendResponsePdu_RequestId_1043101455), GetExtenderConfigResponsePayload(5, new List <string>() { "uri-2" }, 1136073601, 1136073602) }); secondService.ExtendingServiceProtocol.RequestResult = newService.ExtendingServiceProtocol.RequestResult; waitHandle.Reset(); resultConf = null; changeCount = 0; haService.Extend(123); waitHandle.WaitOne(1000); Assert.IsNotNull(resultConf, "Could not get extender config using event handler (after 3rd extend request)."); Assert.AreEqual(5, resultConf.MaxRequests, "Unexpected max requests value (after 3rd extend request)"); Assert.AreEqual(1, resultConf.ParentsUris.Count, "Unexpected parent uri count (after 3rd extend request)"); Assert.IsTrue(resultConf.ParentsUris[0] == "uri-1" || resultConf.ParentsUris[0] == "uri-2", "Unexpected parent uri value at position 0 (after 3rd extend request)"); Assert.AreEqual(1136073601, resultConf.CalendarFirstTime, "Unexpected calendar first time value (after 3rd extend request)"); Assert.AreEqual(1136073602, resultConf.CalendarLastTime, "Unexpected calendar last time value (after 3rd extend request)"); // changing first time should change merged config newService = (TestKsiService)GetService(new List <PduPayload>() { GetExtendResponsePayload(Resources.KsiService_ExtendResponsePdu_RequestId_1043101455), GetExtenderConfigResponsePayload(5, new List <string>() { "uri-2" }, 1136073600, 1136073602) }); secondService.ExtendingServiceProtocol.RequestResult = newService.ExtendingServiceProtocol.RequestResult; waitHandle.Reset(); resultConf = null; changeCount = 0; haService.Extend(123); waitHandle.WaitOne(1000); Assert.IsNotNull(resultConf, "Could not get extender config using event handler (after 4th extend request)."); Assert.AreEqual(5, resultConf.MaxRequests, "Unexpected max requests value (after 4th extend request)"); Assert.AreEqual(1, resultConf.ParentsUris.Count, "Unexpected parent uri count (after 4th extend request)"); Assert.IsTrue(resultConf.ParentsUris[0] == "uri-1" || resultConf.ParentsUris[0] == "uri-2", "Unexpected parent uri value at position 0 (after 4th extend request)"); Assert.AreEqual(1136073600, resultConf.CalendarFirstTime, "Unexpected calendar first time value (after 4th extend request)"); Assert.AreEqual(1136073602, resultConf.CalendarLastTime, "Unexpected calendar last time value (after 4th extend request)"); // changing last time should change merged config newService = (TestKsiService)GetService(new List <PduPayload>() { GetExtendResponsePayload(Resources.KsiService_ExtendResponsePdu_RequestId_1043101455), GetExtenderConfigResponsePayload(5, new List <string>() { "uri-2" }, 1136073600, 1136073603) }); secondService.ExtendingServiceProtocol.RequestResult = newService.ExtendingServiceProtocol.RequestResult; waitHandle.Reset(); resultConf = null; changeCount = 0; haService.Extend(123); waitHandle.WaitOne(1000); Assert.IsNotNull(resultConf, "Could not get extender config using event handler (after 5th extend request)."); Assert.AreEqual(5, resultConf.MaxRequests, "Unexpected max requests value (after 5th extend request)"); Assert.AreEqual(1, resultConf.ParentsUris.Count, "Unexpected parent uri count (after 5th extend request)"); Assert.IsTrue(resultConf.ParentsUris[0] == "uri-1" || resultConf.ParentsUris[0] == "uri-2", "Unexpected parent uri value at position 0 (after 5th extend request)"); Assert.AreEqual(1136073600, resultConf.CalendarFirstTime, "Unexpected calendar first time value (after 5th extend request)"); Assert.AreEqual(1136073603, resultConf.CalendarLastTime, "Unexpected calendar last time value (after 5th extend request)"); // extending again should not change merged config waitHandle.Reset(); resultConf = null; changeCount = 0; haService.Extend(123); waitHandle.WaitOne(1000); Assert.IsNull(resultConf, "Extender config should have not changed (after 6th extend request)"); Assert.AreEqual(0, changeCount, "Unexpected change count."); }
public void HAGetConfigResultsAndRemoveOneTest() { // A configuration request with 2 successful sub-requests is made. // Then a new configuration request is made with 1 successful and 1 unsuccessful sub-requests. // Unsuccessful service config should be removed from cache and merged config should be recalculated HAKsiService haService = GetHAService( new List <PduPayload>() { GetExtenderConfigResponsePayload(4, new List <string>() { "uri-1" }, 1136073601, 2136073601) }, new List <PduPayload>() { GetExtenderConfigResponsePayload(4, new List <string>() { "uri-2" }, 1136073601, 2136073601) }); ManualResetEvent waitHandle = new ManualResetEvent(false); haService.ExtenderConfigChanged += delegate { }; ExtenderConfig resultConf = haService.GetExtenderConfig(); waitHandle.WaitOne(1000); Assert.AreEqual(4, resultConf.MaxRequests, "Unexpected max requests value"); Assert.AreEqual(1, resultConf.ParentsUris.Count, "Unexpected parent uri count"); Assert.AreEqual(1136073601, resultConf.CalendarFirstTime, "Unexpected calendar first time value"); Assert.AreEqual(2136073601, resultConf.CalendarLastTime, "Unexpected calendar last time value"); // change first service response so that request fails ((TestKsiService)haService.ExtendingServices[0]).ExtendingServiceProtocol.RequestResult = File.ReadAllBytes(Path.Combine(TestSetup.LocalPath, Resources.KsiService_ExtendResponsePdu_RequestId_1043101455)); // change second service response so that a valid configuration is returned TestKsiService newService = (TestKsiService)GetService(new List <PduPayload>() { GetExtendResponsePayload(Resources.KsiService_ExtendResponsePdu_RequestId_1043101455), GetExtenderConfigResponsePayload(3, new List <string>() { "uri-2-changed" }, 1136073602, 2136073600) }); ((TestKsiService)haService.ExtendingServices[1]).ExtendingServiceProtocol.RequestResult = newService.ExtendingServiceProtocol.RequestResult; ExtenderConfigChangedEventArgs args = null; waitHandle = new ManualResetEvent(false); haService.ExtenderConfigChanged += delegate(object sender, ExtenderConfigChangedEventArgs e) { args = e; }; resultConf = haService.GetExtenderConfig(); Assert.AreEqual(3, resultConf.MaxRequests, "Unexpected max requests value"); Assert.AreEqual(1, resultConf.ParentsUris.Count, "Unexpected parent uri count"); Assert.AreEqual("uri-2-changed", resultConf.ParentsUris[0], "Unexpected parent uri value at position 0"); Assert.AreEqual(1136073602, resultConf.CalendarFirstTime, "Unexpected calendar first time value"); Assert.AreEqual(2136073600, resultConf.CalendarLastTime, "Unexpected calendar last time value"); waitHandle.WaitOne(1000); Assert.IsNotNull(args, "ExtenderConfigChangedEventArgs cannot be null."); Assert.AreEqual(resultConf, args.ExtenderConfig, "Unexpected ExtenderConfigChangedEventArgs.ExtenderConfig."); Assert.IsNull(args.Exception, "ExtenderConfigChangedEventArgs.Exception cannot have value."); Assert.AreEqual(haService, args.KsiService, "Unexpected ExtenderConfigChangedEventArgs.KsiService"); }
private void Service_ExtenderConfigChanged(object sender, ExtenderConfigChangedEventArgs e) { _extenderConfig = e.ExtenderConfig; _waitHandle.Set(); }