/Rhino.Etl.Tests/Branches/BranchesFixture.cs

http://github.com/ayende/rhino-etl · C# · 76 lines · 62 code · 14 blank · 0 comment · 0 complexity · b730e606ccac2d6f8e0565f91412d858 MD5 · raw file

  1. using System;
  2. using Rhino.Etl.Core;
  3. using Xunit;
  4. using Rhino.Etl.Core.Infrastructure;
  5. namespace Rhino.Etl.Tests.Branches
  6. {
  7. public abstract class BranchesFixture : BaseFibonacciTest
  8. {
  9. [Fact]
  10. public void CanBranchThePipeline()
  11. {
  12. using (var process = CreateBranchingProcess(30, 2))
  13. process.Execute();
  14. AssertFibonacci(30, 2);
  15. }
  16. [Fact]
  17. public void CanBranchThePipelineEfficiently()
  18. {
  19. const int iterations = 30000;
  20. const int childOperations = 10;
  21. var initialMemory = GC.GetTotalMemory(true);
  22. using (var process = CreateBranchingProcess(iterations, childOperations))
  23. process.Execute();
  24. var finalMemory = GC.GetTotalMemory(true);
  25. var consumedMemory = finalMemory - initialMemory;
  26. var tooMuchMemory = Math.Pow(2, 20);
  27. Assert.True(consumedMemory < tooMuchMemory, "Consuming too much memory - (" + consumedMemory.ToString() + " >= " + tooMuchMemory + ")");
  28. AssertFibonacci(iterations, childOperations);
  29. }
  30. protected abstract EtlProcess CreateBranchingProcess(int iterations, int childOperations);
  31. protected static void AssertFibonacci(int iterations, int repetitionsPerIteration)
  32. {
  33. AssertTotalItems(iterations * repetitionsPerIteration);
  34. AssertRepetitions(repetitionsPerIteration);
  35. }
  36. private static void AssertRepetitions(int repetitionsPerIteration)
  37. {
  38. int wrongRepetitions = Use.Transaction("test", cmd =>
  39. {
  40. cmd.CommandText =
  41. string.Format(@" SELECT count(*)
  42. FROM (
  43. SELECT id, count(*) as count
  44. FROM Fibonacci
  45. GROUP BY id
  46. HAVING count(*) <> {0}
  47. ) as ignored", repetitionsPerIteration);
  48. return (int)cmd.ExecuteScalar();
  49. });
  50. Assert.Equal(1 /* 1 is repetated twice the others */, wrongRepetitions);
  51. }
  52. private static void AssertTotalItems(int expectedCount)
  53. {
  54. int totalCount = Use.Transaction("test", cmd =>
  55. {
  56. cmd.CommandText = "SELECT count(*) FROM Fibonacci";
  57. return (int) cmd.ExecuteScalar();
  58. });
  59. Assert.Equal(expectedCount, totalCount);
  60. }
  61. }
  62. }