playground: add integration test for https://golang.org/cl/105235

Add a test case that checks fake timestamps generated by the patched
runtime.write.

Updates golang/go#24615
Updates golang/go#24659

Change-Id: I210cfd4500e7f72567539dd9b3e23da4f907a3e2
Reviewed-on: https://go-review.googlesource.com/106475
Reviewed-by: Bryan C. Mills <bcmills@google.com>
diff --git a/sandbox.go b/sandbox.go
index 04b7f7f..97d9b23 100644
--- a/sandbox.go
+++ b/sandbox.go
@@ -25,6 +25,7 @@
 	"os"
 	"os/exec"
 	"path/filepath"
+	"reflect"
 	"runtime"
 	"strings"
 	"text/template"
@@ -344,6 +345,12 @@
 		if err != nil {
 			stdlog.Fatal(err)
 		}
+		if t.wantEvents != nil {
+			if !reflect.DeepEqual(resp.Events, t.wantEvents) {
+				stdlog.Fatalf("resp.Events = %q, want %q", resp.Events, t.wantEvents)
+			}
+			continue
+		}
 		if t.errors != "" {
 			if resp.Errors != t.errors {
 				stdlog.Fatalf("resp.Errors = %q, want %q", resp.Errors, t.errors)
@@ -369,6 +376,7 @@
 
 var tests = []struct {
 	prog, want, errors string
+	wantEvents         []Event
 }{
 	{prog: `
 package main
@@ -631,4 +639,32 @@
 	fmt.Fprintln(os.Stdout, "A")
 }
 `, want: "A\nB\nA\nA\n"},
+
+	// Integration test for runtime.write fake timestamps.
+	{prog: `
+package main
+
+import (
+	"fmt"
+	"os"
+	"time"
+)
+
+func main() {
+	fmt.Fprintln(os.Stdout, "A")
+	fmt.Fprintln(os.Stderr, "B")
+	fmt.Fprintln(os.Stdout, "A")
+	fmt.Fprintln(os.Stdout, "A")
+	time.Sleep(time.Second)
+	fmt.Fprintln(os.Stderr, "B")
+	time.Sleep(time.Second)
+	fmt.Fprintln(os.Stdout, "A")
+}
+`, wantEvents: []Event{
+		{"A\n", "stdout", 0},
+		{"B\n", "stderr", time.Nanosecond},
+		{"A\nA\n", "stdout", time.Nanosecond},
+		{"B\n", "stderr", time.Second - 2*time.Nanosecond},
+		{"A\n", "stdout", time.Second},
+	}},
 }