blob: aefdb44587ee3f923b15b4f6db4638db3a56cfcd [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import <Foundation/Foundation.h>
#import "ios/chrome/app/application_delegate/startup_information.h"
#import "ios/chrome/app/application_delegate/tab_opening.h"
#import "ios/chrome/app/application_delegate/url_opener.h"
#import "ios/chrome/app/application_delegate/url_opener_params.h"
#import "ios/chrome/app/profile/profile_init_stage.h"
#import "ios/chrome/app/profile/profile_state.h"
#import "ios/chrome/browser/main/ui_bundled/browser_view_wrangler.h"
#import "ios/chrome/browser/main/ui_bundled/wrangled_browser.h"
#import "ios/chrome/browser/shared/coordinator/scene/scene_controller.h"
#import "ios/chrome/browser/shared/coordinator/scene/scene_controller_testing.h"
#import "ios/chrome/browser/shared/coordinator/scene/scene_state.h"
#import "ios/chrome/browser/shared/coordinator/scene/test/fake_scene_state.h"
#import "ios/chrome/browser/shared/coordinator/scene/test/stub_browser_provider.h"
#import "ios/chrome/browser/shared/model/browser/test/test_browser.h"
#import "ios/chrome/browser/shared/model/prefs/browser_prefs.h"
#import "ios/chrome/browser/shared/model/profile/test/test_profile_ios.h"
#import "ios/testing/scoped_block_swizzler.h"
#import "ios/web/public/test/web_task_environment.h"
#import "testing/platform_test.h"
#import "third_party/ocmock/OCMock/OCMock.h"
namespace {
// Prototype of the block used to swizzle the method under test of URLOpener.
using HandleLaunchOptions = void (^)(id,
URLOpenerParams*,
id<TabOpening>,
id<ConnectionInformation>,
id<StartupInformation>,
PrefService*,
ProfileInitStage);
} // namespace
class TabOpenerTest : public PlatformTest {
protected:
void TearDown() override {
[scene_controller_ teardownUI];
scene_controller_ = nil;
[scene_state_ shutdown];
scene_state_ = nil;
PlatformTest::TearDown();
}
BOOL HasSwizzledMethodBeenCalled() { return swizzle_block_executed_; }
void InstallSwizzleForHandleLauncheOptionsMethod(
URLOpenerParams* expected_params,
id<ConnectionInformation> expected_connection_information,
id<StartupInformation> expected_startup_information,
ProfileInitStage expected_init_stage) {
swizzle_block_executed_ = NO;
swizzle_block_ =
^(id self, URLOpenerParams* params, id<TabOpening> tab_opener,
id<ConnectionInformation> connection_information,
id<StartupInformation> startup_information, PrefService* pref_service,
ProfileInitStage init_stage) {
swizzle_block_executed_ = YES;
EXPECT_EQ(expected_params, params);
EXPECT_EQ(expected_connection_information, connection_information);
EXPECT_EQ(expected_startup_information, startup_information);
EXPECT_EQ(scene_controller_, tab_opener);
EXPECT_EQ(expected_init_stage, init_stage);
};
URL_opening_handle_launch_swizzler_ = std::make_unique<ScopedBlockSwizzler>(
[URLOpener class],
@selector(handleLaunchOptions:
tabOpener:connectionInformation:startupInformation
:prefService:initStage:),
swizzle_block_);
}
SceneController* GetSceneController() {
if (!scene_controller_) {
profile_ = TestProfileIOS::Builder().Build();
profile_state_ = OCMClassMock([ProfileState class]);
OCMStub([profile_state_ initStage]).andReturn(ProfileInitStage::kFinal);
scene_state_ = [[FakeSceneState alloc] initWithAppState:nil
profile:profile_.get()];
scene_state_.profileState = profile_state_;
SceneController* controller =
[[SceneController alloc] initWithSceneState:scene_state_];
id mock_wrangled_browser = OCMClassMock([WrangledBrowser class]);
OCMStub([mock_wrangled_browser profile]).andReturn(profile_.get());
scene_controller_ = OCMPartialMock(controller);
OCMStub([scene_controller_ currentInterface])
.andReturn(mock_wrangled_browser);
scene_controller_ = controller;
}
return scene_controller_;
}
private:
web::WebTaskEnvironment task_environment_;
std::unique_ptr<TestProfileIOS> profile_;
ProfileState* profile_state_;
FakeSceneState* scene_state_;
SceneController* scene_controller_;
BOOL swizzle_block_executed_;
HandleLaunchOptions swizzle_block_;
std::unique_ptr<ScopedBlockSwizzler> URL_opening_handle_launch_swizzler_;
};
#pragma mark - Tests.
// Tests that -newTabFromLaunchOptions calls +handleLaunchOption and reset
// options.
TEST_F(TabOpenerTest, openTabFromLaunchWithParamsWithOptions) {
// Setup.
NSString* sourceApplication = @"com.apple.mobilesafari";
URLOpenerParams* params =
[[URLOpenerParams alloc] initWithURL:nil
sourceApplication:sourceApplication];
id mock_startup_information =
[OCMockObject mockForProtocol:@protocol(StartupInformation)];
id<TabOpening> tab_opener = GetSceneController();
id<ConnectionInformation> connection_information = GetSceneController();
InstallSwizzleForHandleLauncheOptionsMethod(params, connection_information,
mock_startup_information,
ProfileInitStage::kFinal);
// Action.
[tab_opener openTabFromLaunchWithParams:params
startupInformation:mock_startup_information];
// Test.
EXPECT_TRUE(HasSwizzledMethodBeenCalled());
}
// Tests that -newTabFromLaunchOptions do nothing if launchOptions is nil.
TEST_F(TabOpenerTest, openTabFromLaunchWithParamsWithNil) {
// Setup.
id mock_startup_information =
[OCMockObject mockForProtocol:@protocol(StartupInformation)];
id<TabOpening> tab_opener = GetSceneController();
id<ConnectionInformation> connection_information = GetSceneController();
InstallSwizzleForHandleLauncheOptionsMethod(nil, connection_information,
mock_startup_information,
ProfileInitStage::kFinal);
// Action.
[tab_opener openTabFromLaunchWithParams:nil
startupInformation:mock_startup_information];
// Test.
EXPECT_FALSE(HasSwizzledMethodBeenCalled());
}