Signed-off-by: Tibor Vass <teabee89@gmail.com>
| ... | ... |
@@ -1,12 +1,18 @@ |
| 1 | 1 |
package main |
| 2 | 2 |
|
| 3 | 3 |
import ( |
| 4 |
+ "bufio" |
|
| 4 | 5 |
"fmt" |
| 6 |
+ "io/ioutil" |
|
| 7 |
+ "os" |
|
| 5 | 8 |
"os/exec" |
| 6 | 9 |
"strconv" |
| 7 | 10 |
"strings" |
| 8 | 11 |
"testing" |
| 9 | 12 |
"time" |
| 13 |
+ "unicode" |
|
| 14 |
+ |
|
| 15 |
+ "github.com/kr/pty" |
|
| 10 | 16 |
) |
| 11 | 17 |
|
| 12 | 18 |
func TestEventsUntag(t *testing.T) {
|
| ... | ... |
@@ -166,3 +172,46 @@ func TestEventsImageUntagDelete(t *testing.T) {
|
| 166 | 166 |
} |
| 167 | 167 |
logDone("events - image untag, delete is logged")
|
| 168 | 168 |
} |
| 169 |
+ |
|
| 170 |
+// #5979 |
|
| 171 |
+func TestEventsRedirectStdout(t *testing.T) {
|
|
| 172 |
+ |
|
| 173 |
+ since := time.Now().Unix() |
|
| 174 |
+ |
|
| 175 |
+ cmd(t, "run", "busybox", "true") |
|
| 176 |
+ |
|
| 177 |
+ defer deleteAllContainers() |
|
| 178 |
+ |
|
| 179 |
+ file, err := ioutil.TempFile("", "")
|
|
| 180 |
+ if err != nil {
|
|
| 181 |
+ t.Fatalf("could not create temp file: %v", err)
|
|
| 182 |
+ } |
|
| 183 |
+ defer os.Remove(file.Name()) |
|
| 184 |
+ |
|
| 185 |
+ command := fmt.Sprintf("%s events --since=%d --until=%d > %s", dockerBinary, since, time.Now().Unix(), file.Name())
|
|
| 186 |
+ _, tty, err := pty.Open() |
|
| 187 |
+ if err != nil {
|
|
| 188 |
+ t.Fatalf("Could not open pty: %v", err)
|
|
| 189 |
+ } |
|
| 190 |
+ cmd := exec.Command("sh", "-c", command)
|
|
| 191 |
+ cmd.Stdin = tty |
|
| 192 |
+ cmd.Stdout = tty |
|
| 193 |
+ cmd.Stderr = tty |
|
| 194 |
+ if err := cmd.Run(); err != nil {
|
|
| 195 |
+ t.Fatalf("run err for command %q: %v", command, err)
|
|
| 196 |
+ } |
|
| 197 |
+ |
|
| 198 |
+ scanner := bufio.NewScanner(file) |
|
| 199 |
+ for scanner.Scan() {
|
|
| 200 |
+ for _, c := range scanner.Text() {
|
|
| 201 |
+ if unicode.IsControl(c) {
|
|
| 202 |
+ t.Fatalf("found control character %v", []byte(string(c)))
|
|
| 203 |
+ } |
|
| 204 |
+ } |
|
| 205 |
+ } |
|
| 206 |
+ if err := scanner.Err(); err != nil {
|
|
| 207 |
+ t.Fatalf("Scan err for command %q: %v", command, err)
|
|
| 208 |
+ } |
|
| 209 |
+ |
|
| 210 |
+ logDone("events - redirect stdout")
|
|
| 211 |
+} |
| ... | ... |
@@ -19,6 +19,7 @@ import ( |
| 19 | 19 |
|
| 20 | 20 |
"github.com/docker/docker/pkg/mount" |
| 21 | 21 |
"github.com/docker/docker/pkg/networkfs/resolvconf" |
| 22 |
+ "github.com/kr/pty" |
|
| 22 | 23 |
) |
| 23 | 24 |
|
| 24 | 25 |
// "test123" should be printed by docker run |
| ... | ... |
@@ -2162,3 +2163,41 @@ func TestRunExecDir(t *testing.T) {
|
| 2162 | 2162 |
|
| 2163 | 2163 |
logDone("run - check execdriver dir behavior")
|
| 2164 | 2164 |
} |
| 2165 |
+ |
|
| 2166 |
+// #6509 |
|
| 2167 |
+func TestRunRedirectStdout(t *testing.T) {
|
|
| 2168 |
+ |
|
| 2169 |
+ defer deleteAllContainers() |
|
| 2170 |
+ |
|
| 2171 |
+ checkRedirect := func(command string) {
|
|
| 2172 |
+ _, tty, err := pty.Open() |
|
| 2173 |
+ if err != nil {
|
|
| 2174 |
+ t.Fatalf("Could not open pty: %v", err)
|
|
| 2175 |
+ } |
|
| 2176 |
+ cmd := exec.Command("sh", "-c", command)
|
|
| 2177 |
+ cmd.Stdin = tty |
|
| 2178 |
+ cmd.Stdout = tty |
|
| 2179 |
+ cmd.Stderr = tty |
|
| 2180 |
+ ch := make(chan struct{})
|
|
| 2181 |
+ if err := cmd.Start(); err != nil {
|
|
| 2182 |
+ t.Fatalf("start err: %v", err)
|
|
| 2183 |
+ } |
|
| 2184 |
+ go func() {
|
|
| 2185 |
+ if err := cmd.Wait(); err != nil {
|
|
| 2186 |
+ t.Fatalf("wait err=%v", err)
|
|
| 2187 |
+ } |
|
| 2188 |
+ close(ch) |
|
| 2189 |
+ }() |
|
| 2190 |
+ |
|
| 2191 |
+ select {
|
|
| 2192 |
+ case <-time.After(time.Second): |
|
| 2193 |
+ t.Fatal("command timeout")
|
|
| 2194 |
+ case <-ch: |
|
| 2195 |
+ } |
|
| 2196 |
+ } |
|
| 2197 |
+ |
|
| 2198 |
+ checkRedirect(dockerBinary + " run -i busybox cat /etc/passwd | grep -q root") |
|
| 2199 |
+ checkRedirect(dockerBinary + " run busybox cat /etc/passwd | grep -q root") |
|
| 2200 |
+ |
|
| 2201 |
+ logDone("run - redirect stdout")
|
|
| 2202 |
+} |