1// Copyright 2015 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package pkcs12
6
7import (
8	"bytes"
9	"encoding/hex"
10	"testing"
11)
12
13var bmpStringTests = []struct {
14	in          string
15	expectedHex string
16	shouldFail  bool
17}{
18	{"", "0000", false},
19	// Example from https://tools.ietf.org/html/rfc7292#appendix-B.
20	{"Beavis", "0042006500610076006900730000", false},
21	// Some characters from the "Letterlike Symbols Unicode block".
22	{"\u2115 - Double-struck N", "21150020002d00200044006f00750062006c0065002d00730074007200750063006b0020004e0000", false},
23	// any character outside the BMP should trigger an error.
24	{"\U0001f000 East wind (Mahjong)", "", true},
25}
26
27func TestBMPString(t *testing.T) {
28	for i, test := range bmpStringTests {
29		expected, err := hex.DecodeString(test.expectedHex)
30		if err != nil {
31			t.Fatalf("#%d: failed to decode expectation", i)
32		}
33
34		out, err := bmpString(test.in)
35		if err == nil && test.shouldFail {
36			t.Errorf("#%d: expected to fail, but produced %x", i, out)
37			continue
38		}
39
40		if err != nil && !test.shouldFail {
41			t.Errorf("#%d: failed unexpectedly: %s", i, err)
42			continue
43		}
44
45		if !test.shouldFail {
46			if !bytes.Equal(out, expected) {
47				t.Errorf("#%d: expected %s, got %x", i, test.expectedHex, out)
48				continue
49			}
50
51			roundTrip, err := decodeBMPString(out)
52			if err != nil {
53				t.Errorf("#%d: decoding output gave an error: %s", i, err)
54				continue
55			}
56
57			if roundTrip != test.in {
58				t.Errorf("#%d: decoding output resulted in %q, but it should have been %q", i, roundTrip, test.in)
59				continue
60			}
61		}
62	}
63}
64