doc/tutorial/kubernets: make more OS-independent

Change-Id: I4ba8a11a37a3e46360bda1039ace5fa60f3c293f
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/2286
Reviewed-by: Marcel van Lohuizen <mpvl@google.com>
diff --git a/doc/tutorial/kubernetes/quick/cue.mod b/doc/tutorial/kubernetes/quick/cue.mod
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/doc/tutorial/kubernetes/quick/cue.mod
diff --git a/doc/tutorial/kubernetes/tut_test.go b/doc/tutorial/kubernetes/tut_test.go
index 4866f20..4df54c8 100644
--- a/doc/tutorial/kubernetes/tut_test.go
+++ b/doc/tutorial/kubernetes/tut_test.go
@@ -117,6 +117,7 @@
 				cmd = cmd[:p]
 			}
 
+			logf(t, "$ %s", cmd)
 			switch cmd = strings.TrimSpace(cmd); {
 			case strings.HasPrefix(cmd, "cat"):
 				if input == "" {
@@ -146,8 +147,6 @@
 				}
 
 			case strings.HasPrefix(cmd, "cue "):
-				logf(t, "$ %s", cmd)
-
 				if strings.HasPrefix(cmd, "cue create") {
 					// Don't execute the kubernetes dry run.
 					break
@@ -158,20 +157,32 @@
 				}
 
 				cuetest.Run(t, wd, cmd, &cuetest.Config{
-					Stdin:  strings.NewReader(input),
-					Stdout: ioutil.Discard,
+					Stdin: strings.NewReader(input),
 				})
 
-			case strings.HasPrefix(cmd, "sed "),
-				strings.HasPrefix(cmd, "touch "):
-				logf(t, "$ %s", cmd)
-				args := cuetest.SplitArgs(t, cmd)
-				cx := exec.Command(args[0], args[1:]...)
-				if input != "" {
-					cx.Stdin = strings.NewReader(input)
-					cx.Stdout = ioutil.Discard
+			case strings.HasPrefix(cmd, "sed "):
+				c := cuetest.NewChunker(t, []byte(cmd))
+				c.Next("s/", "/")
+				re := regexp.MustCompile(c.Text())
+				c.Next("", "/'")
+				repl := c.Bytes()
+				c.Next(" ", ".cue")
+				file := c.Text() + ".cue"
+				b, err := ioutil.ReadFile(file)
+				if err != nil {
+					t.Fatal(err)
 				}
-				if err := cx.Run(); err != nil {
+				b = re.ReplaceAll(b, repl)
+				err = ioutil.WriteFile(file, b, 0644)
+				if err != nil {
+					t.Fatal(err)
+				}
+
+			case strings.HasPrefix(cmd, "touch "):
+				logf(t, "$ %s", cmd)
+				file := strings.TrimSpace(cmd[len("touch "):])
+				err := ioutil.WriteFile(file, []byte(""), 0644)
+				if err != nil {
 					t.Fatal(err)
 				}
 			}
@@ -280,7 +291,8 @@
 			}
 
 			if got, want := string(got), string(b); got != want {
-				t.Errorf("files differ:\n%s", diff.Diff(got, want))
+				t.Log(got)
+				t.Errorf("output differs for file %s in %s", testfile, cwd)
 			}
 		})
 	}
diff --git a/internal/cuetest/sim.go b/internal/cuetest/sim.go
index 87f0f99..ed105c7 100644
--- a/internal/cuetest/sim.go
+++ b/internal/cuetest/sim.go
@@ -66,11 +66,16 @@
 	cmd, err := cmd.New(args)
 	if cfg.Stdout != nil {
 		cmd.SetOutput(cfg.Stdout)
+	} else {
+		cmd.SetOutput(buf)
 	}
 	if cfg.Stdin != nil {
 		cmd.SetInput(cfg.Stdin)
 	}
 	if err = cmd.Run(context.Background()); err != nil {
+		if cfg.Stdout == nil {
+			logf(t, "Ouput:\n%s", buf.String())
+		}
 		logf(t, "Execution failed: %v", err)
 	}
 
@@ -93,6 +98,7 @@
 }
 
 func logf(t *testing.T, format string, args ...interface{}) {
+	t.Helper()
 	t.Logf(format, args...)
 }