engine_test.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. package engine
  2. import (
  3. "bytes"
  4. "io/ioutil"
  5. "os"
  6. "path"
  7. "path/filepath"
  8. "strings"
  9. "testing"
  10. )
  11. func TestRegister(t *testing.T) {
  12. if err := Register("dummy1", nil); err != nil {
  13. t.Fatal(err)
  14. }
  15. if err := Register("dummy1", nil); err == nil {
  16. t.Fatalf("Expecting error, got none")
  17. }
  18. // Register is global so let's cleanup to avoid conflicts
  19. defer unregister("dummy1")
  20. eng := newTestEngine(t)
  21. //Should fail because global handlers are copied
  22. //at the engine creation
  23. if err := eng.Register("dummy1", nil); err == nil {
  24. t.Fatalf("Expecting error, got none")
  25. }
  26. if err := eng.Register("dummy2", nil); err != nil {
  27. t.Fatal(err)
  28. }
  29. if err := eng.Register("dummy2", nil); err == nil {
  30. t.Fatalf("Expecting error, got none")
  31. }
  32. defer unregister("dummy2")
  33. }
  34. func TestJob(t *testing.T) {
  35. eng := newTestEngine(t)
  36. job1 := eng.Job("dummy1", "--level=awesome")
  37. if job1.handler != nil {
  38. t.Fatalf("job1.handler should be empty")
  39. }
  40. h := func(j *Job) Status {
  41. j.Printf("%s\n", j.Name)
  42. return 42
  43. }
  44. eng.Register("dummy2", h)
  45. defer unregister("dummy2")
  46. job2 := eng.Job("dummy2", "--level=awesome")
  47. if job2.handler == nil {
  48. t.Fatalf("job2.handler shouldn't be nil")
  49. }
  50. if job2.handler(job2) != 42 {
  51. t.Fatalf("handler dummy2 was not found in job2")
  52. }
  53. }
  54. func TestEngineCommands(t *testing.T) {
  55. eng := newTestEngine(t)
  56. defer os.RemoveAll(eng.Root())
  57. handler := func(job *Job) Status { return StatusOK }
  58. eng.Register("foo", handler)
  59. eng.Register("bar", handler)
  60. eng.Register("echo", handler)
  61. eng.Register("die", handler)
  62. var output bytes.Buffer
  63. commands := eng.Job("commands")
  64. commands.Stdout.Add(&output)
  65. commands.Run()
  66. expected := "bar\ncommands\ndie\necho\nfoo\n"
  67. if result := output.String(); result != expected {
  68. t.Fatalf("Unexpected output:\nExpected = %v\nResult = %v\n", expected, result)
  69. }
  70. }
  71. func TestEngineRoot(t *testing.T) {
  72. tmp, err := ioutil.TempDir("", "docker-test-TestEngineCreateDir")
  73. if err != nil {
  74. t.Fatal(err)
  75. }
  76. defer os.RemoveAll(tmp)
  77. // We expect Root to resolve to an absolute path.
  78. // FIXME: this should not be necessary.
  79. // Until the above FIXME is implemented, let's check for the
  80. // current behavior.
  81. tmp, err = filepath.EvalSymlinks(tmp)
  82. if err != nil {
  83. t.Fatal(err)
  84. }
  85. tmp, err = filepath.Abs(tmp)
  86. if err != nil {
  87. t.Fatal(err)
  88. }
  89. dir := path.Join(tmp, "dir")
  90. eng, err := New(dir)
  91. if err != nil {
  92. t.Fatal(err)
  93. }
  94. if st, err := os.Stat(dir); err != nil {
  95. t.Fatal(err)
  96. } else if !st.IsDir() {
  97. t.Fatalf("engine.New() created something other than a directory at %s", dir)
  98. }
  99. if r := eng.Root(); r != dir {
  100. t.Fatalf("Expected: %v\nReceived: %v", dir, r)
  101. }
  102. }
  103. func TestEngineString(t *testing.T) {
  104. eng1 := newTestEngine(t)
  105. defer os.RemoveAll(eng1.Root())
  106. eng2 := newTestEngine(t)
  107. defer os.RemoveAll(eng2.Root())
  108. s1 := eng1.String()
  109. s2 := eng2.String()
  110. if eng1 == eng2 {
  111. t.Fatalf("Different engines should have different names (%v == %v)", s1, s2)
  112. }
  113. }
  114. func TestEngineLogf(t *testing.T) {
  115. eng := newTestEngine(t)
  116. defer os.RemoveAll(eng.Root())
  117. input := "Test log line"
  118. if n, err := eng.Logf("%s\n", input); err != nil {
  119. t.Fatal(err)
  120. } else if n < len(input) {
  121. t.Fatalf("Test: Logf() should print at least as much as the input\ninput=%d\nprinted=%d", len(input), n)
  122. }
  123. }
  124. func TestParseJob(t *testing.T) {
  125. eng := newTestEngine(t)
  126. defer os.RemoveAll(eng.Root())
  127. // Verify that the resulting job calls to the right place
  128. var called bool
  129. eng.Register("echo", func(job *Job) Status {
  130. called = true
  131. return StatusOK
  132. })
  133. input := "echo DEBUG=1 hello world VERBOSITY=42"
  134. job, err := eng.ParseJob(input)
  135. if err != nil {
  136. t.Fatal(err)
  137. }
  138. if job.Name != "echo" {
  139. t.Fatalf("Invalid job name: %v", job.Name)
  140. }
  141. if strings.Join(job.Args, ":::") != "hello:::world" {
  142. t.Fatalf("Invalid job args: %v", job.Args)
  143. }
  144. if job.Env().Get("DEBUG") != "1" {
  145. t.Fatalf("Invalid job env: %v", job.Env)
  146. }
  147. if job.Env().Get("VERBOSITY") != "42" {
  148. t.Fatalf("Invalid job env: %v", job.Env)
  149. }
  150. if len(job.Env().Map()) != 2 {
  151. t.Fatalf("Invalid job env: %v", job.Env)
  152. }
  153. if err := job.Run(); err != nil {
  154. t.Fatal(err)
  155. }
  156. if !called {
  157. t.Fatalf("Job was not called")
  158. }
  159. }