From f9e321f1e777f376bfa1c985575c8b334a873df8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krisztia=CC=81n=20Go=CC=88drei?= Date: Fri, 7 Nov 2025 16:01:57 +0100 Subject: [PATCH] Migrate plistutil to v2 --- _integration_tests/zip/ipa_reader_test.go | 2 +- artifacts/ios_xcarchive_reader.go | 2 +- artifacts/ipa_reader.go | 2 +- artifacts/xcarchive_reader.go | 2 +- autocodesign/projectmanager/projecthelper.go | 2 +- codesign/codesign.go | 2 +- .../codesign_group_provider.go | 4 +- .../exportoptionsgenerator.go | 2 +- .../exportoptionsgenerator_test.go | 2 +- exportoptionsgenerator/plistconverter.go | 15 + exportoptionsgenerator/targets.go | 2 +- go.mod | 4 +- plistutil/plistutil.go | 220 +++++++ plistutil/plistutil_test.go | 542 ++++++++++++++++++ xcarchive/ios.go | 6 +- xcarchive/ios_test.go | 4 +- xcarchive/macos.go | 6 +- xcarchive/plistutil.go | 15 + xcarchive/utils.go | 2 +- xcarchive/utils_test.go | 4 +- xcarchive/xcarchive.go | 3 +- 21 files changed, 817 insertions(+), 26 deletions(-) create mode 100644 exportoptionsgenerator/plistconverter.go create mode 100644 plistutil/plistutil.go create mode 100644 plistutil/plistutil_test.go create mode 100644 xcarchive/plistutil.go diff --git a/_integration_tests/zip/ipa_reader_test.go b/_integration_tests/zip/ipa_reader_test.go index 54a20b1d..fa25c8cd 100644 --- a/_integration_tests/zip/ipa_reader_test.go +++ b/_integration_tests/zip/ipa_reader_test.go @@ -6,11 +6,11 @@ import ( "testing" "github.com/bitrise-io/go-utils/v2/log" - "github.com/bitrise-io/go-xcode/plistutil" "github.com/bitrise-io/go-xcode/profileutil" "github.com/bitrise-io/go-xcode/v2/_integration_tests" "github.com/bitrise-io/go-xcode/v2/artifacts" internalzip "github.com/bitrise-io/go-xcode/v2/internal/zip" + "github.com/bitrise-io/go-xcode/v2/plistutil" "github.com/bitrise-io/go-xcode/v2/zip" "github.com/stretchr/testify/require" ) diff --git a/artifacts/ios_xcarchive_reader.go b/artifacts/ios_xcarchive_reader.go index 96b4717c..4180c9f3 100644 --- a/artifacts/ios_xcarchive_reader.go +++ b/artifacts/ios_xcarchive_reader.go @@ -1,7 +1,7 @@ package artifacts import ( - "github.com/bitrise-io/go-xcode/plistutil" + "github.com/bitrise-io/go-xcode/v2/plistutil" ) // IOSXCArchiveReader ... diff --git a/artifacts/ipa_reader.go b/artifacts/ipa_reader.go index 0ed698ee..df25abbe 100644 --- a/artifacts/ipa_reader.go +++ b/artifacts/ipa_reader.go @@ -3,8 +3,8 @@ package artifacts import ( "fmt" - "github.com/bitrise-io/go-xcode/plistutil" "github.com/bitrise-io/go-xcode/profileutil" + "github.com/bitrise-io/go-xcode/v2/plistutil" ) // IPAReader ... diff --git a/artifacts/xcarchive_reader.go b/artifacts/xcarchive_reader.go index 02368165..8270ff4e 100644 --- a/artifacts/xcarchive_reader.go +++ b/artifacts/xcarchive_reader.go @@ -1,7 +1,7 @@ package artifacts import ( - "github.com/bitrise-io/go-xcode/plistutil" + "github.com/bitrise-io/go-xcode/v2/plistutil" ) // XCArchiveReader ... diff --git a/autocodesign/projectmanager/projecthelper.go b/autocodesign/projectmanager/projecthelper.go index d3a829bb..7a3baa01 100644 --- a/autocodesign/projectmanager/projecthelper.go +++ b/autocodesign/projectmanager/projecthelper.go @@ -7,6 +7,7 @@ import ( "regexp" "strings" + "github.com/bitrise-io/go-plist" "github.com/bitrise-io/go-utils/fileutil" "github.com/bitrise-io/go-utils/pathutil" "github.com/bitrise-io/go-utils/sliceutil" @@ -17,7 +18,6 @@ import ( "github.com/bitrise-io/go-xcode/xcodeproject/xcodeproj" "github.com/bitrise-io/go-xcode/xcodeproject/xcscheme" "github.com/bitrise-io/go-xcode/xcodeproject/xcworkspace" - "howett.net/plist" ) // BuildAction is the type of build action to be performed on the scheme. diff --git a/codesign/codesign.go b/codesign/codesign.go index 0e59d3c7..d6eda9e8 100644 --- a/codesign/codesign.go +++ b/codesign/codesign.go @@ -8,7 +8,6 @@ import ( "github.com/bitrise-io/go-utils/v2/log" "github.com/bitrise-io/go-xcode/certificateutil" "github.com/bitrise-io/go-xcode/exportoptions" - "github.com/bitrise-io/go-xcode/plistutil" "github.com/bitrise-io/go-xcode/profileutil" "github.com/bitrise-io/go-xcode/v2/autocodesign" "github.com/bitrise-io/go-xcode/v2/autocodesign/devportalclient" @@ -17,6 +16,7 @@ import ( "github.com/bitrise-io/go-xcode/v2/autocodesign/projectmanager" "github.com/bitrise-io/go-xcode/v2/devportalservice" "github.com/bitrise-io/go-xcode/v2/exportoptionsgenerator" + "github.com/bitrise-io/go-xcode/v2/plistutil" "github.com/bitrise-io/go-xcode/v2/xcarchive" ) diff --git a/exportoptionsgenerator/codesign_group_provider.go b/exportoptionsgenerator/codesign_group_provider.go index 04582465..60f95086 100644 --- a/exportoptionsgenerator/codesign_group_provider.go +++ b/exportoptionsgenerator/codesign_group_provider.go @@ -5,8 +5,8 @@ import ( "github.com/bitrise-io/go-xcode/certificateutil" "github.com/bitrise-io/go-xcode/export" "github.com/bitrise-io/go-xcode/exportoptions" - "github.com/bitrise-io/go-xcode/plistutil" "github.com/bitrise-io/go-xcode/profileutil" + "github.com/bitrise-io/go-xcode/v2/plistutil" ) // CodeSignGroupProvider ... @@ -65,7 +65,7 @@ func (g codeSignGroupProvider) DetermineCodesignGroup(certificates []certificate if len(bundleIDEntitlementsMap) > 0 { g.logger.Warnf("Filtering CodeSignInfo groups for target capabilities") - codeSignGroups = export.FilterSelectableCodeSignGroups(codeSignGroups, export.CreateEntitlementsSelectableCodeSignGroupFilter(bundleIDEntitlementsMap)) + codeSignGroups = export.FilterSelectableCodeSignGroups(codeSignGroups, export.CreateEntitlementsSelectableCodeSignGroupFilter(convertToV1PlistData(bundleIDEntitlementsMap))) g.logger.Debugf("\nGroups after filtering for target capabilities:") for _, group := range codeSignGroups { diff --git a/exportoptionsgenerator/exportoptionsgenerator.go b/exportoptionsgenerator/exportoptionsgenerator.go index aba6aaf0..61c8a533 100644 --- a/exportoptionsgenerator/exportoptionsgenerator.go +++ b/exportoptionsgenerator/exportoptionsgenerator.go @@ -7,8 +7,8 @@ import ( "github.com/bitrise-io/go-utils/v2/log" "github.com/bitrise-io/go-xcode/export" "github.com/bitrise-io/go-xcode/exportoptions" - "github.com/bitrise-io/go-xcode/plistutil" "github.com/bitrise-io/go-xcode/profileutil" + "github.com/bitrise-io/go-xcode/v2/plistutil" "github.com/bitrise-io/go-xcode/v2/xcodeversion" ) diff --git a/exportoptionsgenerator/exportoptionsgenerator_test.go b/exportoptionsgenerator/exportoptionsgenerator_test.go index 20ade1af..9c2fd51a 100644 --- a/exportoptionsgenerator/exportoptionsgenerator_test.go +++ b/exportoptionsgenerator/exportoptionsgenerator_test.go @@ -7,9 +7,9 @@ import ( "github.com/bitrise-io/go-utils/v2/log" "github.com/bitrise-io/go-xcode/certificateutil" "github.com/bitrise-io/go-xcode/exportoptions" - "github.com/bitrise-io/go-xcode/plistutil" "github.com/bitrise-io/go-xcode/profileutil" "github.com/bitrise-io/go-xcode/v2/exportoptionsgenerator/mocks" + "github.com/bitrise-io/go-xcode/v2/plistutil" "github.com/bitrise-io/go-xcode/v2/xcodeversion" "github.com/stretchr/testify/require" ) diff --git a/exportoptionsgenerator/plistconverter.go b/exportoptionsgenerator/plistconverter.go new file mode 100644 index 00000000..cacc358a --- /dev/null +++ b/exportoptionsgenerator/plistconverter.go @@ -0,0 +1,15 @@ +package exportoptionsgenerator + +import ( + plistutilv1 "github.com/bitrise-io/go-xcode/plistutil" + "github.com/bitrise-io/go-xcode/v2/plistutil" +) + +// TODO: remove this function when export package is migrated to v2 and uses plistutil/v2 +func convertToV1PlistData(bundleIDEntitlementsMap map[string]plistutil.PlistData) map[string]plistutilv1.PlistData { + converted := map[string]plistutilv1.PlistData{} + for bundleID, entitlements := range bundleIDEntitlementsMap { + converted[bundleID] = plistutilv1.PlistData(entitlements) + } + return converted +} diff --git a/exportoptionsgenerator/targets.go b/exportoptionsgenerator/targets.go index d7d014ee..ee301009 100644 --- a/exportoptionsgenerator/targets.go +++ b/exportoptionsgenerator/targets.go @@ -3,7 +3,7 @@ package exportoptionsgenerator import ( "fmt" - "github.com/bitrise-io/go-xcode/plistutil" + "github.com/bitrise-io/go-xcode/v2/plistutil" "github.com/bitrise-io/go-xcode/xcodeproject/serialized" "github.com/bitrise-io/go-xcode/xcodeproject/xcodeproj" "github.com/bitrise-io/go-xcode/xcodeproject/xcscheme" diff --git a/go.mod b/go.mod index 9c7e111f..ba691387 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ toolchain go1.23.2 require ( cloud.google.com/go/secretmanager v1.14.3 cloud.google.com/go/storage v1.50.0 + github.com/bitrise-io/go-plist v0.0.0-20210301100253-4b1a112ccd10 github.com/bitrise-io/go-steputils v1.0.5 github.com/bitrise-io/go-steputils/v2 v2.0.0-alpha.18 github.com/bitrise-io/go-utils v1.0.12 @@ -22,7 +23,6 @@ require ( golang.org/x/oauth2 v0.24.0 golang.org/x/text v0.21.0 google.golang.org/api v0.214.0 - howett.net/plist v1.0.0 ) require ( @@ -37,7 +37,6 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 // indirect github.com/bitrise-io/go-pkcs12 v0.0.0-20230815095624-feb898696e02 // indirect - github.com/bitrise-io/go-plist v0.0.0-20210301100253-4b1a112ccd10 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect github.com/davecgh/go-spew v1.1.1 // indirect @@ -80,4 +79,5 @@ require ( google.golang.org/grpc v1.67.3 // indirect google.golang.org/protobuf v1.35.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + howett.net/plist v1.0.0 // indirect ) diff --git a/plistutil/plistutil.go b/plistutil/plistutil.go new file mode 100644 index 00000000..5b7091aa --- /dev/null +++ b/plistutil/plistutil.go @@ -0,0 +1,220 @@ +package plistutil + +import ( + "errors" + "time" + + "github.com/bitrise-io/go-plist" +) + +// PlistData ... +type PlistData map[string]interface{} + +// NewPlistDataFromContent ... +func NewPlistDataFromContent(plistContent string) (PlistData, error) { + var data PlistData + if _, err := plist.Unmarshal([]byte(plistContent), &data); err != nil { + return PlistData{}, err + } + return data, nil +} + +// GetString ... +func (data PlistData) GetString(forKey string) (string, bool) { + value, ok := data[forKey] + if !ok { + return "", false + } + + casted, ok := value.(string) + if !ok { + return "", false + } + + return casted, true +} + +// GetUInt64 ... +func (data PlistData) GetUInt64(forKey string) (uint64, bool) { + value, ok := data[forKey] + if !ok { + return 0, false + } + + casted, ok := value.(uint64) + if !ok { + return 0, false + } + return casted, true +} + +// GetFloat64 ... +func (data PlistData) GetFloat64(forKey string) (float64, bool) { + value, ok := data[forKey] + if !ok { + return 0, false + } + + casted, ok := value.(float64) + if !ok { + return 0, false + } + return casted, true +} + +// GetBool ... +func (data PlistData) GetBool(forKey string) (bool, bool) { + value, ok := data[forKey] + if !ok { + return false, false + } + + casted, ok := value.(bool) + if !ok { + return false, false + } + + return casted, true +} + +// GetTime ... +func (data PlistData) GetTime(forKey string) (time.Time, bool) { + value, ok := data[forKey] + if !ok { + return time.Time{}, false + } + + casted, ok := value.(time.Time) + if !ok { + return time.Time{}, false + } + return casted, true +} + +// GetUInt64Array ... +func (data PlistData) GetUInt64Array(forKey string) ([]uint64, bool) { + value, ok := data[forKey] + if !ok { + return nil, false + } + + if casted, ok := value.([]uint64); ok { + return casted, true + } + + casted, ok := value.([]interface{}) + if !ok { + return nil, false + } + + var array []uint64 + for _, v := range casted { + casted, ok := v.(uint64) + if !ok { + return nil, false + } + + array = append(array, casted) + } + return array, true +} + +// GetStringArray ... +func (data PlistData) GetStringArray(forKey string) ([]string, bool) { + value, ok := data[forKey] + if !ok { + return nil, false + } + + if casted, ok := value.([]string); ok { + return casted, true + } + + casted, ok := value.([]interface{}) + if !ok { + return nil, false + } + + var array []string + for _, v := range casted { + casted, ok := v.(string) + if !ok { + return nil, false + } + + array = append(array, casted) + } + return array, true +} + +// GetByteArrayArray ... +func (data PlistData) GetByteArrayArray(forKey string) ([][]byte, bool) { + value, ok := data[forKey] + if !ok { + return nil, false + } + + if casted, ok := value.([][]byte); ok { + return casted, true + } + + casted, ok := value.([]interface{}) + if !ok { + return nil, false + } + + var array [][]byte + for _, v := range casted { + casted, ok := v.([]byte) + if !ok { + return nil, false + } + + array = append(array, casted) + } + return array, true +} + +// GetMapStringInterface ... +func (data PlistData) GetMapStringInterface(forKey string) (PlistData, bool) { + value, ok := data[forKey] + if !ok { + return nil, false + } + + if casted, ok := value.(map[string]interface{}); ok { + return casted, true + } + return nil, false +} + +func castToMapStringInterfaceArray(obj interface{}) ([]PlistData, error) { + array, ok := obj.([]interface{}) + if !ok { + return nil, errors.New("failed to cast to []interface{}") + } + + var casted []PlistData + for _, item := range array { + mapStringInterface, ok := item.(map[string]interface{}) + if !ok { + return nil, errors.New("failed to cast to map[string]interface{}") + } + casted = append(casted, mapStringInterface) + } + + return casted, nil +} + +// GetMapStringInterfaceArray ... +func (data PlistData) GetMapStringInterfaceArray(forKey string) ([]PlistData, bool) { + value, ok := data[forKey] + if !ok { + return nil, false + } + mapStringInterfaceArray, err := castToMapStringInterfaceArray(value) + if err != nil { + return nil, false + } + return mapStringInterfaceArray, true +} diff --git a/plistutil/plistutil_test.go b/plistutil/plistutil_test.go new file mode 100644 index 00000000..05b8d6f4 --- /dev/null +++ b/plistutil/plistutil_test.go @@ -0,0 +1,542 @@ +package plistutil + +import ( + "reflect" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestAnalyzeInfoPlist(t *testing.T) { + infoPlistData, err := NewPlistDataFromContent(infoPlistContent) + require.NoError(t, err) + + appTitle, ok := infoPlistData.GetString("CFBundleName") + require.Equal(t, true, ok) + require.Equal(t, "ios-simple-objc", appTitle) + + bundleID, _ := infoPlistData.GetString("CFBundleIdentifier") + require.Equal(t, true, ok) + require.Equal(t, "Bitrise.ios-simple-objc", bundleID) + + version, ok := infoPlistData.GetString("CFBundleShortVersionString") + require.Equal(t, true, ok) + require.Equal(t, "1.0", version) + + buildNumber, ok := infoPlistData.GetString("CFBundleVersion") + require.Equal(t, true, ok) + require.Equal(t, "1", buildNumber) + + minOSVersion, ok := infoPlistData.GetString("MinimumOSVersion") + require.Equal(t, true, ok) + require.Equal(t, "8.1", minOSVersion) + + deviceFamilyList, ok := infoPlistData.GetUInt64Array("UIDeviceFamily") + require.Equal(t, true, ok) + require.Equal(t, 2, len(deviceFamilyList)) + require.Equal(t, uint64(1), deviceFamilyList[0]) + require.Equal(t, uint64(2), deviceFamilyList[1]) +} + +func TestAnalyzeEmbeddedProfile(t *testing.T) { + profileData, err := NewPlistDataFromContent(appStoreProfileContent) + require.NoError(t, err) + + creationDate, ok := profileData.GetTime("CreationDate") + require.Equal(t, true, ok) + expectedCreationDate, err := time.Parse("2006-01-02T15:04:05Z", "2016-09-22T11:29:12Z") + require.NoError(t, err) + require.Equal(t, true, creationDate.Equal(expectedCreationDate)) + + expirationDate, ok := profileData.GetTime("ExpirationDate") + require.Equal(t, true, ok) + expectedExpirationDate, err := time.Parse("2006-01-02T15:04:05Z", "2017-09-21T13:20:06Z") + require.NoError(t, err) + require.Equal(t, true, expirationDate.Equal(expectedExpirationDate)) + + deviceUDIDList, ok := profileData.GetStringArray("ProvisionedDevices") + require.Equal(t, false, ok) + require.Equal(t, 0, len(deviceUDIDList)) + + teamName, ok := profileData.GetString("TeamName") + require.Equal(t, true, ok) + require.Equal(t, "Some Dude", teamName) + + profileName, ok := profileData.GetString("Name") + require.Equal(t, true, ok) + require.Equal(t, "Bitrise Test App Store", profileName) + + provisionsAlldevices, ok := profileData.GetBool("ProvisionsAllDevices") + require.Equal(t, false, ok) + require.Equal(t, false, provisionsAlldevices) +} + +func TestGetBool(t *testing.T) { + profileData, err := NewPlistDataFromContent(enterpriseProfileContent) + require.NoError(t, err) + + allDevices, ok := profileData.GetBool("ProvisionsAllDevices") + require.Equal(t, true, ok) + require.Equal(t, true, allDevices) +} + +func TestGetTime(t *testing.T) { + profileData, err := NewPlistDataFromContent(developmentProfileContent) + require.NoError(t, err) + + expire, ok := profileData.GetTime("ExpirationDate") + require.Equal(t, true, ok) + + // 2017-09-22T11:28:46Z + desiredExpire, err := time.Parse("2006-01-02T15:04:05Z", "2017-09-22T11:28:46Z") + require.NoError(t, err) + require.Equal(t, true, expire.Equal(desiredExpire)) +} + +func TestGetInt(t *testing.T) { + profileData, err := NewPlistDataFromContent(developmentProfileContent) + require.NoError(t, err) + + version, ok := profileData.GetUInt64("Version") + require.Equal(t, true, ok) + require.Equal(t, uint64(1), version) +} + +func TestGetStringArray(t *testing.T) { + profileData, err := NewPlistDataFromContent(developmentProfileContent) + require.NoError(t, err) + + devices, ok := profileData.GetStringArray("ProvisionedDevices") + require.Equal(t, true, ok) + require.Equal(t, 1, len(devices)) + require.Equal(t, "b138", devices[0]) +} + +func TestGetMapStringInterface(t *testing.T) { + profileData, err := NewPlistDataFromContent(developmentProfileContent) + require.NoError(t, err) + + entitlements, ok := profileData.GetMapStringInterface("Entitlements") + require.Equal(t, true, ok) + + teamID, ok := entitlements.GetString("com.apple.developer.team-identifier") + require.Equal(t, true, ok) + require.Equal(t, "9NS4", teamID) +} + +func TestPlistData_GetMapStringInterfaceArray(t *testing.T) { + testSummariesData, err := NewPlistDataFromContent(paritalTestSummariesContent) + if err != nil { + t.Errorf("NewPlistDataFromContent(), got: %v, want: %v", err, nil) + } + const key = "Key" + + type args struct { + forKey string + } + tests := []struct { + name string + data PlistData + args args + want []PlistData + want1 bool + }{ + { + name: "Test ok case", + data: PlistData{key: []interface{}{ + map[string]interface{}{"k1": "v1", "k2": "v2"}, + map[string]interface{}{"k3": "v3"}, + }}, + args: args{key}, + want: []PlistData{ + map[string]interface{}{"k1": "v1", "k2": "v2"}, + map[string]interface{}{"k3": "v3"}, + }, + want1: true, + }, + { + name: "Test key not found", + data: PlistData{"otherKey": []PlistData{}}, + args: args{key}, + want: nil, + want1: false, + }, + { + name: "Test failed to cast to interface{}", + data: PlistData{key: []PlistData{ + map[string]interface{}{"k1": "v1", "k2": "v2"}, + map[string]interface{}{"k3": "v3"}, + }}, + args: args{key}, + want: nil, + want1: false, + }, + { + name: "Failed to cast array element to map[string]interface{}", + data: PlistData{key: []interface{}{ + map[string]string{"k1": "v1", "k2": "v2"}, + map[string]string{"k3": "v3"}, + }}, + args: args{key}, + want: nil, + want1: false, + }, + { + name: "Intefration test with real plist data", + data: testSummariesData, + args: args{"Subtests"}, + want: []PlistData{ + map[string]interface{}{"TestIdentifier": "ios_simple_objcTests/testExample", "TestStatus": "Success"}, + map[string]interface{}{"TestIdentifier": "ios_simple_objcTests/testExample2", "TestStatus": "Success"}, + }, + want1: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, got1 := tt.data.GetMapStringInterfaceArray(tt.args.forKey) + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("PlistData.GetMapStringInterfaceArray() got = %v, want %v", got, tt.want) + } + if got1 != tt.want1 { + t.Errorf("PlistData.GetMapStringInterfaceArray() got1 = %v, want %v", got1, tt.want1) + } + }) + } +} + +func TestPlistData_GetFloat64(t *testing.T) { + testSummariesData, err := NewPlistDataFromContent(paritalTestSummariesContent) + if err != nil { + t.Errorf("NewPlistDataFromContent(), got: %v, want: %v", err, nil) + } + const key = "Duration" + const value = 0.00072991847991943359 + + type args struct { + forKey string + } + tests := []struct { + name string + data PlistData + args args + want float64 + want1 bool + }{ + { + name: "Read float, ok", + data: map[string]interface{}{key: value}, + args: args{key}, + want: value, + want1: true, + }, + { + name: "Key not found", + data: map[string]interface{}{"otherKey": value}, + args: args{key}, + want: 0, + want1: false, + }, + { + name: "Read int value, fail", + data: map[string]interface{}{key: 23}, + args: args{key}, + want: 0, + want1: false, + }, + { + name: "Integration test with real plist data", + data: testSummariesData, + args: args{"Duration"}, + want: 0.34774100780487061, + want1: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, got1 := tt.data.GetFloat64(tt.args.forKey) + if got != tt.want { + t.Errorf("PlistData.GetFloat64() got = %v, want %v", got, tt.want) + } + if got1 != tt.want1 { + t.Errorf("PlistData.GetFloat64() got1 = %v, want %v", got1, tt.want1) + } + }) + } +} + +const infoPlistContent = ` + + + + CFBundleName + ios-simple-objc + DTXcode + 0832 + DTSDKName + iphoneos10.3 + UILaunchStoryboardName + LaunchScreen + DTSDKBuild + 14E269 + CFBundleDevelopmentRegion + en + CFBundleVersion + 1 + BuildMachineOSBuild + 16F73 + DTPlatformName + iphoneos + CFBundlePackageType + APPL + UIMainStoryboardFile + Main + CFBundleSupportedPlatforms + + iPhoneOS + + CFBundleShortVersionString + 1.0 + CFBundleInfoDictionaryVersion + 6.0 + UIRequiredDeviceCapabilities + + armv7 + + CFBundleExecutable + ios-simple-objc + DTCompiler + com.apple.compilers.llvm.clang.1_0 + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CFBundleIdentifier + Bitrise.ios-simple-objc + MinimumOSVersion + 8.1 + DTXcodeBuild + 8E2002 + DTPlatformVersion + 10.3 + LSRequiresIPhoneOS + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CFBundleSignature + ???? + UIDeviceFamily + + 1 + 2 + + DTPlatformBuild + 14E269 + + +` + +const developmentProfileContent = ` + + + + AppIDName + Bitrise Test + ApplicationIdentifierPrefix + + 9NS4 + + CreationDate + 2016-09-22T11:28:46Z + Platform + + iOS + + DeveloperCertificates + + + + Entitlements + + keychain-access-groups + + 9NS4.* + + get-task-allow + + application-identifier + 9NS4.* + com.apple.developer.team-identifier + 9NS4 + + ExpirationDate + 2017-09-22T11:28:46Z + Name + Bitrise Test Development + ProvisionedDevices + + b138 + + TeamIdentifier + + 9NS4 + + TeamName + Some Dude + TimeToLive + 365 + UUID + 4b617a5f + Version + 1 +` + +const appStoreProfileContent = ` + + + + AppIDName + Bitrise Test + ApplicationIdentifierPrefix + + 9NS4 + + CreationDate + 2016-09-22T11:29:12Z + Platform + + iOS + + DeveloperCertificates + + + + Entitlements + + keychain-access-groups + + 9NS4.* + + get-task-allow + + application-identifier + 9NS4.* + com.apple.developer.team-identifier + 9NS4 + beta-reports-active + + + ExpirationDate + 2017-09-21T13:20:06Z + Name + Bitrise Test App Store + TeamIdentifier + + 9NS4 + + TeamName + Some Dude + TimeToLive + 364 + UUID + a60668dd + Version + 1 +` + +const enterpriseProfileContent = ` + + + + AppIDName + Bitrise Test + ApplicationIdentifierPrefix + + PF3BP78LQ8 + + CreationDate + 2015-10-05T13:32:46Z + Platform + + iOS + + DeveloperCertificates + + + + Entitlements + + keychain-access-groups + + PF3BP78LQ8.* + + get-task-allow + + application-identifier + 9NS4.* + com.apple.developer.team-identifier + 9NS4 + + ExpirationDate + 2016-10-04T13:32:46Z + Name + Bitrise Test Enterprise + ProvisionsAllDevices + + TeamIdentifier + + PF3BP78LQ8 + + TeamName + Some Dude + TimeToLive + 365 + UUID + 8d6caa15 + Version + 1 +` + +const paritalTestSummariesContent = ` + + + + Duration + 0.34774100780487061 + Subtests + + + TestIdentifier + ios_simple_objcTests/testExample + TestStatus + Success + + + TestIdentifier + ios_simple_objcTests/testExample2 + TestStatus + Success + + + TestIdentifier + ios_simple_objcTests + TestName + ios_simple_objcTests + TestObjectClass + IDESchemeActionTestSummaryGroup + +TestIdentifier +ios-simple-objcTests.xctest +TestName +ios-simple-objcTests.xctest +TestObjectClass +IDESchemeActionTestSummaryGroup +` diff --git a/xcarchive/ios.go b/xcarchive/ios.go index b92b1801..c945d99c 100644 --- a/xcarchive/ios.go +++ b/xcarchive/ios.go @@ -8,9 +8,9 @@ import ( "github.com/bitrise-io/go-utils/v2/command" "github.com/bitrise-io/go-utils/v2/env" "github.com/bitrise-io/go-utils/v2/pathutil" - "github.com/bitrise-io/go-xcode/plistutil" "github.com/bitrise-io/go-xcode/profileutil" "github.com/bitrise-io/go-xcode/v2/autocodesign" + "github.com/bitrise-io/go-xcode/v2/plistutil" ) // IosBaseApplication ... @@ -41,7 +41,7 @@ func NewIosBaseApplication(path string) (IosBaseApplication, error) { } else if !exist { return IosBaseApplication{}, fmt.Errorf("Info.plist not exists at: %s", infoPlistPath) } - plist, err := plistutil.NewPlistDataFromFile(infoPlistPath) + plist, err := newPlistDataFromFile(infoPlistPath) if err != nil { return IosBaseApplication{}, err } @@ -240,7 +240,7 @@ func NewIosArchive(path string) (IosArchive, error) { } else if !exist { return IosArchive{}, fmt.Errorf("Info.plist not exists at: %s", infoPlistPath) } - plist, err := plistutil.NewPlistDataFromFile(infoPlistPath) + plist, err := newPlistDataFromFile(infoPlistPath) if err != nil { return IosArchive{}, err } diff --git a/xcarchive/ios_test.go b/xcarchive/ios_test.go index 1172fad2..4ded9cb8 100644 --- a/xcarchive/ios_test.go +++ b/xcarchive/ios_test.go @@ -10,9 +10,9 @@ import ( "github.com/bitrise-io/go-utils/v2/command" "github.com/bitrise-io/go-utils/v2/env" "github.com/bitrise-io/go-utils/v2/pathutil" - "github.com/bitrise-io/go-xcode/plistutil" "github.com/bitrise-io/go-xcode/profileutil" "github.com/bitrise-io/go-xcode/v2/autocodesign" + "github.com/bitrise-io/go-xcode/v2/plistutil" "github.com/stretchr/testify/require" ) @@ -217,7 +217,7 @@ func Test_applicationFromArchive(t *testing.T) { } func Test_applicationFromPlist(t *testing.T) { - infoPlist, err := plistutil.NewPlistDataFromFile(filepath.Join(sampleRepoPath(t), "archives/ios.xcarchive/Info.plist")) + infoPlist, err := newPlistDataFromFile(filepath.Join(sampleRepoPath(t), "archives/ios.xcarchive/Info.plist")) const appRelativePathToProduct = "Applications/code-sign-test.app" if err != nil { t.Errorf("setup: could not read plist, error: %s", infoPlist) diff --git a/xcarchive/macos.go b/xcarchive/macos.go index 2cdf1068..1d3b3c13 100644 --- a/xcarchive/macos.go +++ b/xcarchive/macos.go @@ -7,8 +7,8 @@ import ( "github.com/bitrise-io/go-utils/v2/command" "github.com/bitrise-io/go-utils/v2/env" "github.com/bitrise-io/go-utils/v2/pathutil" - "github.com/bitrise-io/go-xcode/plistutil" "github.com/bitrise-io/go-xcode/profileutil" + "github.com/bitrise-io/go-xcode/v2/plistutil" ) type macosBaseApplication struct { @@ -37,7 +37,7 @@ func newMacosBaseApplication(path string) (macosBaseApplication, error) { } else if !exist { return macosBaseApplication{}, fmt.Errorf("Info.plist not exists at: %s", infoPlistPath) } - plist, err := plistutil.NewPlistDataFromFile(infoPlistPath) + plist, err := newPlistDataFromFile(infoPlistPath) if err != nil { return macosBaseApplication{}, err } @@ -144,7 +144,7 @@ func NewMacosArchive(path string) (MacosArchive, error) { } else if !exist { return MacosArchive{}, fmt.Errorf("Info.plist not exists at: %s", infoPlistPath) } - plist, err := plistutil.NewPlistDataFromFile(infoPlistPath) + plist, err := newPlistDataFromFile(infoPlistPath) if err != nil { return MacosArchive{}, err } diff --git a/xcarchive/plistutil.go b/xcarchive/plistutil.go new file mode 100644 index 00000000..0e239e9f --- /dev/null +++ b/xcarchive/plistutil.go @@ -0,0 +1,15 @@ +package xcarchive + +import ( + "os" + + "github.com/bitrise-io/go-xcode/v2/plistutil" +) + +func newPlistDataFromFile(plistPth string) (plistutil.PlistData, error) { + content, err := os.ReadFile(plistPth) + if err != nil { + return plistutil.PlistData{}, err + } + return plistutil.NewPlistDataFromContent(string(content)) +} diff --git a/xcarchive/utils.go b/xcarchive/utils.go index d7958dde..e7755e0a 100644 --- a/xcarchive/utils.go +++ b/xcarchive/utils.go @@ -7,7 +7,7 @@ import ( "strings" "github.com/bitrise-io/go-utils/v2/command" - "github.com/bitrise-io/go-xcode/plistutil" + "github.com/bitrise-io/go-xcode/v2/plistutil" ) func executableNameFromInfoPlist(infoPlist plistutil.PlistData) string { diff --git a/xcarchive/utils_test.go b/xcarchive/utils_test.go index 756246fa..88693448 100644 --- a/xcarchive/utils_test.go +++ b/xcarchive/utils_test.go @@ -9,7 +9,7 @@ import ( "github.com/bitrise-io/go-utils/v2/command" "github.com/bitrise-io/go-utils/v2/env" "github.com/bitrise-io/go-utils/v2/pathutil" - "github.com/bitrise-io/go-xcode/plistutil" + "github.com/bitrise-io/go-xcode/v2/plistutil" "github.com/stretchr/testify/assert" ) @@ -52,7 +52,7 @@ func executableRelativePath(basePath, infoPlistRelativePath, executableFolderRel return "" } - plist, err := plistutil.NewPlistDataFromFile(infoPlistPath) + plist, err := newPlistDataFromFile(infoPlistPath) if err != nil { return "" } diff --git a/xcarchive/xcarchive.go b/xcarchive/xcarchive.go index 66015747..178409d9 100644 --- a/xcarchive/xcarchive.go +++ b/xcarchive/xcarchive.go @@ -5,7 +5,6 @@ import ( "github.com/bitrise-io/go-utils/v2/log" "github.com/bitrise-io/go-utils/v2/pathutil" - "github.com/bitrise-io/go-xcode/plistutil" ) // ArchiveReader ... @@ -28,7 +27,7 @@ func (r ArchiveReader) IsMacOS(archPath string) (bool, error) { r.logger.Debugf("Checking archive is MacOS or iOS") infoPlistPath := filepath.Join(archPath, "Info.plist") - plist, err := plistutil.NewPlistDataFromFile(infoPlistPath) + plist, err := newPlistDataFromFile(infoPlistPath) if err != nil { return false, err }