// Copyright 2017 Google // // 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. #import "FirebaseCore/Tests/Unit/FIRTestCase.h" #import #import "FirebaseCore/Sources/FIRBundleUtil.h" #import "SharedTestUtilities/FIROptionsMock.h" static NSString *const kResultPath = @"resultPath"; static NSString *const kResourceName = @"resourceName"; static NSString *const kFileType = @"fileType"; @interface FIRBundleUtilTest : FIRTestCase @property(nonatomic, strong) id mockBundle; @end @implementation FIRBundleUtilTest - (void)setUp { [super setUp]; self.mockBundle = OCMClassMock([NSBundle class]); } - (void)testRelevantBundles_mainIsFirst { // Pointer compare to same instance of main bundle. XCTAssertEqual([NSBundle mainBundle], [FIRBundleUtil relevantBundles][0]); } // TODO: test that adding a bundle appears in "all bundles" // once the use-case is understood. - (void)testFindOptionsDictionaryPath { [OCMStub([self.mockBundle pathForResource:kResourceName ofType:kFileType]) andReturn:kResultPath]; XCTAssertEqualObjects([FIRBundleUtil optionsDictionaryPathWithResourceName:kResourceName andFileType:kFileType inBundles:@[ self.mockBundle ]], kResultPath); } - (void)testFindOptionsDictionaryPath_notFound { XCTAssertNil([FIRBundleUtil optionsDictionaryPathWithResourceName:kResourceName andFileType:kFileType inBundles:@[ self.mockBundle ]]); } - (void)testFindOptionsDictionaryPath_secondBundle { NSBundle *mockBundleEmpty = OCMClassMock([NSBundle class]); [OCMStub([self.mockBundle pathForResource:kResourceName ofType:kFileType]) andReturn:kResultPath]; NSArray *bundles = @[ mockBundleEmpty, self.mockBundle ]; XCTAssertEqualObjects([FIRBundleUtil optionsDictionaryPathWithResourceName:kResourceName andFileType:kFileType inBundles:bundles], kResultPath); } - (void)testBundleIdentifierExistsInBundles { NSString *bundleID = @"com.google.test"; [OCMStub([self.mockBundle bundleIdentifier]) andReturn:bundleID]; XCTAssertTrue([FIRBundleUtil hasBundleIdentifierPrefix:bundleID inBundles:@[ self.mockBundle ]]); } - (void)testBundleIdentifierExistsInBundles_notExist { [OCMStub([self.mockBundle bundleIdentifier]) andReturn:@"com.google.test"]; XCTAssertFalse([FIRBundleUtil hasBundleIdentifierPrefix:@"not-exist" inBundles:@[ self.mockBundle ]]); } - (void)testBundleIdentifierExistsInBundles_emptyBundlesArray { XCTAssertFalse([FIRBundleUtil hasBundleIdentifierPrefix:@"com.google.test" inBundles:@[]]); } - (void)testBundleIdentifierHasPrefixInBundlesForExtension { id environmentUtilsMock = [OCMockObject mockForClass:[GULAppEnvironmentUtil class]]; [[[environmentUtilsMock stub] andReturnValue:@(YES)] isAppExtension]; // Mock bundle should have what app extension has, the extension bundle ID. [OCMStub([self.mockBundle bundleIdentifier]) andReturn:@"com.google.test.someextension"]; XCTAssertTrue([FIRBundleUtil hasBundleIdentifierPrefix:@"com.google.test" inBundles:@[ self.mockBundle ]]); [environmentUtilsMock stopMocking]; } - (void)testBundleIdentifierExistsInBundlesForExtensions_exactMatch { id environmentUtilsMock = [OCMockObject mockForClass:[GULAppEnvironmentUtil class]]; [[[environmentUtilsMock stub] andReturnValue:@(YES)] isAppExtension]; // Mock bundle should have what app extension has, the extension bundle ID. [OCMStub([self.mockBundle bundleIdentifier]) andReturn:@"com.google.test.someextension"]; XCTAssertTrue([FIRBundleUtil hasBundleIdentifierPrefix:@"com.google.test.someextension" inBundles:@[ self.mockBundle ]]); [environmentUtilsMock stopMocking]; } - (void)testBundleIdentifierHasPrefixInBundlesNotValidExtension { id environmentUtilsMock = [OCMockObject mockForClass:[GULAppEnvironmentUtil class]]; [[[environmentUtilsMock stub] andReturnValue:@(YES)] isAppExtension]; [OCMStub([self.mockBundle bundleIdentifier]) andReturn:@"com.google.test.someextension.some"]; XCTAssertFalse([FIRBundleUtil hasBundleIdentifierPrefix:@"com.google.test" inBundles:@[ self.mockBundle ]]); [OCMStub([self.mockBundle bundleIdentifier]) andReturn:@"com.google.testsomeextension"]; XCTAssertFalse([FIRBundleUtil hasBundleIdentifierPrefix:@"com.google.test" inBundles:@[ self.mockBundle ]]); [OCMStub([self.mockBundle bundleIdentifier]) andReturn:@"com.google.testsomeextension.some"]; XCTAssertFalse([FIRBundleUtil hasBundleIdentifierPrefix:@"com.google.test" inBundles:@[ self.mockBundle ]]); [OCMStub([self.mockBundle bundleIdentifier]) andReturn:@"not-exist"]; XCTAssertFalse([FIRBundleUtil hasBundleIdentifierPrefix:@"com.google.test" inBundles:@[ self.mockBundle ]]); // Should be NO, since if @"com.google.tests" is an app extension identifier, then the app bundle // identifier is @"com.google" XCTAssertFalse([FIRBundleUtil hasBundleIdentifierPrefix:@"com.google.tests" inBundles:@[ self.mockBundle ]]); [environmentUtilsMock stopMocking]; } @end