1// Copyright 2022 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package main
16
17import (
18	"bytes"
19	"strings"
20	"testing"
21)
22
23func Test_extractR8CompilerHash(t *testing.T) {
24	testCases := []struct {
25		name string
26		data string
27
28		hash string
29		err  string
30	}{
31		{
32			name: "simple",
33			data: `# compiler: R8
34# compiler_version: 3.3.18-dev
35# min_api: 10000
36# compiler_hash: bab44c1a04a2201b55fe10394f477994205c34e0
37# common_typos_disable
38# {"id":"com.android.tools.r8.mapping","version":"2.0"}
39# pg_map_id: 7fe8b95
40# pg_map_hash: SHA-256 7fe8b95ae71f179f63d2a585356fb9cf2c8fb94df9c9dd50621ffa6d9e9e88da
41android.car.userlib.UserHelper -> android.car.userlib.UserHelper:
42`,
43			hash: "7fe8b95ae71f179f63d2a585356fb9cf2c8fb94df9c9dd50621ffa6d9e9e88da",
44		},
45		{
46			name: "empty",
47			data: ``,
48			hash: "",
49		},
50		{
51			name: "non comment line",
52			data: `# compiler: R8
53# compiler_version: 3.3.18-dev
54# min_api: 10000
55# compiler_hash: bab44c1a04a2201b55fe10394f477994205c34e0
56# common_typos_disable
57# {"id":"com.android.tools.r8.mapping","version":"2.0"}
58# pg_map_id: 7fe8b95
59android.car.userlib.UserHelper -> android.car.userlib.UserHelper:
60# pg_map_hash: SHA-256 7fe8b95ae71f179f63d2a585356fb9cf2c8fb94df9c9dd50621ffa6d9e9e88da
61`,
62			hash: "",
63		},
64		{
65			name: "invalid hash",
66			data: `# pg_map_hash: foobar 7fe8b95ae71f179f63d2a585356fb9cf2c8fb94df9c9dd50621ffa6d9e9e88da`,
67			err:  "invalid hash type",
68		},
69	}
70
71	for _, tt := range testCases {
72		t.Run(tt.name, func(t *testing.T) {
73			hash, err := extractR8CompilerHash(bytes.NewBufferString(tt.data))
74			if err != nil {
75				if tt.err != "" {
76					if !strings.Contains(err.Error(), tt.err) {
77						t.Fatalf("incorrect error in extractR8CompilerHash, want %s got %s", tt.err, err)
78					}
79				} else {
80					t.Fatalf("unexpected error in extractR8CompilerHash: %s", err)
81				}
82			} else if tt.err != "" {
83				t.Fatalf("missing error in extractR8CompilerHash, want %s", tt.err)
84			}
85
86			if g, w := hash, tt.hash; g != w {
87				t.Errorf("incorrect hash, want %q got %q", w, g)
88			}
89		})
90	}
91}
92