engine_test.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package engine
  2. import (
  3. "bytes"
  4. "strings"
  5. "testing"
  6. )
  7. func TestRegister(t *testing.T) {
  8. if err := Register("dummy1", nil); err != nil {
  9. t.Fatal(err)
  10. }
  11. if err := Register("dummy1", nil); err == nil {
  12. t.Fatalf("Expecting error, got none")
  13. }
  14. // Register is global so let's cleanup to avoid conflicts
  15. defer unregister("dummy1")
  16. eng := New()
  17. //Should fail because global handlers are copied
  18. //at the engine creation
  19. if err := eng.Register("dummy1", nil); err == nil {
  20. t.Fatalf("Expecting error, got none")
  21. }
  22. if err := eng.Register("dummy2", nil); err != nil {
  23. t.Fatal(err)
  24. }
  25. if err := eng.Register("dummy2", nil); err == nil {
  26. t.Fatalf("Expecting error, got none")
  27. }
  28. defer unregister("dummy2")
  29. }
  30. func TestJob(t *testing.T) {
  31. eng := New()
  32. job1 := eng.Job("dummy1", "--level=awesome")
  33. if job1.handler != nil {
  34. t.Fatalf("job1.handler should be empty")
  35. }
  36. h := func(j *Job) Status {
  37. j.Printf("%s\n", j.Name)
  38. return 42
  39. }
  40. eng.Register("dummy2", h)
  41. defer unregister("dummy2")
  42. job2 := eng.Job("dummy2", "--level=awesome")
  43. if job2.handler == nil {
  44. t.Fatalf("job2.handler shouldn't be nil")
  45. }
  46. if job2.handler(job2) != 42 {
  47. t.Fatalf("handler dummy2 was not found in job2")
  48. }
  49. }
  50. func TestEngineCommands(t *testing.T) {
  51. eng := New()
  52. handler := func(job *Job) Status { return StatusOK }
  53. eng.Register("foo", handler)
  54. eng.Register("bar", handler)
  55. eng.Register("echo", handler)
  56. eng.Register("die", handler)
  57. var output bytes.Buffer
  58. commands := eng.Job("commands")
  59. commands.Stdout.Add(&output)
  60. commands.Run()
  61. expected := "bar\ncommands\ndie\necho\nfoo\n"
  62. if result := output.String(); result != expected {
  63. t.Fatalf("Unexpected output:\nExpected = %v\nResult = %v\n", expected, result)
  64. }
  65. }
  66. func TestEngineString(t *testing.T) {
  67. eng1 := New()
  68. eng2 := New()
  69. s1 := eng1.String()
  70. s2 := eng2.String()
  71. if eng1 == eng2 {
  72. t.Fatalf("Different engines should have different names (%v == %v)", s1, s2)
  73. }
  74. }
  75. func TestEngineLogf(t *testing.T) {
  76. eng := New()
  77. input := "Test log line"
  78. if n, err := eng.Logf("%s\n", input); err != nil {
  79. t.Fatal(err)
  80. } else if n < len(input) {
  81. t.Fatalf("Test: Logf() should print at least as much as the input\ninput=%d\nprinted=%d", len(input), n)
  82. }
  83. }
  84. func TestParseJob(t *testing.T) {
  85. eng := New()
  86. // Verify that the resulting job calls to the right place
  87. var called bool
  88. eng.Register("echo", func(job *Job) Status {
  89. called = true
  90. return StatusOK
  91. })
  92. input := "echo DEBUG=1 hello world VERBOSITY=42"
  93. job, err := eng.ParseJob(input)
  94. if err != nil {
  95. t.Fatal(err)
  96. }
  97. if job.Name != "echo" {
  98. t.Fatalf("Invalid job name: %v", job.Name)
  99. }
  100. if strings.Join(job.Args, ":::") != "hello:::world" {
  101. t.Fatalf("Invalid job args: %v", job.Args)
  102. }
  103. if job.Env().Get("DEBUG") != "1" {
  104. t.Fatalf("Invalid job env: %v", job.Env)
  105. }
  106. if job.Env().Get("VERBOSITY") != "42" {
  107. t.Fatalf("Invalid job env: %v", job.Env)
  108. }
  109. if len(job.Env().Map()) != 2 {
  110. t.Fatalf("Invalid job env: %v", job.Env)
  111. }
  112. if err := job.Run(); err != nil {
  113. t.Fatal(err)
  114. }
  115. if !called {
  116. t.Fatalf("Job was not called")
  117. }
  118. }
  119. func TestCatchallEmptyName(t *testing.T) {
  120. eng := New()
  121. var called bool
  122. eng.RegisterCatchall(func(job *Job) Status {
  123. called = true
  124. return StatusOK
  125. })
  126. err := eng.Job("").Run()
  127. if err == nil {
  128. t.Fatalf("Engine.Job(\"\").Run() should return an error")
  129. }
  130. if called {
  131. t.Fatalf("Engine.Job(\"\").Run() should return an error")
  132. }
  133. }