1package machineid
2
3import (
4	"bytes"
5	"crypto/hmac"
6	"crypto/sha256"
7	"encoding/hex"
8	"strings"
9	"testing"
10)
11
12func Test_protect(t *testing.T) {
13	appID := "ms.azur.appX"
14	machineID := "1a1238d601ad430cbea7efb0d1f3d92d"
15	hash := protect(appID, machineID)
16	if hash == "" {
17		t.Error("hash is empty")
18	}
19	rawHash, err := hex.DecodeString(hash)
20	if err != nil {
21		t.Error(err)
22	}
23	eq := checkMAC([]byte(appID), rawHash, []byte(machineID))
24	if eq == false {
25		t.Error("hashes do not match")
26	}
27	// modify rawHash --> should not match
28	rawHash[0] = 0
29	eq = checkMAC([]byte(appID), rawHash, []byte(machineID))
30	if eq == true {
31		t.Error("hashes do match, but shouldn't")
32	}
33}
34
35func checkMAC(message, messageMAC, key []byte) bool {
36	mac := hmac.New(sha256.New, key)
37	mac.Write(message)
38	expectedMAC := mac.Sum(nil)
39	return hmac.Equal(messageMAC, expectedMAC)
40}
41
42func Test_run(t *testing.T) {
43	stdout := &bytes.Buffer{}
44	stderr := &bytes.Buffer{}
45	wantStdout := "hello"
46	wantStderr := ""
47	if err := run(stdout, stderr, "echo", "hello"); err != nil {
48		t.Error(err)
49	}
50	gotStdout := strings.TrimRight(stdout.String(), "\r\n")
51	if gotStdout != wantStdout {
52		t.Errorf("run() = %v, want %v", gotStdout, wantStdout)
53	}
54	if gotStderr := stderr.String(); gotStderr != wantStderr {
55		t.Errorf("run() = %v, want %v", gotStderr, wantStderr)
56	}
57}
58
59func Test_run_unknown(t *testing.T) {
60	stdout := &bytes.Buffer{}
61	stderr := &bytes.Buffer{}
62	err := run(stdout, stderr, "echolo", "hello")
63	if err == nil {
64		t.Error("expected error, got none")
65	}
66	if strings.Contains(err.Error(), "executable file not found") == false {
67		t.Error("unexpected error, expected exec not found")
68	}
69}
70
71func Test_trim(t *testing.T) {
72	type args struct {
73		s string
74	}
75	tests := []struct {
76		name string
77		args args
78		want string
79	}{
80		{
81			name: "nil",
82			args: args{s: ""},
83			want: "",
84		},
85		{
86			name: "space",
87			args: args{s: " space "},
88			want: "space",
89		},
90		{
91			name: "nl",
92			args: args{s: "data\n"},
93			want: "data",
94		},
95		{
96			name: "combined",
97			args: args{s: " some data \n"},
98			want: "some data",
99		},
100	}
101	for _, tt := range tests {
102		t.Run(tt.name, func(t *testing.T) {
103			if got := trim(tt.args.s); got != tt.want {
104				t.Errorf("trim() = %v, want %v", got, tt.want)
105			}
106		})
107	}
108}
109