...

Source file src/go.opentelemetry.io/otel/sdk/resource/os_release_darwin_test.go

Documentation: go.opentelemetry.io/otel/sdk/resource

     1  // Copyright The OpenTelemetry Authors
     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  
    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