/* * Copyright 2015-present Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ package com.facebook.buck.apple; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertFalse; import com.dd.plist.NSArray; import com.dd.plist.NSObject; import com.dd.plist.NSString; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.hash.HashCode; import java.nio.file.Paths; import java.util.Date; import java.util.Optional; import org.junit.Test; public class ProvisioningProfileStoreTest { private static ProvisioningProfileMetadata makeTestMetadata( String appID, Date expirationDate, String uuid) throws Exception { return makeTestMetadata(appID, expirationDate, uuid, ImmutableMap.of()); } private static ProvisioningProfileMetadata makeTestMetadata( String appID, Date expirationDate, String uuid, ImmutableMap<String, NSObject> entitlements) throws Exception { return makeTestMetadata(appID, expirationDate, uuid, entitlements, ImmutableSet.of()); } private static ProvisioningProfileMetadata makeTestMetadata( String appID, Date expirationDate, String uuid, ImmutableMap<String, NSObject> entitlements, ImmutableSet<HashCode> fingerprints) throws Exception { return ProvisioningProfileMetadata.builder() .setAppID(ProvisioningProfileMetadata.splitAppID(appID)) .setExpirationDate(expirationDate) .setUUID(uuid) .setProfilePath(Paths.get("dummy.mobileprovision")) .setEntitlements(entitlements) .setDeveloperCertificateFingerprints(fingerprints) .build(); } @Test public void testExpiredProfilesAreIgnored() throws Exception { ProvisioningProfileStore profiles = ProvisioningProfileStore.fromProvisioningProfiles( ImmutableList.of( makeTestMetadata( "AAAAAAAAAA.*", new Date(0), "00000000-0000-0000-0000-000000000000"))); Optional<ProvisioningProfileMetadata> actual = profiles.getBestProvisioningProfile( "com.facebook.test", ApplePlatform.IPHONEOS, ProvisioningProfileStore.MATCH_ANY_ENTITLEMENT, ProvisioningProfileStore.MATCH_ANY_IDENTITY); assertThat(actual, is(equalTo(Optional.empty()))); } @Test public void testPrefixOverride() throws Exception { ProvisioningProfileMetadata expected = makeTestMetadata( "AAAAAAAAAA.*", new Date(Long.MAX_VALUE), "00000000-0000-0000-0000-000000000000"); ProvisioningProfileStore profiles = ProvisioningProfileStore.fromProvisioningProfiles( ImmutableList.of( expected, makeTestMetadata( "BBBBBBBBBB.com.facebook.test", new Date(Long.MAX_VALUE), "00000000-0000-0000-0000-000000000000"))); NSString[] fakeKeychainAccessGroups = {new NSString("AAAAAAAAAA.*")}; ImmutableMap<String, NSObject> fakeEntitlements = ImmutableMap.of("keychain-access-groups", new NSArray(fakeKeychainAccessGroups)); Optional<ProvisioningProfileMetadata> actual = profiles.getBestProvisioningProfile( "com.facebook.test", ApplePlatform.IPHONEOS, Optional.of(fakeEntitlements), ProvisioningProfileStore.MATCH_ANY_IDENTITY); assertThat(actual.get(), is(equalTo(expected))); } @Test public void testEntitlementKeysAreMatched() throws Exception { final NSString[] fakeKeychainAccessGroups = {new NSString("AAAAAAAAAA.*")}; final NSArray fakeKeychainAccessGroupsArray = new NSArray(fakeKeychainAccessGroups); ImmutableMap<String, NSObject> fakeDevelopmentEntitlements = ImmutableMap.of( "keychain-access-groups", fakeKeychainAccessGroupsArray, "aps-environment", new NSString("development"), "com.apple.security.application-groups", new NSArray(new NSString("foo"), new NSString("bar"))); ImmutableMap<String, NSObject> fakeProductionEntitlements = ImmutableMap.of( "keychain-access-groups", fakeKeychainAccessGroupsArray, "aps-environment", new NSString("production"), "com.apple.security.application-groups", new NSArray(new NSString("foo"), new NSString("bar"), new NSString("baz"))); ProvisioningProfileMetadata expected = makeTestMetadata( "AAAAAAAAAA.com.facebook.test", new Date(Long.MAX_VALUE), "11111111-1111-1111-1111-111111111111", fakeProductionEntitlements); ProvisioningProfileStore profiles = ProvisioningProfileStore.fromProvisioningProfiles( ImmutableList.of( makeTestMetadata( "AAAAAAAAAA.com.facebook.test", new Date(Long.MAX_VALUE), "00000000-0000-0000-0000-000000000000", fakeDevelopmentEntitlements), expected)); Optional<ProvisioningProfileMetadata> actual = profiles.getBestProvisioningProfile( "com.facebook.test", ApplePlatform.IPHONEOS, Optional.of( ImmutableMap.of( "keychain-access-groups", fakeKeychainAccessGroupsArray, "aps-environment", new NSString("production"), "com.apple.security.application-groups", new NSArray(new NSString("foo"), new NSString("bar")))), ProvisioningProfileStore.MATCH_ANY_IDENTITY); assertThat(actual.get(), is(equalTo(expected))); actual = profiles.getBestProvisioningProfile( "com.facebook.test", ApplePlatform.IPHONEOS, Optional.of( ImmutableMap.of( "keychain-access-groups", fakeKeychainAccessGroupsArray, "aps-environment", new NSString("production"), "com.apple.security.application-groups", new NSArray(new NSString("foo"), new NSString("xxx")))), ProvisioningProfileStore.MATCH_ANY_IDENTITY); assertFalse(actual.isPresent()); // Test without keychain access groups. actual = profiles.getBestProvisioningProfile( "com.facebook.test", ApplePlatform.IPHONEOS, Optional.of( ImmutableMap.of( "aps-environment", new NSString("production"), "com.apple.security.application-groups", new NSArray(new NSString("foo"), new NSString("bar")))), ProvisioningProfileStore.MATCH_ANY_IDENTITY); assertThat(actual.get(), is(equalTo(expected))); actual = profiles.getBestProvisioningProfile( "com.facebook.test", ApplePlatform.IPHONEOS, Optional.of( ImmutableMap.of( "aps-environment", new NSString("production"), "com.apple.security.application-groups", new NSArray(new NSString("foo"), new NSString("xxx")))), ProvisioningProfileStore.MATCH_ANY_IDENTITY); assertFalse(actual.isPresent()); } @Test public void testOnlyProfilesContainingValidFingerprintsAreMatched() throws Exception { CodeSignIdentity validIdentity = CodeSignIdentity.builder() .setFingerprint( CodeSignIdentity.toFingerprint("BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB")) .setSubjectCommonName("iPhone Developer: Foo Bar (54321EDCBA)") .build(); CodeSignIdentity otherIdentity = CodeSignIdentity.builder() .setFingerprint( CodeSignIdentity.toFingerprint("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")) .setSubjectCommonName("iPhone Developer: Foo Bar (ABCDE12345)") .build(); ProvisioningProfileMetadata expected = makeTestMetadata( "AAAAAAAAAA.com.facebook.test", new Date(Long.MAX_VALUE), "11111111-1111-1111-1111-111111111111", ImmutableMap.of(), ImmutableSet.of( validIdentity.getFingerprint().get(), otherIdentity.getFingerprint().get())); ProvisioningProfileStore profiles = ProvisioningProfileStore.fromProvisioningProfiles( ImmutableList.of( makeTestMetadata( "AAAAAAAAAA.com.facebook.test", new Date(Long.MAX_VALUE), "00000000-0000-0000-0000-000000000000", ImmutableMap.of(), ImmutableSet.of(otherIdentity.getFingerprint().get())), expected)); Optional<ProvisioningProfileMetadata> actual = profiles.getBestProvisioningProfile( "com.facebook.test", ApplePlatform.IPHONEOS, ProvisioningProfileStore.MATCH_ANY_ENTITLEMENT, Optional.of(ImmutableList.of(validIdentity))); assertThat(actual.get(), is(equalTo(expected))); } @Test public void testGetByUUID() throws Exception { ProvisioningProfileMetadata expected = makeTestMetadata( "BBBBBBBBBB.*", new Date(Long.MAX_VALUE), "11111111-1111-1111-1111-111111111111"); ProvisioningProfileStore profiles = ProvisioningProfileStore.fromProvisioningProfiles( ImmutableList.of( expected, makeTestMetadata( "BBBBBBBBBB.com.facebook.test", new Date(Long.MAX_VALUE), "00000000-0000-0000-0000-000000000000"))); Optional<ProvisioningProfileMetadata> actual = profiles.getProvisioningProfileByUUID("11111111-1111-1111-1111-111111111111"); assertThat(actual.get(), is(equalTo(expected))); } @Test public void testMatchesSpecificApp() throws Exception { ProvisioningProfileMetadata expected = makeTestMetadata( "BBBBBBBBBB.com.facebook.test", new Date(Long.MAX_VALUE), "00000000-0000-0000-0000-000000000000"); ProvisioningProfileStore profiles = ProvisioningProfileStore.fromProvisioningProfiles( ImmutableList.of( expected, makeTestMetadata( "BBBBBBBBBB.com.facebook.*", new Date(Long.MAX_VALUE), "11111111-1111-1111-1111-111111111111"))); Optional<ProvisioningProfileMetadata> actual = profiles.getBestProvisioningProfile( "com.facebook.test", ApplePlatform.IPHONEOS, ProvisioningProfileStore.MATCH_ANY_ENTITLEMENT, ProvisioningProfileStore.MATCH_ANY_IDENTITY); assertThat(actual.get(), is(equalTo(expected))); } @Test public void testMatchesWildcard() throws Exception { ProvisioningProfileMetadata expected = makeTestMetadata( "BBBBBBBBBB.*", new Date(Long.MAX_VALUE), "00000000-0000-0000-0000-000000000000"); ProvisioningProfileStore profiles = ProvisioningProfileStore.fromProvisioningProfiles(ImmutableList.of(expected)); Optional<ProvisioningProfileMetadata> actual = profiles.getBestProvisioningProfile( "com.facebook.test", ApplePlatform.IPHONEOS, ProvisioningProfileStore.MATCH_ANY_ENTITLEMENT, ProvisioningProfileStore.MATCH_ANY_IDENTITY); assertThat(actual.get(), is(equalTo(expected))); } }