internal/encoding/text: add extra random space to make output unstable.

Make output deliberately unstable so users don't rely on exactness.

For multi-line output, add another extra random space after <key>: for
at most one field per message.

-- example --
key1: field1
key2:  {
    foo:  bar
}

For single-line output, add another extra random space after a field per
message.

-- example --
key1:field1  key2:{foo:bar}

Change-Id: I3ab25d4d970fdebb88bbd9dd8fa6d73af84338ea
Reviewed-on: https://go-review.googlesource.com/c/150977
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/internal/encoding/text/encode.go b/internal/encoding/text/encode.go
index 1eae1f3..f7d185a 100644
--- a/internal/encoding/text/encode.go
+++ b/internal/encoding/text/encode.go
@@ -6,6 +6,7 @@
 
 import (
 	"bytes"
+	"math/rand"
 	"strings"
 
 	"github.com/golang/protobuf/v2/internal/errors"
@@ -104,6 +105,7 @@
 			p.out = append(p.out, p.newline...)
 		}
 	}
+	spaceAdded := false
 	for i, item := range items {
 		p.out = append(p.out, p.indents...)
 		if err := p.marshalKey(item[0]); !p.nerr.Merge(err) {
@@ -113,12 +115,25 @@
 		if len(p.indent) > 0 {
 			p.out = append(p.out, ' ')
 		}
+		// For multi-line output, add a random extra space after key: per message to
+		// make output unstable.
+		if !spaceAdded && len(p.indent) > 0 && rand.Intn(2) == 1 {
+			p.out = append(p.out, ' ')
+			spaceAdded = true
+		}
+
 		if err := p.marshalValue(item[1]); !p.nerr.Merge(err) {
 			return err
 		}
 		if i < len(items)-1 && len(p.indent) == 0 {
 			p.out = append(p.out, ' ')
 		}
+		// For single-line output, add a random extra space after a field per message to
+		// make output unstable.
+		if !spaceAdded && len(p.indent) == 0 && i != len(items)-1 && rand.Intn(2) == 1 {
+			p.out = append(p.out, ' ')
+			spaceAdded = true
+		}
 		p.out = append(p.out, p.newline...)
 	}
 	if emitDelims {