event: merge the print and common tests to be a better test suite

Also add some extra tests to cover more functionality.

Change-Id: I1c5504afdc07c494722f190ba0409f5b9ba9696c
Reviewed-on: https://go-review.googlesource.com/c/exp/+/333074
Trust: Ian Cottrell <iancottrell@google.com>
Run-TryBot: Ian Cottrell <iancottrell@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
diff --git a/event/adapter/gokit/gokit_test.go b/event/adapter/gokit/gokit_test.go
index d76dfaf..5db17dd 100644
--- a/event/adapter/gokit/gokit_test.go
+++ b/event/adapter/gokit/gokit_test.go
@@ -30,7 +30,7 @@
 			event.String("msg", "mess"),
 		},
 	}}
-	if diff := cmp.Diff(want, h.Got, eventtest.CmpOption()); diff != "" {
+	if diff := cmp.Diff(want, h.Got, eventtest.CmpOptions()...); diff != "" {
 		t.Errorf("mismatch (-want, +got):\n%s", diff)
 	}
 }
diff --git a/event/adapter/logr/logr_test.go b/event/adapter/logr/logr_test.go
index 66a60f0..8dcb87b 100644
--- a/event/adapter/logr/logr_test.go
+++ b/event/adapter/logr/logr_test.go
@@ -32,7 +32,7 @@
 			event.String("msg", "mess"),
 		},
 	}}
-	if diff := cmp.Diff(want, th.Got, eventtest.CmpOption()); diff != "" {
+	if diff := cmp.Diff(want, th.Got, eventtest.CmpOptions()...); diff != "" {
 		t.Errorf("mismatch (-want, +got):\n%s", diff)
 	}
 }
diff --git a/event/adapter/logrus/logrus_test.go b/event/adapter/logrus/logrus_test.go
index 467485e..bf8b850 100644
--- a/event/adapter/logrus/logrus_test.go
+++ b/event/adapter/logrus/logrus_test.go
@@ -11,7 +11,6 @@
 	"testing"
 
 	"github.com/google/go-cmp/cmp"
-	"github.com/google/go-cmp/cmp/cmpopts"
 	"github.com/sirupsen/logrus"
 	"golang.org/x/exp/event"
 	elogrus "golang.org/x/exp/event/adapter/logrus"
@@ -39,8 +38,7 @@
 	}}
 	// logrus fields are stored in a map, so we have to sort to overcome map
 	// iteration indeterminacy.
-	less := func(a, b event.Label) bool { return a.Name < b.Name }
-	if diff := cmp.Diff(want, th.Got, cmpopts.SortSlices(less), eventtest.CmpOption()); diff != "" {
+	if diff := cmp.Diff(want, th.Got, eventtest.CmpOptions()...); diff != "" {
 		t.Errorf("mismatch (-want, +got):\n%s", diff)
 	}
 }
diff --git a/event/adapter/zap/zap_test.go b/event/adapter/zap/zap_test.go
index 55461bf..95f6849 100644
--- a/event/adapter/zap/zap_test.go
+++ b/event/adapter/zap/zap_test.go
@@ -34,7 +34,7 @@
 			event.String("msg", "mess"),
 		},
 	}}
-	if diff := cmp.Diff(want, h.Got, eventtest.CmpOption()); diff != "" {
+	if diff := cmp.Diff(want, h.Got, eventtest.CmpOptions()...); diff != "" {
 		t.Errorf("mismatch (-want, +got):\n%s", diff)
 	}
 }
