input_test.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package cmdline
  2. import (
  3. "fmt"
  4. "os"
  5. "sync"
  6. "testing"
  7. "time"
  8. "github.com/stretchr/testify/assert"
  9. "github.com/tal-tech/go-zero/core/lang"
  10. )
  11. func TestEnterToContinue(t *testing.T) {
  12. r, w, err := os.Pipe()
  13. assert.Nil(t, err)
  14. var wg sync.WaitGroup
  15. wg.Add(2)
  16. go func() {
  17. defer wg.Done()
  18. ow := os.Stdout
  19. os.Stdout = w
  20. fmt.Println()
  21. os.Stdout = ow
  22. }()
  23. go func() {
  24. defer wg.Done()
  25. or := os.Stdin
  26. os.Stdin = r
  27. EnterToContinue()
  28. os.Stdin = or
  29. }()
  30. wait := make(chan lang.PlaceholderType)
  31. go func() {
  32. wg.Wait()
  33. close(wait)
  34. }()
  35. select {
  36. case <-time.After(time.Second):
  37. t.Error("timeout")
  38. case <-wait:
  39. }
  40. }
  41. func TestReadLine(t *testing.T) {
  42. r, w, err := os.Pipe()
  43. assert.Nil(t, err)
  44. const message = "hello"
  45. var wg sync.WaitGroup
  46. wg.Add(2)
  47. go func() {
  48. defer wg.Done()
  49. ow := os.Stdout
  50. os.Stdout = w
  51. fmt.Println(message)
  52. os.Stdout = ow
  53. }()
  54. go func() {
  55. defer wg.Done()
  56. or := os.Stdin
  57. os.Stdin = r
  58. input := ReadLine("")
  59. assert.Equal(t, message, input)
  60. os.Stdin = or
  61. }()
  62. wait := make(chan lang.PlaceholderType)
  63. go func() {
  64. wg.Wait()
  65. close(wait)
  66. }()
  67. select {
  68. case <-time.After(time.Second):
  69. t.Error("timeout")
  70. case <-wait:
  71. }
  72. }