/Source/Nomad.Tests/FunctionalTests/Kernel/NomadKernelEventRaising.cs

https://github.com/psla/Nomad · C# · 216 lines · 150 code · 47 blank · 19 comment · 0 complexity · 38262c264a4d46d1d480d09ddec76eb5 MD5 · raw file

  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using Nomad.Core;
  5. using Nomad.Exceptions;
  6. using Nomad.KeysGenerator;
  7. using Nomad.Messages;
  8. using Nomad.Messages.Loading;
  9. using Nomad.Modules;
  10. using Nomad.Modules.Discovery;
  11. using Nomad.Tests.FunctionalTests.Fixtures;
  12. using Nomad.Tests.FunctionalTests.Modules;
  13. using NUnit.Framework;
  14. using TestsShared;
  15. namespace Nomad.Tests.FunctionalTests.Kernel
  16. {
  17. [FunctionalTests]
  18. public class NomadKernelEventRaising : NomadKernelTestFixture
  19. {
  20. [Test]
  21. public void
  22. exception_during_module_loading_is_changed_into_event_visible_from_module_and_kernel()
  23. {
  24. // set up configuration of kernel with mocks
  25. NomadKernel kernel = SetupMockedKernel();
  26. // set up listener for kernel side
  27. bool hasBeenCalled = false;
  28. kernel.EventAggregator.Subscribe<NomadAllModulesLoadedMessage>(
  29. (message) => hasBeenCalled = true);
  30. // compile module for event aggregation
  31. const string dir = @"Modules\Kernel\Event\";
  32. const string fileName = "EventAwareModule.dll";
  33. const string keyFile = @"newkey.xml";
  34. var compiler = new ModuleCompiler
  35. {
  36. OutputDirectory =
  37. Path.Combine(AppDomain.CurrentDomain.BaseDirectory, dir)
  38. };
  39. compiler.OutputName = Path.Combine(compiler.OutputDirectory, fileName);
  40. string modulePath = compiler.GenerateModuleFromCode(
  41. @"..\Source\Nomad.Tests\FunctionalTests\Data\Kernel\EventAwareModule.cs");
  42. KeysGeneratorProgram.Main(new[] {keyFile});
  43. compiler.GenerateManifestForModule(modulePath, keyFile);
  44. // set up module which subscribes for event
  45. IModuleDiscovery setUpDiscovery = SetUpDiscovery(new ModuleInfo(modulePath));
  46. kernel.LoadModules(setUpDiscovery);
  47. // set up the discovery mock
  48. IModuleDiscovery nonExistingDiscovery =
  49. SetUpDiscovery(new ModuleInfo("NonExistingModule.dll"));
  50. // perform test
  51. Assert.Throws<NomadCouldNotLoadModuleException>(
  52. () => kernel.LoadModules(nonExistingDiscovery),
  53. "Exception should be thrown in kernel domain.");
  54. //verify the method being called in a module.
  55. var carrier = (MessageCarrier) kernel.ModuleAppDomain.CreateInstanceAndUnwrap(
  56. typeof (MessageCarrier).Assembly.FullName, typeof (MessageCarrier).FullName);
  57. Assert.AreEqual(new[] {"EventAwareModule"}, carrier.List.ToArray());
  58. Assert.IsTrue(hasBeenCalled);
  59. }
  60. private NomadKernel SetupMockedKernel()
  61. {
  62. NomadConfiguration configuration = NomadConfiguration.Default;
  63. configuration.ModuleFilter = _moduleFilterMock.Object;
  64. configuration.DependencyChecker = _dependencyCheckerMock.Object;
  65. return new NomadKernel(configuration);
  66. }
  67. [Test]
  68. public void event_after_successful_module_loading_is_published()
  69. {
  70. NomadKernel kernel = SetupMockedKernel();
  71. // subscribe for message in kernel
  72. bool hasBeenLoaded = false;
  73. kernel.EventAggregator.Subscribe<NomadAllModulesLoadedMessage>( (message) =>
  74. {
  75. Assert.AreEqual(3,message.ModuleInfos.Count());
  76. hasBeenLoaded = true;
  77. });
  78. // compile module for event aggregation
  79. const string dir = @"Modules\Kernel\AllModulesLoadedAwarenessTestModules\";
  80. const string awareModuleName = "AllModulesLoadedEventAwareModule.dll";
  81. const string module1Name = "SimpleModule1.dll";
  82. const string module2Name = "SimpleModule2.dll";
  83. const string keyFile = @"newkey.xml";
  84. CompileSimpleModules(dir, keyFile, module1Name, module2Name);
  85. var compiler = new ModuleCompiler
  86. {
  87. OutputDirectory =
  88. Path.Combine(AppDomain.CurrentDomain.BaseDirectory, dir)
  89. };
  90. compiler.OutputName = Path.Combine(compiler.OutputDirectory, awareModuleName);
  91. string modulePath = compiler.GenerateModuleFromCode(
  92. @"..\Source\Nomad.Tests\FunctionalTests\Data\Kernel\AllModulesLoadedEventAwareModule.cs");
  93. KeysGeneratorProgram.Main(new[] {keyFile});
  94. compiler.GenerateManifestForModule(modulePath, keyFile);
  95. var directoryDiscovery = new DirectoryModuleDiscovery(dir, SearchOption.TopDirectoryOnly);
  96. // loading modules
  97. Assert.DoesNotThrow(() => kernel.LoadModules(directoryDiscovery));
  98. //verify the method being called in a module.
  99. var carrier = (MessageCarrier) kernel.ModuleAppDomain.CreateInstanceAndUnwrap(
  100. typeof (MessageCarrier).Assembly.FullName, typeof (MessageCarrier).FullName);
  101. Assert.AreEqual(new[] {"AllModulesLoadedEventAwareModule"}, carrier.List.ToArray());
  102. Assert.IsTrue(hasBeenLoaded);
  103. }
  104. [Test]
  105. public void event_all_modules_loaded_is_catched_upon_every_success()
  106. {
  107. NomadKernel kernel = SetupMockedKernel();
  108. // subscribe kernel for event
  109. bool hasBeenLoaded = false;
  110. kernel.EventAggregator.Subscribe<NomadAllModulesLoadedMessage>((message) =>
  111. {
  112. Assert.AreNotEqual(0,message.ModuleInfos.Count());
  113. hasBeenLoaded = true;
  114. });
  115. // compiling simple modules
  116. const string dir = @"Modules\Kernel\SimpleAllModulesLoadedAwarenessTestModules\Simple\";
  117. const string fileName = "AllModulesLoadedEventAwareModule.dll";
  118. const string module1Name = "SimpleModule1.dll";
  119. const string module2Name = "SimpleModule2.dll";
  120. const string keyFile = @"newkey.xml";
  121. CompileSimpleModules(dir, keyFile, module1Name, module2Name);
  122. // compiling aware module
  123. var compiler = new ModuleCompiler
  124. {
  125. OutputDirectory =
  126. Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
  127. @"Modules\Kernel\SimpleAllModulesLoadedAwarenessTestModules\Aware\")
  128. };
  129. compiler.OutputName = Path.Combine(compiler.OutputDirectory, fileName);
  130. string modulePath = compiler.GenerateModuleFromCode(
  131. @"..\Source\Nomad.Tests\FunctionalTests\Data\Kernel\AllModulesLoadedEventAwareModule.cs");
  132. KeysGeneratorProgram.Main(new[] {keyFile});
  133. compiler.GenerateManifestForModule(modulePath, keyFile);
  134. // set up module which subscribes for event
  135. // loading aware module
  136. IModuleDiscovery setUpDiscovery = SetUpDiscovery(new ModuleInfo(modulePath));
  137. Assert.DoesNotThrow(() => kernel.LoadModules(setUpDiscovery));
  138. // loading simple modules
  139. var directoryDiscovery = new DirectoryModuleDiscovery(dir, SearchOption.TopDirectoryOnly);
  140. Assert.DoesNotThrow(() => kernel.LoadModules(directoryDiscovery));
  141. //verify the method being called in a module.
  142. var carrier = (MessageCarrier) kernel.ModuleAppDomain.CreateInstanceAndUnwrap(
  143. typeof (MessageCarrier).Assembly.FullName, typeof (MessageCarrier).FullName);
  144. Assert.AreEqual(
  145. new[] {"AllModulesLoadedEventAwareModule", "AllModulesLoadedEventAwareModule"},
  146. carrier.List.ToArray());
  147. Assert.IsTrue(hasBeenLoaded);
  148. }
  149. private static void CompileSimpleModules(string dir, string keyFile,
  150. string simpleModule1Name, string simpleModule2Name)
  151. {
  152. var compiler = new ModuleCompiler
  153. {
  154. OutputDirectory =
  155. Path.Combine(AppDomain.CurrentDomain.BaseDirectory, dir)
  156. };
  157. KeysGeneratorProgram.Main(new[] {keyFile});
  158. // generating not subcribed modules
  159. compiler.OutputName = Path.Combine(compiler.OutputDirectory, simpleModule1Name);
  160. string module1Path =
  161. compiler.GenerateModuleFromCode(ModuleCompiler.DefaultSimpleModuleSource);
  162. compiler.GenerateManifestForModule(module1Path, keyFile);
  163. compiler.OutputName = Path.Combine(compiler.OutputDirectory, simpleModule2Name);
  164. string module2Path =
  165. compiler.GenerateModuleFromCode(ModuleCompiler.DefaultSimpleModuleSourceAlternative);
  166. compiler.GenerateManifestForModule(module2Path, keyFile);
  167. }
  168. }
  169. }