1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package resource_test
16
17 import (
18 "bytes"
19 "io"
20 "testing"
21
22 "github.com/stretchr/testify/require"
23
24 "go.opentelemetry.io/otel/sdk/resource"
25 )
26
27 func TestParsePlistFile(t *testing.T) {
28 standardPlist := bytes.NewBufferString(`<?xml version="1.0" encoding="UTF-8"?>
29 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
30 <plist version="1.0">
31 <dict>
32 <key>ProductBuildVersion</key>
33 <string>20E232</string>
34 <key>ProductCopyright</key>
35 <string>1983-2021 Apple Inc.</string>
36 <key>ProductName</key>
37 <string>macOS</string>
38 <key>ProductUserVisibleVersion</key>
39 <string>11.3</string>
40 <key>ProductVersion</key>
41 <string>11.3</string>
42 <key>iOSSupportVersion</key>
43 <string>14.5</string>
44 </dict>
45 </plist>`)
46
47 parsedPlist := map[string]string{
48 "ProductBuildVersion": "20E232",
49 "ProductCopyright": "1983-2021 Apple Inc.",
50 "ProductName": "macOS",
51 "ProductUserVisibleVersion": "11.3",
52 "ProductVersion": "11.3",
53 "iOSSupportVersion": "14.5",
54 }
55
56 emptyPlist := bytes.NewBufferString(`<?xml version="1.0" encoding="UTF-8"?>
57 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
58 <plist version="1.0">
59 <dict>
60 </dict>
61 </plist>`)
62
63 missingDictPlist := bytes.NewBufferString(`<?xml version="1.0" encoding="UTF-8"?>
64 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
65 <plist version="1.0">
66 </plist>`)
67
68 unknownElementsPlist := bytes.NewBufferString(`<?xml version="1.0" encoding="UTF-8"?>
69 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
70 <plist version="1.0">
71 <dict>
72 <a>
73 <b>123</b>
74 </a>
75 <key>ProductBuildVersion</key>
76 <c>Value</c>
77 <string>20E232</string>
78 <d attr="1"></d>
79 </dict>
80 </plist>`)
81
82 parsedUnknownElementsPlist := map[string]string{
83 "ProductBuildVersion": "20E232",
84 }
85
86 tt := []struct {
87 Name string
88 Plist io.Reader
89 Parsed map[string]string
90 }{
91 {"Standard", standardPlist, parsedPlist},
92 {"Empty", emptyPlist, map[string]string{}},
93 {"Missing dict", missingDictPlist, map[string]string{}},
94 {"Unknown elements", unknownElementsPlist, parsedUnknownElementsPlist},
95 }
96
97 for _, tc := range tt {
98 tc := tc
99
100 t.Run(tc.Name, func(t *testing.T) {
101 result, err := resource.ParsePlistFile(tc.Plist)
102
103 require.Equal(t, tc.Parsed, result)
104 require.NoError(t, err)
105 })
106 }
107 }
108
109 func TestParsePlistFileUnevenKeys(t *testing.T) {
110 plist := bytes.NewBufferString(`<?xml version="1.0" encoding="UTF-8"?>
111 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
112 <plist version="1.0">
113 <dict>
114 <key>ProductBuildVersion</key>
115 <string>20E232</string>
116 <key>ProductCopyright</key>
117 </dict>
118 </plist>`)
119
120 result, err := resource.ParsePlistFile(plist)
121
122 require.Nil(t, result)
123 require.Error(t, err)
124 }
125
126 func TestParsePlistFileMalformed(t *testing.T) {
127 plist := bytes.NewBufferString(`<?xml version="1.0" encoding="UTF-8"?>
128 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
129 <plist version="1.0">
130 <dict>
131 <key>Product
132 </dict>
133 </plist>`)
134
135 result, err := resource.ParsePlistFile(plist)
136
137 require.Nil(t, result)
138 require.Error(t, err)
139 }
140
141 func TestBuildOSRelease(t *testing.T) {
142 tt := []struct {
143 Name string
144 Properties map[string]string
145 OSRelease string
146 }{
147 {"Empty properties", map[string]string{}, ""},
148 {"Empty properties (nil)", nil, ""},
149 {"Missing product name", map[string]string{
150 "ProductVersion": "11.3",
151 "ProductBuildVersion": "20E232",
152 }, ""},
153 {"Missing product version", map[string]string{
154 "ProductName": "macOS",
155 "ProductBuildVersion": "20E232",
156 }, ""},
157 {"Missing product build version", map[string]string{
158 "ProductName": "macOS",
159 "ProductVersion": "11.3",
160 }, ""},
161 {"All properties available", map[string]string{
162 "ProductName": "macOS",
163 "ProductVersion": "11.3",
164 "ProductBuildVersion": "20E232",
165 }, "macOS 11.3 (20E232)"},
166 }
167
168 for _, tc := range tt {
169 tc := tc
170
171 t.Run(tc.Name, func(t *testing.T) {
172 result := resource.BuildOSRelease(tc.Properties)
173 require.Equal(t, tc.OSRelease, result)
174 })
175 }
176 }
177
View as plain text