diff --git a/event/common_test.go b/event/common_test.go
deleted file mode 100644
index 35d021e..0000000
--- a/event/common_test.go
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !disable_events
-
-package event_test
-
-import (
-	"context"
-	"testing"
-
-	"github.com/google/go-cmp/cmp"
-	"golang.org/x/exp/event"
-	"golang.org/x/exp/event/eventtest"
-)
-
-func TestCommon(t *testing.T) {
-	m := event.NewCounter("m", "")
-	for _, test := range []struct {
-		method string
-		events func(context.Context)
-		expect []event.Event
-	}{{
-		method: "Log",
-		events: func(ctx context.Context) { event.Log(ctx, "simple message") },
-		expect: []event.Event{{
-			ID:     1,
-			Kind:   event.LogKind,
-			Labels: []event.Label{event.String("msg", "simple message")},
-		}},
-	}, {
-		method: "Logf",
-		events: func(ctx context.Context) { event.Logf(ctx, "logf %s message", "to") },
-		expect: []event.Event{{
-			ID:     1,
-			Kind:   event.LogKind,
-			Labels: []event.Label{event.String("msg", "logf to message")},
-		}},
-	}, {
-		method: "Metric",
-		events: func(ctx context.Context) {
-			m.Record(ctx, 3)
-		},
-		expect: []event.Event{{
-			ID:   1,
-			Kind: event.MetricKind,
-			Labels: []event.Label{
-				event.Int64("metricValue", 3),
-				event.Value("metric", m),
-			},
-		}},
-	}, {
-		method: "Annotate",
-		events: func(ctx context.Context) { event.Annotate(ctx, event.String("other", "some value")) },
-		expect: []event.Event{{
-			ID:     1,
-			Labels: []event.Label{event.String("other", "some value")},
-		}},
-	}, {
-		method: "Start",
-		events: func(ctx context.Context) {
-			ctx = event.Start(ctx, `a trace`)
-			event.End(ctx)
-		},
-		expect: []event.Event{{
-			ID:     1,
-			Kind:   event.StartKind,
-			Labels: []event.Label{event.String("name", "a trace")},
-		}, {
-			ID:     2,
-			Parent: 1,
-			Kind:   event.EndKind,
-			Labels: []event.Label{},
-		}},
-	}} {
-		t.Run(test.method, func(t *testing.T) {
-			ctx, h := eventtest.NewCapture()
-			test.events(ctx)
-			if diff := cmp.Diff(test.expect, h.Got, eventtest.CmpOption()); diff != "" {
-				t.Errorf("mismatch (-want, +got):\n%s", diff)
-			}
-		})
-	}
-}
diff --git a/event/event_test.go b/event/event_test.go
index 8bedc21..d918bcd 100644
--- a/event/event_test.go
+++ b/event/event_test.go
@@ -8,12 +8,13 @@
 
 import (
 	"context"
+	"errors"
 	"fmt"
 	"os"
-	"strings"
 	"testing"
 	"time"
 
+	"github.com/google/go-cmp/cmp"
 	"golang.org/x/exp/event"
 	"golang.org/x/exp/event/adapter/logfmt"
 	"golang.org/x/exp/event/eventtest"
@@ -26,41 +27,84 @@
 	counter = event.NewCounter("hits", "cache hits")
 	gauge   = event.NewFloatGauge("temperature", "CPU board temperature in Celsius")
 	latency = event.NewDuration("latency", "how long it took")
+	err     = errors.New("an error")
 )
 
