stdio_test.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package main
  2. import (
  3. "bytes"
  4. "io"
  5. "os"
  6. "path/filepath"
  7. "testing"
  8. "github.com/stretchr/testify/assert"
  9. "github.com/stretchr/testify/require"
  10. )
  11. // withStdin temporarily replaces stdinReader for the duration of t.
  12. func withStdin(t *testing.T, r io.Reader) {
  13. t.Helper()
  14. prev := stdinReader
  15. stdinReader = r
  16. t.Cleanup(func() { stdinReader = prev })
  17. }
  18. func Test_readInput_stdin(t *testing.T) {
  19. withStdin(t, bytes.NewBufferString("hello"))
  20. var claims ioClaims
  21. got, err := readInput("path", "-", &claims)
  22. require.NoError(t, err)
  23. assert.Equal(t, []byte("hello"), got)
  24. assert.Equal(t, "path", claims.in)
  25. }
  26. func Test_readInput_file(t *testing.T) {
  27. dir := t.TempDir()
  28. p := filepath.Join(dir, "f")
  29. require.NoError(t, os.WriteFile(p, []byte("file"), 0600))
  30. var claims ioClaims
  31. got, err := readInput("path", p, &claims)
  32. require.NoError(t, err)
  33. assert.Equal(t, []byte("file"), got)
  34. assert.Empty(t, claims.in)
  35. }
  36. func Test_readInput_doubleStdinErrors(t *testing.T) {
  37. withStdin(t, bytes.NewBufferString("hello"))
  38. var claims ioClaims
  39. _, err := readInput("ca-key", "-", &claims)
  40. require.NoError(t, err)
  41. _, err = readInput("ca-crt", "-", &claims)
  42. require.EqualError(t, err, `-ca-key and -ca-crt both set to "-", only one input may read from stdin`)
  43. }
  44. func Test_openInput_stdin(t *testing.T) {
  45. withStdin(t, bytes.NewBufferString("hi"))
  46. var claims ioClaims
  47. r, err := openInput("ca", "-", &claims)
  48. require.NoError(t, err)
  49. defer r.Close()
  50. b, err := io.ReadAll(r)
  51. require.NoError(t, err)
  52. assert.Equal(t, []byte("hi"), b)
  53. }
  54. func Test_openInput_doubleStdinErrors(t *testing.T) {
  55. withStdin(t, bytes.NewBufferString("hi"))
  56. var claims ioClaims
  57. r, err := openInput("ca", "-", &claims)
  58. require.NoError(t, err)
  59. r.Close()
  60. _, err = openInput("crt", "-", &claims)
  61. require.EqualError(t, err, `-ca and -crt both set to "-", only one input may read from stdin`)
  62. }
  63. func Test_writeOutput_stdout(t *testing.T) {
  64. out := &bytes.Buffer{}
  65. err := writeOutput("-", []byte("payload"), 0600, out)
  66. require.NoError(t, err)
  67. assert.Equal(t, "payload", out.String())
  68. }
  69. func Test_writeOutput_file(t *testing.T) {
  70. dir := t.TempDir()
  71. p := filepath.Join(dir, "f")
  72. out := &bytes.Buffer{}
  73. err := writeOutput(p, []byte("payload"), 0600, out)
  74. require.NoError(t, err)
  75. assert.Empty(t, out.String())
  76. got, err := os.ReadFile(p)
  77. require.NoError(t, err)
  78. assert.Equal(t, []byte("payload"), got)
  79. }
  80. func Test_reserveOutputs_noConflict(t *testing.T) {
  81. var claims ioClaims
  82. require.NoError(t, reserveOutputs(&claims,
  83. "out-key", "/tmp/key",
  84. "out-crt", "-",
  85. "out-qr", "",
  86. ))
  87. assert.Equal(t, "out-crt", claims.out)
  88. }
  89. func Test_reserveOutputs_conflict(t *testing.T) {
  90. var claims ioClaims
  91. err := reserveOutputs(&claims,
  92. "out-key", "-",
  93. "out-crt", "-",
  94. )
  95. require.EqualError(t, err, `-out-key and -out-crt both set to "-", only one output may write to stdout`)
  96. }
  97. func Test_reserveOutputs_panicsOnOddPairs(t *testing.T) {
  98. defer func() {
  99. r := recover()
  100. require.NotNil(t, r)
  101. }()
  102. var claims ioClaims
  103. _ = reserveOutputs(&claims, "out-key")
  104. }
  105. func Test_reserveInputs_noConflict(t *testing.T) {
  106. var claims ioClaims
  107. require.NoError(t, reserveInputs(&claims,
  108. "ca-key", "/tmp/ca.key",
  109. "ca-crt", "-",
  110. "in-pub", "",
  111. ))
  112. assert.Equal(t, "ca-crt", claims.in)
  113. }
  114. func Test_reserveInputs_conflict(t *testing.T) {
  115. var claims ioClaims
  116. err := reserveInputs(&claims,
  117. "ca-key", "-",
  118. "ca-crt", "-",
  119. )
  120. require.EqualError(t, err, `-ca-key and -ca-crt both set to "-", only one input may read from stdin`)
  121. }
  122. func Test_claimIn_idempotent(t *testing.T) {
  123. // pre-claim then a lazy re-claim of the same flag should be a no-op
  124. var claims ioClaims
  125. require.NoError(t, claims.claimIn("ca-key"))
  126. require.NoError(t, claims.claimIn("ca-key"))
  127. assert.Equal(t, "ca-key", claims.in)
  128. }
  129. func Test_claimOut_idempotent(t *testing.T) {
  130. var claims ioClaims
  131. require.NoError(t, claims.claimOut("out-crt"))
  132. require.NoError(t, claims.claimOut("out-crt"))
  133. assert.Equal(t, "out-crt", claims.out)
  134. }
  135. func Test_isStdio(t *testing.T) {
  136. assert.True(t, isStdio("-"))
  137. assert.False(t, isStdio(""))
  138. assert.False(t, isStdio("./-"))
  139. assert.False(t, isStdio("foo"))
  140. }