engine_test.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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 TestEngineShutdown(t *testing.T) {
  51. eng := New()
  52. if eng.IsShutdown() {
  53. t.Fatalf("Engine should not show as shutdown")
  54. }
  55. eng.Shutdown()
  56. if !eng.IsShutdown() {
  57. t.Fatalf("Engine should show as shutdown")
  58. }
  59. }
  60. func TestEngineCommands(t *testing.T) {
  61. eng := New()
  62. handler := func(job *Job) Status { return StatusOK }
  63. eng.Register("foo", handler)
  64. eng.Register("bar", handler)
  65. eng.Register("echo", handler)
  66. eng.Register("die", handler)
  67. var output bytes.Buffer
  68. commands := eng.Job("commands")
  69. commands.Stdout.Add(&output)
  70. commands.Run()
  71. expected := "bar\ncommands\ndie\necho\nfoo\n"
  72. if result := output.String(); result != expected {
  73. t.Fatalf("Unexpected output:\nExpected = %v\nResult = %v\n", expected, result)
  74. }
  75. }
  76. func TestEngineString(t *testing.T) {
  77. eng1 := New()
  78. eng2 := New()
  79. s1 := eng1.String()
  80. s2 := eng2.String()
  81. if eng1 == eng2 {
  82. t.Fatalf("Different engines should have different names (%v == %v)", s1, s2)
  83. }
  84. }
  85. func TestParseJob(t *testing.T) {
  86. eng := New()
  87. // Verify that the resulting job calls to the right place
  88. var called bool
  89. eng.Register("echo", func(job *Job) Status {
  90. called = true
  91. return StatusOK
  92. })
  93. input := "echo DEBUG=1 hello world VERBOSITY=42"
  94. job, err := eng.ParseJob(input)
  95. if err != nil {
  96. t.Fatal(err)
  97. }
  98. if job.Name != "echo" {
  99. t.Fatalf("Invalid job name: %v", job.Name)
  100. }
  101. if strings.Join(job.Args, ":::") != "hello:::world" {
  102. t.Fatalf("Invalid job args: %v", job.Args)
  103. }
  104. if job.Env().Get("DEBUG") != "1" {
  105. t.Fatalf("Invalid job env: %v", job.Env)
  106. }
  107. if job.Env().Get("VERBOSITY") != "42" {
  108. t.Fatalf("Invalid job env: %v", job.Env)
  109. }
  110. if len(job.Env().Map()) != 2 {
  111. t.Fatalf("Invalid job env: %v", job.Env)
  112. }
  113. if err := job.Run(); err != nil {
  114. t.Fatal(err)
  115. }
  116. if !called {
  117. t.Fatalf("Job was not called")
  118. }
  119. }
  120. func TestCatchallEmptyName(t *testing.T) {
  121. eng := New()
  122. var called bool
  123. eng.RegisterCatchall(func(job *Job) Status {
  124. called = true
  125. return StatusOK
  126. })
  127. err := eng.Job("").Run()
  128. if err == nil {
  129. t.Fatalf("Engine.Job(\"\").Run() should return an error")
  130. }
  131. if called {
  132. t.Fatalf("Engine.Job(\"\").Run() should return an error")
  133. }
  134. }