-func TestPrint(t *testing.T) {
-	ctx := context.Background()
+func TestCommon(t *testing.T) {
 	for _, test := range []struct {
-		name   string
+		method string
 		events func(context.Context)
-		expect string
+		expect []event.Event
 	}{{
-		name:   "simple",
+		method: "simple",
 		events: func(ctx context.Context) { event.Log(ctx, "a message") },
-		expect: `time="2020/03/05 14:27:48" msg="a message"
-`}, {
-		name:   "log 1",
+		expect: []event.Event{{
+			ID:     1,
+			Kind:   event.LogKind,
+			Labels: []event.Label{event.String("msg", "a message")},
+		}},
+	}, {
+		method: "log 1",
 		events: func(ctx context.Context) { event.Log(ctx, "a message", l1) },
-		expect: `time="2020/03/05 14:27:48" l1=1 msg="a message"`,
+		expect: []event.Event{{
+			ID:     1,
+			Kind:   event.LogKind,
+			Labels: []event.Label{event.String("msg", "a message"), l1},
+		}},
 	}, {
-		name:   "log 2",
+		method: "log 2",
 		events: func(ctx context.Context) { event.Log(ctx, "a message", l1, l2) },
-		expect: `time="2020/03/05 14:27:48" l1=1 l2=2 msg="a message"`,
+		expect: []event.Event{{
+			ID:     1,
+			Kind:   event.LogKind,
+			Labels: []event.Label{event.String("msg", "a message"), l1, l2},
+		}},
 	}, {
-		name:   "log 3",
+		method: "log 3",
 		events: func(ctx context.Context) { event.Log(ctx, "a message", l1, l2, l3) },
-		expect: `time="2020/03/05 14:27:48" l1=1 l2=2 l3=3 msg="a message"`,
+		expect: []event.Event{{
+			ID:     1,
+			Kind:   event.LogKind,
+			Labels: []event.Label{event.String("msg", "a message"), l1, l2, l3},
+		}},
 	}, {
-		name: "span",
+		method: "logf",
+		events: func(ctx context.Context) { event.Logf(ctx, "logf %s message", "to") },
+		expect: []event.Event{{
+			ID:     1,
+			Kind:   event.LogKind,
+			Labels: []event.Label{event.String("msg", "logf to message")},
+		}},
+	}, {
+		method: "error",
+		events: func(ctx context.Context) { event.Error(ctx, "failed", err, l1) },
+		expect: []event.Event{{
+			ID:   1,
+			Kind: event.LogKind,
+			Labels: []event.Label{
+				event.String("msg", "failed"),
+				event.Value("error", err),
+				l1,
+			},
+		}},
+	}, {
+		method: "span",
 		events: func(ctx context.Context) {
-			ctx = event.Start(ctx, "span")
+			ctx = event.Start(ctx, `span`)
 			event.End(ctx)
 		},
-		expect: `
-time="2020/03/05 14:27:48" name=span trace=1
-time="2020/03/05 14:27:49" parent=1 end
-`}, {
-		name: "span nested",
+		expect: []event.Event{{
+			ID:     1,
+			Kind:   event.StartKind,
+			Labels: []event.Label{event.String("name", "span")},
+		}, {
+			ID:     2,
+			Parent: 1,
+			Kind:   event.EndKind,
+			Labels: []event.Label{},
+		}},
+	}, {
+		method: "span nested",
 		events: func(ctx context.Context) {
 			ctx = event.Start(ctx, "parent")
 			defer event.End(ctx)
@@ -68,36 +112,83 @@
 			defer event.End(child)
 			event.Log(child, "message")
 		},
-		expect: `
-time="2020/03/05 14:27:48" name=parent trace=1
-time="2020/03/05 14:27:49" parent=1 name=child trace=2
-time="2020/03/05 14:27:50" parent=2 msg=message
-time="2020/03/05 14:27:51" parent=2 end
-time="2020/03/05 14:27:52" parent=1 end
-`}, {
-		name:   "counter",
+		expect: []event.Event{{
+			ID:     1,
+			Kind:   event.StartKind,
+			Labels: []event.Label{event.String("name", "parent")},
+		}, {
+			ID:     2,
+			Parent: 1,
+			Kind:   event.StartKind,
+			Labels: []event.Label{event.String("name", "child")},
+		}, {
+			ID:     3,
+			Parent: 2,
+			Kind:   event.LogKind,
+			Labels: []event.Label{event.String("msg", "message")},
+		}, {
+			ID:     4,
+			Parent: 2,
+			Kind:   event.EndKind,
+			Labels: []event.Label{},
+		}, {
+			ID:     5,
+			Parent: 1,
+			Kind:   event.EndKind,
+			Labels: []event.Label{},
+		}},
+	}, {
+		method: "counter",
 		events: func(ctx context.Context) { counter.Record(ctx, 2, l1) },
-		expect: `time="2020/03/05 14:27:48" metricValue=2 metric="Metric(\"golang.org/x/exp/event_test/hits\")" l1=1`,
+		expect: []event.Event{{
+			ID:   1,
+			Kind: event.MetricKind,
+			Labels: []event.Label{
+				event.Int64("metricValue", 2),
+				event.Value("metric", counter),
+				l1,
+			},
+		}},
 	}, {
-		name:   "gauge",
+		method: "gauge",
 		events: func(ctx context.Context) { gauge.Record(ctx, 98.6, l1) },
-		expect: `time="2020/03/05 14:27:48" metricValue=98.6 metric="Metric(\"golang.org/x/exp/event_test/temperature\")" l1=1`,
+		expect: []event.Event{{
+			ID:   1,
+			Kind: event.MetricKind,
+			Labels: []event.Label{
+				event.Float64("metricValue", 98.6),
+				event.Value("metric", gauge),
+				l1,
+			},
+		}},
 	}, {
-		name: "duration",
-		events: func(ctx context.Context) {
-			latency.Record(ctx, 3*time.Second, l1, l2)
-		},
-		expect: `time="2020/03/05 14:27:48" metricValue=3s metric="Metric(\"golang.org/x/exp/event_test/latency\")" l1=1 l2=2`,
+		method: "duration",
+		events: func(ctx context.Context) { latency.Record(ctx, 3*time.Second, l1, l2) },
+		expect: []event.Event{{
+			ID:   1,
+			Kind: event.MetricKind,
+			Labels: []event.Label{
+				event.Duration("metricValue", 3*time.Second),
+				event.Value("metric", latency),
+				l1, l2,
+			},
+		}},
 	}, {
-		name:   "annotate",
+		method: "annotate",
 		events: func(ctx context.Context) { event.Annotate(ctx, l1) },
-		expect: `time="2020/03/05 14:27:48" l1=1`,
+		expect: []event.Event{{
+			ID:     1,
+			Labels: []event.Label{l1},
+		}},
 	}, {
-		name:   "annotate 2",
+		method: "annotate 2",
 		events: func(ctx context.Context) { event.Annotate(ctx, l1, l2) },
-		expect: `time="2020/03/05 14:27:48" l1=1 l2=2`,
+		expect: []event.Event{{
+			ID:     1,
+			Labels: []event.Label{l1, l2},
+		}},
 	}, {
-		name: "multiple events",
+		method: "multiple events",
 		events: func(ctx context.Context) {
 			/*TODO: this is supposed to be using a cached target
 			t := event.To(ctx)
@@ -108,18 +199,29 @@
 			event.Log(ctx, "my event", event.Int64("myInt", 6))
 			event.Log(ctx, "string event", event.String("myString", "some string value"))
 		},
-		expect: `
-time="2020/03/05 14:27:48" myInt=6 msg="my event"
-time="2020/03/05 14:27:49" myString="some string value" msg="string event"
-`}} {
-		buf := &strings.Builder{}
-		ctx := event.WithExporter(ctx, event.NewExporter(logfmt.NewHandler(buf), eventtest.ExporterOptions()))
-		test.events(ctx)
-		got := strings.TrimSpace(buf.String())
-		expect := strings.TrimSpace(test.expect)
-		if got != expect {
-			t.Errorf("%s failed\ngot   : %s\nexpect: %s", test.name, got, expect)
-		}
+		expect: []event.Event{{
+			ID:   1,
+			Kind: event.LogKind,
+			Labels: []event.Label{
+				event.String("msg", "my event"),
+				event.Int64("myInt", 6),
+			},
+		}, {
+			ID:   2,
+			Kind: event.LogKind,
+			Labels: []event.Label{
+				event.String("msg", "string event"),
+				event.String("myString", "some string value"),
+			},
+		}},
+	}} {
+		t.Run(test.method, func(t *testing.T) {
+			ctx, h := eventtest.NewCapture()
+			test.events(ctx)
+			if diff := cmp.Diff(test.expect, h.Got, eventtest.CmpOptions()...); diff != "" {
+				t.Errorf("mismatch (-want, +got):\n%s", diff)
+			}
+		})
 	}
 }
 
diff --git a/event/eventtest/eventtest.go b/event/eventtest/eventtest.go
index dd55a43..8081159 100644
--- a/event/eventtest/eventtest.go
+++ b/event/eventtest/eventtest.go
@@ -55,6 +55,11 @@
 	}
 }
 
-func CmpOption() cmp.Option {
-	return cmpopts.IgnoreFields(event.Event{}, "At", "ctx", "target", "labels")
+func CmpOptions() []cmp.Option {
+	return []cmp.Option{
+		cmpopts.SortSlices(func(x, y event.Label) bool {
+			return x.Name < y.Name
+		}),
+		cmpopts.IgnoreFields(event.Event{}, "At", "ctx", "target", "labels"),
+	}
 }
diff --git a/event/label_test.go b/event/label_test.go
index 7ca43a8..0bf3ae1 100644
--- a/event/label_test.go
+++ b/event/label_test.go
@@ -35,6 +35,10 @@
 	if got := v.String(); got != s {
 		t.Errorf("got %v, want %v", got, s)
 	}
+	v = event.Bytes("key", []byte(s))
+	if got := v.Bytes(); string(got) != s {
+		t.Errorf("got %v, want %v", got, s)
+	}
 	tm := time.Now()
 	v = event.Value("key", tm)
 	if got := v.Interface(); got != tm {
@@ -91,6 +95,8 @@
 		{"uint64", func() { event.Int64("key", 3).Uint64() }},
 		{"float64", func() { event.Uint64("key", 3).Float64() }},
 		{"bool", func() { event.Int64("key", 3).Bool() }},
+		{"duration", func() { event.Value("key", "value").Duration() }},
+		{"bytes", func() { event.String("key", "value").Bytes() }},
 	} {
 		if !panics(test.f) {
 			t.Errorf("%s: got no panic, want panic", test.name)