]> source.dussan.org Git - sonarqube.git/commitdiff
make UserSession non static
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Mon, 11 May 2015 08:06:03 +0000 (10:06 +0200)
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Tue, 12 May 2015 09:39:11 +0000 (11:39 +0200)
UserSession is now an interface
the old UserSession has been split into ServerUserSession (implements the lazy loading of credentials directly from DAOs) and ThreadLocalUserSession (implements the thread local management)
add UserSessionRule for UserSession management in unit test with support for ServerTester
DoPrivileged now restores the user session which was in ThreadLocal before it ran
move MockUserSession to server.tester package

244 files changed:
server/sonar-server-benchmarks/src/test/java/org/sonar/server/benchmark/IssueIndexBenchmarkTest.java
server/sonar-server/src/main/java/org/sonar/server/activity/ActivityService.java
server/sonar-server/src/main/java/org/sonar/server/activity/ws/ActivityMapping.java
server/sonar-server/src/main/java/org/sonar/server/activity/ws/SearchAction.java
server/sonar-server/src/main/java/org/sonar/server/batch/GlobalRepositoryAction.java
server/sonar-server/src/main/java/org/sonar/server/batch/IssuesAction.java
server/sonar-server/src/main/java/org/sonar/server/batch/ProjectRepositoryLoader.java
server/sonar-server/src/main/java/org/sonar/server/batch/UsersAction.java
server/sonar-server/src/main/java/org/sonar/server/component/ComponentService.java
server/sonar-server/src/main/java/org/sonar/server/component/ws/ComponentAppAction.java
server/sonar-server/src/main/java/org/sonar/server/component/ws/ProvisionedProjectsAction.java
server/sonar-server/src/main/java/org/sonar/server/component/ws/SearchAction.java
server/sonar-server/src/main/java/org/sonar/server/computation/ws/HistoryWsAction.java
server/sonar-server/src/main/java/org/sonar/server/computation/ws/SubmitReportWsAction.java
server/sonar-server/src/main/java/org/sonar/server/dashboard/ws/DashboardsShowAction.java
server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelBackup.java
server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelOperations.java
server/sonar-server/src/main/java/org/sonar/server/design/ws/ShowAction.java
server/sonar-server/src/main/java/org/sonar/server/duplication/ws/ShowAction.java
server/sonar-server/src/main/java/org/sonar/server/issue/InternalRubyIssueService.java
server/sonar-server/src/main/java/org/sonar/server/issue/IssueBulkChangeService.java
server/sonar-server/src/main/java/org/sonar/server/issue/IssueChangelogFormatter.java
server/sonar-server/src/main/java/org/sonar/server/issue/IssueChangelogService.java
server/sonar-server/src/main/java/org/sonar/server/issue/IssueQuery.java
server/sonar-server/src/main/java/org/sonar/server/issue/IssueQueryService.java
server/sonar-server/src/main/java/org/sonar/server/issue/IssueService.java
server/sonar-server/src/main/java/org/sonar/server/issue/SetSeverityAction.java
server/sonar-server/src/main/java/org/sonar/server/issue/TransitionAction.java
server/sonar-server/src/main/java/org/sonar/server/issue/filter/AppAction.java
server/sonar-server/src/main/java/org/sonar/server/issue/filter/FavoritesAction.java
server/sonar-server/src/main/java/org/sonar/server/issue/filter/ShowAction.java
server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndex.java
server/sonar-server/src/main/java/org/sonar/server/issue/ws/IssueActionsWriter.java
server/sonar-server/src/main/java/org/sonar/server/issue/ws/IssueShowAction.java
server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/InternalPermissionService.java
server/sonar-server/src/main/java/org/sonar/server/permission/InternalPermissionTemplateService.java
server/sonar-server/src/main/java/org/sonar/server/permission/PermissionTemplateUpdater.java
server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java
server/sonar-server/src/main/java/org/sonar/server/platform/ws/L10nWs.java
server/sonar-server/src/main/java/org/sonar/server/platform/ws/SystemInfoWsAction.java
server/sonar-server/src/main/java/org/sonar/server/plugins/ws/CancelAllPluginsWsAction.java
server/sonar-server/src/main/java/org/sonar/server/plugins/ws/InstallPluginsWsAction.java
server/sonar-server/src/main/java/org/sonar/server/plugins/ws/UninstallPluginsWsAction.java
server/sonar-server/src/main/java/org/sonar/server/plugins/ws/UpdatePluginsWsAction.java
server/sonar-server/src/main/java/org/sonar/server/qualitygate/QualityGates.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileLoader.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileProjectLookup.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileService.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfiles.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/RuleActivator.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/BulkRuleActivationActions.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/ProjectAssociationActions.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/QProfileChangeParentAction.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/QProfileCopyAction.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/QProfileCreateAction.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/QProfileDeleteAction.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/QProfileProjectsAction.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/QProfileRenameAction.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/QProfileRestoreAction.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/QProfileSetDefaultAction.java
server/sonar-server/src/main/java/org/sonar/server/rule/DefaultRuleFinder.java
server/sonar-server/src/main/java/org/sonar/server/rule/RubyRuleService.java
server/sonar-server/src/main/java/org/sonar/server/rule/RuleService.java
server/sonar-server/src/main/java/org/sonar/server/rule/ws/AppAction.java
server/sonar-server/src/main/java/org/sonar/server/rule/ws/RuleMapping.java
server/sonar-server/src/main/java/org/sonar/server/rule/ws/SearchAction.java
server/sonar-server/src/main/java/org/sonar/server/search/QueryContext.java
server/sonar-server/src/main/java/org/sonar/server/search/ws/BaseMapping.java
server/sonar-server/src/main/java/org/sonar/server/search/ws/SearchRequestHandler.java
server/sonar-server/src/main/java/org/sonar/server/source/ws/HashAction.java
server/sonar-server/src/main/java/org/sonar/server/source/ws/IndexAction.java
server/sonar-server/src/main/java/org/sonar/server/source/ws/LinesAction.java
server/sonar-server/src/main/java/org/sonar/server/source/ws/RawAction.java
server/sonar-server/src/main/java/org/sonar/server/source/ws/ScmAction.java
server/sonar-server/src/main/java/org/sonar/server/source/ws/ShowAction.java
server/sonar-server/src/main/java/org/sonar/server/test/CoverageService.java
server/sonar-server/src/main/java/org/sonar/server/test/ws/TestsCoveredFilesAction.java
server/sonar-server/src/main/java/org/sonar/server/test/ws/TestsListAction.java
server/sonar-server/src/main/java/org/sonar/server/ui/JRubyI18n.java
server/sonar-server/src/main/java/org/sonar/server/ui/ViewProxy.java
server/sonar-server/src/main/java/org/sonar/server/ui/Views.java
server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentNavigationAction.java
server/sonar-server/src/main/java/org/sonar/server/ui/ws/GlobalNavigationAction.java
server/sonar-server/src/main/java/org/sonar/server/ui/ws/SettingsNavigationAction.java
server/sonar-server/src/main/java/org/sonar/server/user/AbstractUserSession.java [new file with mode: 0644]
server/sonar-server/src/main/java/org/sonar/server/user/AnonymousUserSession.java [new file with mode: 0644]
server/sonar-server/src/main/java/org/sonar/server/user/DefaultUserService.java
server/sonar-server/src/main/java/org/sonar/server/user/DoPrivileged.java
server/sonar-server/src/main/java/org/sonar/server/user/RubyUserSession.java
server/sonar-server/src/main/java/org/sonar/server/user/ServerUserSession.java [new file with mode: 0644]
server/sonar-server/src/main/java/org/sonar/server/user/ThreadLocalUserSession.java [new file with mode: 0644]
server/sonar-server/src/main/java/org/sonar/server/user/UserSession.java
server/sonar-server/src/main/java/org/sonar/server/user/UserSessionFilter.java
server/sonar-server/src/main/java/org/sonar/server/user/ws/ChangePasswordAction.java
server/sonar-server/src/main/java/org/sonar/server/user/ws/CreateAction.java
server/sonar-server/src/main/java/org/sonar/server/user/ws/CurrentUserAction.java
server/sonar-server/src/main/java/org/sonar/server/user/ws/DeactivateAction.java
server/sonar-server/src/main/java/org/sonar/server/user/ws/UpdateAction.java
server/sonar-server/src/main/java/org/sonar/server/ws/WebServiceEngine.java
server/sonar-server/src/test/java/org/sonar/server/activity/ActivityServiceTest.java
server/sonar-server/src/test/java/org/sonar/server/activity/ws/ActivitiesWebServiceMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/batch/BatchWsTest.java
server/sonar-server/src/test/java/org/sonar/server/batch/GlobalRepositoryActionTest.java
server/sonar-server/src/test/java/org/sonar/server/batch/IssuesActionTest.java
server/sonar-server/src/test/java/org/sonar/server/batch/ProjectRepositoryLoaderMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/batch/UsersActionTest.java
server/sonar-server/src/test/java/org/sonar/server/component/ComponentCleanerServiceMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/component/ComponentServiceMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/component/ws/ComponentAppActionTest.java
server/sonar-server/src/test/java/org/sonar/server/component/ws/ComponentsWsTest.java
server/sonar-server/src/test/java/org/sonar/server/component/ws/ProvisionedProjectsActionTest.java
server/sonar-server/src/test/java/org/sonar/server/component/ws/SearchActionTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/ws/HistoryWsActionMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/ws/SubmitReportWsActionTest.java
server/sonar-server/src/test/java/org/sonar/server/debt/DebtMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelBackupTest.java
server/sonar-server/src/test/java/org/sonar/server/debt/DebtModelOperationsTest.java
server/sonar-server/src/test/java/org/sonar/server/design/ws/DependenciesWsTest.java
server/sonar-server/src/test/java/org/sonar/server/design/ws/ShowActionTest.java
server/sonar-server/src/test/java/org/sonar/server/duplication/ws/DuplicationsWsTest.java
server/sonar-server/src/test/java/org/sonar/server/duplication/ws/ShowActionTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/ActionServiceTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/AssignActionTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/CommentActionTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/InternalRubyIssueServiceTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/IssueBulkChangeServiceMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/IssueBulkChangeServiceTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/IssueChangelogFormatterTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/IssueChangelogServiceTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/IssueCommentServiceMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/IssueCommentServiceTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/IssueQueryServiceTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/IssueQueryTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/IssueServiceMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/IssuesFinderSortTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/PlanActionTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/SetSeverityActionTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/TransitionActionTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/actionplan/ActionPlanServiceTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/filter/AppActionTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/filter/FavoritesActionTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/filter/IssueFilterServiceTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/filter/IssueFilterWriterTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/filter/IssueFilterWsTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/filter/ShowActionTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueActionsWriterTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueShowActionTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionComponentsMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/permission/InternalPermissionServiceMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/permission/InternalPermissionTemplateServiceTest.java
server/sonar-server/src/test/java/org/sonar/server/permission/PermissionTemplateUpdaterTest.java
server/sonar-server/src/test/java/org/sonar/server/platform/ws/L10nWsTest.java
server/sonar-server/src/test/java/org/sonar/server/platform/ws/SystemInfoWsActionTest.java
server/sonar-server/src/test/java/org/sonar/server/platform/ws/SystemWsTest.java
server/sonar-server/src/test/java/org/sonar/server/plugins/ws/CancelAllPluginsWsActionTest.java
server/sonar-server/src/test/java/org/sonar/server/plugins/ws/InstallPluginsWsActionTest.java
server/sonar-server/src/test/java/org/sonar/server/plugins/ws/UninstallPluginsWsActionTest.java
server/sonar-server/src/test/java/org/sonar/server/plugins/ws/UpdatePluginsWsActionTest.java
server/sonar-server/src/test/java/org/sonar/server/qualitygate/QualityGatesTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ActiveRuleBackendMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileBackuperMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileComparisonMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileCopierMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileExportersTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileFactoryMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileProjectOperationsMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileResetMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileServiceMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfilesTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/RuleActivatorMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileChangeParentActionMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileCompareActionMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileCopyActionTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileCreateActionMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileCreateActionTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileDeleteActionTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileExportActionTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileInheritanceActionMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileProjectsActionTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileRenameActionTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileRestoreActionTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileSetDefaultActionTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfilesWsMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfilesWsTest.java
server/sonar-server/src/test/java/org/sonar/server/rule/DefaultRuleFinderMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/rule/RubyRuleServiceTest.java
server/sonar-server/src/test/java/org/sonar/server/rule/RuleBackendMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/rule/RuleCreatorMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/rule/RuleDeleterMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/rule/RuleOperationsTest.java
server/sonar-server/src/test/java/org/sonar/server/rule/RuleServiceMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/rule/RuleUpdaterMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/rule/ws/AppActionTest.java
server/sonar-server/src/test/java/org/sonar/server/rule/ws/CreateActionMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/rule/ws/RuleMappingTest.java
server/sonar-server/src/test/java/org/sonar/server/rule/ws/RulesWebServiceMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/rule/ws/ShowActionMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/rule/ws/UpdateActionMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/search/QueryContextTest.java
server/sonar-server/src/test/java/org/sonar/server/search/SearchClientMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/source/ws/HashActionTest.java
server/sonar-server/src/test/java/org/sonar/server/source/ws/IndexActionTest.java
server/sonar-server/src/test/java/org/sonar/server/source/ws/LinesActionTest.java
server/sonar-server/src/test/java/org/sonar/server/source/ws/RawActionTest.java
server/sonar-server/src/test/java/org/sonar/server/source/ws/ScmActionTest.java
server/sonar-server/src/test/java/org/sonar/server/source/ws/ShowActionTest.java
server/sonar-server/src/test/java/org/sonar/server/source/ws/SourcesWsTest.java
server/sonar-server/src/test/java/org/sonar/server/test/CoverageServiceTest.java
server/sonar-server/src/test/java/org/sonar/server/test/ws/TestsCoveredFilesActionTest.java
server/sonar-server/src/test/java/org/sonar/server/test/ws/TestsListActionTest.java
server/sonar-server/src/test/java/org/sonar/server/test/ws/TestsWsTest.java
server/sonar-server/src/test/java/org/sonar/server/tester/AnonymousMockUserSession.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/tester/MockUserSession.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/tester/MockUserSessionTest.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/tester/UserSessionRule.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/ui/JRubyI18nTest.java
server/sonar-server/src/test/java/org/sonar/server/ui/ViewProxyTest.java
server/sonar-server/src/test/java/org/sonar/server/ui/ViewsTest.java
server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentNavigationActionTest.java
server/sonar-server/src/test/java/org/sonar/server/ui/ws/GlobalNavigationActionTest.java
server/sonar-server/src/test/java/org/sonar/server/ui/ws/SettingsNavigationActionTest.java
server/sonar-server/src/test/java/org/sonar/server/user/DefaultUserServiceTest.java
server/sonar-server/src/test/java/org/sonar/server/user/DoPrivilegedTest.java
server/sonar-server/src/test/java/org/sonar/server/user/MockUserSession.java [deleted file]
server/sonar-server/src/test/java/org/sonar/server/user/MockUserSessionTest.java [deleted file]
server/sonar-server/src/test/java/org/sonar/server/user/RubyUserSessionTest.java
server/sonar-server/src/test/java/org/sonar/server/user/ServerUserSessionTest.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/user/ThreadLocalUserSessionTest.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/user/UserSessionFilterTest.java
server/sonar-server/src/test/java/org/sonar/server/user/UserSessionTest.java [deleted file]
server/sonar-server/src/test/java/org/sonar/server/user/UserSessionTestUtils.java [deleted file]
server/sonar-server/src/test/java/org/sonar/server/user/ws/ChangePasswordActionTest.java
server/sonar-server/src/test/java/org/sonar/server/user/ws/CreateActionTest.java
server/sonar-server/src/test/java/org/sonar/server/user/ws/CurrentUserActionTest.java
server/sonar-server/src/test/java/org/sonar/server/user/ws/DeactivateActionTest.java
server/sonar-server/src/test/java/org/sonar/server/user/ws/UpdateActionTest.java
server/sonar-server/src/test/java/org/sonar/server/user/ws/UsersWsTest.java
server/sonar-server/src/test/java/org/sonar/server/view/index/ViewIndexerMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/ws/WebServiceEngineTest.java

index 460b785d64b5f36d235009cdf801c52c48bd9503..4791fe3915f20fc21df4eb27351b026ef46b380c 100644 (file)
@@ -24,8 +24,15 @@ import com.google.common.collect.Iterables;
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Timer;
+import java.util.concurrent.atomic.AtomicLong;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.math.RandomUtils;
+import org.junit.ClassRule;
 import org.junit.Rule;
 import org.junit.Test;
 import org.slf4j.Logger;
@@ -43,14 +50,7 @@ import org.sonar.server.issue.index.IssueDoc;
 import org.sonar.server.issue.index.IssueIndex;
 import org.sonar.server.issue.index.IssueIndexer;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
-
-import java.util.Arrays;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Timer;
-import java.util.concurrent.atomic.AtomicLong;
+import org.sonar.server.tester.UserSessionRule;
 
 public class IssueIndexBenchmarkTest {
 
@@ -60,8 +60,10 @@ public class IssueIndexBenchmarkTest {
   final static int FILES_PER_PROJECT = 100;
   final static int ISSUES_PER_FILE = 100;
 
+  @ClassRule
+  public static ServerTester tester = new ServerTester();
   @Rule
-  public ServerTester tester = new ServerTester();
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   @Rule
   public Benchmark benchmark = new Benchmark();
@@ -122,11 +124,11 @@ public class IssueIndexBenchmarkTest {
   }
 
   private void benchmarkQueries() {
-    MockUserSession.set().setUserGroups("sonar-users");
-    benchmarkQuery("all issues", IssueQuery.builder().build());
-    benchmarkQuery("project issues", IssueQuery.builder().projectUuids(Arrays.asList("PROJECT33")).build());
-    benchmarkQuery("file issues", IssueQuery.builder().componentUuids(Arrays.asList("FILE333")).build());
-    benchmarkQuery("various", IssueQuery.builder()
+    userSessionRule.setUserGroups("sonar-users");
+    benchmarkQuery("all issues", IssueQuery.builder(userSessionRule).build());
+    benchmarkQuery("project issues", IssueQuery.builder(userSessionRule).projectUuids(Arrays.asList("PROJECT33")).build());
+    benchmarkQuery("file issues", IssueQuery.builder(userSessionRule).componentUuids(Arrays.asList("FILE333")).build());
+    benchmarkQuery("various", IssueQuery.builder(userSessionRule)
       .resolutions(Arrays.asList(Issue.RESOLUTION_FIXED))
       .assigned(true)
       .build());
index 6d5c5626bd8c9269f82b462751184e334e9828aa..81d7779ada4584edc6ca19b7121e6f72fe1e185c 100644 (file)
@@ -32,16 +32,18 @@ public class ActivityService {
 
   private final DbClient dbClient;
   private final ActivityIndexer indexer;
+  private final UserSession userSession;
 
-  public ActivityService(DbClient dbClient, ActivityIndexer indexer) {
+  public ActivityService(DbClient dbClient, ActivityIndexer indexer, UserSession userSession) {
     this.dbClient = dbClient;
     this.indexer = indexer;
+    this.userSession = userSession;
   }
 
   public void save(Activity activity) {
     ActivityDto dto = new ActivityDto()
       .setKey(Uuids.create())
-      .setAuthor(UserSession.get().login())
+      .setAuthor(userSession.login())
       .setAction(activity.getAction())
       .setMessage(activity.getMessage())
       .setData(KeyValueFormat.format(activity.getData()))
index 07a756335cff16472e990b281984fd0b324da23c..0ca7823b1df1bee043d90504995af2d2281bbe87 100644 (file)
@@ -26,13 +26,15 @@ import org.sonar.server.search.QueryContext;
 import org.sonar.server.search.ws.BaseMapping;
 
 import java.util.Map;
+import org.sonar.server.user.UserSession;
 
 /**
  * Conversion between {@link org.sonar.server.activity.index.ActivityDoc} and WS JSON response
  */
 public class ActivityMapping extends BaseMapping<ActivityDoc, Object> {
 
-  public ActivityMapping() {
+  public ActivityMapping(UserSession userSession) {
+    super(userSession);
     map("type", ActivityIndexDefinition.FIELD_TYPE);
     map("action", ActivityIndexDefinition.FIELD_ACTION);
     mapDateTime("createdAt", ActivityIndexDefinition.FIELD_CREATED_AT);
index 0bb0647f753e12da0cc61e9f4276e0290cd3a5bd..1600f943c5c3bc1d2330fbe8e9de5ee7db8bc3c7 100644 (file)
@@ -31,6 +31,7 @@ import org.sonar.server.activity.index.ActivityQuery;
 import org.sonar.server.es.SearchOptions;
 import org.sonar.server.es.SearchResult;
 import org.sonar.server.search.QueryContext;
+import org.sonar.server.user.UserSession;
 
 public class SearchAction implements RequestHandler {
 
@@ -39,10 +40,12 @@ public class SearchAction implements RequestHandler {
 
   private final ActivityIndex activityIndex;
   private final ActivityMapping docToJsonMapping;
+  private final UserSession userSession;
 
-  public SearchAction(ActivityIndex activityIndex, ActivityMapping docToJsonMapping) {
+  public SearchAction(ActivityIndex activityIndex, ActivityMapping docToJsonMapping, UserSession userSession) {
     this.activityIndex = activityIndex;
     this.docToJsonMapping = docToJsonMapping;
+    this.userSession = userSession;
   }
 
   void define(WebService.NewController controller) {
@@ -73,7 +76,7 @@ public class SearchAction implements RequestHandler {
 
     JsonWriter json = response.newJsonWriter().beginObject();
     options.writeJson(json, results.getTotal());
-    writeActivities(results, json, new QueryContext().setFieldsToReturn(request.paramAsStrings(WebService.Param.FIELDS)));
+    writeActivities(results, json, new QueryContext(userSession).setFieldsToReturn(request.paramAsStrings(WebService.Param.FIELDS)));
     json.endObject().close();
   }
 
index 0e19a80fce685ec69bf31f2053032193e5ee7c82..9f76061023a20313a6d1943196e99cde1e120073 100644 (file)
@@ -40,10 +40,12 @@ public class GlobalRepositoryAction implements BatchAction {
 
   private final DbClient dbClient;
   private final PropertiesDao propertiesDao;
+  private final UserSession userSession;
 
-  public GlobalRepositoryAction(DbClient dbClient, PropertiesDao propertiesDao) {
+  public GlobalRepositoryAction(DbClient dbClient, PropertiesDao propertiesDao, UserSession userSession) {
     this.dbClient = dbClient;
     this.propertiesDao = propertiesDao;
+    this.userSession = userSession;
   }
 
   @Override
@@ -57,7 +59,6 @@ public class GlobalRepositoryAction implements BatchAction {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession userSession = UserSession.get();
     boolean hasScanPerm = userSession.hasGlobalPermission(GlobalPermissions.SCAN_EXECUTION);
     boolean hasPreviewPerm = userSession.hasGlobalPermission(GlobalPermissions.PREVIEW_EXECUTION);
     if (!hasPreviewPerm && !hasScanPerm) {
index a0e9bf40c67346d131c25a9ab7d4af288fe1605c..16b3c4b0bec38623d1858b6b02886892455fb88a 100644 (file)
 
 package org.sonar.server.batch;
 
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 import org.sonar.api.resources.Scopes;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.Response;
@@ -35,12 +40,6 @@ import org.sonar.server.issue.index.IssueIndex;
 import org.sonar.server.plugins.MimeTypes;
 import org.sonar.server.user.UserSession;
 
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
 import static com.google.common.collect.Maps.newHashMap;
 
 public class IssuesAction implements BatchAction {
@@ -48,12 +47,13 @@ public class IssuesAction implements BatchAction {
   private static final String PARAM_KEY = "key";
 
   private final DbClient dbClient;
-
   private final IssueIndex issueIndex;
+  private final UserSession userSession;
 
-  public IssuesAction(DbClient dbClient, IssueIndex issueIndex) {
+  public IssuesAction(DbClient dbClient, IssueIndex issueIndex, UserSession userSession) {
     this.dbClient = dbClient;
     this.issueIndex = issueIndex;
+    this.userSession = userSession;
   }
 
   @Override
@@ -73,7 +73,7 @@ public class IssuesAction implements BatchAction {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession.get().checkGlobalPermission(GlobalPermissions.PREVIEW_EXECUTION);
+    userSession.checkGlobalPermission(GlobalPermissions.PREVIEW_EXECUTION);
     final String moduleKey = request.mandatoryParam(PARAM_KEY);
 
     response.stream().setMediaType(MimeTypes.PROTOBUF);
index 7a912db9bae585c59896089b6b449b3930d6e0cf..c34159404e4b3af7326b690d8ac92740e6cca38f 100644 (file)
@@ -75,18 +75,20 @@ public class ProjectRepositoryLoader {
   private final QProfileLoader qProfileLoader;
   private final RuleService ruleService;
   private final Languages languages;
+  private final UserSession userSession;
 
   public ProjectRepositoryLoader(DbClient dbClient, QProfileFactory qProfileFactory, QProfileLoader qProfileLoader, RuleService ruleService,
-    Languages languages) {
+                                 Languages languages, UserSession userSession) {
     this.dbClient = dbClient;
     this.qProfileFactory = qProfileFactory;
     this.qProfileLoader = qProfileLoader;
     this.ruleService = ruleService;
     this.languages = languages;
+    this.userSession = userSession;
   }
 
   public ProjectRepositories load(ProjectRepositoryQuery query) {
-    boolean hasScanPerm = UserSession.get().hasGlobalPermission(GlobalPermissions.SCAN_EXECUTION);
+    boolean hasScanPerm = userSession.hasGlobalPermission(GlobalPermissions.SCAN_EXECUTION);
     checkPermission(query.isPreview());
 
     DbSession session = dbClient.openSession(false);
@@ -97,7 +99,7 @@ public class ProjectRepositoryLoader {
       // Current project/module can be null when analysing a new project
       if (module != null) {
         // Scan permission is enough to analyze all projects but preview permission is limited to projects user can access
-        if (query.isPreview() && !UserSession.get().hasProjectPermissionByUuid(UserRole.USER, module.projectUuid())) {
+        if (query.isPreview() && !userSession.hasProjectPermissionByUuid(UserRole.USER, module.projectUuid())) {
           throw new ForbiddenException("You're not authorized to access to project '" + module.name() + "', please contact your SonarQube administrator.");
         }
 
@@ -238,7 +240,7 @@ public class ProjectRepositoryLoader {
     for (org.sonar.batch.protocol.input.QProfile qProfile : ref.qProfiles()) {
       // Load all rules of the profile language (only needed fields are loaded)
       Map<RuleKey, Rule> languageRules = ruleByRuleKey(ruleService.search(new RuleQuery().setLanguages(newArrayList(qProfile.language())),
-        new QueryContext().setLimit(100).setFieldsToReturn(newArrayList(
+        new QueryContext(userSession).setLimit(100).setFieldsToReturn(newArrayList(
           RuleNormalizer.RuleField.KEY.field(), RuleNormalizer.RuleField.NAME.field(), RuleNormalizer.RuleField.INTERNAL_KEY.field(), RuleNormalizer.RuleField.TEMPLATE_KEY.field()
           )).setScroll(true))
         .scroll());
@@ -277,7 +279,7 @@ public class ProjectRepositoryLoader {
   }
 
   private void addManualRules(ProjectRepositories ref) {
-    Result<Rule> ruleSearchResult = ruleService.search(new RuleQuery().setRepositories(newArrayList(RuleKey.MANUAL_REPOSITORY_KEY)), new QueryContext().setScroll(true)
+    Result<Rule> ruleSearchResult = ruleService.search(new RuleQuery().setRepositories(newArrayList(RuleKey.MANUAL_REPOSITORY_KEY)), new QueryContext(userSession).setScroll(true)
       .setFieldsToReturn(newArrayList(RuleNormalizer.RuleField.KEY.field(), RuleNormalizer.RuleField.NAME.field())));
     Iterator<Rule> rules = ruleSearchResult.scroll();
     while (rules.hasNext()) {
@@ -304,7 +306,6 @@ public class ProjectRepositoryLoader {
   }
 
   private void checkPermission(boolean preview) {
-    UserSession userSession = UserSession.get();
     boolean hasScanPerm = userSession.hasGlobalPermission(GlobalPermissions.SCAN_EXECUTION);
     boolean hasPreviewPerm = userSession.hasGlobalPermission(GlobalPermissions.PREVIEW_EXECUTION);
     if (!hasPreviewPerm && !hasScanPerm) {
index 520ce7e6757765e62c34ba1cab560e2a4d6967f0..46f2c0d167191ec7685ea23a5a45d2c39b7058b7 100644 (file)
 
 package org.sonar.server.batch;
 
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Iterator;
+import java.util.List;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.Response;
 import org.sonar.api.server.ws.WebService;
@@ -30,19 +34,16 @@ import org.sonar.server.user.UserSession;
 import org.sonar.server.user.index.UserDoc;
 import org.sonar.server.user.index.UserIndex;
 
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Iterator;
-import java.util.List;
-
 public class UsersAction implements BatchAction {
 
   private static final String PARAM_LOGINS = "logins";
 
   private final UserIndex userIndex;
+  private final UserSession userSession;
 
-  public UsersAction(UserIndex userIndex) {
+  public UsersAction(UserIndex userIndex, UserSession userSession) {
     this.userIndex = userIndex;
+    this.userSession = userSession;
   }
 
   @Override
@@ -62,7 +63,7 @@ public class UsersAction implements BatchAction {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession.get().checkGlobalPermission(GlobalPermissions.PREVIEW_EXECUTION);
+    userSession.checkGlobalPermission(GlobalPermissions.PREVIEW_EXECUTION);
     List<String> logins = request.mandatoryParamAsStrings(PARAM_LOGINS);
 
     response.stream().setMediaType(MimeTypes.PROTOBUF);
index c4263a25b162105ef50c20eae0218eb461a9c42b..5dad5622ad077e516f9635f3aafe67f9a66c8615 100644 (file)
@@ -24,6 +24,15 @@ import com.google.common.base.Function;
 import com.google.common.base.Joiner;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.Sets;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
+import org.sonar.api.ServerComponent;
 import org.sonar.api.ServerSide;
 import org.sonar.api.i18n.I18n;
 import org.sonar.api.resources.Scopes;
@@ -41,16 +50,6 @@ import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.permission.InternalPermissionService;
 import org.sonar.server.user.UserSession;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-
 import static com.google.common.collect.Lists.newArrayList;
 
 @ServerSide
@@ -62,14 +61,16 @@ public class ComponentService {
   private final I18n i18n;
   private final ResourceIndexerDao resourceIndexerDao;
   private final InternalPermissionService permissionService;
+  private final UserSession userSession;
 
   public ComponentService(DbClient dbClient, ResourceKeyUpdaterDao resourceKeyUpdaterDao, I18n i18n, ResourceIndexerDao resourceIndexerDao,
-    InternalPermissionService permissionService) {
+                          InternalPermissionService permissionService, UserSession userSession) {
     this.dbClient = dbClient;
     this.resourceKeyUpdaterDao = resourceKeyUpdaterDao;
     this.i18n = i18n;
     this.resourceIndexerDao = resourceIndexerDao;
     this.permissionService = permissionService;
+    this.userSession = userSession;
   }
 
   public ComponentDto getByKey(String key) {
@@ -114,7 +115,7 @@ public class ComponentService {
     DbSession session = dbClient.openSession(false);
     try {
       ComponentDto projectOrModule = getByKey(session, projectOrModuleKey);
-      UserSession.get().checkProjectUuidPermission(UserRole.ADMIN, projectOrModule.projectUuid());
+      userSession.checkProjectUuidPermission(UserRole.ADMIN, projectOrModule.projectUuid());
       resourceKeyUpdaterDao.updateKey(projectOrModule.getId(), newKey);
       session.commit();
 
@@ -128,7 +129,7 @@ public class ComponentService {
     DbSession session = dbClient.openSession(false);
     try {
       ComponentDto project = getByKey(projectKey);
-      UserSession.get().checkProjectUuidPermission(UserRole.ADMIN, project.projectUuid());
+      userSession.checkProjectUuidPermission(UserRole.ADMIN, project.projectUuid());
       return resourceKeyUpdaterDao.checkModuleKeysBeforeRenaming(project.getId(), stringToReplace, replacementString);
     } finally {
       session.close();
@@ -140,7 +141,7 @@ public class ComponentService {
     DbSession session = dbClient.openSession(true);
     try {
       ComponentDto project = getByKey(session, projectKey);
-      UserSession.get().checkProjectUuidPermission(UserRole.ADMIN, project.projectUuid());
+      userSession.checkProjectUuidPermission(UserRole.ADMIN, project.projectUuid());
       resourceKeyUpdaterDao.bulkUpdateKey(session, project.getId(), stringToReplace, replacementString);
       session.commit();
     } finally {
@@ -149,7 +150,7 @@ public class ComponentService {
   }
 
   public String create(NewComponent newComponent) {
-    UserSession.get().checkGlobalPermission(GlobalPermissions.PROVISIONING);
+    userSession.checkGlobalPermission(GlobalPermissions.PROVISIONING);
 
     DbSession session = dbClient.openSession(false);
     try {
index e08f7aa136af2836708e018f6dbd34abc515501d..83aa5dd8f1df025769baafdc07c46cad188db0ff 100644 (file)
 
 package org.sonar.server.component.ws;
 
+import java.util.List;
+import java.util.Map;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
 import org.apache.commons.lang.BooleanUtils;
 import org.sonar.api.i18n.I18n;
 import org.sonar.api.measures.CoreMetrics;
@@ -41,12 +45,6 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.user.UserSession;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.util.List;
-import java.util.Map;
-
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Maps.newHashMap;
 
@@ -63,11 +61,13 @@ public class ComponentAppAction implements RequestHandler {
 
   private final Durations durations;
   private final I18n i18n;
+  private final UserSession userSession;
 
-  public ComponentAppAction(DbClient dbClient, Durations durations, I18n i18n) {
+  public ComponentAppAction(DbClient dbClient, Durations durations, I18n i18n, UserSession userSession) {
     this.dbClient = dbClient;
     this.durations = durations;
     this.i18n = i18n;
+    this.userSession = userSession;
   }
 
   void define(WebService.NewController controller) {
@@ -92,7 +92,6 @@ public class ComponentAppAction implements RequestHandler {
   @Override
   public void handle(Request request, Response response) {
     String componentUuid = request.mandatoryParam(PARAM_UUID);
-    UserSession userSession = UserSession.get();
 
     JsonWriter json = response.newJsonWriter();
     json.beginObject();
@@ -211,16 +210,16 @@ public class ComponentAppAction implements RequestHandler {
       value = metric.getBestValue();
     }
     if (metricType.equals(Metric.ValueType.FLOAT) && value != null) {
-      return i18n.formatDouble(UserSession.get().locale(), value);
+      return i18n.formatDouble(userSession.locale(), value);
     }
     if (metricType.equals(Metric.ValueType.INT) && value != null) {
-      return i18n.formatInteger(UserSession.get().locale(), value.intValue());
+      return i18n.formatInteger(userSession.locale(), value.intValue());
     }
     if (metricType.equals(Metric.ValueType.PERCENT) && value != null) {
-      return i18n.formatDouble(UserSession.get().locale(), value) + "%";
+      return i18n.formatDouble(userSession.locale(), value) + "%";
     }
     if (metricType.equals(Metric.ValueType.WORK_DUR) && value != null) {
-      return durations.format(UserSession.get().locale(), durations.create(value.longValue()), Durations.DurationFormat.SHORT);
+      return durations.format(userSession.locale(), durations.create(value.longValue()), Durations.DurationFormat.SHORT);
     }
     if ((metricType.equals(Metric.ValueType.STRING) || metricType.equals(Metric.ValueType.RATING)) && data != null) {
       return data;
index cbc15b86377c9afd4f40d7a7ca148acd51feddaa..7acf67b055d86f1ada9a792ca3d1cfe25296648f 100644 (file)
@@ -39,12 +39,14 @@ import java.util.Date;
 import java.util.List;
 
 public class ProvisionedProjectsAction implements ProjectsAction {
-  private final DbClient dbClient;
-
   private static final List<String> POSSIBLE_FIELDS = Arrays.asList("uuid", "key", "name", "creationDate");
 
-  public ProvisionedProjectsAction(DbClient dbClient) {
+  private final DbClient dbClient;
+  private final UserSession userSession;
+
+  public ProvisionedProjectsAction(DbClient dbClient, UserSession userSession) {
     this.dbClient = dbClient;
+    this.userSession = userSession;
   }
 
   @Override
@@ -68,7 +70,7 @@ public class ProvisionedProjectsAction implements ProjectsAction {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession.get().checkGlobalPermission(UserRole.ADMIN, "You need admin rights.");
+    userSession.checkGlobalPermission(UserRole.ADMIN, "You need admin rights.");
     SearchOptions options = new SearchOptions().setPage(
       request.mandatoryParamAsInt(Param.PAGE),
       request.mandatoryParamAsInt(Param.PAGE_SIZE)
index 482390c8344ddaadb1bc04f122dda6af51417320..2ac0799b78b2750618b6172254740bb51e521c1e 100644 (file)
@@ -21,6 +21,9 @@
 package org.sonar.server.component.ws;
 
 import com.google.common.collect.Sets;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.RequestHandler;
 import org.sonar.api.server.ws.Response;
@@ -35,10 +38,6 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.es.SearchOptions;
 import org.sonar.server.user.UserSession;
 
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
 import static com.google.common.collect.Sets.newLinkedHashSet;
 import static org.sonar.api.server.ws.WebService.Param.PAGE;
 import static org.sonar.api.server.ws.WebService.Param.PAGE_SIZE;
@@ -50,9 +49,11 @@ public class SearchAction implements RequestHandler {
   private static final String PARAM_COMPONENT_UUID = "componentUuid";
 
   private final DbClient dbClient;
+  private final UserSession userSession;
 
-  public SearchAction(DbClient dbClient) {
+  public SearchAction(DbClient dbClient, UserSession userSession) {
     this.dbClient = dbClient;
+    this.userSession = userSession;
   }
 
   void define(WebService.NewController controller) {
@@ -91,10 +92,10 @@ public class SearchAction implements RequestHandler {
     DbSession session = dbClient.openSession(false);
     try {
       ComponentDto componentDto = dbClient.componentDao().getByUuid(session, viewOrSubUuid);
-      UserSession.get().checkProjectUuidPermission(UserRole.USER, componentDto.projectUuid());
+      userSession.checkProjectUuidPermission(UserRole.USER, componentDto.projectUuid());
 
       Set<Long> projectIds = newLinkedHashSet(dbClient.componentIndexDao().selectProjectIdsFromQueryAndViewOrSubViewUuid(session, query, componentDto.uuid()));
-      Collection<Long> authorizedProjectIds = dbClient.authorizationDao().keepAuthorizedProjectIds(session, projectIds, UserSession.get().userId(), UserRole.USER);
+      Collection<Long> authorizedProjectIds = dbClient.authorizationDao().keepAuthorizedProjectIds(session, projectIds, userSession.userId(), UserRole.USER);
 
       SearchOptions options = new SearchOptions();
       options.setPage(request.mandatoryParamAsInt(PAGE), request.mandatoryParamAsInt(PAGE_SIZE));
index 82135a2c15fefb7e6e65777f5ce4505a1564986c..0bb4d2b11558659898776b8eacdfa91eeab6d5b3 100644 (file)
@@ -20,6 +20,8 @@
 
 package org.sonar.server.computation.ws;
 
+import java.util.Arrays;
+import java.util.Map;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.RequestHandler;
 import org.sonar.api.server.ws.Response;
@@ -35,18 +37,17 @@ import org.sonar.server.es.SearchResult;
 import org.sonar.server.issue.ws.IssuesWs;
 import org.sonar.server.user.UserSession;
 
-import java.util.Arrays;
-import java.util.Map;
-
 // FIXME replace by api/activities/search
 public class HistoryWsAction implements ComputationWsAction, RequestHandler {
 
   public static final String PARAM_TYPE = "type";
 
   private final ActivityIndex activityIndex;
+  private final UserSession userSession;
 
-  public HistoryWsAction(ActivityIndex activityIndex) {
+  public HistoryWsAction(ActivityIndex activityIndex, UserSession userSession) {
     this.activityIndex = activityIndex;
+    this.userSession = userSession;
   }
 
   @Override
@@ -63,7 +64,7 @@ public class HistoryWsAction implements ComputationWsAction, RequestHandler {
 
   @Override
   public void handle(Request request, Response response) {
-    UserSession.get().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
+    userSession.checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
 
     ActivityQuery query = new ActivityQuery();
     query.setTypes(Arrays.asList(Activity.Type.ANALYSIS_REPORT.name()));
index 7a7c54d001d94cf016c1214d1b6fec642923966e..2c1347e956f6ac7291cc562f1577f0dd15074da6 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.sonar.server.computation.ws;
 
+import java.io.InputStream;
 import org.apache.commons.io.IOUtils;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.RequestHandler;
@@ -30,8 +31,6 @@ import org.sonar.server.computation.ComputationThreadLauncher;
 import org.sonar.server.computation.ReportQueue;
 import org.sonar.server.user.UserSession;
 
-import java.io.InputStream;
-
 public class SubmitReportWsAction implements ComputationWsAction, RequestHandler {
 
   public static final String ACTION = "submit_report";
@@ -40,10 +39,12 @@ public class SubmitReportWsAction implements ComputationWsAction, RequestHandler
 
   private final ReportQueue queue;
   private final ComputationThreadLauncher workerLauncher;
+  private final UserSession userSession;
 
-  public SubmitReportWsAction(ReportQueue queue, ComputationThreadLauncher workerLauncher) {
+  public SubmitReportWsAction(ReportQueue queue, ComputationThreadLauncher workerLauncher, UserSession userSession) {
     this.queue = queue;
     this.workerLauncher = workerLauncher;
+    this.userSession = userSession;
   }
 
   @Override
@@ -68,7 +69,7 @@ public class SubmitReportWsAction implements ComputationWsAction, RequestHandler
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession.get().checkGlobalPermission(GlobalPermissions.SCAN_EXECUTION);
+    userSession.checkGlobalPermission(GlobalPermissions.SCAN_EXECUTION);
     String projectKey = request.mandatoryParam(PARAM_PROJECT_KEY);
     InputStream reportData = request.paramAsInputStream(PARAM_REPORT_DATA);
     try {
index 035ad011da9f2401fab98abcf319be09cad86cc3..1c053863f4bbbaf0157caffc79267f3ebba2770f 100644 (file)
@@ -20,6 +20,7 @@
 package org.sonar.server.dashboard.ws;
 
 import com.google.common.collect.ListMultimap;
+import java.util.Collection;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.Response;
 import org.sonar.api.server.ws.WebService;
@@ -33,16 +34,16 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.user.UserSession;
 
-import java.util.Collection;
-
 public class DashboardsShowAction implements DashboardsAction {
 
   private static final String PARAM_KEY = "key";
 
   private final DbClient dbClient;
+  private final UserSession userSession;
 
-  public DashboardsShowAction(DbClient dbClient) {
+  public DashboardsShowAction(DbClient dbClient, UserSession userSession) {
     this.dbClient = dbClient;
+    this.userSession = userSession;
   }
 
   @Override
@@ -61,7 +62,7 @@ public class DashboardsShowAction implements DashboardsAction {
   public void handle(Request request, Response response) throws Exception {
     DbSession dbSession = dbClient.openSession(false);
     try {
-      Integer userId = UserSession.get().userId();
+      Integer userId = userSession.userId();
       DashboardDto dashboard = dbClient.dashboardDao().getAllowedByKey(dbSession, request.mandatoryParamAsLong(PARAM_KEY),
         userId != null ? userId.longValue() : null);
       if (dashboard == null) {
index 920ca9e3ccc6b45417d3cdca32019e30d9c03d96..560363f81cbcb7e14aa3e32cc0f117b0d62c2b27 100644 (file)
@@ -45,7 +45,6 @@ import org.sonar.server.debt.DebtModelXMLExporter.RuleDebt;
 import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.rule.RuleDefinitionsLoader;
 import org.sonar.server.rule.RuleOperations;
-import org.sonar.server.user.UserSession;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
@@ -53,6 +52,7 @@ import javax.annotation.Nullable;
 import java.io.Reader;
 import java.util.Date;
 import java.util.List;
+import org.sonar.server.user.UserSession;
 
 import static com.google.common.collect.Lists.newArrayList;
 
@@ -70,18 +70,19 @@ public class DebtModelBackup {
   private final DebtModelXMLExporter debtModelXMLExporter;
   private final RuleDefinitionsLoader defLoader;
   private final System2 system2;
+  private final UserSession userSession;
 
   public DebtModelBackup(DbClient dbClient, DebtModelOperations debtModelOperations, RuleOperations ruleOperations,
     DebtModelPluginRepository debtModelPluginRepository, DebtCharacteristicsXMLImporter characteristicsXMLImporter, DebtRulesXMLImporter rulesXMLImporter,
-    DebtModelXMLExporter debtModelXMLExporter, RuleDefinitionsLoader defLoader) {
+    DebtModelXMLExporter debtModelXMLExporter, RuleDefinitionsLoader defLoader, UserSession userSession) {
     this(dbClient, debtModelOperations, ruleOperations, debtModelPluginRepository, characteristicsXMLImporter, rulesXMLImporter, debtModelXMLExporter,
-      defLoader, System2.INSTANCE);
+      defLoader, System2.INSTANCE, userSession);
   }
 
   @VisibleForTesting
   DebtModelBackup(DbClient dbClient, DebtModelOperations debtModelOperations, RuleOperations ruleOperations,
     DebtModelPluginRepository debtModelPluginRepository, DebtCharacteristicsXMLImporter characteristicsXMLImporter, DebtRulesXMLImporter rulesXMLImporter,
-    DebtModelXMLExporter debtModelXMLExporter, RuleDefinitionsLoader defLoader, System2 system2) {
+    DebtModelXMLExporter debtModelXMLExporter, RuleDefinitionsLoader defLoader, System2 system2, UserSession userSession) {
     this.dbClient = dbClient;
     this.debtModelOperations = debtModelOperations;
     this.ruleOperations = ruleOperations;
@@ -91,6 +92,7 @@ public class DebtModelBackup {
     this.debtModelXMLExporter = debtModelXMLExporter;
     this.defLoader = defLoader;
     this.system2 = system2;
+    this.userSession = userSession;
   }
 
   public String backup() {
@@ -426,7 +428,7 @@ public class DebtModelBackup {
   }
 
   private void checkPermission() {
-    UserSession.get().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
+    userSession.checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
   }
 
 }
index 2b15c2160be940104032935c479d45a29d9b39dd..dcfd747e0b036ceae3d74541ac3a9e4119f4514e 100644 (file)
@@ -50,15 +50,17 @@ public class DebtModelOperations {
 
   private final DbClient dbClient;
   private final System2 system2;
+  private final UserSession userSession;
 
-  public DebtModelOperations(DbClient dbClient) {
-    this(dbClient, System2.INSTANCE);
+  public DebtModelOperations(DbClient dbClient, UserSession userSession) {
+    this(dbClient, System2.INSTANCE, userSession);
   }
 
   @VisibleForTesting
-  DebtModelOperations(DbClient dbClient, System2 system2) {
+  DebtModelOperations(DbClient dbClient, System2 system2, UserSession userSession) {
     this.dbClient = dbClient;
     this.system2 = system2;
+    this.userSession = userSession;
   }
 
   public DebtCharacteristic create(String name, @Nullable Integer parentId) {
@@ -262,7 +264,7 @@ public class DebtModelOperations {
   }
 
   private void checkPermission() {
-    UserSession.get().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
+    userSession.checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
   }
 
   private static DebtCharacteristic toCharacteristic(CharacteristicDto dto) {
index bf2882e60274898b865163c9421660b4ca92fe7f..7e3878981a8cab4c1619e7fba4bf99daa376afcb 100644 (file)
 package org.sonar.server.design.ws;
 
 import com.google.common.io.Resources;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.Response;
 import org.sonar.api.server.ws.WebService;
@@ -33,21 +38,17 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.user.UserSession;
 import org.sonar.server.user.ws.BaseUsersWsAction;
 
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
 public class ShowAction implements BaseUsersWsAction {
 
   private static final String PARAM_FROM_PARENT_UUID = "fromParentUuid";
   private static final String PARAM_TO_PARENT_UUID = "toParentUuid";
 
   private final DbClient dbClient;
+  private final UserSession userSession;
 
-  public ShowAction(DbClient dbClient) {
+  public ShowAction(DbClient dbClient, UserSession userSession) {
     this.dbClient = dbClient;
+    this.userSession = userSession;
   }
 
   @Override
@@ -79,7 +80,7 @@ public class ShowAction implements BaseUsersWsAction {
     try {
       ComponentDto fromParent = dbClient.componentDao().getByUuid(session, fromParentUuid);
       ComponentDto project = dbClient.componentDao().getByUuid(session, fromParent.projectUuid());
-      UserSession.get().checkProjectUuidPermission(UserRole.USER, project.uuid());
+      userSession.checkProjectUuidPermission(UserRole.USER, project.uuid());
 
       List<FileDependencyDto> fileDependencies = dbClient.fileDependencyDao().selectFromParents(session, fromParentUuid, toParentUuid, project.getId());
       writeResponse(response, fileDependencies, componentsByUuid(session, fileDependencies));
index 5f18d58f81fdc848ff1f37b8e1eedc118254dc8d..a4e7a1ac10f7a5b0713b593c44ae242c4f7563fa 100644 (file)
@@ -22,6 +22,8 @@ package org.sonar.server.duplication.ws;
 
 import com.google.common.base.Preconditions;
 import com.google.common.io.Resources;
+import java.util.List;
+import javax.annotation.CheckForNull;
 import org.sonar.api.measures.CoreMetrics;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.RequestHandler;
@@ -39,9 +41,6 @@ import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.measure.persistence.MeasureDao;
 import org.sonar.server.user.UserSession;
 
-import javax.annotation.CheckForNull;
-import java.util.List;
-
 public class ShowAction implements RequestHandler {
 
   private final DbClient dbClient;
@@ -49,13 +48,15 @@ public class ShowAction implements RequestHandler {
   private final MeasureDao measureDao;
   private final DuplicationsParser parser;
   private final DuplicationsJsonWriter duplicationsJsonWriter;
+  private final UserSession userSession;
 
-  public ShowAction(DbClient dbClient, ComponentDao componentDao, MeasureDao measureDao, DuplicationsParser parser, DuplicationsJsonWriter duplicationsJsonWriter) {
+  public ShowAction(DbClient dbClient, ComponentDao componentDao, MeasureDao measureDao, DuplicationsParser parser, DuplicationsJsonWriter duplicationsJsonWriter, UserSession userSession) {
     this.dbClient = dbClient;
     this.componentDao = componentDao;
     this.measureDao = measureDao;
     this.parser = parser;
     this.duplicationsJsonWriter = duplicationsJsonWriter;
+    this.userSession = userSession;
   }
 
   void define(WebService.NewController controller) {
@@ -87,7 +88,7 @@ public class ShowAction implements RequestHandler {
       fileKey = componentDao.getByUuid(session, fileUuid).key();
     }
 
-    UserSession.get().checkComponentPermission(UserRole.CODEVIEWER, fileKey);
+    userSession.checkComponentPermission(UserRole.CODEVIEWER, fileKey);
 
     try {
       ComponentDto component = findComponent(fileKey, session);
index db59c14e0268bf8a8fab8e1377fb8dc73534ba08..f6f0058ad1080697d889ee07d316a8e882e51adb 100644 (file)
@@ -26,6 +26,12 @@ import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
 import org.apache.commons.lang.StringUtils;
 import org.sonar.api.ServerSide;
 import org.sonar.api.issue.ActionPlan;
@@ -54,14 +60,6 @@ import org.sonar.server.user.UserSession;
 import org.sonar.server.util.RubyUtils;
 import org.sonar.server.util.Validation;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
 import static com.google.common.collect.Lists.newArrayList;
 
 /**
@@ -91,6 +89,7 @@ public class InternalRubyIssueService {
   private final ActionService actionService;
   private final IssueFilterService issueFilterService;
   private final IssueBulkChangeService issueBulkChangeService;
+  private final UserSession userSession;
 
   public InternalRubyIssueService(
     IssueService issueService,
@@ -98,7 +97,8 @@ public class InternalRubyIssueService {
     IssueCommentService commentService,
     IssueChangelogService changelogService, ActionPlanService actionPlanService,
     ResourceDao resourceDao, ActionService actionService,
-    IssueFilterService issueFilterService, IssueBulkChangeService issueBulkChangeService) {
+    IssueFilterService issueFilterService, IssueBulkChangeService issueBulkChangeService,
+    UserSession userSession) {
     this.issueService = issueService;
     this.issueQueryService = issueQueryService;
     this.commentService = commentService;
@@ -108,6 +108,7 @@ public class InternalRubyIssueService {
     this.actionService = actionService;
     this.issueFilterService = issueFilterService;
     this.issueBulkChangeService = issueBulkChangeService;
+    this.userSession = userSession;
   }
 
   public Issue getIssueByKey(String issueKey) {
@@ -202,7 +203,7 @@ public class InternalRubyIssueService {
   public Result<IssueComment> addComment(String issueKey, String text) {
     Result<IssueComment> result = Result.of();
     try {
-      result.set(commentService.addComment(issueKey, text, UserSession.get()));
+      result.set(commentService.addComment(issueKey, text, userSession));
     } catch (Exception e) {
       result.addError(e.getMessage());
     }
@@ -210,13 +211,13 @@ public class InternalRubyIssueService {
   }
 
   public IssueComment deleteComment(String commentKey) {
-    return commentService.deleteComment(commentKey, UserSession.get());
+    return commentService.deleteComment(commentKey, userSession);
   }
 
   public Result<IssueComment> editComment(String commentKey, String newText) {
     Result<IssueComment> result = Result.of();
     try {
-      result.set(commentService.editComment(commentKey, newText, UserSession.get()));
+      result.set(commentService.editComment(commentKey, newText, userSession));
     } catch (Exception e) {
       result.addError(e.getMessage());
     }
@@ -259,27 +260,27 @@ public class InternalRubyIssueService {
   }
 
   public Collection<ActionPlan> findOpenActionPlans(String projectKey) {
-    return actionPlanService.findOpenByProjectKey(projectKey, UserSession.get());
+    return actionPlanService.findOpenByProjectKey(projectKey, userSession);
   }
 
   public ActionPlan findActionPlan(String actionPlanKey) {
-    return actionPlanService.findByKey(actionPlanKey, UserSession.get());
+    return actionPlanService.findByKey(actionPlanKey, userSession);
   }
 
   public List<ActionPlanStats> findActionPlanStats(String projectKey) {
-    return actionPlanService.findActionPlanStats(projectKey, UserSession.get());
+    return actionPlanService.findActionPlanStats(projectKey, userSession);
   }
 
   public Result<ActionPlan> createActionPlan(Map<String, String> parameters) {
     Result<ActionPlan> result = createActionPlanResult(parameters);
     if (result.ok()) {
-      result.set(actionPlanService.create(result.get(), UserSession.get()));
+      result.set(actionPlanService.create(result.get(), userSession));
     }
     return result;
   }
 
   public Result<ActionPlan> updateActionPlan(String key, Map<String, String> parameters) {
-    DefaultActionPlan existingActionPlan = (DefaultActionPlan) actionPlanService.findByKey(key, UserSession.get());
+    DefaultActionPlan existingActionPlan = (DefaultActionPlan) actionPlanService.findByKey(key, userSession);
     if (existingActionPlan == null) {
       Result<ActionPlan> result = Result.of();
       result.addError(Result.Message.ofL10n(ACTION_PLANS_ERRORS_ACTION_PLAN_DOES_NOT_EXIST_MESSAGE, key));
@@ -290,7 +291,7 @@ public class InternalRubyIssueService {
         DefaultActionPlan actionPlan = (DefaultActionPlan) result.get();
         actionPlan.setKey(existingActionPlan.key());
         actionPlan.setUserLogin(existingActionPlan.userLogin());
-        result.set(actionPlanService.update(actionPlan, UserSession.get()));
+        result.set(actionPlanService.update(actionPlan, userSession));
       }
       return result;
     }
@@ -299,7 +300,7 @@ public class InternalRubyIssueService {
   public Result<ActionPlan> closeActionPlan(String actionPlanKey) {
     Result<ActionPlan> result = createResultForExistingActionPlan(actionPlanKey);
     if (result.ok()) {
-      result.set(actionPlanService.setStatus(actionPlanKey, ActionPlan.STATUS_CLOSED, UserSession.get()));
+      result.set(actionPlanService.setStatus(actionPlanKey, ActionPlan.STATUS_CLOSED, userSession));
     }
     return result;
   }
@@ -307,7 +308,7 @@ public class InternalRubyIssueService {
   public Result<ActionPlan> openActionPlan(String actionPlanKey) {
     Result<ActionPlan> result = createResultForExistingActionPlan(actionPlanKey);
     if (result.ok()) {
-      result.set(actionPlanService.setStatus(actionPlanKey, ActionPlan.STATUS_OPEN, UserSession.get()));
+      result.set(actionPlanService.setStatus(actionPlanKey, ActionPlan.STATUS_OPEN, userSession));
     }
     return result;
   }
@@ -315,7 +316,7 @@ public class InternalRubyIssueService {
   public Result<ActionPlan> deleteActionPlan(String actionPlanKey) {
     Result<ActionPlan> result = createResultForExistingActionPlan(actionPlanKey);
     if (result.ok()) {
-      actionPlanService.delete(actionPlanKey, UserSession.get());
+      actionPlanService.delete(actionPlanKey, userSession);
     }
     return result;
   }
@@ -351,7 +352,7 @@ public class InternalRubyIssueService {
     if (result.ok()) {
       DefaultActionPlan actionPlan = DefaultActionPlan.create(name)
         .setDescription(description)
-        .setUserLogin(UserSession.get().login())
+        .setUserLogin(userSession.login())
         .setDeadLine(deadLine);
 
       // Can only set project on creation
@@ -408,7 +409,7 @@ public class InternalRubyIssueService {
   public Result<Issue> executeAction(String issueKey, String actionKey) {
     Result<Issue> result = Result.of();
     try {
-      result.set(actionService.execute(issueKey, actionKey, UserSession.get()));
+      result.set(actionService.execute(issueKey, actionKey, userSession));
     } catch (Exception e) {
       result.addError(e.getMessage());
     }
@@ -437,12 +438,11 @@ public class InternalRubyIssueService {
    * Never return null
    */
   public IssueFilterDto findIssueFilter(Long id) {
-    return issueFilterService.find(id, UserSession.get());
+    return issueFilterService.find(id, userSession);
   }
 
   public boolean isUserAuthorized(IssueFilterDto issueFilter) {
     try {
-      UserSession userSession = UserSession.get();
       String user = issueFilterService.getLoggedLogin(userSession);
       issueFilterService.verifyCurrentUserCanReadFilter(issueFilter, user);
       return true;
@@ -452,7 +452,7 @@ public class InternalRubyIssueService {
   }
 
   public boolean canUserShareIssueFilter() {
-    return issueFilterService.canShareFilter(UserSession.get());
+    return issueFilterService.canShareFilter(userSession);
   }
 
   public String serializeFilterQuery(Map<String, Object> filterQuery) {
@@ -483,7 +483,7 @@ public class InternalRubyIssueService {
    * Execute issue filter from existing filter with optional overridable parameters
    */
   public IssueFilterService.IssueFilterResult execute(Long issueFilterId, Map<String, Object> overrideProps) {
-    IssueFilterDto issueFilter = issueFilterService.find(issueFilterId, UserSession.get());
+    IssueFilterDto issueFilter = issueFilterService.find(issueFilterId, userSession);
     Map<String, Object> props = issueFilterService.deserializeIssueFilterQuery(issueFilter);
     overrideProps(props, overrideProps);
     return execute(props);
@@ -499,7 +499,7 @@ public class InternalRubyIssueService {
    * List user issue filter
    */
   public List<IssueFilterDto> findIssueFiltersForCurrentUser() {
-    return issueFilterService.findByUser(UserSession.get());
+    return issueFilterService.findByUser(userSession);
   }
 
   /**
@@ -507,7 +507,7 @@ public class InternalRubyIssueService {
    */
   public IssueFilterDto createIssueFilter(Map<String, String> parameters) {
     IssueFilterDto result = createIssueFilterResultForNew(parameters);
-    return issueFilterService.save(result, UserSession.get());
+    return issueFilterService.save(result, userSession);
   }
 
   /**
@@ -515,21 +515,21 @@ public class InternalRubyIssueService {
    */
   public IssueFilterDto updateIssueFilter(Map<String, String> parameters) {
     IssueFilterDto result = createIssueFilterResultForUpdate(parameters);
-    return issueFilterService.update(result, UserSession.get());
+    return issueFilterService.update(result, userSession);
   }
 
   /**
    * Update issue filter data
    */
   public IssueFilterDto updateIssueFilterQuery(Long issueFilterId, Map<String, Object> data) {
-    return issueFilterService.updateFilterQuery(issueFilterId, data, UserSession.get());
+    return issueFilterService.updateFilterQuery(issueFilterId, data, userSession);
   }
 
   /**
    * Delete issue filter
    */
   public void deleteIssueFilter(Long issueFilterId) {
-    issueFilterService.delete(issueFilterId, UserSession.get());
+    issueFilterService.delete(issueFilterId, userSession);
   }
 
   /**
@@ -537,7 +537,7 @@ public class InternalRubyIssueService {
    */
   public IssueFilterDto copyIssueFilter(Long issueFilterIdToCopy, Map<String, String> parameters) {
     IssueFilterDto result = createIssueFilterResultForCopy(parameters);
-    return issueFilterService.copy(issueFilterIdToCopy, result, UserSession.get());
+    return issueFilterService.copy(issueFilterIdToCopy, result, userSession);
   }
 
   @VisibleForTesting
@@ -587,15 +587,15 @@ public class InternalRubyIssueService {
   }
 
   public List<IssueFilterDto> findSharedFiltersForCurrentUser() {
-    return issueFilterService.findSharedFiltersWithoutUserFilters(UserSession.get());
+    return issueFilterService.findSharedFiltersWithoutUserFilters(userSession);
   }
 
   public List<IssueFilterDto> findFavouriteIssueFiltersForCurrentUser() {
-    return issueFilterService.findFavoriteFilters(UserSession.get());
+    return issueFilterService.findFavoriteFilters(userSession);
   }
 
   public boolean toggleFavouriteIssueFilter(Long issueFilterId) {
-    return issueFilterService.toggleFavouriteIssueFilter(issueFilterId, UserSession.get());
+    return issueFilterService.toggleFavouriteIssueFilter(issueFilterId, userSession);
   }
 
   /**
@@ -603,7 +603,7 @@ public class InternalRubyIssueService {
    */
   public IssueBulkChangeResult bulkChange(Map<String, Object> props, String comment, boolean sendNotifications) {
     IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(props, comment, sendNotifications);
-    return issueBulkChangeService.execute(issueBulkChangeQuery, UserSession.get());
+    return issueBulkChangeService.execute(issueBulkChangeQuery, userSession);
   }
 
   private void checkMandatoryParameter(String value, String paramName, Result result) {
index 0ec177045a33f86468507cd84d5d5f57b7300f2f..3737eb05dbd4d992d452582af7d2662723bbe3d7 100644 (file)
@@ -71,15 +71,17 @@ public class IssueBulkChangeService {
   private final DefaultRuleFinder ruleFinder;
   private final NotificationManager notificationService;
   private final List<Action> actions;
+  private final UserSession userSession;
 
   public IssueBulkChangeService(DbClient dbClient, IssueService issueService, IssueStorage issueStorage, DefaultRuleFinder ruleFinder,
-    NotificationManager notificationService, List<Action> actions) {
+    NotificationManager notificationService, List<Action> actions, UserSession userSession) {
     this.dbClient = dbClient;
     this.issueService = issueService;
     this.issueStorage = issueStorage;
     this.ruleFinder = ruleFinder;
     this.notificationService = notificationService;
     this.actions = actions;
+    this.userSession = userSession;
   }
 
   public IssueBulkChangeResult execute(IssueBulkChangeQuery issueBulkChangeQuery, UserSession userSession) {
@@ -129,7 +131,7 @@ public class IssueBulkChangeService {
     // Load from index to check permission
     SearchOptions options = new SearchOptions().setLimit(SearchOptions.MAX_LIMIT);
     // TODO restrict fields to issue key, in order to not load all other fields;
-    List<IssueDoc> authorizedIssues = issueService.search(IssueQuery.builder().issueKeys(issueKeys).build(), options).getDocs();
+    List<IssueDoc> authorizedIssues = issueService.search(IssueQuery.builder(userSession).issueKeys(issueKeys).build(), options).getDocs();
     Collection<String> authorizedKeys = Collections2.transform(authorizedIssues, new Function<IssueDoc, String>() {
       @Override
       public String apply(IssueDoc input) {
index 7639efb98d50c8931b91648b0487399a8b31d923..3ff8056c7be8539458d5d28bae64bea0a0ec8337 100644 (file)
  */
 package org.sonar.server.issue;
 
+import java.io.Serializable;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import org.sonar.api.ServerComponent;
 import org.sonar.api.ServerSide;
 import org.sonar.api.i18n.I18n;
 import org.sonar.api.issue.internal.FieldDiffs;
@@ -27,11 +32,6 @@ import org.sonar.api.utils.Durations;
 import org.sonar.core.issue.IssueUpdater;
 import org.sonar.server.user.UserSession;
 
-import java.io.Serializable;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
 import static com.google.common.collect.Lists.newArrayList;
 
 @ServerSide
@@ -41,10 +41,12 @@ public class IssueChangelogFormatter {
 
   private final I18n i18n;
   private final Durations durations;
+  private final UserSession userSession;
 
-  public IssueChangelogFormatter(I18n i18n, Durations durations) {
+  public IssueChangelogFormatter(I18n i18n, Durations durations, UserSession userSession) {
     this.i18n = i18n;
     this.durations = durations;
+    this.userSession = userSession;
   }
 
   public List<String> format(Locale locale, FieldDiffs diffs) {
@@ -76,10 +78,10 @@ public class IssueChangelogFormatter {
     String oldValueString = oldValue != null && !"".equals(oldValue) ? oldValue.toString() : null;
     if (IssueUpdater.TECHNICAL_DEBT.equals(key)) {
       if (newValueString != null) {
-        newValueString = durations.format(UserSession.get().locale(), Duration.create(Long.parseLong(newValueString)), Durations.DurationFormat.SHORT);
+        newValueString = durations.format(userSession.locale(), Duration.create(Long.parseLong(newValueString)), Durations.DurationFormat.SHORT);
       }
       if (oldValueString != null) {
-        oldValueString = durations.format(UserSession.get().locale(), Duration.create(Long.parseLong(oldValueString)), Durations.DurationFormat.SHORT);
+        oldValueString = durations.format(userSession.locale(), Duration.create(Long.parseLong(oldValueString)), Durations.DurationFormat.SHORT);
       }
     }
     return new IssueChangelogDiffFormat(oldValueString, newValueString);
index 2533c27ef38f5a93dc6d4d7f0112da84d77319c0..8a1eadfc8de174b8cfd6b176363a0247f184cc7f 100644 (file)
@@ -19,6 +19,9 @@
  */
 package org.sonar.server.issue;
 
+import java.util.Collection;
+import java.util.List;
+import org.sonar.api.ServerComponent;
 import org.sonar.api.ServerSide;
 import org.sonar.api.issue.Issue;
 import org.sonar.api.issue.internal.FieldDiffs;
@@ -27,9 +30,6 @@ import org.sonar.api.user.UserFinder;
 import org.sonar.core.issue.db.IssueChangeDao;
 import org.sonar.server.user.UserSession;
 
-import java.util.Collection;
-import java.util.List;
-
 import static com.google.common.collect.Lists.newArrayList;
 
 /**
@@ -42,12 +42,14 @@ public class IssueChangelogService {
   private final UserFinder userFinder;
   private final IssueService issueService;
   private final IssueChangelogFormatter formatter;
+  private final UserSession userSession;
 
-  public IssueChangelogService(IssueChangeDao changeDao, UserFinder userFinder, IssueService issueService, IssueChangelogFormatter formatter) {
+  public IssueChangelogService(IssueChangeDao changeDao, UserFinder userFinder, IssueService issueService, IssueChangelogFormatter formatter, UserSession userSession) {
     this.changeDao = changeDao;
     this.userFinder = userFinder;
     this.issueService = issueService;
     this.formatter = formatter;
+    this.userSession = userSession;
   }
 
   public IssueChangelog changelog(String issueKey) {
@@ -70,6 +72,6 @@ public class IssueChangelogService {
   }
 
   public List<String> formatDiffs(FieldDiffs diffs) {
-    return formatter.format(UserSession.get().locale(), diffs);
+    return formatter.format(userSession.locale(), diffs);
   }
 }
index 4360c7a0fb63e30520912dfb155598dbe0cb287a..efe306caf7c086b2375f314b9c7cc6bb559774ee 100644 (file)
@@ -21,18 +21,16 @@ package org.sonar.server.issue;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
-import org.apache.commons.lang.builder.ReflectionToStringBuilder;
-import org.sonar.api.rule.RuleKey;
-import org.sonar.server.search.QueryContext;
-import org.sonar.server.user.UserSession;
-
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
 import java.util.Set;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
+import org.apache.commons.lang.builder.ReflectionToStringBuilder;
+import org.sonar.api.rule.RuleKey;
+import org.sonar.server.search.QueryContext;
+import org.sonar.server.user.UserSession;
 
 import static com.google.common.collect.Sets.newHashSet;
 
@@ -283,8 +281,8 @@ public class IssueQuery {
     return ReflectionToStringBuilder.toString(this);
   }
 
-  public static Builder builder() {
-    return new Builder();
+  public static Builder builder(UserSession userSession) {
+    return new Builder(userSession);
   }
 
   public static class Builder {
@@ -318,11 +316,13 @@ public class IssueQuery {
     private String sort;
     private Boolean asc = false;
     private Boolean ignorePaging = false;
-    private String userLogin = UserSession.get().login();
-    private Set<String> userGroups = UserSession.get().userGroups();
+    private String userLogin;
+    private Set<String> userGroups;
     private boolean checkAuthorization = true;
 
-    private Builder() {
+    private Builder(UserSession userSession) {
+      this.userLogin = userSession.login();
+      this.userGroups = userSession.userGroups();
     }
 
     public Builder issueKeys(@Nullable Collection<String> l) {
index 2bfb5b4142d599d97789db3769417197312b061a..16220ab9603121ca15eb8af527706517b8417565 100644 (file)
@@ -72,18 +72,20 @@ public class IssueQueryService {
   private final DbClient dbClient;
   private final ComponentService componentService;
   private final System2 system;
+  private final UserSession userSession;
 
-  public IssueQueryService(DbClient dbClient, ComponentService componentService, System2 system) {
+  public IssueQueryService(DbClient dbClient, ComponentService componentService, System2 system, UserSession userSession) {
     this.dbClient = dbClient;
     this.componentService = componentService;
     this.system = system;
+    this.userSession = userSession;
   }
 
   public IssueQuery createFromMap(Map<String, Object> params) {
     DbSession session = dbClient.openSession(false);
     try {
 
-      IssueQuery.Builder builder = IssueQuery.builder()
+      IssueQuery.Builder builder = IssueQuery.builder(userSession)
         .issueKeys(RubyUtils.toStrings(params.get(IssueFilterParameters.ISSUES)))
         .severities(RubyUtils.toStrings(params.get(IssueFilterParameters.SEVERITIES)))
         .statuses(RubyUtils.toStrings(params.get(IssueFilterParameters.STATUSES)))
@@ -156,7 +158,7 @@ public class IssueQueryService {
   public IssueQuery createFromRequest(Request request) {
     DbSession session = dbClient.openSession(false);
     try {
-      IssueQuery.Builder builder = IssueQuery.builder()
+      IssueQuery.Builder builder = IssueQuery.builder(userSession)
         .issueKeys(request.paramAsStrings(IssueFilterParameters.ISSUES))
         .severities(request.paramAsStrings(IssueFilterParameters.SEVERITIES))
         .statuses(request.paramAsStrings(IssueFilterParameters.STATUSES))
@@ -212,7 +214,7 @@ public class IssueQueryService {
       assignees.addAll(assigneesFromParams);
     }
     if (assignees.contains(LOGIN_MYSELF)) {
-      String login = UserSession.get().login();
+      String login = userSession.login();
       if (login == null) {
         assignees.add(UNKNOWN);
       } else {
@@ -337,8 +339,8 @@ public class IssueQueryService {
   private void addViewsOrSubViews(IssueQuery.Builder builder, Collection<String> componentUuids, String uniqueQualifier) {
     List<String> filteredViewUuids = newArrayList();
     for (String viewUuid : componentUuids) {
-      if ((Qualifiers.VIEW.equals(uniqueQualifier) && UserSession.get().hasProjectPermissionByUuid(UserRole.USER, viewUuid))
-        || (Qualifiers.SUBVIEW.equals(uniqueQualifier) && UserSession.get().hasComponentUuidPermission(UserRole.USER, viewUuid))) {
+      if ((Qualifiers.VIEW.equals(uniqueQualifier) && userSession.hasProjectPermissionByUuid(UserRole.USER, viewUuid))
+        || (Qualifiers.SUBVIEW.equals(uniqueQualifier) && userSession.hasComponentUuidPermission(UserRole.USER, viewUuid))) {
         filteredViewUuids.add(viewUuid);
       }
     }
index 5e4db0a7bdc9900ce3345c1a23cf87abfd4c8521..e73c04426f647e6f0504c6973081ff8c7ada4288 100644 (file)
  */
 package org.sonar.server.issue;
 
-import com.google.common.base.Objects;
-import com.google.common.base.Strings;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
+
 import org.apache.commons.lang.StringUtils;
 import org.sonar.api.ServerSide;
 import org.sonar.api.issue.ActionPlan;
@@ -57,15 +65,8 @@ import org.sonar.server.user.UserSession;
 import org.sonar.server.user.index.UserDoc;
 import org.sonar.server.user.index.UserIndex;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import com.google.common.base.Objects;
+import com.google.common.base.Strings;
 
 @ServerSide
 public class IssueService {
@@ -82,6 +83,7 @@ public class IssueService {
   private final UserFinder userFinder;
   private final UserIndex userIndex;
   private final SourceLineIndex sourceLineIndex;
+  private final UserSession userSession;
 
   public IssueService(DbClient dbClient, IssueIndex issueIndex,
     IssueWorkflow workflow,
@@ -91,7 +93,7 @@ public class IssueService {
     ActionPlanService actionPlanService,
     RuleFinder ruleFinder,
     UserFinder userFinder,
-    UserIndex userIndex, SourceLineIndex sourceLineIndex) {
+    UserIndex userIndex, SourceLineIndex sourceLineIndex, UserSession userSession) {
     this.dbClient = dbClient;
     this.issueIndex = issueIndex;
     this.workflow = workflow;
@@ -103,6 +105,7 @@ public class IssueService {
     this.userFinder = userFinder;
     this.userIndex = userIndex;
     this.sourceLineIndex = sourceLineIndex;
+    this.userSession = userSession;
   }
 
   public List<String> listStatus() {
@@ -136,7 +139,7 @@ public class IssueService {
     for (Transition transition : outTransitions) {
       String projectUuid = issue.projectUuid();
       if (StringUtils.isBlank(transition.requiredProjectPermission()) ||
-        (projectUuid != null && UserSession.get().hasProjectPermissionByUuid(transition.requiredProjectPermission(), projectUuid))) {
+        (projectUuid != null && userSession.hasProjectPermissionByUuid(transition.requiredProjectPermission(), projectUuid))) {
         allowedTransitions.add(transition);
       }
     }
@@ -149,8 +152,8 @@ public class IssueService {
     DbSession session = dbClient.openSession(false);
     try {
       DefaultIssue defaultIssue = getByKeyForUpdate(session, issueKey).toDefaultIssue();
-      IssueChangeContext context = IssueChangeContext.createUser(new Date(), UserSession.get().login());
-      checkTransitionPermission(transitionKey, UserSession.get(), defaultIssue);
+      IssueChangeContext context = IssueChangeContext.createUser(new Date(), userSession.login());
+      checkTransitionPermission(transitionKey, userSession, defaultIssue);
       if (workflow.doTransition(defaultIssue, transitionKey, context)) {
         saveIssue(session, defaultIssue, context, null);
       }
@@ -184,7 +187,7 @@ public class IssueService {
           throw new NotFoundException("Unknown user: " + assignee);
         }
       }
-      IssueChangeContext context = IssueChangeContext.createUser(new Date(), UserSession.get().login());
+      IssueChangeContext context = IssueChangeContext.createUser(new Date(), userSession.login());
       if (issueUpdater.assign(issue, user, context)) {
         saveIssue(session, issue, context, null);
       }
@@ -202,14 +205,14 @@ public class IssueService {
     try {
       ActionPlan actionPlan = null;
       if (!Strings.isNullOrEmpty(actionPlanKey)) {
-        actionPlan = actionPlanService.findByKey(actionPlanKey, UserSession.get());
+        actionPlan = actionPlanService.findByKey(actionPlanKey, userSession);
         if (actionPlan == null) {
           throw new NotFoundException("Unknown action plan: " + actionPlanKey);
         }
       }
       DefaultIssue issue = getByKeyForUpdate(session, issueKey).toDefaultIssue();
 
-      IssueChangeContext context = IssueChangeContext.createUser(new Date(), UserSession.get().login());
+      IssueChangeContext context = IssueChangeContext.createUser(new Date(), userSession.login());
       if (issueUpdater.plan(issue, actionPlan, context)) {
         saveIssue(session, issue, context, null);
       }
@@ -226,9 +229,9 @@ public class IssueService {
     DbSession session = dbClient.openSession(false);
     try {
       DefaultIssue issue = getByKeyForUpdate(session, issueKey).toDefaultIssue();
-      UserSession.get().checkProjectPermission(UserRole.ISSUE_ADMIN, issue.projectKey());
+      userSession.checkProjectPermission(UserRole.ISSUE_ADMIN, issue.projectKey());
 
-      IssueChangeContext context = IssueChangeContext.createUser(new Date(), UserSession.get().login());
+      IssueChangeContext context = IssueChangeContext.createUser(new Date(), userSession.login());
       if (issueUpdater.setManualSeverity(issue, severity, context)) {
         saveIssue(session, issue, context, null);
       }
@@ -247,7 +250,7 @@ public class IssueService {
       ComponentDto component = dbClient.componentDao().getByKey(session, componentKey);
       ComponentDto project = dbClient.componentDao().getByUuid(session, component.projectUuid());
 
-      UserSession.get().checkProjectPermission(UserRole.USER, project.getKey());
+      userSession.checkProjectPermission(UserRole.USER, project.getKey());
       if (!ruleKey.isManual()) {
         throw new IllegalArgumentException("Issues can be created only on rules marked as 'manual': " + ruleKey);
       }
@@ -264,7 +267,7 @@ public class IssueService {
         .severity(Objects.firstNonNull(severity, Severity.MAJOR))
         .effortToFix(effortToFix)
         .ruleKey(ruleKey)
-        .reporter(UserSession.get().login())
+        .reporter(userSession.login())
         .assignee(findSourceLineUser(component.uuid(), line))
         .build();
 
@@ -317,21 +320,21 @@ public class IssueService {
   }
 
   private void verifyLoggedIn() {
-    UserSession.get().checkLoggedIn();
+    userSession.checkLoggedIn();
   }
 
   /**
    * Search for all tags, whatever issue resolution or user access rights
    */
   public List<String> listTags(@Nullable String textQuery, int pageSize) {
-    IssueQuery query = IssueQuery.builder()
+    IssueQuery query = IssueQuery.builder(userSession)
       .checkAuthorization(false)
       .build();
     return issueIndex.listTags(query, textQuery, pageSize);
   }
 
   public List<String> listAuthors(@Nullable String textQuery, int pageSize) {
-    IssueQuery query = IssueQuery.builder()
+    IssueQuery query = IssueQuery.builder(userSession)
       .checkAuthorization(false)
       .build();
     return issueIndex.listAuthors(query, textQuery, pageSize);
@@ -343,7 +346,7 @@ public class IssueService {
     DbSession session = dbClient.openSession(false);
     try {
       DefaultIssue issue = getByKeyForUpdate(session, issueKey).toDefaultIssue();
-      IssueChangeContext context = IssueChangeContext.createUser(new Date(), UserSession.get().login());
+      IssueChangeContext context = IssueChangeContext.createUser(new Date(), userSession.login());
       if (issueUpdater.setTags(issue, tags, context)) {
         saveIssue(session, issue, context, null);
       }
index d56514a552e38b81c548c4cfb46c24bacf3d6800..f84b3de627c3aec101dab3ea4e97b31fc7cfbe84 100644 (file)
@@ -20,7 +20,9 @@
 
 package org.sonar.server.issue;
 
-import com.google.common.base.Strings;
+import java.util.Collection;
+import java.util.Map;
+
 import org.sonar.api.ServerSide;
 import org.sonar.api.issue.Issue;
 import org.sonar.api.issue.condition.Condition;
@@ -30,8 +32,7 @@ import org.sonar.api.web.UserRole;
 import org.sonar.core.issue.IssueUpdater;
 import org.sonar.server.user.UserSession;
 
-import java.util.Collection;
-import java.util.Map;
+import com.google.common.base.Strings;
 
 @ServerSide
 public class SetSeverityAction extends Action {
@@ -39,10 +40,12 @@ public class SetSeverityAction extends Action {
   public static final String KEY = "set_severity";
 
   private final IssueUpdater issueUpdater;
+  private final UserSession userSession;
 
-  public SetSeverityAction(IssueUpdater issueUpdater) {
+  public SetSeverityAction(IssueUpdater issueUpdater, UserSession userSession) {
     super(KEY);
     this.issueUpdater = issueUpdater;
+    this.userSession = userSession;
     super.setConditions(new IsUnResolved(), new Condition() {
       @Override
       public boolean matches(Issue issue) {
@@ -52,7 +55,7 @@ public class SetSeverityAction extends Action {
   }
 
   private boolean isCurrentUserIssueAdmin(String projectKey) {
-    return UserSession.get().hasProjectPermission(UserRole.ISSUE_ADMIN, projectKey);
+    return userSession.hasProjectPermission(UserRole.ISSUE_ADMIN, projectKey);
   }
 
   @Override
index 6e9707ddda20d3fdbf00bafe06b1fa2ff9ca89c6..d0fe9d5298b3b12acca40a64b3d29d393e915587 100644 (file)
@@ -20,9 +20,9 @@
 
 package org.sonar.server.issue;
 
-import com.google.common.base.Predicate;
-import com.google.common.base.Strings;
-import com.google.common.collect.Iterables;
+import java.util.Collection;
+import java.util.Map;
+
 import org.apache.commons.lang.StringUtils;
 import org.sonar.api.ServerSide;
 import org.sonar.api.issue.Issue;
@@ -31,8 +31,9 @@ import org.sonar.core.issue.workflow.IssueWorkflow;
 import org.sonar.core.issue.workflow.Transition;
 import org.sonar.server.user.UserSession;
 
-import java.util.Collection;
-import java.util.Map;
+import com.google.common.base.Predicate;
+import com.google.common.base.Strings;
+import com.google.common.collect.Iterables;
 
 @ServerSide
 public class TransitionAction extends Action {
@@ -40,10 +41,12 @@ public class TransitionAction extends Action {
   public static final String KEY = "do_transition";
 
   private final IssueWorkflow workflow;
+  private final UserSession userSession;
 
-  public TransitionAction(IssueWorkflow workflow) {
+  public TransitionAction(IssueWorkflow workflow, UserSession userSession) {
     super(KEY);
     this.workflow = workflow;
+    this.userSession = userSession;
   }
 
   @Override
@@ -64,7 +67,6 @@ public class TransitionAction extends Action {
 
   private boolean canExecuteTransition(Issue issue, final String transition) {
     final DefaultIssue defaultIssue = (DefaultIssue) issue;
-    final UserSession userSession = UserSession.get();
     return Iterables.find(workflow.outTransitions(issue), new Predicate<Transition>() {
       @Override
       public boolean apply(Transition input) {
index 1b6ef78b4d9ade3f98b676dd3390533cad341f6c..3b445c29c007d0a2eac95991ae0ab28345c6d63a 100644 (file)
@@ -21,6 +21,7 @@
 package org.sonar.server.issue.filter;
 
 import com.google.common.io.Resources;
+import java.util.List;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.RequestHandler;
 import org.sonar.api.server.ws.Response;
@@ -29,16 +30,16 @@ import org.sonar.api.utils.text.JsonWriter;
 import org.sonar.core.issue.db.IssueFilterDto;
 import org.sonar.server.user.UserSession;
 
-import java.util.List;
-
 public class AppAction implements RequestHandler {
 
   private final IssueFilterService service;
   private final IssueFilterWriter issueFilterWriter;
+  private final UserSession userSession;
 
-  public AppAction(IssueFilterService service, IssueFilterWriter issueFilterWriter) {
+  public AppAction(IssueFilterService service, IssueFilterWriter issueFilterWriter, UserSession userSession) {
     this.service = service;
     this.issueFilterWriter = issueFilterWriter;
+    this.userSession = userSession;
   }
 
   void define(WebService.NewController controller) {
@@ -55,8 +56,6 @@ public class AppAction implements RequestHandler {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession session = UserSession.get();
-
     JsonWriter json = response.newJsonWriter();
     json.beginObject();
 
@@ -64,21 +63,21 @@ public class AppAction implements RequestHandler {
     Integer filterId = request.paramAsInt("id");
     IssueFilterDto filter = null;
     if (filterId != null && filterId >= 0) {
-      filter = service.find((long) filterId, session);
+      filter = service.find((long) filterId, userSession);
     }
 
     // Permissions
-    json.prop("canManageFilters", session.isLoggedIn());
-    json.prop("canBulkChange", session.isLoggedIn());
+    json.prop("canManageFilters", userSession.isLoggedIn());
+    json.prop("canBulkChange", userSession.isLoggedIn());
 
     // Selected filter
     if (filter != null) {
-      issueFilterWriter.write(session, filter, json);
+      issueFilterWriter.write(userSession, filter, json);
     }
 
     // Favorite filters, if logged in
-    if (session.isLoggedIn()) {
-      List<IssueFilterDto> favorites = service.findFavoriteFilters(session);
+    if (userSession.isLoggedIn()) {
+      List<IssueFilterDto> favorites = service.findFavoriteFilters(userSession);
       json.name("favorites").beginArray();
       for (IssueFilterDto favorite : favorites) {
         json
index b68a7cae04ecf37cc726fbed2ca67193ab41dea6..5abdcd7b4703933820d9d9e9612cee992b985718 100644 (file)
@@ -31,9 +31,11 @@ import org.sonar.server.user.UserSession;
 public class FavoritesAction implements RequestHandler {
 
   private final IssueFilterService service;
+  private final UserSession userSession;
 
-  public FavoritesAction(IssueFilterService service) {
+  public FavoritesAction(IssueFilterService service, UserSession userSession) {
     this.service = service;
+    this.userSession = userSession;
   }
 
   void define(WebService.NewController controller) {
@@ -46,11 +48,10 @@ public class FavoritesAction implements RequestHandler {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession session = UserSession.get();
     JsonWriter json = response.newJsonWriter();
     json.beginObject().name("favoriteFilters").beginArray();
-    if (session.isLoggedIn()) {
-      for (IssueFilterDto favorite : service.findFavoriteFilters(session)) {
+    if (userSession.isLoggedIn()) {
+      for (IssueFilterDto favorite : service.findFavoriteFilters(userSession)) {
         json.beginObject();
         json.prop("id", favorite.getId());
         json.prop("name", favorite.getName());
index 6542f766a6bc37536b2637f0de96d1d9d07e5288..16c9b44a33c81f7e5f7f52deb2829e23a4f72b15 100644 (file)
@@ -33,10 +33,12 @@ public class ShowAction implements RequestHandler {
 
   private final IssueFilterService service;
   private final IssueFilterWriter issueFilterWriter;
+  private final UserSession userSession;
 
-  public ShowAction(IssueFilterService service, IssueFilterWriter issueFilterWriter) {
+  public ShowAction(IssueFilterService service, IssueFilterWriter issueFilterWriter, UserSession userSession) {
     this.service = service;
     this.issueFilterWriter = issueFilterWriter;
+    this.userSession = userSession;
   }
 
   void define(WebService.NewController controller) {
@@ -53,12 +55,11 @@ public class ShowAction implements RequestHandler {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession session = UserSession.get();
-    IssueFilterDto filter = service.find(request.mandatoryParamAsLong("id"), session);
+    IssueFilterDto filter = service.find(request.mandatoryParamAsLong("id"), userSession);
 
     JsonWriter json = response.newJsonWriter();
     json.beginObject();
-    issueFilterWriter.write(session, filter, json);
+    issueFilterWriter.write(userSession, filter, json);
     json.endObject();
     json.close();
   }
index 88a4ce27050ff367c7a9bdd01c0d5f98479dfd84..5a6930663a524c5aa41cdb0cc86493bdb4f02cb9 100644 (file)
@@ -26,6 +26,18 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.regex.Pattern;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
 import org.apache.commons.lang.BooleanUtils;
 import org.apache.commons.lang.StringUtils;
 import org.elasticsearch.action.search.SearchRequestBuilder;
@@ -70,20 +82,6 @@ import org.sonar.server.search.StickyFacetBuilder;
 import org.sonar.server.user.UserSession;
 import org.sonar.server.view.index.ViewIndexDefinition;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedSet;
-import java.util.regex.Pattern;
-
 import static com.google.common.collect.Lists.newArrayList;
 
 /**
@@ -136,11 +134,13 @@ public class IssueIndex extends BaseIndex {
 
   private final Sorting sorting;
   private final System2 system;
+  private final UserSession userSession;
 
-  public IssueIndex(EsClient client, System2 system) {
+  public IssueIndex(EsClient client, System2 system, UserSession userSession) {
     super(client);
 
     this.system = system;
+    this.userSession = userSession;
     this.sorting = new Sorting();
     this.sorting.add(IssueQuery.SORT_BY_ASSIGNEE, IssueIndexDefinition.FIELD_ISSUE_ASSIGNEE);
     this.sorting.add(IssueQuery.SORT_BY_STATUS, IssueIndexDefinition.FIELD_ISSUE_STATUS);
@@ -165,7 +165,7 @@ public class IssueIndex extends BaseIndex {
    */
   @CheckForNull
   public IssueDoc getNullableByKey(String key) {
-    SearchResult<IssueDoc> result = search(IssueQuery.builder().issueKeys(newArrayList(key)).build(), new SearchOptions());
+    SearchResult<IssueDoc> result = search(IssueQuery.builder(userSession).issueKeys(newArrayList(key)).build(), new SearchOptions());
     if (result.getTotal() == 1) {
       return result.getDocs().get(0);
     }
@@ -521,7 +521,7 @@ public class IssueIndex extends BaseIndex {
   }
 
   private void addAssignedToMeFacetIfNeeded(SearchRequestBuilder builder, SearchOptions options, IssueQuery query, Map<String, FilterBuilder> filters, QueryBuilder queryBuilder) {
-    String login = UserSession.get().login();
+    String login = userSession.login();
 
     if (!options.getFacets().contains(IssueFilterParameters.FACET_ASSIGNED_TO_ME) || StringUtils.isEmpty(login)) {
       return;
@@ -713,7 +713,7 @@ public class IssueIndex extends BaseIndex {
    */
   public Iterator<IssueDoc> selectIssuesForBatch(ComponentDto component) {
     BoolFilterBuilder filter = FilterBuilders.boolFilter()
-      .must(createAuthorizationFilter(true, UserSession.get().login(), UserSession.get().userGroups()))
+      .must(createAuthorizationFilter(true, userSession.login(), userSession.userGroups()))
       .mustNot(FilterBuilders.termsFilter(IssueIndexDefinition.FIELD_ISSUE_STATUS, Issue.STATUS_CLOSED));
 
     switch (component.scope()) {
index c2f6eb79ce4cdbfdc55aca1309ab543b72ff40dc..2db4b0b35efbb817d33fa27b57f39d9989b14ece 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.sonar.server.issue.ws;
 
+import java.util.List;
 import org.sonar.api.ServerSide;
 import org.sonar.api.issue.Issue;
 import org.sonar.api.issue.action.Action;
@@ -30,8 +31,6 @@ import org.sonar.server.issue.ActionService;
 import org.sonar.server.issue.IssueService;
 import org.sonar.server.user.UserSession;
 
-import java.util.List;
-
 import static com.google.common.collect.Lists.newArrayList;
 
 @ServerSide
@@ -39,15 +38,17 @@ public class IssueActionsWriter {
 
   private final IssueService issueService;
   private final ActionService actionService;
+  private final UserSession userSession;
 
-  public IssueActionsWriter(IssueService issueService, ActionService actionService) {
+  public IssueActionsWriter(IssueService issueService, ActionService actionService, UserSession userSession) {
     this.issueService = issueService;
     this.actionService = actionService;
+    this.userSession = userSession;
   }
 
   public void writeTransitions(Issue issue, JsonWriter json) {
     json.name("transitions").beginArray();
-    if (UserSession.get().isLoggedIn()) {
+    if (userSession.isLoggedIn()) {
       for (Transition transition : issueService.listTransitions(issue)) {
         json.value(transition.key());
       }
@@ -65,7 +66,7 @@ public class IssueActionsWriter {
 
   private List<String> actions(Issue issue) {
     List<String> actions = newArrayList();
-    String login = UserSession.get().login();
+    String login = userSession.login();
     if (login != null) {
       actions.add("comment");
       if (issue.resolution() == null) {
@@ -76,7 +77,7 @@ public class IssueActionsWriter {
         }
         actions.add("plan");
         String projectUuid = issue.projectUuid();
-        if (projectUuid != null && UserSession.get().hasProjectPermissionByUuid(UserRole.ISSUE_ADMIN, projectUuid)) {
+        if (projectUuid != null && userSession.hasProjectPermissionByUuid(UserRole.ISSUE_ADMIN, projectUuid)) {
           actions.add("set_severity");
         }
         for (Action action : actionService.listAvailableActions(issue)) {
index 1c0604c028307a29920d18913fb4c9207a112abf..3e0a84f26a60a75a6e8f10c80b7e907be323a33f 100644 (file)
 package org.sonar.server.issue.ws;
 
 import com.google.common.io.Resources;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
 import org.sonar.api.i18n.I18n;
 import org.sonar.api.issue.ActionPlan;
 import org.sonar.api.issue.Issue;
@@ -51,12 +56,6 @@ import org.sonar.server.rule.Rule;
 import org.sonar.server.rule.RuleService;
 import org.sonar.server.user.UserSession;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
 import static com.google.common.collect.Maps.newHashMap;
 
 public class IssueShowAction implements BaseIssuesWsAction {
@@ -75,10 +74,11 @@ public class IssueShowAction implements BaseIssuesWsAction {
   private final RuleService ruleService;
   private final I18n i18n;
   private final Durations durations;
+  private final UserSession userSession;
 
   public IssueShowAction(DbClient dbClient, IssueService issueService, IssueChangelogService issueChangelogService, IssueCommentService commentService,
-                         IssueActionsWriter actionsWriter, ActionPlanService actionPlanService, UserFinder userFinder, DebtModelService debtModel, RuleService ruleService,
-                         I18n i18n, Durations durations) {
+    IssueActionsWriter actionsWriter, ActionPlanService actionPlanService, UserFinder userFinder, DebtModelService debtModel, RuleService ruleService,
+    I18n i18n, Durations durations, UserSession userSession) {
     this.dbClient = dbClient;
     this.issueService = issueService;
     this.issueChangelogService = issueChangelogService;
@@ -90,6 +90,7 @@ public class IssueShowAction implements BaseIssuesWsAction {
     this.ruleService = ruleService;
     this.i18n = i18n;
     this.durations = durations;
+    this.userSession = userSession;
   }
 
   @Override
@@ -131,7 +132,7 @@ public class IssueShowAction implements BaseIssuesWsAction {
 
   private void writeIssue(DbSession session, Issue issue, JsonWriter json) {
     String actionPlanKey = issue.actionPlanKey();
-    ActionPlan actionPlan = actionPlanKey != null ? actionPlanService.findByKey(actionPlanKey, UserSession.get()) : null;
+    ActionPlan actionPlan = actionPlanKey == null ? null : actionPlanService.findByKey(actionPlanKey, userSession);
     Duration debt = issue.debt();
     Rule rule = ruleService.getNonNullByKey(issue.ruleKey());
     Date updateDate = issue.updateDate();
@@ -183,14 +184,14 @@ public class IssueShowAction implements BaseIssuesWsAction {
       .prop("componentEnabled", component.isEnabled())
       .prop("project", project.key())
       .prop("projectName", projectName)
-      //TODO replace subProject names by parentProject
+      // TODO replace subProject names by parentProject
       .prop("subProject", parentProjectKey)
       .prop("subProjectName", parentProjectName);
   }
 
   private void writeComments(Issue issue, JsonWriter json) {
     json.name("comments").beginArray();
-    String login = UserSession.get().login();
+    String login = userSession.login();
 
     Map<String, User> usersByLogin = newHashMap();
     List<DefaultIssueComment> comments = commentService.findComments(issue.key());
@@ -228,7 +229,7 @@ public class IssueShowAction implements BaseIssuesWsAction {
       .prop("creationDate", DateUtils.formatDateTime(issue.creationDate()))
       .prop("fCreationDate", formatDate(issue.creationDate()))
       .name("diffs").beginArray()
-      .value(i18n.message(UserSession.get().locale(), "created", null))
+      .value(i18n.message(userSession.locale(), "created", null))
       .endArray()
       .endObject();
 
@@ -263,7 +264,7 @@ public class IssueShowAction implements BaseIssuesWsAction {
   @CheckForNull
   private String formatDate(@Nullable Date date) {
     if (date != null) {
-      return i18n.formatDateTime(UserSession.get().locale(), date);
+      return i18n.formatDateTime(userSession.locale(), date);
     }
     return null;
   }
@@ -271,7 +272,7 @@ public class IssueShowAction implements BaseIssuesWsAction {
   @CheckForNull
   private String formatAgeDate(@Nullable Date date) {
     if (date != null) {
-      return i18n.ageFromNow(UserSession.get().locale(), date);
+      return i18n.ageFromNow(userSession.locale(), date);
     }
     return null;
   }
index dfaed56fa7faf92123fe2e54444efb115a3da1bb..87f867b01a84066f0a5d06d130b54fa8def881cd 100644 (file)
@@ -24,6 +24,16 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Sets;
 import com.google.common.io.Resources;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
 import org.apache.commons.lang.BooleanUtils;
 import org.sonar.api.i18n.I18n;
 import org.sonar.api.issue.ActionPlan;
@@ -60,18 +70,6 @@ import org.sonar.server.rule.Rule;
 import org.sonar.server.rule.RuleService;
 import org.sonar.server.user.UserSession;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Maps.newHashMap;
 import static com.google.common.collect.Sets.newHashSet;
@@ -101,9 +99,11 @@ public class SearchAction implements BaseIssuesWsAction {
   private final I18n i18n;
   private final Durations durations;
   private final Languages languages;
+  private final UserSession userSession;
 
   public SearchAction(DbClient dbClient, IssueService service, IssueActionsWriter actionsWriter, IssueQueryService issueQueryService,
-    RuleService ruleService, ActionPlanService actionPlanService, UserFinder userFinder, I18n i18n, Durations durations, Languages languages) {
+    RuleService ruleService, ActionPlanService actionPlanService, UserFinder userFinder, I18n i18n, Durations durations, Languages languages,
+    UserSession userSession) {
     this.dbClient = dbClient;
     this.service = service;
     this.actionsWriter = actionsWriter;
@@ -114,6 +114,7 @@ public class SearchAction implements BaseIssuesWsAction {
     this.i18n = i18n;
     this.durations = durations;
     this.languages = languages;
+    this.userSession = userSession;
   }
 
   @Override
@@ -341,7 +342,6 @@ public class SearchAction implements BaseIssuesWsAction {
 
     collectFacetsData(request, result, projectUuids, componentUuids, userLogins, actionPlanKeys);
 
-    UserSession userSession = UserSession.get();
     if (userSession.isLoggedIn()) {
       userLogins.add(userSession.login());
     }
@@ -418,7 +418,7 @@ public class SearchAction implements BaseIssuesWsAction {
       assignees.remove(IssueQueryService.LOGIN_MYSELF);
     }
     addMandatoryFacetValues(results, IssueFilterParameters.ASSIGNEES, assignees);
-    addMandatoryFacetValues(results, IssueFilterParameters.FACET_ASSIGNED_TO_ME, Arrays.asList(UserSession.get().login()));
+    addMandatoryFacetValues(results, IssueFilterParameters.FACET_ASSIGNED_TO_ME, Arrays.asList(userSession.login()));
     addMandatoryFacetValues(results, IssueFilterParameters.REPORTERS, request.paramAsStrings(IssueFilterParameters.REPORTERS));
     addMandatoryFacetValues(results, IssueFilterParameters.RULES, request.paramAsStrings(IssueFilterParameters.RULES));
     addMandatoryFacetValues(results, IssueFilterParameters.LANGUAGES, request.paramAsStrings(IssueFilterParameters.LANGUAGES));
@@ -574,7 +574,7 @@ public class SearchAction implements BaseIssuesWsAction {
   private void writeIssueComments(Collection<DefaultIssueComment> issueComments, Map<String, User> usersByLogin, JsonWriter json) {
     if (!issueComments.isEmpty()) {
       json.name("comments").beginArray();
-      String login = UserSession.get().login();
+      String login = userSession.login();
       for (IssueComment comment : issueComments) {
         String userLogin = comment.userLogin();
         User user = userLogin != null ? usersByLogin.get(userLogin) : null;
@@ -792,7 +792,7 @@ public class SearchAction implements BaseIssuesWsAction {
   @CheckForNull
   private String formatDate(@Nullable Date date) {
     if (date != null) {
-      return i18n.formatDateTime(UserSession.get().locale(), date);
+      return i18n.formatDateTime(userSession.locale(), date);
     }
     return null;
   }
@@ -800,7 +800,7 @@ public class SearchAction implements BaseIssuesWsAction {
   @CheckForNull
   private String formatAgeDate(@Nullable Date date) {
     if (date != null) {
-      return i18n.ageFromNow(UserSession.get().locale(), date);
+      return i18n.ageFromNow(userSession.locale(), date);
     }
     return null;
   }
index 2792a4fd033459792ae33b4493e24a32941fcd2f..edf1fa7fe795dcb8846075aa6dfb4f229c1d4b94 100644 (file)
 
 package org.sonar.server.permission;
 
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
+
 import org.sonar.api.ServerSide;
 import org.sonar.api.security.DefaultGroups;
 import org.sonar.api.web.UserRole;
@@ -36,12 +42,6 @@ import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.issue.index.IssueAuthorizationIndexer;
 import org.sonar.server.user.UserSession;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.util.List;
-import java.util.Map;
-
 /**
  * Used by ruby code <pre>Internal.permissions</pre>
  */
@@ -60,13 +60,15 @@ public class InternalPermissionService {
   private final PermissionFacade permissionFacade;
   private final PermissionFinder finder;
   private final IssueAuthorizationIndexer issueAuthorizationIndexer;
+  private final UserSession userSession;
 
   public InternalPermissionService(DbClient dbClient, PermissionFacade permissionFacade, PermissionFinder finder,
-    IssueAuthorizationIndexer issueAuthorizationIndexer) {
+    IssueAuthorizationIndexer issueAuthorizationIndexer, UserSession userSession) {
     this.dbClient = dbClient;
     this.permissionFacade = permissionFacade;
     this.finder = finder;
     this.issueAuthorizationIndexer = issueAuthorizationIndexer;
+    this.userSession = userSession;
   }
 
   public List<String> globalPermissions() {
@@ -118,7 +120,7 @@ public class InternalPermissionService {
   }
 
   public void applyDefaultPermissionTemplate(final String componentKey) {
-    UserSession.get().checkLoggedIn();
+    userSession.checkLoggedIn();
 
     DbSession session = dbClient.openSession(false);
     try {
@@ -127,7 +129,7 @@ public class InternalPermissionService {
       if (provisioned == null) {
         checkProjectAdminPermission(componentKey);
       } else {
-        UserSession.get().checkGlobalPermission(GlobalPermissions.PROVISIONING);
+        userSession.checkGlobalPermission(GlobalPermissions.PROVISIONING);
       }
       permissionFacade.grantDefaultRoles(session, component.getId(), component.qualifier());
       session.commit();
@@ -138,7 +140,7 @@ public class InternalPermissionService {
   }
 
   public void applyPermissionTemplate(Map<String, Object> params) {
-    UserSession.get().checkLoggedIn();
+    userSession.checkLoggedIn();
     ApplyPermissionTemplateQuery query = ApplyPermissionTemplateQuery.buildFromParams(params);
     applyPermissionTemplate(query);
   }
@@ -156,7 +158,7 @@ public class InternalPermissionService {
         checkProjectAdminPermission(query.getSelectedComponents().get(0));
       } else {
         checkProjectAdminPermission(null);
-        UserSession.get().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
+        userSession.checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
       }
 
       for (String componentKey : query.getSelectedComponents()) {
@@ -174,7 +176,7 @@ public class InternalPermissionService {
   }
 
   private void applyChange(Operation operation, PermissionChange change, DbSession session) {
-    UserSession.get().checkLoggedIn();
+    userSession.checkLoggedIn();
     change.validate();
     boolean changed;
     if (change.user() != null) {
@@ -268,9 +270,9 @@ public class InternalPermissionService {
 
   private void checkProjectAdminPermission(@Nullable String projectKey) {
     if (projectKey == null) {
-      UserSession.get().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
+      userSession.checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
     } else {
-      if (!UserSession.get().hasGlobalPermission(GlobalPermissions.SYSTEM_ADMIN) && !UserSession.get().hasProjectPermission(UserRole.ADMIN, projectKey)) {
+      if (!userSession.hasGlobalPermission(GlobalPermissions.SYSTEM_ADMIN) && !userSession.hasProjectPermission(UserRole.ADMIN, projectKey)) {
         throw new ForbiddenException("Insufficient privileges");
       }
     }
index e03268539509d102087d16315bd2754b3efeace5..db18e3846c8982d7e8a9e5ad13ea0aad002ca1cf 100644 (file)
@@ -32,7 +32,6 @@ import org.sonar.core.user.GroupDto;
 import org.sonar.core.user.UserDao;
 import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.exceptions.NotFoundException;
-import org.sonar.server.user.UserSession;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
@@ -41,6 +40,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
+import org.sonar.server.user.UserSession;
 
 /**
  * Used by ruby code <pre>Internal.permission_templates</pre>
@@ -52,12 +52,14 @@ public class InternalPermissionTemplateService {
   private final PermissionTemplateDao permissionTemplateDao;
   private final UserDao userDao;
   private final PermissionFinder finder;
+  private final UserSession userSession;
 
-  public InternalPermissionTemplateService(MyBatis myBatis, PermissionTemplateDao permissionTemplateDao, UserDao userDao, PermissionFinder finder) {
+  public InternalPermissionTemplateService(MyBatis myBatis, PermissionTemplateDao permissionTemplateDao, UserDao userDao, PermissionFinder finder, UserSession userSession) {
     this.myBatis = myBatis;
     this.permissionTemplateDao = permissionTemplateDao;
     this.userDao = userDao;
     this.finder = finder;
+    this.userSession = userSession;
   }
 
   public UserWithPermissionQueryResult findUsersWithPermissionTemplate(Map<String, Object> params) {
@@ -70,7 +72,7 @@ public class InternalPermissionTemplateService {
 
   @CheckForNull
   public PermissionTemplate selectPermissionTemplate(String templateKey) {
-    PermissionTemplateUpdater.checkSystemAdminUser();
+    PermissionTemplateUpdater.checkSystemAdminUser(userSession);
     PermissionTemplateDto permissionTemplateDto = permissionTemplateDao.selectPermissionTemplate(templateKey);
     return PermissionTemplate.create(permissionTemplateDto);
   }
@@ -80,7 +82,7 @@ public class InternalPermissionTemplateService {
   }
 
   public List<PermissionTemplate> selectAllPermissionTemplates(@Nullable String componentKey) {
-    PermissionTemplateUpdater.checkProjectAdminUser(componentKey);
+    PermissionTemplateUpdater.checkProjectAdminUser(componentKey, userSession);
     List<PermissionTemplate> permissionTemplates = Lists.newArrayList();
     List<PermissionTemplateDto> permissionTemplateDtos = permissionTemplateDao.selectAllPermissionTemplates();
     if (permissionTemplateDtos != null) {
@@ -92,7 +94,7 @@ public class InternalPermissionTemplateService {
   }
 
   public PermissionTemplate createPermissionTemplate(String name, @Nullable String description, @Nullable String keyPattern) {
-    PermissionTemplateUpdater.checkSystemAdminUser();
+    PermissionTemplateUpdater.checkSystemAdminUser(userSession);
     validateTemplateName(null, name);
     validateKeyPattern(keyPattern);
     PermissionTemplateDto permissionTemplateDto = permissionTemplateDao.createPermissionTemplate(name, description, keyPattern);
@@ -100,19 +102,19 @@ public class InternalPermissionTemplateService {
   }
 
   public void updatePermissionTemplate(Long templateId, String newName, @Nullable String newDescription, @Nullable String newKeyPattern) {
-    PermissionTemplateUpdater.checkSystemAdminUser();
+    PermissionTemplateUpdater.checkSystemAdminUser(userSession);
     validateTemplateName(templateId, newName);
     validateKeyPattern(newKeyPattern);
     permissionTemplateDao.updatePermissionTemplate(templateId, newName, newDescription, newKeyPattern);
   }
 
   public void deletePermissionTemplate(Long templateId) {
-    PermissionTemplateUpdater.checkSystemAdminUser();
+    PermissionTemplateUpdater.checkSystemAdminUser(userSession);
     permissionTemplateDao.deletePermissionTemplate(templateId);
   }
 
   public void addUserPermission(String templateKey, String permission, String userLogin) {
-    PermissionTemplateUpdater updater = new PermissionTemplateUpdater(templateKey, permission, userLogin, permissionTemplateDao, userDao) {
+    PermissionTemplateUpdater updater = new PermissionTemplateUpdater(templateKey, permission, userLogin, permissionTemplateDao, userDao, userSession) {
       @Override
       protected void doExecute(Long templateId, String permission) {
         Long userId = getUserId();
@@ -123,7 +125,7 @@ public class InternalPermissionTemplateService {
   }
 
   public void removeUserPermission(String templateKey, String permission, String userLogin) {
-    PermissionTemplateUpdater updater = new PermissionTemplateUpdater(templateKey, permission, userLogin, permissionTemplateDao, userDao) {
+    PermissionTemplateUpdater updater = new PermissionTemplateUpdater(templateKey, permission, userLogin, permissionTemplateDao, userDao, userSession) {
       @Override
       protected void doExecute(Long templateId, String permission) {
         Long userId = getUserId();
@@ -134,7 +136,7 @@ public class InternalPermissionTemplateService {
   }
 
   public void addGroupPermission(String templateKey, String permission, String groupName) {
-    PermissionTemplateUpdater updater = new PermissionTemplateUpdater(templateKey, permission, groupName, permissionTemplateDao, userDao) {
+    PermissionTemplateUpdater updater = new PermissionTemplateUpdater(templateKey, permission, groupName, permissionTemplateDao, userDao, userSession) {
       @Override
       protected void doExecute(Long templateId, String permission) {
         Long groupId = getGroupId();
@@ -145,7 +147,7 @@ public class InternalPermissionTemplateService {
   }
 
   public void removeGroupPermission(String templateKey, String permission, String groupName) {
-    PermissionTemplateUpdater updater = new PermissionTemplateUpdater(templateKey, permission, groupName, permissionTemplateDao, userDao) {
+    PermissionTemplateUpdater updater = new PermissionTemplateUpdater(templateKey, permission, groupName, permissionTemplateDao, userDao, userSession) {
       @Override
       protected void doExecute(Long templateId, String permission) {
         Long groupId = getGroupId();
@@ -156,7 +158,7 @@ public class InternalPermissionTemplateService {
   }
 
   public void removeGroupFromTemplates(String groupName) {
-    UserSession.get().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
+    userSession.checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
     DbSession session = myBatis.openSession(false);
     try {
       GroupDto group = userDao.selectGroupByName(groupName, session);
index 59ec165c377b61b4c5003be16e9cc618adff44ca..7869b35d13a6741bb394b670c1b1a1e3aeb1f2c6 100644 (file)
@@ -42,17 +42,19 @@ abstract class PermissionTemplateUpdater {
   private final String updatedReference;
   private final PermissionTemplateDao permissionTemplateDao;
   private final UserDao userDao;
+  private final UserSession userSession;
 
-  PermissionTemplateUpdater(String templateKey, String permission, String updatedReference, PermissionTemplateDao permissionTemplateDao, UserDao userDao) {
+  PermissionTemplateUpdater(String templateKey, String permission, String updatedReference, PermissionTemplateDao permissionTemplateDao, UserDao userDao, UserSession userSession) {
     this.templateKey = templateKey;
     this.permission = permission;
     this.updatedReference = updatedReference;
     this.permissionTemplateDao = permissionTemplateDao;
     this.userDao = userDao;
+    this.userSession = userSession;
   }
 
   void executeUpdate() {
-    checkSystemAdminUser();
+    checkSystemAdminUser(userSession);
     Long templateId = getTemplateId(templateKey);
     validatePermission(permission);
     doExecute(templateId, permission);
@@ -79,19 +81,16 @@ abstract class PermissionTemplateUpdater {
     return groupDto.getId();
   }
 
-  static void checkSystemAdminUser() {
-    checkProjectAdminUser(null);
+  static void checkSystemAdminUser(UserSession userSession) {
+    checkProjectAdminUser(null, userSession);
   }
 
-  static void checkProjectAdminUser(@Nullable String componentKey) {
-    UserSession currentSession = UserSession.get();
-    currentSession.checkLoggedIn();
+  static void checkProjectAdminUser(@Nullable String componentKey, UserSession userSession) {
+    userSession.checkLoggedIn();
     if (componentKey == null) {
-      currentSession.checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
-    } else {
-      if (!currentSession.hasGlobalPermission(GlobalPermissions.SYSTEM_ADMIN) && !currentSession.hasProjectPermission(UserRole.ADMIN, componentKey)) {
-        throw new ForbiddenException("Insufficient privileges");
-      }
+      userSession.checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
+    } else if (!userSession.hasGlobalPermission(GlobalPermissions.SYSTEM_ADMIN) && !userSession.hasProjectPermission(UserRole.ADMIN, componentKey)) {
+      throw new ForbiddenException("Insufficient privileges");
     }
   }
 
index 4fb3c1fbf8adaa5a86913154c66fb002f8c89117..4f1c92c55a7ae5fb8fbdfd43455bdd9ee377076c 100644 (file)
  */
 package org.sonar.server.platform;
 
-import com.google.common.collect.Lists;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Properties;
+
+import javax.annotation.Nullable;
+
 import org.sonar.api.config.EmailSettings;
 import org.sonar.api.issue.action.Actions;
 import org.sonar.api.profiles.AnnotationProfileParser;
@@ -373,6 +379,7 @@ import org.sonar.server.user.GroupMembershipFinder;
 import org.sonar.server.user.GroupMembershipService;
 import org.sonar.server.user.NewUserNotifier;
 import org.sonar.server.user.SecurityRealmFactory;
+import org.sonar.server.user.ThreadLocalUserSession;
 import org.sonar.server.user.UserUpdater;
 import org.sonar.server.user.db.GroupDao;
 import org.sonar.server.user.db.UserDao;
@@ -396,12 +403,7 @@ import org.sonar.server.view.index.ViewIndexer;
 import org.sonar.server.ws.ListingWs;
 import org.sonar.server.ws.WebServiceEngine;
 
-import javax.annotation.Nullable;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Properties;
+import com.google.common.collect.Lists;
 
 class ServerComponents {
 
@@ -445,6 +447,9 @@ class ServerComponents {
       // rack bridges
       PlatformRackBridge.class,
 
+      // user session
+      ThreadLocalUserSession.class,
+
       // DB
       DbClient.class,
 
@@ -1016,7 +1021,7 @@ class ServerComponents {
     startupContainer.addSingleton(RegisterIssueFilters.class);
     startupContainer.addSingleton(RenameIssueWidgets.class);
 
-    DoPrivileged.execute(new DoPrivileged.Task() {
+    DoPrivileged.execute(new DoPrivileged.Task(startupContainer.getComponentByType(ThreadLocalUserSession.class)) {
       @Override
       protected void doPrivileged() {
         startupContainer.getComponentByType(IndexSynchronizer.class).executeDeprecated();
index 5d75175186a38ff850cc7c478a20a9284cbb4c9d..805e319f5e9bdfa3cd5e90ec19e8d9d868b6f343 100644 (file)
  */
 package org.sonar.server.platform.ws;
 
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.util.Date;
+import java.util.Locale;
 import org.apache.commons.lang.LocaleUtils;
 import org.sonar.api.platform.Server;
 import org.sonar.api.server.ws.Request;
@@ -29,19 +33,16 @@ import org.sonar.api.utils.text.JsonWriter;
 import org.sonar.core.i18n.DefaultI18n;
 import org.sonar.server.user.UserSession;
 
-import java.io.IOException;
-import java.net.HttpURLConnection;
-import java.util.Date;
-import java.util.Locale;
-
 public class L10nWs implements WebService {
 
   private final DefaultI18n i18n;
   private final Server server;
+  private final UserSession userSession;
 
-  public L10nWs(DefaultI18n i18n, Server server) {
+  public L10nWs(DefaultI18n i18n, Server server, UserSession userSession) {
     this.i18n = i18n;
     this.server = server;
+    this.userSession = userSession;
   }
 
   @Override
@@ -74,7 +75,7 @@ public class L10nWs implements WebService {
       response.stream().setStatus(HttpURLConnection.HTTP_NOT_MODIFIED).output().close();
     } else {
 
-      Locale locale = UserSession.get().locale();
+      Locale locale = userSession.locale();
       String localeParam = request.param("locale");
       if (localeParam != null) {
         locale = LocaleUtils.toLocale(localeParam);
index 6368101a8b4865cd2bfac3fb192caea21ab266d3..a90d17112acd4bcfa307297eb9418adb957330f3 100644 (file)
@@ -21,7 +21,6 @@
 package org.sonar.server.platform.ws;
 
 import java.util.Map;
-
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.Response;
 import org.sonar.api.server.ws.WebService;
@@ -36,8 +35,10 @@ import org.sonar.server.user.UserSession;
 public class SystemInfoWsAction implements SystemWsAction {
 
   private final Monitor[] monitors;
+  private final UserSession userSession;
 
-  public SystemInfoWsAction(Monitor... monitors) {
+  public SystemInfoWsAction(UserSession userSession, Monitor... monitors) {
+    this.userSession = userSession;
     this.monitors = monitors;
   }
 
@@ -54,7 +55,7 @@ public class SystemInfoWsAction implements SystemWsAction {
 
   @Override
   public void handle(Request request, Response response) {
-    UserSession.get().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
+    userSession.checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
     JsonWriter json = response.newJsonWriter();
     writeJson(json);
     json.close();
index 3899e50985de436f9b9678dd7b497ad8780a0e4b..1812db270958df6a0405419d4ecd408c5b4a0293 100644 (file)
@@ -31,10 +31,12 @@ public class CancelAllPluginsWsAction implements PluginsWsAction {
 
   private final PluginDownloader pluginDownloader;
   private final ServerPluginRepository pluginRepository;
+  private final UserSession userSession;
 
-  public CancelAllPluginsWsAction(PluginDownloader pluginDownloader, ServerPluginRepository pluginRepository) {
+  public CancelAllPluginsWsAction(PluginDownloader pluginDownloader, ServerPluginRepository pluginRepository, UserSession userSession) {
     this.pluginDownloader = pluginDownloader;
     this.pluginRepository = pluginRepository;
+    this.userSession = userSession;
   }
 
   @Override
@@ -49,7 +51,7 @@ public class CancelAllPluginsWsAction implements PluginsWsAction {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession.get().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
+    userSession.checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
 
     pluginDownloader.cancelDownloads();
     pluginRepository.cancelUninstalls();
index c31ac557b903f759bdff9fbdae6348887a39e2dd..3a55f4a3140de4bdba5d1341feb6dd3f6ab65320 100644 (file)
@@ -43,11 +43,13 @@ public class InstallPluginsWsAction implements PluginsWsAction {
 
   private final UpdateCenterMatrixFactory updateCenterFactory;
   private final PluginDownloader pluginDownloader;
+  private final UserSession userSession;
 
   public InstallPluginsWsAction(UpdateCenterMatrixFactory updateCenterFactory,
-    PluginDownloader pluginDownloader) {
+                                PluginDownloader pluginDownloader, UserSession userSession) {
     this.updateCenterFactory = updateCenterFactory;
     this.pluginDownloader = pluginDownloader;
+    this.userSession = userSession;
   }
 
   @Override
@@ -67,7 +69,7 @@ public class InstallPluginsWsAction implements PluginsWsAction {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession.get().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
+    userSession.checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
     String key = request.mandatoryParam(PARAM_KEY);
     PluginUpdate pluginUpdate = findAvailablePluginByKey(key);
     pluginDownloader.download(key, pluginUpdate.getRelease().getVersion());
index 1c8f2dcfe07606491b7d0ebd06cdc3a65516c45f..a4583e35b641bfc361db101a44130cba7ff70900 100644 (file)
@@ -35,9 +35,11 @@ public class UninstallPluginsWsAction implements PluginsWsAction {
   private static final String PARAM_KEY = "key";
 
   private final ServerPluginRepository pluginRepository;
+  private final UserSession userSession;
 
-  public UninstallPluginsWsAction(ServerPluginRepository pluginRepository) {
+  public UninstallPluginsWsAction(ServerPluginRepository pluginRepository, UserSession userSession) {
     this.pluginRepository = pluginRepository;
+    this.userSession = userSession;
   }
 
   @Override
@@ -56,7 +58,7 @@ public class UninstallPluginsWsAction implements PluginsWsAction {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession.get().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
+    userSession.checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
     String key = request.mandatoryParam(PARAM_KEY);
     ensurePluginIsInstalled(key);
     pluginRepository.uninstall(key);
index af79a9bef1f13c0b424283040be0aedbdf9a6943..37382736ed93dff1478bef0cf3f6069533bfc63b 100644 (file)
@@ -44,10 +44,12 @@ public class UpdatePluginsWsAction implements PluginsWsAction {
 
   private final UpdateCenterMatrixFactory updateCenterFactory;
   private final PluginDownloader pluginDownloader;
+  private final UserSession userSession;
 
-  public UpdatePluginsWsAction(UpdateCenterMatrixFactory updateCenterFactory, PluginDownloader pluginDownloader) {
+  public UpdatePluginsWsAction(UpdateCenterMatrixFactory updateCenterFactory, PluginDownloader pluginDownloader, UserSession userSession) {
     this.updateCenterFactory = updateCenterFactory;
     this.pluginDownloader = pluginDownloader;
+    this.userSession = userSession;
   }
 
   @Override
@@ -68,7 +70,7 @@ public class UpdatePluginsWsAction implements PluginsWsAction {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession.get().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
+    userSession.checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
     String key = request.mandatoryParam(PARAM_KEY);
     PluginUpdate pluginUpdate = findPluginUpdateByKey(key);
     pluginDownloader.download(key, pluginUpdate.getRelease().getVersion());
index 5abcc46a1f30c06dc2e400aa04f93b6d8fcac24d..fe9015d3c1a2bd4da06b9859fd1902364579096a 100644 (file)
  */
 package org.sonar.server.qualitygate;
 
-import com.google.common.base.Predicate;
-import com.google.common.base.Strings;
-import com.google.common.collect.Collections2;
+import java.util.Collection;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
+
 import org.apache.commons.lang.BooleanUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.ibatis.session.SqlSession;
@@ -41,14 +43,18 @@ import org.sonar.core.qualitygate.db.QualityGateConditionDto;
 import org.sonar.core.qualitygate.db.QualityGateDao;
 import org.sonar.core.qualitygate.db.QualityGateDto;
 import org.sonar.server.component.db.ComponentDao;
-import org.sonar.server.exceptions.*;
+import org.sonar.server.exceptions.BadRequestException;
+import org.sonar.server.exceptions.Errors;
+import org.sonar.server.exceptions.ForbiddenException;
+import org.sonar.server.exceptions.Message;
+import org.sonar.server.exceptions.NotFoundException;
+import org.sonar.server.exceptions.ServerException;
 import org.sonar.server.user.UserSession;
 import org.sonar.server.util.Validation;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.util.Collection;
+import com.google.common.base.Predicate;
+import com.google.common.base.Strings;
+import com.google.common.collect.Collections2;
 
 /**
  * @since 4.3
@@ -58,29 +64,26 @@ public class QualityGates {
   public static final String SONAR_QUALITYGATE_PROPERTY = "sonar.qualitygate";
 
   private final QualityGateDao dao;
-
   private final QualityGateConditionDao conditionDao;
-
   private final MetricFinder metricFinder;
-
   private final PropertiesDao propertiesDao;
-
   private final ComponentDao componentDao;
-
   private final MyBatis myBatis;
+  private final UserSession userSession;
 
   public QualityGates(QualityGateDao dao, QualityGateConditionDao conditionDao, MetricFinder metricFinder, PropertiesDao propertiesDao, ComponentDao componentDao,
-    MyBatis myBatis) {
+    MyBatis myBatis, UserSession userSession) {
     this.dao = dao;
     this.conditionDao = conditionDao;
     this.metricFinder = metricFinder;
     this.propertiesDao = propertiesDao;
     this.componentDao = componentDao;
     this.myBatis = myBatis;
+    this.userSession = userSession;
   }
 
   public QualityGateDto create(String name) {
-    checkPermission(UserSession.get());
+    checkPermission();
     validateQualityGate(null, name);
     QualityGateDto newQualityGate = new QualityGateDto().setName(name);
     dao.insert(newQualityGate);
@@ -96,7 +99,7 @@ public class QualityGates {
   }
 
   public QualityGateDto rename(long idToRename, String name) {
-    checkPermission(UserSession.get());
+    checkPermission();
     QualityGateDto toRename = getNonNullQgate(idToRename);
     validateQualityGate(idToRename, name);
     toRename.setName(name);
@@ -105,7 +108,7 @@ public class QualityGates {
   }
 
   public QualityGateDto copy(long sourceId, String destinationName) {
-    checkPermission(UserSession.get());
+    checkPermission();
     getNonNullQgate(sourceId);
     validateQualityGate(null, destinationName);
     QualityGateDto destinationGate = new QualityGateDto().setName(destinationName);
@@ -131,7 +134,7 @@ public class QualityGates {
   }
 
   public void delete(long idToDelete) {
-    checkPermission(UserSession.get());
+    checkPermission();
     QualityGateDto qGate = getNonNullQgate(idToDelete);
     SqlSession session = myBatis.openSession(false);
     try {
@@ -147,7 +150,7 @@ public class QualityGates {
   }
 
   public void setDefault(@Nullable Long idToUseAsDefault) {
-    checkPermission(UserSession.get());
+    checkPermission();
     if (idToUseAsDefault == null) {
       propertiesDao.deleteGlobalProperty(SONAR_QUALITYGATE_PROPERTY);
     } else {
@@ -168,7 +171,7 @@ public class QualityGates {
 
   public QualityGateConditionDto createCondition(long qGateId, String metricKey, String operator,
     @Nullable String warningThreshold, @Nullable String errorThreshold, @Nullable Integer period) {
-    checkPermission(UserSession.get());
+    checkPermission();
     getNonNullQgate(qGateId);
     Metric metric = getNonNullMetric(metricKey);
     validateCondition(metric, operator, warningThreshold, errorThreshold, period);
@@ -181,7 +184,7 @@ public class QualityGates {
 
   public QualityGateConditionDto updateCondition(long condId, String metricKey, String operator,
     @Nullable String warningThreshold, @Nullable String errorThreshold, @Nullable Integer period) {
-    checkPermission(UserSession.get());
+    checkPermission();
     QualityGateConditionDto condition = getNonNullCondition(condId);
     Metric metric = getNonNullMetric(metricKey);
     validateCondition(metric, operator, warningThreshold, errorThreshold, period);
@@ -204,7 +207,7 @@ public class QualityGates {
   }
 
   public void deleteCondition(Long condId) {
-    checkPermission(UserSession.get());
+    checkPermission();
     conditionDao.delete(getNonNullCondition(condId));
   }
 
@@ -212,7 +215,7 @@ public class QualityGates {
     DbSession session = myBatis.openSession(false);
     try {
       getNonNullQgate(qGateId);
-      checkPermission(UserSession.get(), projectId, session);
+      checkPermission(projectId, session);
       propertiesDao.setProperty(new PropertyDto().setKey(SONAR_QUALITYGATE_PROPERTY).setResourceId(projectId).setValue(qGateId.toString()));
     } finally {
       MyBatis.closeQuietly(session);
@@ -223,7 +226,7 @@ public class QualityGates {
     DbSession session = myBatis.openSession(false);
     try {
       getNonNullQgate(qGateId);
-      checkPermission(UserSession.get(), projectId, session);
+      checkPermission(projectId, session);
       propertiesDao.deleteProjectProperty(SONAR_QUALITYGATE_PROPERTY, projectId);
     } finally {
       MyBatis.closeQuietly(session);
@@ -242,7 +245,7 @@ public class QualityGates {
   public boolean currentUserHasWritePermission() {
     boolean hasWritePermission = false;
     try {
-      checkPermission(UserSession.get());
+      checkPermission();
       hasWritePermission = true;
     } catch (ServerException unallowed) {
       // Ignored
@@ -355,11 +358,11 @@ public class QualityGates {
 
   }
 
-  private void checkPermission(UserSession userSession) {
+  private void checkPermission() {
     userSession.checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
   }
 
-  private void checkPermission(UserSession userSession, Long projectId, DbSession session) {
+  private void checkPermission(Long projectId, DbSession session) {
     ComponentDto project = componentDao.getById(projectId, session);
     if (!userSession.hasGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN) && !userSession.hasProjectPermission(UserRole.ADMIN, project.key())) {
       throw new ForbiddenException("Insufficient privileges");
index 63cf0b7d5b078ea84336a9c109e063f62a35197e..6670519ec30a5a627ee247a40c238ac974af4807 100644 (file)
@@ -41,16 +41,19 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import org.sonar.server.user.UserSession;
 
 @ServerSide
 public class QProfileLoader {
 
   private final DbClient db;
   private final IndexClient index;
+  private final UserSession userSession;
 
-  public QProfileLoader(DbClient db, IndexClient index) {
+  public QProfileLoader(DbClient db, IndexClient index, UserSession userSession) {
     this.db = db;
     this.index = index;
+    this.userSession = userSession;
   }
 
   /**
@@ -129,7 +132,7 @@ public class QProfileLoader {
         .setQProfileKey(key)
         .setActivation(true)
         .setStatuses(Lists.newArrayList(RuleStatus.DEPRECATED)),
-      new QueryContext().setLimit(0)).getTotal();
+      new QueryContext(userSession).setLimit(0)).getTotal();
   }
 
 }
index f3dabcd25eb8eadd91d059eb38801d3033f2253a..31b4ca2c40024d13846e4d0042e793d71d5a0d31 100644 (file)
 
 package org.sonar.server.qualityprofile;
 
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.CheckForNull;
+
 import org.sonar.api.ServerSide;
 import org.sonar.api.component.Component;
 import org.sonar.api.web.UserRole;
@@ -31,19 +35,18 @@ import org.sonar.core.qualityprofile.db.QualityProfileDto;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.user.UserSession;
 
-import javax.annotation.CheckForNull;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 
 @ServerSide
 public class QProfileProjectLookup {
 
   private final DbClient db;
+  private final UserSession userSession;
 
-  public QProfileProjectLookup(DbClient db) {
+  public QProfileProjectLookup(DbClient db, UserSession userSession) {
     this.db = db;
+    this.userSession = userSession;
   }
 
   public List<Component> projects(int profileId) {
@@ -56,7 +59,6 @@ public class QProfileProjectLookup {
         componentsByKeys.put(component.key(), component);
       }
 
-      UserSession userSession = UserSession.get();
       List<Component> result = Lists.newArrayList();
       Collection<String> authorizedProjectKeys = db.authorizationDao().selectAuthorizedRootProjectsKeys(userSession.userId(), UserRole.USER);
       for (Map.Entry<String, Component> entry : componentsByKeys.entrySet()) {
index 383b07a32f85c1cdd7e1dc5085a005d95d4bb00c..98e708ec3f1e786bf29f233f03677120e088aab0 100644 (file)
  */
 package org.sonar.server.qualityprofile;
 
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
+
 import org.elasticsearch.action.search.SearchResponse;
 import org.elasticsearch.search.SearchHit;
 import org.sonar.api.ServerSide;
@@ -35,17 +46,6 @@ import org.sonar.server.rule.index.RuleQuery;
 import org.sonar.server.search.Result;
 import org.sonar.server.user.UserSession;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
 @ServerSide
 public class QProfileService {
 
@@ -57,9 +57,11 @@ public class QProfileService {
   private final QProfileCopier copier;
   private final QProfileReset reset;
   private final QProfileExporters exporters;
+  private final UserSession userSession;
 
   public QProfileService(DbClient db, ActivityIndex activityIndex, RuleActivator ruleActivator, QProfileFactory factory,
-    QProfileBackuper backuper, QProfileCopier copier, QProfileReset reset, QProfileExporters exporters) {
+    QProfileBackuper backuper, QProfileCopier copier, QProfileReset reset, QProfileExporters exporters,
+    UserSession userSession) {
     this.db = db;
     this.activityIndex = activityIndex;
     this.ruleActivator = ruleActivator;
@@ -68,6 +70,7 @@ public class QProfileService {
     this.copier = copier;
     this.reset = reset;
     this.exporters = exporters;
+    this.userSession = userSession;
   }
 
   public QProfileResult create(QProfileName name, @Nullable Map<String, String> xmlQProfilesByPlugin) {
@@ -207,8 +210,8 @@ public class QProfileService {
   }
 
   private void verifyAdminPermission() {
-    UserSession.get().checkLoggedIn();
-    UserSession.get().checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSession.checkLoggedIn();
+    userSession.checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
   }
 
   public Result<QProfileActivity> searchActivities(QProfileActivityQuery query, SearchOptions options) {
index e716783bbaa0843241445da274fbd0941e8410f6..e1fd4bf770c29048a2d275b62665085638663609 100644 (file)
 
 package org.sonar.server.qualityprofile;
 
-import com.google.common.base.Strings;
+import java.util.List;
+
+import javax.annotation.CheckForNull;
+
 import org.sonar.api.ServerSide;
 import org.sonar.api.component.Component;
 import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.user.UserSession;
 import org.sonar.server.util.Validation;
 
-import javax.annotation.CheckForNull;
-
-import java.util.List;
+import com.google.common.base.Strings;
 
 /**
  * Use {@link org.sonar.server.qualityprofile.QProfileService} instead
@@ -43,12 +44,14 @@ public class QProfiles {
   private final QProfileProjectOperations projectOperations;
   private final QProfileProjectLookup projectLookup;
   private final QProfileLookup profileLookup;
+  private final UserSession userSession;
 
   public QProfiles(QProfileProjectOperations projectOperations, QProfileProjectLookup projectLookup,
-    QProfileLookup profileLookup) {
+    QProfileLookup profileLookup, UserSession userSession) {
     this.projectOperations = projectOperations;
     this.projectLookup = projectLookup;
     this.profileLookup = profileLookup;
+    this.userSession = userSession;
   }
 
   public List<QProfile> allProfiles() {
@@ -103,19 +106,19 @@ public class QProfiles {
   }
 
   public void addProject(String profileKey, String projectUuid) {
-    projectOperations.addProject(profileKey, projectUuid, UserSession.get());
+    projectOperations.addProject(profileKey, projectUuid, userSession);
   }
 
   public void removeProject(String profileKey, String projectUuid) {
-    projectOperations.removeProject(profileKey, projectUuid, UserSession.get());
+    projectOperations.removeProject(profileKey, projectUuid, userSession);
   }
 
   public void removeProjectByLanguage(String language, long projectId) {
-    projectOperations.removeProject(language, projectId, UserSession.get());
+    projectOperations.removeProject(language, projectId, userSession);
   }
 
   public void removeAllProjects(String profileKey) {
-    projectOperations.removeAllProjects(profileKey, UserSession.get());
+    projectOperations.removeAllProjects(profileKey, userSession);
   }
 
   private void checkProfileNameParam(String name) {
index 76587e1d9dd4c8c5e1e58d8adba3cea1af9effe3..9a3d490f778fbc279348864abbb392bc90970c55 100644 (file)
@@ -41,6 +41,7 @@ import org.sonar.server.rule.index.RuleQuery;
 import org.sonar.server.search.IndexClient;
 import org.sonar.server.search.QueryContext;
 import org.sonar.server.search.Result;
+import org.sonar.server.user.UserSession;
 import org.sonar.server.util.TypeValidations;
 
 import javax.annotation.CheckForNull;
@@ -64,15 +65,17 @@ public class RuleActivator {
   private final RuleActivatorContextFactory contextFactory;
   private final IndexClient index;
   private final ActivityService activityService;
+  private final UserSession userSession;
 
   public RuleActivator(DbClient db, IndexClient index,
     RuleActivatorContextFactory contextFactory, TypeValidations typeValidations,
-    ActivityService activityService) {
+    ActivityService activityService, UserSession userSession) {
     this.db = db;
     this.index = index;
     this.contextFactory = contextFactory;
     this.typeValidations = typeValidations;
     this.activityService = activityService;
+    this.userSession = userSession;
   }
 
   public List<ActiveRuleChange> activate(DbSession dbSession, RuleActivation activation, String profileKey) {
@@ -393,7 +396,7 @@ public class RuleActivator {
     RuleIndex ruleIndex = index.get(RuleIndex.class);
     DbSession dbSession = db.openSession(false);
     try {
-      Result<Rule> ruleSearchResult = ruleIndex.search(ruleQuery, new QueryContext().setScroll(true)
+      Result<Rule> ruleSearchResult = ruleIndex.search(ruleQuery, new QueryContext(userSession).setScroll(true)
         .setFieldsToReturn(Arrays.asList(RuleNormalizer.RuleField.KEY.field())));
       Iterator<Rule> rules = ruleSearchResult.scroll();
       while (rules.hasNext()) {
@@ -425,7 +428,7 @@ public class RuleActivator {
     try {
       RuleIndex ruleIndex = index.get(RuleIndex.class);
       BulkChangeResult result = new BulkChangeResult();
-      Result<Rule> ruleSearchResult = ruleIndex.search(ruleQuery, new QueryContext().setScroll(true)
+      Result<Rule> ruleSearchResult = ruleIndex.search(ruleQuery, new QueryContext(userSession).setScroll(true)
         .setFieldsToReturn(Arrays.asList(RuleNormalizer.RuleField.KEY.field())));
       Iterator<Rule> rules = ruleSearchResult.scroll();
       while (rules.hasNext()) {
index 9c57e6171892fab484fe5d4a7e99b36be06c40a7..3887cdf6b3d68a00555776a408b286ef01c06b17 100644 (file)
@@ -45,11 +45,13 @@ public class BulkRuleActivationActions {
   private final QProfileService profileService;
   private final RuleService ruleService;
   private final I18n i18n;
+  private final UserSession userSession;
 
-  public BulkRuleActivationActions(QProfileService profileService, RuleService ruleService, I18n i18n) {
+  public BulkRuleActivationActions(QProfileService profileService, RuleService ruleService, I18n i18n, UserSession userSession) {
     this.profileService = profileService;
     this.ruleService = ruleService;
     this.i18n = i18n;
+    this.userSession = userSession;
   }
 
   void define(WebService.NewController controller) {
@@ -121,7 +123,7 @@ public class BulkRuleActivationActions {
     JsonWriter json = response.newJsonWriter().beginObject();
     json.prop("succeeded", result.countSucceeded());
     json.prop("failed", result.countFailed());
-    result.getErrors().writeJsonAsWarnings(json, i18n, UserSession.get().locale());
+    result.getErrors().writeJsonAsWarnings(json, i18n, userSession.locale());
     json.endObject().close();
   }
 }
index 13e7bb88f0bdfa0637b6bc1f54d9a23b15e11e79..c058ce9c8f0a47aeb8ae2724ddf7f536c0bfa6cb 100644 (file)
@@ -49,19 +49,21 @@ public class ProjectAssociationActions {
   private final QProfileLookup profileLookup;
   private final ComponentService componentService;
   private final Languages languages;
+  private final UserSession userSession;
 
-  public ProjectAssociationActions(QProfileProjectOperations profileProjectOperations, QProfileLookup profileLookup, ComponentService componentService, Languages languages) {
+  public ProjectAssociationActions(QProfileProjectOperations profileProjectOperations, QProfileLookup profileLookup, ComponentService componentService, Languages languages, UserSession userSession) {
     this.profileProjectOperations = profileProjectOperations;
     this.profileLookup = profileLookup;
     this.componentService = componentService;
     this.languages = languages;
+    this.userSession = userSession;
   }
 
   void define(WebService.NewController controller) {
     NewAction addProject = controller.createAction("add_project")
       .setSince("5.2")
       .setDescription("Associate a project with a quality profile.")
-      .setHandler(new AssociationHandler(profileLookup, componentService) {
+      .setHandler(new AssociationHandler(profileLookup, componentService, userSession) {
         @Override
         protected void changeAssociation(String profileKey, String projectUuid, UserSession userSession) {
           profileProjectOperations.addProject(profileKey, projectUuid, userSession);
@@ -72,7 +74,7 @@ public class ProjectAssociationActions {
     NewAction removeProject = controller.createAction("remove_project")
       .setSince("5.2")
       .setDescription("Remove a project's association with a quality profile.")
-      .setHandler(new AssociationHandler(profileLookup, componentService) {
+      .setHandler(new AssociationHandler(profileLookup, componentService, userSession) {
         @Override
         protected void changeAssociation(String profileKey, String projectUuid, UserSession userSession) {
           profileProjectOperations.removeProject(profileKey, projectUuid, userSession);
@@ -105,10 +107,12 @@ public class ProjectAssociationActions {
 
     private final QProfileLookup profileLookup;
     private final ComponentService componentService;
+    private final UserSession userSession;
 
-    public AssociationHandler(QProfileLookup profileLookup, ComponentService componentService) {
+    public AssociationHandler(QProfileLookup profileLookup, ComponentService componentService, UserSession userSession) {
       this.profileLookup = profileLookup;
       this.componentService = componentService;
+      this.userSession = userSession;
     }
 
     protected abstract void changeAssociation(String profileKey, String projectUuid, UserSession userSession);
@@ -133,7 +137,7 @@ public class ProjectAssociationActions {
         projectUuid = componentService.getByKey(projectKey).uuid();
       }
 
-      changeAssociation(profileKey, projectUuid, UserSession.get());
+      changeAssociation(profileKey, projectUuid, userSession);
       response.noContent();
     }
 
index 2412b4de93669d07ef4c8c1de94f68c4dcb7b7a5..2b99c76429c35a5dd417f92dccf2a198815dd6f4 100644 (file)
@@ -47,12 +47,14 @@ public class QProfileChangeParentAction implements BaseQProfileWsAction {
   private final QProfileFactory profileFactory;
 
   private final Languages languages;
+  private final UserSession userSession;
 
-  public QProfileChangeParentAction(DbClient dbClient, RuleActivator ruleActivator, QProfileFactory profileFactory, Languages languages) {
+  public QProfileChangeParentAction(DbClient dbClient, RuleActivator ruleActivator, QProfileFactory profileFactory, Languages languages, UserSession userSession) {
     this.dbClient = dbClient;
     this.ruleActivator = ruleActivator;
     this.profileFactory = profileFactory;
     this.languages = languages;
+    this.userSession = userSession;
   }
 
   @Override
@@ -78,7 +80,7 @@ public class QProfileChangeParentAction implements BaseQProfileWsAction {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession.get().checkLoggedIn().checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSession.checkLoggedIn().checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     DbSession session = dbClient.openSession(false);
     try {
index 79ad6630ad83ab5c77695bcee416c866ecdfaa50..341bf118083fbb1dd998c03e8d0aa62477755976 100644 (file)
@@ -37,10 +37,12 @@ public class QProfileCopyAction implements BaseQProfileWsAction {
 
   private final QProfileCopier profileCopier;
   private final Languages languages;
+  private final UserSession userSession;
 
-  public QProfileCopyAction(QProfileCopier profileCopier, Languages languages) {
+  public QProfileCopyAction(QProfileCopier profileCopier, Languages languages, UserSession userSession) {
     this.profileCopier = profileCopier;
     this.languages = languages;
+    this.userSession = userSession;
   }
 
   @Override
@@ -64,7 +66,7 @@ public class QProfileCopyAction implements BaseQProfileWsAction {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession.get().checkLoggedIn().checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSession.checkLoggedIn().checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     String newName = request.mandatoryParam(PARAM_PROFILE_NAME);
     String profileKey = request.mandatoryParam(PARAM_PROFILE_KEY);
index bb6f12d3c7aa8e8272137394ad54dd69586c8f5c..ce31e68294723b60fb49b1debf1b2bff59f2f90f 100644 (file)
@@ -34,9 +34,9 @@ import org.sonar.server.qualityprofile.QProfileExporters;
 import org.sonar.server.qualityprofile.QProfileFactory;
 import org.sonar.server.qualityprofile.QProfileName;
 import org.sonar.server.qualityprofile.QProfileResult;
-import org.sonar.server.user.UserSession;
 
 import java.io.InputStream;
+import org.sonar.server.user.UserSession;
 
 public class QProfileCreateAction implements BaseQProfileWsAction {
 
@@ -53,17 +53,19 @@ public class QProfileCreateAction implements BaseQProfileWsAction {
   private final Languages languages;
 
   private final ProfileImporter[] importers;
+  private final UserSession userSession;
 
-  public QProfileCreateAction(DbClient dbClient, QProfileFactory profileFactory, QProfileExporters exporters, Languages languages, ProfileImporter[] importers) {
+  public QProfileCreateAction(DbClient dbClient, QProfileFactory profileFactory, QProfileExporters exporters, Languages languages, ProfileImporter[] importers, UserSession userSession) {
     this.dbClient = dbClient;
     this.profileFactory = profileFactory;
     this.exporters = exporters;
     this.languages = languages;
     this.importers = importers;
+    this.userSession = userSession;
   }
 
-  public QProfileCreateAction(DbClient dbClient, QProfileFactory profileFactory, QProfileExporters exporters, Languages languages) {
-    this(dbClient, profileFactory, exporters, languages, new ProfileImporter[0]);
+  public QProfileCreateAction(DbClient dbClient, QProfileFactory profileFactory, QProfileExporters exporters, Languages languages, UserSession userSession) {
+    this(dbClient, profileFactory, exporters, languages, new ProfileImporter[0], userSession);
   }
 
   @Override
@@ -94,7 +96,7 @@ public class QProfileCreateAction implements BaseQProfileWsAction {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession.get().checkLoggedIn().checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSession.checkLoggedIn().checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     String name = request.mandatoryParam(PARAM_PROFILE_NAME);
     String language = request.mandatoryParam(PARAM_LANGUAGE);
index 119b4e2bae9b80a0d0895cf39682f81a5c62433f..af966a63349182b5cc25339653b7de7d5e4e3d14 100644 (file)
@@ -35,11 +35,13 @@ public class QProfileDeleteAction implements BaseQProfileWsAction {
   private final Languages languages;
   private final QProfileFactory profileFactory;
   private final DbClient dbClient;
+  private final UserSession userSession;
 
-  public QProfileDeleteAction(Languages languages, QProfileFactory profileFactory, DbClient dbClient) {
+  public QProfileDeleteAction(Languages languages, QProfileFactory profileFactory, DbClient dbClient, UserSession userSession) {
     this.languages = languages;
     this.profileFactory = profileFactory;
     this.dbClient = dbClient;
+    this.userSession = userSession;
   }
 
   @Override
@@ -56,8 +58,8 @@ public class QProfileDeleteAction implements BaseQProfileWsAction {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession.get().checkLoggedIn();
-    UserSession.get().checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSession.checkLoggedIn();
+    userSession.checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
 
     DbSession session = dbClient.openSession(false);
index 0cef6f868a3ad19f2c35fbd70f4866838f9d611d..7b9f8cbf5164a86adfe5e370eaada414713396d2 100644 (file)
@@ -23,6 +23,10 @@ import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
 import org.apache.commons.lang.builder.CompareToBuilder;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.Response;
@@ -38,11 +42,6 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.user.UserSession;
 
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
 public class QProfileProjectsAction implements BaseQProfileWsAction {
 
   private static final String PARAM_KEY = "key";
@@ -56,9 +55,11 @@ public class QProfileProjectsAction implements BaseQProfileWsAction {
   private static final String SELECTION_DESELECTED = "deselected";
 
   private final DbClient dbClient;
+  private final UserSession userSession;
 
-  public QProfileProjectsAction(DbClient dbClient) {
+  public QProfileProjectsAction(DbClient dbClient, UserSession userSession) {
     this.dbClient = dbClient;
+    this.userSession = userSession;
   }
 
   @Override
@@ -117,7 +118,7 @@ public class QProfileProjectsAction implements BaseQProfileWsAction {
         }
       });
 
-      final Collection<Long> authorizedProjectIds = dbClient.authorizationDao().keepAuthorizedProjectIds(session, projectIds, UserSession.get().userId(), UserRole.USER);
+      final Collection<Long> authorizedProjectIds = dbClient.authorizationDao().keepAuthorizedProjectIds(session, projectIds, userSession.userId(), UserRole.USER);
       Iterable<ProjectQprofileAssociationDto> authorizedProjects = Iterables.filter(projects, new Predicate<ProjectQprofileAssociationDto>() {
         @Override
         public boolean apply(ProjectQprofileAssociationDto input) {
index 10ceb36256f5d0576a8cdb9ec28609324cc94b6b..a29c80b8b91098255516d06822ab6e504c81ab5e 100644 (file)
@@ -33,9 +33,11 @@ public class QProfileRenameAction implements BaseQProfileWsAction {
   private static final String PARAM_PROFILE_KEY = "key";
 
   private final QProfileFactory profileFactory;
+  private final UserSession userSession;
 
-  public QProfileRenameAction(QProfileFactory profileFactory) {
+  public QProfileRenameAction(QProfileFactory profileFactory, UserSession userSession) {
     this.profileFactory = profileFactory;
+    this.userSession = userSession;
   }
 
   @Override
@@ -59,7 +61,7 @@ public class QProfileRenameAction implements BaseQProfileWsAction {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession.get().checkLoggedIn().checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSession.checkLoggedIn().checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     String newName = request.mandatoryParam(PARAM_PROFILE_NAME);
     String profileKey = request.mandatoryParam(PARAM_PROFILE_KEY);
index 02a6556a4dc033aefe694e477dfcfd55f6a30327..b6290e909576e5c46082067b79ff231f4a76861c 100644 (file)
@@ -21,6 +21,8 @@ package org.sonar.server.qualityprofile.ws;
 
 import com.google.common.base.Charsets;
 import com.google.common.base.Preconditions;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import org.apache.commons.io.IOUtils;
 import org.sonar.api.resources.Languages;
 import org.sonar.api.server.ws.Request;
@@ -33,18 +35,17 @@ import org.sonar.server.qualityprofile.BulkChangeResult;
 import org.sonar.server.qualityprofile.QProfileBackuper;
 import org.sonar.server.user.UserSession;
 
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
 public class QProfileRestoreAction implements BaseQProfileWsAction {
 
   private static final String PARAM_BACKUP = "backup";
   private final QProfileBackuper backuper;
   private final Languages languages;
+  private final UserSession userSession;
 
-  public QProfileRestoreAction(QProfileBackuper backuper, Languages languages) {
+  public QProfileRestoreAction(QProfileBackuper backuper, Languages languages, UserSession userSession) {
     this.backuper = backuper;
     this.languages = languages;
+    this.userSession = userSession;
   }
 
   @Override
@@ -63,7 +64,7 @@ public class QProfileRestoreAction implements BaseQProfileWsAction {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession.get().checkLoggedIn().checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSession.checkLoggedIn().checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
     InputStream backup = request.paramAsInputStream(PARAM_BACKUP);
     InputStreamReader reader = null;
 
index 1b3a7ee0c9772e84e9c8c0aef348f99876391fe1..c35c23cd955b625095c5c50b7204a51dc03fa072 100644 (file)
@@ -45,11 +45,13 @@ public class QProfileSetDefaultAction implements BaseQProfileWsAction {
   private final QProfileLookup profileLookup;
 
   private final QProfileFactory profileFactory;
+  private final UserSession userSession;
 
-  public QProfileSetDefaultAction(Languages languages, QProfileLookup profileLookup, QProfileFactory profileFactory) {
+  public QProfileSetDefaultAction(Languages languages, QProfileLookup profileLookup, QProfileFactory profileFactory, UserSession userSession) {
     this.languages = languages;
     this.profileLookup = profileLookup;
     this.profileFactory = profileFactory;
+    this.userSession = userSession;
   }
 
   @Override
@@ -76,7 +78,7 @@ public class QProfileSetDefaultAction implements BaseQProfileWsAction {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession.get().checkLoggedIn().checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSession.checkLoggedIn().checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     String language = request.param(PARAM_LANGUAGE);
     String profileName = request.param(PARAM_PROFILE_NAME);
index ab781bba3781eb80f26b117a0deca3ceb0ba7bf5..94bead3e3f538900787489979a890ed871938f0a 100644 (file)
@@ -36,6 +36,7 @@ import javax.annotation.CheckForNull;
 
 import java.util.Collection;
 import java.util.List;
+import org.sonar.server.user.UserSession;
 
 import static com.google.common.collect.Lists.newArrayList;
 
@@ -45,8 +46,10 @@ import static com.google.common.collect.Lists.newArrayList;
 public class DefaultRuleFinder implements RuleFinder {
 
   private final RuleIndex index;
+  private final UserSession userSession;
 
-  public DefaultRuleFinder(IndexClient indexes) {
+  public DefaultRuleFinder(IndexClient indexes, UserSession userSession) {
+    this.userSession = userSession;
     this.index = indexes.get(RuleIndex.class);
   }
 
@@ -101,7 +104,7 @@ public class DefaultRuleFinder implements RuleFinder {
 
   @Override
   public final org.sonar.api.rules.Rule find(org.sonar.api.rules.RuleQuery query) {
-    Result<Rule> result = index.search(toQuery(query), new QueryContext());
+    Result<Rule> result = index.search(toQuery(query), new QueryContext(userSession));
     if (!result.getHits().isEmpty()) {
       return toRule(result.getHits().get(0));
     } else {
@@ -112,7 +115,7 @@ public class DefaultRuleFinder implements RuleFinder {
   @Override
   public final Collection<org.sonar.api.rules.Rule> findAll(org.sonar.api.rules.RuleQuery query) {
     List<org.sonar.api.rules.Rule> rules = newArrayList();
-    for (Rule rule : index.search(toQuery(query), new QueryContext()).getHits()) {
+    for (Rule rule : index.search(toQuery(query), new QueryContext(userSession)).getHits()) {
       rules.add(toRule(rule));
     }
     return rules;
index a73d018a16d439251a711cb190a5df31e0b8a82e..24694fda230e4fa6743c871aaefc6900a10bc6fc 100644 (file)
@@ -20,6 +20,9 @@
 package org.sonar.server.rule;
 
 import com.google.common.base.Strings;
+import java.util.List;
+import java.util.Map;
+import javax.annotation.CheckForNull;
 import org.picocontainer.Startable;
 import org.sonar.api.ServerSide;
 import org.sonar.api.rule.RuleKey;
@@ -36,11 +39,6 @@ import org.sonar.server.search.Result;
 import org.sonar.server.user.UserSession;
 import org.sonar.server.util.RubyUtils;
 
-import javax.annotation.CheckForNull;
-
-import java.util.List;
-import java.util.Map;
-
 import static com.google.common.collect.Lists.newArrayList;
 
 /**
@@ -54,10 +52,12 @@ public class RubyRuleService implements Startable {
 
   private final RuleService service;
   private final RuleUpdater updater;
+  private final UserSession userSession;
 
-  public RubyRuleService(RuleService service, RuleUpdater updater) {
+  public RubyRuleService(RuleService service, RuleUpdater updater, UserSession userSession) {
     this.service = service;
     this.updater = updater;
+    this.userSession = userSession;
   }
 
   /**
@@ -90,7 +90,7 @@ public class RubyRuleService implements Startable {
       query.setActivation(true);
     }
 
-    QueryContext options = new QueryContext();
+    QueryContext options = new QueryContext(userSession);
     Integer pageSize = RubyUtils.toInteger(params.get("pageSize"));
     int size = pageSize != null ? pageSize : 50;
     if (size > -1) {
@@ -100,7 +100,7 @@ public class RubyRuleService implements Startable {
       Result<Rule> result = service.search(query, options);
       return new PagedResult<>(result.getHits(), PagingResult.create(options.getLimit(), pageIndex, result.getTotal()));
     } else {
-      List<Rule> rules = newArrayList(service.search(query, new QueryContext().setScroll(true)).scroll());
+      List<Rule> rules = newArrayList(service.search(query, new QueryContext(userSession).setScroll(true)).scroll());
       return new PagedResult<>(rules, PagingResult.create(Integer.MAX_VALUE, 1, rules.size()));
     }
   }
@@ -109,7 +109,7 @@ public class RubyRuleService implements Startable {
    * Used in manual_rules_controller.rb
    */
   public List<Rule> searchManualRules() {
-    return service.search(new RuleQuery().setRepositories(newArrayList(RuleDoc.MANUAL_REPOSITORY)).setSortField(RuleNormalizer.RuleField.NAME), new QueryContext()).getHits();
+    return service.search(new RuleQuery().setRepositories(newArrayList(RuleDoc.MANUAL_REPOSITORY)).setSortField(RuleNormalizer.RuleField.NAME), new QueryContext(userSession)).getHits();
   }
 
   // sqale
@@ -126,7 +126,7 @@ public class RubyRuleService implements Startable {
         Strings.emptyToNull((String) params.get("debtRemediationOffset")))
         );
     }
-    updater.update(update, UserSession.get());
+    updater.update(update, userSession);
   }
 
   /**
index 3b0ab6be424f708a5ad796ddb55f50fd4650faec..e800e07620026d7bcbd468d8fc24c4a46622ee6f 100644 (file)
  */
 package org.sonar.server.rule;
 
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
+
 import org.sonar.api.ServerSide;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.core.permission.GlobalPermissions;
@@ -30,13 +37,6 @@ import org.sonar.server.search.QueryContext;
 import org.sonar.server.search.Result;
 import org.sonar.server.user.UserSession;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
 /**
  * @since 4.4
  */
@@ -47,12 +47,14 @@ public class RuleService {
   private final RuleUpdater ruleUpdater;
   private final RuleCreator ruleCreator;
   private final RuleDeleter ruleDeleter;
+  private final UserSession userSession;
 
-  public RuleService(RuleIndex index, RuleUpdater ruleUpdater, RuleCreator ruleCreator, RuleDeleter ruleDeleter) {
+  public RuleService(RuleIndex index, RuleUpdater ruleUpdater, RuleCreator ruleCreator, RuleDeleter ruleDeleter, UserSession userSession) {
     this.index = index;
     this.ruleUpdater = ruleUpdater;
     this.ruleCreator = ruleCreator;
     this.ruleDeleter = ruleDeleter;
+    this.userSession = userSession;
   }
 
   @CheckForNull
@@ -98,7 +100,7 @@ public class RuleService {
 
   public void update(RuleUpdate update) {
     checkPermission();
-    ruleUpdater.update(update, UserSession.get());
+    ruleUpdater.update(update, userSession);
   }
 
   public RuleKey create(NewRule newRule) {
@@ -112,7 +114,6 @@ public class RuleService {
   }
 
   private void checkPermission() {
-    UserSession userSession = UserSession.get();
     userSession.checkLoggedIn();
     userSession.checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
   }
index d3bd0835ec9efce17fdc7c22ea05d6b59dc45b36..12faa3fa9aca5f37cb1f87808ea8058364fc665f 100644 (file)
@@ -22,6 +22,10 @@ package org.sonar.server.rule.ws;
 import com.google.common.collect.LinkedListMultimap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Multimap;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Locale;
 import org.apache.commons.lang.builder.CompareToBuilder;
 import org.sonar.api.i18n.I18n;
 import org.sonar.api.resources.Language;
@@ -41,11 +45,6 @@ import org.sonar.server.rule.RuleRepositories;
 import org.sonar.server.rule.RuleRepositories.Repository;
 import org.sonar.server.user.UserSession;
 
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Locale;
-
 /**
  * @since 4.4
  */
@@ -56,14 +55,16 @@ public class AppAction implements RulesAction {
   private final I18n i18n;
   private final DebtModel debtModel;
   private final QProfileLoader profileLoader;
+  private final UserSession userSession;
 
   public AppAction(Languages languages, RuleRepositories ruleRepositories, I18n i18n,
-    DebtModel debtModel, QProfileLoader profileLoader) {
+                   DebtModel debtModel, QProfileLoader profileLoader, UserSession userSession) {
     this.languages = languages;
     this.ruleRepositories = ruleRepositories;
     this.i18n = i18n;
     this.debtModel = debtModel;
     this.profileLoader = profileLoader;
+    this.userSession = userSession;
   }
 
   @Override
@@ -80,7 +81,7 @@ public class AppAction implements RulesAction {
   }
 
   private void addPermissions(JsonWriter json) {
-    json.prop("canWrite", UserSession.get().hasGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN));
+    json.prop("canWrite", userSession.hasGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN));
   }
 
   private void addProfiles(JsonWriter json) {
index 77cf01ec5a2494c0f6b5c86366e460fe398d3605..95a9e3be87c869ae94c52815d81df414aa0f179f 100644 (file)
@@ -39,6 +39,7 @@ import javax.annotation.Nullable;
 
 import java.util.Collection;
 import java.util.Map;
+import org.sonar.server.user.UserSession;
 
 /**
  * Conversion of {@link org.sonar.server.rule.index.RuleDoc} to WS JSON document
@@ -47,7 +48,8 @@ public class RuleMapping extends BaseMapping<RuleDoc, RuleMappingContext> {
 
   private final DebtModel debtModel;
 
-  public RuleMapping(final Languages languages, final MacroInterpreter macroInterpreter, final DebtModel debtModel) {
+  public RuleMapping(final Languages languages, final MacroInterpreter macroInterpreter, final DebtModel debtModel, UserSession userSession) {
+    super(userSession);
     this.debtModel = debtModel;
 
     mapBasicFields(languages);
index 48a9813f9401135bae0dd7d43a48ac9f996eebec..1044bffe7b0f9693e234e0f0d6a240ff92d7b89b 100644 (file)
@@ -47,6 +47,7 @@ import javax.annotation.CheckForNull;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Iterator;
+import org.sonar.server.user.UserSession;
 
 /**
  * @since 4.4
@@ -76,8 +77,8 @@ public class SearchAction extends SearchRequestHandler<RuleQuery, Rule> implemen
   private final ActiveRuleCompleter activeRuleCompleter;
   private final RuleMapping mapping;
 
-  public SearchAction(RuleService service, ActiveRuleCompleter activeRuleCompleter, RuleMapping mapping) {
-    super(SEARCH_ACTION);
+  public SearchAction(RuleService service, ActiveRuleCompleter activeRuleCompleter, RuleMapping mapping, UserSession userSession) {
+    super(SEARCH_ACTION, userSession);
     this.ruleService = service;
     this.activeRuleCompleter = activeRuleCompleter;
     this.mapping = mapping;
index 66d2244f9eecf8b76b2818bb0e669bd3bf610de4..8e24491b34591161a3ce145fb1c29339961dc855 100644 (file)
 package org.sonar.server.search;
 
 import com.google.common.base.Preconditions;
-import org.sonar.server.user.UserSession;
-
-import javax.annotation.Nullable;
-
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Set;
+import javax.annotation.Nullable;
+import org.sonar.server.user.UserSession;
 
 import static com.google.common.collect.Sets.newHashSet;
 import static com.google.common.collect.Sets.newLinkedHashSet;
@@ -52,9 +50,9 @@ public class QueryContext {
   private String userLogin;
   private Set<String> userGroups = newHashSet();
 
-  public QueryContext() {
-    this.userLogin = UserSession.get().login();
-    this.userGroups = UserSession.get().userGroups();
+  public QueryContext(UserSession userSession) {
+    this.userLogin = userSession.login();
+    this.userGroups = userSession.userGroups();
   }
 
   /**
index 6f195dfe6232ce9a2097807796eaf1fb7d87646d..93a84786bfd2f276bf89dad2abae1df08fdd0fd0 100644 (file)
@@ -32,6 +32,7 @@ import javax.annotation.Nullable;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
+import org.sonar.server.user.UserSession;
 
 /**
  * Mapping of search documents (see {@link org.sonar.server.search.BaseDoc}) to WS JSON responses
@@ -41,6 +42,11 @@ public abstract class BaseMapping<DOC extends BaseDoc, CTX> {
 
   private final Multimap<String, String> indexFieldsByWsFields = LinkedHashMultimap.create();
   private final Multimap<String, Mapper> mappers = LinkedHashMultimap.create();
+  private final UserSession userSession;
+
+  protected BaseMapping(UserSession userSession) {
+    this.userSession = userSession;
+  }
 
   /**
    * All the WS supported fields
@@ -50,7 +56,7 @@ public abstract class BaseMapping<DOC extends BaseDoc, CTX> {
   }
 
   public QueryContext newQueryOptions(SearchOptions options) {
-    QueryContext result = new QueryContext();
+    QueryContext result = new QueryContext(userSession);
     result.setPage(options.page(), options.pageSize());
     List<String> optionFields = options.fields();
     if (optionFields != null) {
index e5bec95f0e5e7383f07fba5685792b921126e4cb..5481a4b2e55c5526747c028a49b05f96a85d33c0 100644 (file)
@@ -39,6 +39,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import org.sonar.server.user.UserSession;
 
 public abstract class SearchRequestHandler<QUERY, DOMAIN> implements RequestHandler {
 
@@ -51,9 +52,11 @@ public abstract class SearchRequestHandler<QUERY, DOMAIN> implements RequestHand
   public static final String PARAM_FACETS = "facets";
 
   private final String actionName;
+  protected final UserSession userSession;
 
-  protected SearchRequestHandler(String actionName) {
+  protected SearchRequestHandler(String actionName, UserSession userSession) {
     this.actionName = actionName;
+    this.userSession = userSession;
   }
 
   protected abstract Result<DOMAIN> doSearch(QUERY query, QueryContext context);
@@ -126,7 +129,7 @@ public abstract class SearchRequestHandler<QUERY, DOMAIN> implements RequestHand
 
   protected QueryContext getQueryContext(Request request) {
     int pageSize = request.mandatoryParamAsInt(PARAM_PAGE_SIZE);
-    QueryContext queryContext = new QueryContext().addFieldsToReturn(request.paramAsStrings(PARAM_FIELDS));
+    QueryContext queryContext = new QueryContext(userSession).addFieldsToReturn(request.paramAsStrings(PARAM_FIELDS));
     List<String> facets = request.paramAsStrings(PARAM_FACETS);
     if(facets != null) {
       queryContext.addFacets(facets);
index de3d87c84275b3ef92de91368b1ccf3dd6cda17f..940af9f8684c203ed3a07ca24db9c297d965b3f0 100644 (file)
@@ -22,6 +22,9 @@ package org.sonar.server.source.ws;
 import com.google.common.base.Function;
 import com.google.common.io.CharStreams;
 import com.google.common.io.Resources;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
 import org.apache.commons.io.Charsets;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.Response;
@@ -32,16 +35,14 @@ import org.sonar.core.persistence.DbSession;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.user.UserSession;
 
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-
 public class HashAction implements SourcesAction {
 
   private final DbClient dbClient;
+  private final UserSession userSession;
 
-  public HashAction(DbClient dbClient) {
+  public HashAction(DbClient dbClient, UserSession userSession) {
     this.dbClient = dbClient;
+    this.userSession = userSession;
   }
 
   @Override
@@ -65,7 +66,7 @@ public class HashAction implements SourcesAction {
     try (DbSession session = dbClient.openSession(false)) {
       final String componentKey = request.mandatoryParam("key");
       final ComponentDto component = dbClient.componentDao().getByKey(session, componentKey);
-      UserSession.get().checkProjectUuidPermission(UserRole.USER, component.projectUuid());
+      userSession.checkProjectUuidPermission(UserRole.USER, component.projectUuid());
 
       response.stream().setMediaType("text/plain");
       OutputStreamWriter writer = new OutputStreamWriter(response.stream().output(), Charsets.UTF_8);
index 178c49abb0623fb78ca5a513975797a2c9f5c0d2..5dff47dc731c7d03d6097bc926a0425550f3145e 100644 (file)
@@ -21,6 +21,7 @@
 package org.sonar.server.source.ws;
 
 import com.google.common.io.Resources;
+import java.util.List;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.Response;
 import org.sonar.api.server.ws.WebService;
@@ -32,16 +33,16 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.source.SourceService;
 import org.sonar.server.user.UserSession;
 
-import java.util.List;
-
 public class IndexAction implements SourcesAction {
 
   private final DbClient dbClient;
   private final SourceService sourceService;
+  private final UserSession userSession;
 
-  public IndexAction(DbClient dbClient, SourceService sourceService) {
+  public IndexAction(DbClient dbClient, SourceService sourceService, UserSession userSession) {
     this.dbClient = dbClient;
     this.sourceService = sourceService;
+    this.userSession = userSession;
   }
 
   @Override
@@ -72,7 +73,7 @@ public class IndexAction implements SourcesAction {
   @Override
   public void handle(Request request, Response response) {
     String fileKey = request.mandatoryParam("resource");
-    UserSession.get().checkComponentPermission(UserRole.CODEVIEWER, fileKey);
+    userSession.checkComponentPermission(UserRole.CODEVIEWER, fileKey);
     Integer from = request.mandatoryParamAsInt("from");
     Integer to = request.paramAsInt("to");
     try (DbSession session = dbClient.openSession(false)) {
index ff750c5c98449e882e170a03f445d700660cede2..6d0599cf19ab19b0639ed77f86ee919c2000c808 100644 (file)
@@ -20,6 +20,8 @@
 package org.sonar.server.source.ws;
 
 import com.google.common.io.Resources;
+import java.util.Date;
+import java.util.List;
 import org.apache.commons.lang.ObjectUtils;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.Response;
@@ -37,9 +39,6 @@ import org.sonar.server.source.index.SourceLineDoc;
 import org.sonar.server.source.index.SourceLineIndex;
 import org.sonar.server.user.UserSession;
 
-import java.util.Date;
-import java.util.List;
-
 public class LinesAction implements SourcesAction {
 
   private static final String PARAM_UUID = "uuid";
@@ -48,11 +47,13 @@ public class LinesAction implements SourcesAction {
   private final SourceLineIndex sourceLineIndex;
   private final HtmlSourceDecorator htmlSourceDecorator;
   private final DbClient dbClient;
+  private final UserSession userSession;
 
-  public LinesAction(DbClient dbClient, SourceLineIndex sourceLineIndex, HtmlSourceDecorator htmlSourceDecorator) {
+  public LinesAction(DbClient dbClient, SourceLineIndex sourceLineIndex, HtmlSourceDecorator htmlSourceDecorator, UserSession userSession) {
     this.sourceLineIndex = sourceLineIndex;
     this.htmlSourceDecorator = htmlSourceDecorator;
     this.dbClient = dbClient;
+    this.userSession = userSession;
   }
 
   @Override
@@ -103,7 +104,7 @@ public class LinesAction implements SourcesAction {
   @Override
   public void handle(Request request, Response response) {
     ComponentDto component = loadComponent(request);
-    UserSession.get().checkProjectUuidPermission(UserRole.CODEVIEWER, component.projectUuid());
+    userSession.checkProjectUuidPermission(UserRole.CODEVIEWER, component.projectUuid());
 
     int from = Math.max(request.mandatoryParamAsInt("from"), 1);
     int to = (Integer) ObjectUtils.defaultIfNull(request.paramAsInt("to"), Integer.MAX_VALUE);
index ea04157ff4caba929a459a3adda196dd33578cef..00f431d802daf492256d406cfd38b14c39ddc38b 100644 (file)
@@ -21,6 +21,8 @@
 package org.sonar.server.source.ws;
 
 import com.google.common.io.Resources;
+import java.io.IOException;
+import java.util.List;
 import org.apache.commons.io.Charsets;
 import org.apache.commons.io.IOUtils;
 import org.sonar.api.server.ws.Request;
@@ -33,17 +35,16 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.source.SourceService;
 import org.sonar.server.user.UserSession;
 
-import java.io.IOException;
-import java.util.List;
-
 public class RawAction implements SourcesAction {
 
   private final DbClient dbClient;
   private final SourceService sourceService;
+  private final UserSession userSession;
 
-  public RawAction(DbClient dbClient, SourceService sourceService) {
+  public RawAction(DbClient dbClient, SourceService sourceService, UserSession userSession) {
     this.dbClient = dbClient;
     this.sourceService = sourceService;
+    this.userSession = userSession;
   }
 
   @Override
@@ -64,7 +65,7 @@ public class RawAction implements SourcesAction {
   @Override
   public void handle(Request request, Response response) {
     String fileKey = request.mandatoryParam("key");
-    UserSession.get().checkComponentPermission(UserRole.CODEVIEWER, fileKey);
+    userSession.checkComponentPermission(UserRole.CODEVIEWER, fileKey);
     try (DbSession session = dbClient.openSession(false)) {
       ComponentDto componentDto = dbClient.componentDao().getByKey(session, fileKey);
       List<String> lines = sourceService.getLinesAsTxt(componentDto.uuid(), null, null);
index 7abdecbe09145dc4bf01e3dc70c85013b8b5f39c..418f2abc8b6e1575a8a7a21f73601f3363684466 100644 (file)
@@ -22,6 +22,8 @@ package org.sonar.server.source.ws;
 
 import com.google.common.base.Strings;
 import com.google.common.io.Resources;
+import java.util.Date;
+import java.util.List;
 import org.apache.commons.lang.ObjectUtils;
 import org.apache.commons.lang.builder.EqualsBuilder;
 import org.sonar.api.server.ws.Request;
@@ -38,17 +40,16 @@ import org.sonar.server.source.index.SourceLineDoc;
 import org.sonar.server.source.index.SourceLineIndex;
 import org.sonar.server.user.UserSession;
 
-import java.util.Date;
-import java.util.List;
-
 public class ScmAction implements SourcesAction {
 
   private final DbClient dbClient;
   private final SourceLineIndex sourceLineIndex;
+  private final UserSession userSession;
 
-  public ScmAction(DbClient dbClient, SourceLineIndex sourceLineIndex) {
+  public ScmAction(DbClient dbClient, SourceLineIndex sourceLineIndex, UserSession userSession) {
     this.dbClient = dbClient;
     this.sourceLineIndex = sourceLineIndex;
+    this.userSession = userSession;
   }
 
   @Override
@@ -101,7 +102,7 @@ public class ScmAction implements SourcesAction {
     DbSession session = dbClient.openSession(false);
     try {
       ComponentDto fileDto = dbClient.componentDao().getByKey(session, fileKey);
-      UserSession.get().checkProjectUuidPermission(UserRole.CODEVIEWER, fileDto.projectUuid());
+      userSession.checkProjectUuidPermission(UserRole.CODEVIEWER, fileDto.projectUuid());
       List<SourceLineDoc> sourceLines = sourceLineIndex.getLines(fileDto.uuid(), from, to);
       if (sourceLines.isEmpty()) {
         throw new NotFoundException("File '" + fileKey + "' has no sources");
index fc8bc31bde0341123c3a2099b6affbc5098494ed..54356aa3d369012af78c733be384fe17bb904214 100644 (file)
@@ -20,6 +20,7 @@
 package org.sonar.server.source.ws;
 
 import com.google.common.io.Resources;
+import java.util.List;
 import org.apache.commons.lang.ObjectUtils;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.Response;
@@ -32,16 +33,16 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.source.SourceService;
 import org.sonar.server.user.UserSession;
 
-import java.util.List;
-
 public class ShowAction implements SourcesAction {
 
   private final SourceService sourceService;
   private final DbClient dbClient;
+  private final UserSession userSession;
 
-  public ShowAction(SourceService sourceService, DbClient dbClient) {
+  public ShowAction(SourceService sourceService, DbClient dbClient, UserSession userSession) {
     this.sourceService = sourceService;
     this.dbClient = dbClient;
+    this.userSession = userSession;
   }
 
   @Override
@@ -78,7 +79,7 @@ public class ShowAction implements SourcesAction {
   @Override
   public void handle(Request request, Response response) {
     String fileKey = request.mandatoryParam("key");
-    UserSession.get().checkComponentPermission(UserRole.CODEVIEWER, fileKey);
+    userSession.checkComponentPermission(UserRole.CODEVIEWER, fileKey);
 
     int from = Math.max(request.mandatoryParamAsInt("from"), 1);
     int to = (Integer) ObjectUtils.defaultIfNull(request.paramAsInt("to"), Integer.MAX_VALUE);
index a6e579e119214f669b4ecccc0a7daebdadfec83c..b56a58b7f5a2d71072ad03db5d28e54f902a881d 100644 (file)
 
 package org.sonar.server.test;
 
-import com.google.common.collect.Maps;
+import java.util.Map;
+
+import javax.annotation.CheckForNull;
+
 import org.sonar.api.ServerSide;
 import org.sonar.api.measures.CoreMetrics;
 import org.sonar.api.test.MutableTestable;
@@ -34,9 +37,7 @@ import org.sonar.core.persistence.MyBatis;
 import org.sonar.server.measure.persistence.MeasureDao;
 import org.sonar.server.user.UserSession;
 
-import javax.annotation.CheckForNull;
-
-import java.util.Map;
+import com.google.common.collect.Maps;
 
 @ServerSide
 public class CoverageService {
@@ -48,15 +49,17 @@ public class CoverageService {
   private final MyBatis myBatis;
   private final MeasureDao measureDao;
   private final SnapshotPerspectives snapshotPerspectives;
+  private final UserSession userSession;
 
-  public CoverageService(MyBatis myBatis, MeasureDao measureDao, SnapshotPerspectives snapshotPerspectives) {
+  public CoverageService(MyBatis myBatis, MeasureDao measureDao, SnapshotPerspectives snapshotPerspectives, UserSession userSession) {
     this.myBatis = myBatis;
     this.measureDao = measureDao;
     this.snapshotPerspectives = snapshotPerspectives;
+    this.userSession = userSession;
   }
 
   public void checkPermission(String fileKey) {
-    UserSession.get().checkComponentPermission(UserRole.CODEVIEWER, fileKey);
+    userSession.checkComponentPermission(UserRole.CODEVIEWER, fileKey);
   }
 
   public Map<Integer, Integer> getHits(String fileKey, CoverageService.TYPE type) {
index 7617fc6c2e34c22b051336a3b87713c2e8541605..9160ee9d2b0f7d9b22de91580f33d16a5c934103 100644 (file)
@@ -24,6 +24,8 @@ import com.google.common.base.Function;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.io.Resources;
+import java.util.List;
+import java.util.Map;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.Response;
 import org.sonar.api.server.ws.WebService;
@@ -37,19 +39,18 @@ import org.sonar.server.test.index.CoveredFileDoc;
 import org.sonar.server.test.index.TestIndex;
 import org.sonar.server.user.UserSession;
 
-import java.util.List;
-import java.util.Map;
-
 public class TestsCoveredFilesAction implements TestAction {
 
   public static final String TEST_UUID = "testUuid";
 
   private final DbClient dbClient;
   private final TestIndex index;
+  private final UserSession userSession;
 
-  public TestsCoveredFilesAction(DbClient dbClient, TestIndex index) {
+  public TestsCoveredFilesAction(DbClient dbClient, TestIndex index, UserSession userSession) {
     this.dbClient = dbClient;
     this.index = index;
+    this.userSession = userSession;
   }
 
   @Override
@@ -71,7 +72,7 @@ public class TestsCoveredFilesAction implements TestAction {
   @Override
   public void handle(Request request, Response response) {
     String testUuid = request.mandatoryParam(TEST_UUID);
-    UserSession.get().checkComponentUuidPermission(UserRole.CODEVIEWER, index.searchByTestUuid(testUuid).fileUuid());
+    userSession.checkComponentUuidPermission(UserRole.CODEVIEWER, index.searchByTestUuid(testUuid).fileUuid());
 
     List<CoveredFileDoc> coveredFiles = index.coveredFiles(testUuid);
     Map<String, ComponentDto> componentsByUuid = buildComponentsByUuid(coveredFiles);
index 0a65137ecf7012d07e2ef685c1eb237d6759c489..281f1219d5951bbb54066546d27542e9b4d80676 100644 (file)
@@ -23,6 +23,9 @@ package org.sonar.server.test.ws;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.io.Resources;
+import java.util.List;
+import java.util.Map;
+import javax.annotation.Nullable;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.Response;
 import org.sonar.api.server.ws.WebService;
@@ -40,11 +43,6 @@ import org.sonar.server.test.index.TestDoc;
 import org.sonar.server.test.index.TestIndex;
 import org.sonar.server.user.UserSession;
 
-import javax.annotation.Nullable;
-
-import java.util.List;
-import java.util.Map;
-
 public class TestsListAction implements TestAction {
   public static final String TEST_UUID = "testUuid";
   public static final String TEST_FILE_UUID = "testFileUuid";
@@ -54,10 +52,12 @@ public class TestsListAction implements TestAction {
 
   private final DbClient dbClient;
   private final TestIndex testIndex;
+  private final UserSession userSession;
 
-  public TestsListAction(DbClient dbClient, TestIndex testIndex) {
+  public TestsListAction(DbClient dbClient, TestIndex testIndex, UserSession userSession) {
     this.dbClient = dbClient;
     this.testIndex = testIndex;
+    this.userSession = userSession;
   }
 
   @Override
@@ -204,7 +204,7 @@ public class TestsListAction implements TestAction {
   }
 
   private SearchResult<TestDoc> searchTestsByTestFileKey(DbSession dbSession, String testFileKey, SearchOptions searchOptions) {
-    UserSession.get().checkComponentPermission(UserRole.CODEVIEWER, testFileKey);
+    userSession.checkComponentPermission(UserRole.CODEVIEWER, testFileKey);
     ComponentDto testFile = dbClient.componentDao().getByKey(dbSession, testFileKey);
 
     return testIndex.searchByTestFileUuid(testFile.uuid(), searchOptions);
@@ -222,6 +222,6 @@ public class TestsListAction implements TestAction {
 
   private void checkComponentUuidPermission(DbSession dbSession, String componentUuid) {
     ComponentDto component = dbClient.componentDao().getByUuid(dbSession, componentUuid);
-    UserSession.get().checkProjectUuidPermission(UserRole.CODEVIEWER, component.projectUuid());
+    userSession.checkProjectUuidPermission(UserRole.CODEVIEWER, component.projectUuid());
   }
 }
index 17175bf780746ff29eff2bb2bd555a922c8cd3b0..4564f13515bbb345ee1ea02d8c06c051b1992c56 100644 (file)
 package org.sonar.server.ui;
 
 import com.google.common.collect.Maps;
+import java.util.Date;
+import java.util.Locale;
+import java.util.Map;
+import javax.annotation.Nullable;
 import org.apache.commons.lang.StringUtils;
 import org.sonar.api.ServerSide;
 import org.sonar.api.i18n.I18n;
@@ -27,12 +31,6 @@ import org.sonar.api.utils.Duration;
 import org.sonar.api.utils.Durations;
 import org.sonar.server.user.UserSession;
 
-import javax.annotation.Nullable;
-
-import java.util.Date;
-import java.util.Locale;
-import java.util.Map;
-
 /**
  * Used through ruby code <pre>Internal.i18n</pre>
  *
@@ -41,13 +39,15 @@ import java.util.Map;
 @ServerSide
 public class JRubyI18n {
 
-  private I18n i18n;
-  private Durations durations;
+  private final I18n i18n;
+  private final Durations durations;
+  private final UserSession userSession;
   private Map<String, Locale> localesByRubyKey = Maps.newHashMap();
 
-  public JRubyI18n(I18n i18n, Durations durations) {
+  public JRubyI18n(I18n i18n, Durations durations, UserSession userSession) {
     this.i18n = i18n;
     this.durations = durations;
+    this.userSession = userSession;
   }
 
   Locale getLocale(String rubyKey) {
@@ -83,11 +83,11 @@ public class JRubyI18n {
   }
 
   public String ageFromNow(Date date) {
-    return i18n.ageFromNow(UserSession.get().locale(), date);
+    return i18n.ageFromNow(userSession.locale(), date);
   }
 
   public String formatDuration(Duration duration, String format) {
-    return durations.format(UserSession.get().locale(), duration, Durations.DurationFormat.valueOf(format));
+    return durations.format(userSession.locale(), duration, Durations.DurationFormat.valueOf(format));
   }
 
   public String formatLongDuration(long duration, String format) {
@@ -95,7 +95,7 @@ public class JRubyI18n {
   }
 
   public String formatDateTime(Date date) {
-    return i18n.formatDateTime(UserSession.get().locale(), date);
+    return i18n.formatDateTime(userSession.locale(), date);
   }
 
 }
index 3beb0bbbbeb464eca82f53bcee5cc7497af43e60..82dc0a805b957ab7f8ce77f53e503a9bb500d0fb 100644 (file)
@@ -21,6 +21,8 @@ package org.sonar.server.ui;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
+import java.util.Collection;
+import java.util.Map;
 import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.builder.CompareToBuilder;
@@ -46,13 +48,11 @@ import org.sonar.api.web.WidgetScope;
 import org.sonar.core.component.ComponentDto;
 import org.sonar.server.user.UserSession;
 
-import java.util.Collection;
-import java.util.Map;
-
 @SuppressWarnings("rawtypes")
 public class ViewProxy<V extends View> implements Comparable<ViewProxy> {
 
-  private V view;
+  private final V view;
+  private final UserSession userSession;
   private String[] sections = {NavigationSection.HOME};
   private String[] userRoles = {};
   private String[] resourceScopes = {};
@@ -69,8 +69,9 @@ public class ViewProxy<V extends View> implements Comparable<ViewProxy> {
   private String[] mandatoryMeasures = {};
   private String[] needOneOfMeasures = {};
 
-  public ViewProxy(final V view) {
+  public ViewProxy(V view, UserSession userSession) {
     this.view = view;
+    this.userSession = userSession;
 
     initUserRoles(view);
     initSections(view);
@@ -277,7 +278,7 @@ public class ViewProxy<V extends View> implements Comparable<ViewProxy> {
   public boolean isUserAuthorized() {
     boolean authorized = userRoles.length == 0;
     for (String userRole : getUserRoles()) {
-      authorized |= UserSession.get().hasGlobalPermission(userRole);
+      authorized |= userSession.hasGlobalPermission(userRole);
     }
     return authorized;
   }
@@ -285,7 +286,7 @@ public class ViewProxy<V extends View> implements Comparable<ViewProxy> {
   public boolean isUserAuthorized(ComponentDto component) {
     boolean authorized = userRoles.length == 0;
     for (String userRole : getUserRoles()) {
-      authorized |= UserSession.get().hasProjectPermissionByUuid(userRole, component.uuid());
+      authorized |= userSession.hasProjectPermissionByUuid(userRole, component.uuid());
     }
     return authorized;
   }
index 059269e079cf1606e78d3d9ce40419629db7ec79..fd46b6a94d4560af160f540727315f23fcc62905 100644 (file)
@@ -33,6 +33,7 @@ import javax.annotation.Nullable;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import org.sonar.server.user.UserSession;
 
 @ServerSide
 public class Views {
@@ -43,10 +44,14 @@ public class Views {
   private Map<String, ViewProxy<Widget>> widgetsPerId = Maps.newHashMap();
   private Set<ViewProxy<Widget>> widgets = Sets.newTreeSet();
 
-  public Views() {
+  private final UserSession userSession;
+
+  public Views(UserSession userSession) {
+    this.userSession = userSession;
   }
 
-  public Views(View[] views) {
+  public Views(UserSession userSession, View[] views) {
+    this.userSession = userSession;
     for (View view : views) {
       register(view);
     }
@@ -54,12 +59,12 @@ public class Views {
 
   private void register(View view) {
     if (view instanceof Widget) {
-      ViewProxy<Widget> proxy = new ViewProxy<Widget>((Widget) view);
+      ViewProxy<Widget> proxy = new ViewProxy<>((Widget) view, userSession);
       widgets.add(proxy);
       widgetsPerId.put(proxy.getId(), proxy);
 
     } else if (view instanceof Page) {
-      ViewProxy<Page> proxy = new ViewProxy<Page>((Page) view);
+      ViewProxy<Page> proxy = new ViewProxy<>((Page) view, userSession);
       pagesPerId.put(proxy.getId(), proxy);
       pages.add(proxy);
     }
index 48189880e0a067ee19eaa185ff713a52fa6a52b8..75fdda425dac64f14baff716dd168b02956b125f 100644 (file)
@@ -21,6 +21,12 @@ package org.sonar.server.ui.ws;
 
 import com.google.common.base.Charsets;
 import com.google.common.collect.Lists;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import javax.annotation.Nullable;
 import org.sonar.api.i18n.I18n;
 import org.sonar.api.resources.Qualifiers;
 import org.sonar.api.resources.ResourceType;
@@ -47,14 +53,6 @@ import org.sonar.server.ui.ViewProxy;
 import org.sonar.server.ui.Views;
 import org.sonar.server.user.UserSession;
 
-import javax.annotation.Nullable;
-
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-
 public class ComponentNavigationAction implements NavigationAction {
 
   private static final String PARAM_COMPONENT_KEY = "componentKey";
@@ -73,13 +71,15 @@ public class ComponentNavigationAction implements NavigationAction {
   private final Views views;
   private final I18n i18n;
   private final ResourceTypes resourceTypes;
+  private final UserSession userSession;
 
-  public ComponentNavigationAction(DbClient dbClient, ActiveDashboardDao activeDashboardDao, Views views, I18n i18n, ResourceTypes resourceTypes) {
+  public ComponentNavigationAction(DbClient dbClient, ActiveDashboardDao activeDashboardDao, Views views, I18n i18n, ResourceTypes resourceTypes, UserSession userSession) {
     this.dbClient = dbClient;
     this.activeDashboardDao = activeDashboardDao;
     this.views = views;
     this.i18n = i18n;
     this.resourceTypes = resourceTypes;
+    this.userSession = userSession;
   }
 
   @Override
@@ -102,7 +102,6 @@ public class ComponentNavigationAction implements NavigationAction {
   public void handle(Request request, Response response) throws Exception {
     String componentKey = request.mandatoryParam(PARAM_COMPONENT_KEY);
 
-    UserSession userSession = UserSession.get();
     DbSession session = dbClient.openSession(false);
 
     try {
index 45907e1538cc0b8bca82d4038820eac58db05d61..95f7a80f50293b740bb8951b8f8fcccc53ada5b8 100644 (file)
@@ -19,6 +19,7 @@
  */
 package org.sonar.server.ui.ws;
 
+import java.util.List;
 import org.sonar.api.config.Settings;
 import org.sonar.api.resources.ResourceType;
 import org.sonar.api.resources.ResourceTypes;
@@ -34,8 +35,6 @@ import org.sonar.server.ui.ViewProxy;
 import org.sonar.server.ui.Views;
 import org.sonar.server.user.UserSession;
 
-import java.util.List;
-
 public class GlobalNavigationAction implements NavigationAction {
 
   private static final String ANONYMOUS = null;
@@ -44,12 +43,14 @@ public class GlobalNavigationAction implements NavigationAction {
   private final Views views;
   private final Settings settings;
   private final ResourceTypes resourceTypes;
+  private final UserSession userSession;
 
-  public GlobalNavigationAction(ActiveDashboardDao activeDashboardDao, Views views, Settings settings, ResourceTypes resourceTypes) {
+  public GlobalNavigationAction(ActiveDashboardDao activeDashboardDao, Views views, Settings settings, ResourceTypes resourceTypes, UserSession userSession) {
     this.activeDashboardDao = activeDashboardDao;
     this.views = views;
     this.settings = settings;
     this.resourceTypes = resourceTypes;
+    this.userSession = userSession;
   }
 
   @Override
@@ -64,8 +65,6 @@ public class GlobalNavigationAction implements NavigationAction {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession userSession = UserSession.get();
-
     List<DashboardDto> dashboards = activeDashboardDao.selectGlobalDashboardsForUserLogin(userSession.login());
     if (dashboards.isEmpty()) {
       dashboards = activeDashboardDao.selectGlobalDashboardsForUserLogin(ANONYMOUS);
index 83bf6c6312e923de97cee139e7d0f9ba677b89ef..05aa5cf92626356e39a8ec40189936d173048329 100644 (file)
@@ -38,11 +38,13 @@ public class SettingsNavigationAction implements NavigationAction {
   private final Settings settings;
   private final Views views;
   private final I18n i18n;
+  private final UserSession userSession;
 
-  public SettingsNavigationAction(Settings settings, Views views, I18n i18n) {
+  public SettingsNavigationAction(Settings settings, Views views, I18n i18n, UserSession userSession) {
     this.views = views;
     this.settings = settings;
     this.i18n = i18n;
+    this.userSession = userSession;
   }
 
   @Override
@@ -61,7 +63,6 @@ public class SettingsNavigationAction implements NavigationAction {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession userSession = UserSession.get();
     boolean isAdmin = userSession.hasGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
 
     JsonWriter json = response.newJsonWriter().beginObject();
@@ -72,7 +73,7 @@ public class SettingsNavigationAction implements NavigationAction {
     if (isAdmin) {
       for (ViewProxy<Page> page : views.getPages(NavigationSection.CONFIGURATION, null, null, null, null)) {
         json.beginObject()
-          .prop("name", i18n.message(UserSession.get().locale(), String.format("%s.page", page.getTitle()), page.getTitle()))
+          .prop("name", i18n.message(userSession.locale(), String.format("%s.page", page.getTitle()), page.getTitle()))
           .prop("url", getPageUrl(page))
           .endObject();
       }
diff --git a/server/sonar-server/src/main/java/org/sonar/server/user/AbstractUserSession.java b/server/sonar-server/src/main/java/org/sonar/server/user/AbstractUserSession.java
new file mode 100644 (file)
index 0000000..e83ed9b
--- /dev/null
@@ -0,0 +1,178 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.user;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Strings;
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Sets;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
+import org.sonar.api.security.DefaultGroups;
+import org.sonar.server.exceptions.ForbiddenException;
+import org.sonar.server.exceptions.UnauthorizedException;
+
+import static com.google.common.collect.Lists.newArrayList;
+import static com.google.common.collect.Maps.newHashMap;
+
+public abstract class AbstractUserSession<T extends AbstractUserSession> implements UserSession {
+  protected static final String INSUFFICIENT_PRIVILEGES_MESSAGE = "Insufficient privileges";
+
+  protected Integer userId;
+  protected String login;
+  protected Set<String> userGroups = Sets.newHashSet(DefaultGroups.ANYONE);
+  protected List<String> globalPermissions = Collections.emptyList();
+  protected HashMultimap<String, String> projectKeyByPermission = HashMultimap.create();
+  protected HashMultimap<String, String> projectUuidByPermission = HashMultimap.create();
+  protected Map<String, String> projectUuidByComponentUuid = newHashMap();
+  protected List<String> projectPermissions = newArrayList();
+  protected String name;
+  protected Locale locale = Locale.ENGLISH;
+
+  private final Class<T> clazz;
+
+  protected AbstractUserSession(Class<T> clazz) {
+    this.clazz = clazz;
+  }
+
+  @Override
+  @CheckForNull
+  public String login() {
+    return login;
+  }
+
+  protected T setLogin(@Nullable String s) {
+    this.login = Strings.emptyToNull(s);
+    return clazz.cast(this);
+  }
+
+  @Override
+  @CheckForNull
+  public String name() {
+    return name;
+  }
+
+  protected T setName(@Nullable String s) {
+    this.name = Strings.emptyToNull(s);
+    return clazz.cast(this);
+  }
+
+  @Override
+  @CheckForNull
+  public Integer userId() {
+    return userId;
+  }
+
+  protected T setUserId(@Nullable Integer userId) {
+    this.userId = userId;
+    return clazz.cast(this);
+  }
+
+  @Override
+  public Set<String> userGroups() {
+    return userGroups;
+  }
+
+  protected T setUserGroups(@Nullable String... userGroups) {
+    if (userGroups != null) {
+      this.userGroups.addAll(Arrays.asList(userGroups));
+    }
+    return clazz.cast(this);
+  }
+
+  @Override
+  public boolean isLoggedIn() {
+    return login != null;
+  }
+
+  @Override
+  public Locale locale() {
+    return locale;
+  }
+
+  protected T setLocale(@Nullable Locale l) {
+    this.locale = Objects.firstNonNull(l, Locale.ENGLISH);
+    return clazz.cast(this);
+  }
+
+  @Override
+  public UserSession checkLoggedIn() {
+    if (login == null) {
+      throw new UnauthorizedException("Authentication is required");
+    }
+    return this;
+  }
+
+  @Override
+  public UserSession checkGlobalPermission(String globalPermission) {
+    return checkGlobalPermission(globalPermission, null);
+  }
+
+  @Override
+  public UserSession checkGlobalPermission(String globalPermission, @Nullable String errorMessage) {
+    if (!hasGlobalPermission(globalPermission)) {
+      throw new ForbiddenException(errorMessage != null ? errorMessage : INSUFFICIENT_PRIVILEGES_MESSAGE);
+    }
+    return this;
+  }
+
+  @Override
+  public boolean hasGlobalPermission(String globalPermission) {
+    return globalPermissions().contains(globalPermission);
+  }
+
+  @Override
+  public UserSession checkProjectPermission(String projectPermission, String projectKey) {
+    if (!hasProjectPermission(projectPermission, projectKey)) {
+      throw new ForbiddenException(INSUFFICIENT_PRIVILEGES_MESSAGE);
+    }
+    return this;
+  }
+
+  @Override
+  public UserSession checkProjectUuidPermission(String projectPermission, String projectUuid) {
+    if (!hasProjectPermissionByUuid(projectPermission, projectUuid)) {
+      throw new ForbiddenException(INSUFFICIENT_PRIVILEGES_MESSAGE);
+    }
+    return this;
+  }
+
+  @Override
+  public UserSession checkComponentPermission(String projectPermission, String componentKey) {
+    if (!hasComponentPermission(projectPermission, componentKey)) {
+      throw new ForbiddenException(INSUFFICIENT_PRIVILEGES_MESSAGE);
+    }
+    return this;
+  }
+
+  @Override
+  public UserSession checkComponentUuidPermission(String permission, String componentUuid) {
+    if (!hasComponentUuidPermission(permission, componentUuid)) {
+      throw new ForbiddenException(INSUFFICIENT_PRIVILEGES_MESSAGE);
+    }
+    return this;
+  }
+}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/user/AnonymousUserSession.java b/server/sonar-server/src/main/java/org/sonar/server/user/AnonymousUserSession.java
new file mode 100644 (file)
index 0000000..03dab8e
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.user;
+
+import java.util.Collections;
+import java.util.List;
+
+public final class AnonymousUserSession extends AbstractUserSession<AnonymousUserSession> {
+  public static final UserSession INSTANCE = new AnonymousUserSession();
+
+  private AnonymousUserSession() {
+    super(AnonymousUserSession.class);
+  }
+
+  @Override
+  public List<String> globalPermissions() {
+    return Collections.emptyList();
+  }
+
+  @Override
+  public boolean hasProjectPermission(String permission, String projectKey) {
+    return false;
+  }
+
+  @Override
+  public boolean hasProjectPermissionByUuid(String permission, String projectUuid) {
+    return false;
+  }
+
+  @Override
+  public boolean hasComponentPermission(String permission, String componentKey) {
+    return false;
+  }
+
+  @Override
+  public boolean hasComponentUuidPermission(String permission, String componentUuid) {
+    return false;
+  }
+}
index 9dfcea527a2a2f88a63c421266380d754095f2cb..3655ee6661da68d6fc495394bad793908ccc6c5c 100644 (file)
@@ -41,11 +41,13 @@ public class DefaultUserService implements RubyUserService {
   private final UserIndex userIndex;
   private final UserUpdater userUpdater;
   private final UserFinder finder;
+  private final UserSession userSession;
 
-  public DefaultUserService(UserIndex userIndex, UserUpdater userUpdater, UserFinder finder) {
+  public DefaultUserService(UserIndex userIndex, UserUpdater userUpdater, UserFinder finder, UserSession userSession) {
     this.userIndex = userIndex;
     this.userUpdater = userUpdater;
     this.finder = finder;
+    this.userSession = userSession;
   }
 
   @Override
@@ -108,7 +110,6 @@ public class DefaultUserService implements RubyUserService {
     if (Strings.isNullOrEmpty(login)) {
       throw new BadRequestException("Login is missing");
     }
-    UserSession userSession = UserSession.get();
     userSession.checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
     if (Objects.equal(userSession.login(), login)) {
       throw new BadRequestException("Self-deactivation is not possible");
index 954191b136bc89711b015d82c6b79b7765841ec0..d5fdc5674c9971cdf7fccdd434031290a757d4b3 100644 (file)
@@ -19,6 +19,8 @@
  */
 package org.sonar.server.user;
 
+import java.util.Collections;
+import java.util.List;
 import org.sonar.core.permission.GlobalPermissions;
 
 import java.util.Locale;
@@ -51,27 +53,63 @@ public final class DoPrivileged {
    * to the execution of the {@link #doPrivileged()} method.
    */
   public abstract static class Task {
+    private final ThreadLocalUserSession threadLocalUserSession;
+    private UserSession oldUserSession;
+
+    protected Task(ThreadLocalUserSession threadLocalUserSession) {
+      this.threadLocalUserSession = threadLocalUserSession;
+    }
 
     /**
      * Code placed in this method will be executed in a privileged environment.
      */
     protected abstract void doPrivileged();
 
+    private static class PrivilegedUserSession extends AbstractUserSession<PrivilegedUserSession> {
+
+      private PrivilegedUserSession() {
+        super(PrivilegedUserSession.class);
+      }
+
+      @Override
+      public boolean hasGlobalPermission(String globalPermission) {
+        return true;
+      }
+
+      @Override
+      public List<String> globalPermissions() {
+        return Collections.emptyList();
+      }
+
+      @Override
+      public boolean hasProjectPermission(String permission, String projectKey) {
+        return true;
+      }
+
+      @Override
+      public boolean hasProjectPermissionByUuid(String permission, String projectUuid) {
+        return true;
+      }
+
+      @Override
+      public boolean hasComponentPermission(String permission, String componentKey) {
+        return true;
+      }
+
+      @Override
+      public boolean hasComponentUuidPermission(String permission, String componentUuid) {
+        return true;
+      }
+    }
+
     private void start() {
-      UserSession.set(new UserSession() {
-        @Override
-        public boolean hasGlobalPermission(String globalPermission) {
-          return true;
-        }
-        @Override
-        public boolean hasProjectPermission(String permission, String projectKey) {
-          return true;
-        }
-      }.setLocale(Locale.getDefault()));
+      oldUserSession = threadLocalUserSession.get();
+      threadLocalUserSession.set(new PrivilegedUserSession().setLocale(Locale.getDefault()));
     }
   
     private void stop() {
-      UserSession.remove();
+      threadLocalUserSession.remove();
+      threadLocalUserSession.set(oldUserSession);
     }
   }
 }
index bd8dc0f9960ada02c0d15e1cba398bb133c9826e..c58d0dd2c1661c670d24286c506a1e813b23d13c 100644 (file)
  */
 package org.sonar.server.user;
 
-import org.sonar.server.ui.JRubyI18n;
+import java.util.List;
 
 import javax.annotation.Nullable;
 
-import java.util.List;
+import org.sonar.core.platform.ComponentContainer;
+import org.sonar.core.resource.ResourceDao;
+import org.sonar.core.user.AuthorizationDao;
+import org.sonar.server.platform.Platform;
+import org.sonar.server.ui.JRubyI18n;
+
+import com.google.common.annotations.VisibleForTesting;
 
 public class RubyUserSession {
+
+  private static RubyUserSession instance;
+
+  private static RubyUserSession getInstance() {
+    if (instance == null) {
+      instance = new RubyUserSession(Platform.getInstance());
+    }
+    return instance;
+  }
+
+  private final Platform platform;
+
   /**
    * Invoked by Ruby code - see application_controller.rb
    */
   public static void setSession(@Nullable Integer userId, @Nullable String login, @Nullable String name, @Nullable List<String> userGroups, @Nullable String localeRubyKey) {
-    UserSession session = new UserSession()
+    getInstance().setSessionImpl(userId, login, name, userGroups, localeRubyKey);
+  }
+
+  @VisibleForTesting
+  RubyUserSession(Platform platform) {
+    // Utility class
+    this.platform = platform;
+  }
+
+  public void setSessionImpl(@Nullable Integer userId, @Nullable String login, @Nullable String name, @Nullable List<String> userGroups, @Nullable String localeRubyKey) {
+    ComponentContainer container = platform.getContainer();
+    ThreadLocalUserSession threadLocalUserSession = container.getComponentByType(ThreadLocalUserSession.class);
+
+    UserSession session = new ServerUserSession(container.getComponentByType(AuthorizationDao.class),
+      container.getComponentByType(ResourceDao.class))
       .setLogin(login)
       .setName(name)
       .setUserId(userId)
       .setUserGroups(userGroups != null ? userGroups.toArray(new String[userGroups.size()]) : null)
       .setLocale(JRubyI18n.toLocale(localeRubyKey));
-    UserSession.set(session);
-  }
-
-  private RubyUserSession() {
-    // Utility class
+    threadLocalUserSession.set(session);
   }
 
 }
diff --git a/server/sonar-server/src/main/java/org/sonar/server/user/ServerUserSession.java b/server/sonar-server/src/main/java/org/sonar/server/user/ServerUserSession.java
new file mode 100644 (file)
index 0000000..454caa8
--- /dev/null
@@ -0,0 +1,140 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.user;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import org.sonar.api.security.DefaultGroups;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
+import org.sonar.core.permission.GlobalPermissions;
+import org.sonar.core.resource.ResourceDao;
+import org.sonar.core.resource.ResourceDto;
+import org.sonar.core.user.AuthorizationDao;
+
+import static com.google.common.collect.Maps.newHashMap;
+import static com.google.common.collect.Sets.newHashSet;
+
+/**
+ * Part of the current HTTP session
+ */
+public class ServerUserSession extends AbstractUserSession<ServerUserSession>
+    implements UserSession {
+
+  private static final Logger LOG = Loggers.get(ServerUserSession.class);
+
+  private Map<String, String> projectKeyByComponentKey = newHashMap();
+
+  private final AuthorizationDao authorizationDao;
+  private final ResourceDao resourceDao;
+
+  ServerUserSession(AuthorizationDao authorizationDao, ResourceDao resourceDao) {
+    super(ServerUserSession.class);
+    this.globalPermissions = null;
+    this.authorizationDao = authorizationDao;
+    this.resourceDao = resourceDao;
+    // Do not forget that when forceAuthentication is set to true, the Anyone group should not be set (but this will be check when
+    // authentication will be done in Java)
+    this.userGroups = newHashSet(DefaultGroups.ANYONE);
+  }
+
+  @Override
+  public List<String> globalPermissions() {
+    if (globalPermissions == null) {
+      List<String> permissionKeys = authorizationDao.selectGlobalPermissions(login);
+      globalPermissions = new ArrayList<>();
+      for (String permissionKey : permissionKeys) {
+        if (!GlobalPermissions.ALL.contains(permissionKey)) {
+          LOG.warn("Ignoring unknown permission {} for user {}", permissionKey, login);
+        } else {
+          globalPermissions.add(permissionKey);
+        }
+      }
+    }
+    return globalPermissions;
+  }
+
+  @Override
+  public boolean hasProjectPermission(String permission, String projectKey) {
+    if (!projectPermissions.contains(permission)) {
+      Collection<String> projectKeys = authorizationDao.selectAuthorizedRootProjectsKeys(userId, permission);
+      for (String key : projectKeys) {
+        projectKeyByPermission.put(permission, key);
+      }
+      projectPermissions.add(permission);
+    }
+    return projectKeyByPermission.get(permission).contains(projectKey);
+  }
+
+  @Override
+  public boolean hasProjectPermissionByUuid(String permission, String projectUuid) {
+    if (!projectPermissions.contains(permission)) {
+      Collection<String> projectUuids = authorizationDao.selectAuthorizedRootProjectsUuids(userId, permission);
+      addProjectPermission(permission, projectUuids);
+    }
+    return projectUuidByPermission.get(permission).contains(projectUuid);
+  }
+
+  private void addProjectPermission(String permission, Collection<String> authorizedProjectUuids) {
+    for (String key : authorizedProjectUuids) {
+      projectUuidByPermission.put(permission, key);
+    }
+    projectPermissions.add(permission);
+  }
+
+  @Override
+  public boolean hasComponentPermission(String permission, String componentKey) {
+    String projectKey = projectKeyByComponentKey.get(componentKey);
+    if (projectKey == null) {
+      ResourceDto project = resourceDao.getRootProjectByComponentKey(componentKey);
+      if (project == null) {
+        return false;
+      }
+      projectKey = project.getKey();
+    }
+    boolean hasComponentPermission = hasProjectPermission(permission, projectKey);
+    if (hasComponentPermission) {
+      projectKeyByComponentKey.put(componentKey, projectKey);
+      return true;
+    }
+    return false;
+  }
+
+  @Override
+  public boolean hasComponentUuidPermission(String permission, String componentUuid) {
+    String projectUuid = projectUuidByComponentUuid.get(componentUuid);
+    if (projectUuid == null) {
+      ResourceDto project = resourceDao.getResource(componentUuid);
+      if (project == null) {
+        return false;
+      }
+      projectUuid = project.getProjectUuid();
+    }
+    boolean hasComponentPermission = hasProjectPermissionByUuid(permission, projectUuid);
+    if (hasComponentPermission) {
+      projectUuidByComponentUuid.put(componentUuid, projectUuid);
+      return true;
+    }
+    return false;
+  }
+
+}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/user/ThreadLocalUserSession.java b/server/sonar-server/src/main/java/org/sonar/server/user/ThreadLocalUserSession.java
new file mode 100644 (file)
index 0000000..2a8b84e
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.user;
+
+import com.google.common.base.Objects;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
+
+/**
+ * Part of the current HTTP session
+ */
+public class ThreadLocalUserSession implements UserSession {
+
+  private static final ThreadLocal<UserSession> THREAD_LOCAL = new ThreadLocal<UserSession>();
+
+  public UserSession get() {
+    return Objects.firstNonNull(THREAD_LOCAL.get(), AnonymousUserSession.INSTANCE);
+  }
+
+  public void set(UserSession session) {
+    THREAD_LOCAL.set(session);
+  }
+
+  public void remove() {
+    THREAD_LOCAL.remove();
+  }
+
+  public boolean hasSession() {
+    return THREAD_LOCAL.get() != null;
+  }
+
+  @Override
+  @CheckForNull
+  public String login() {
+    return get().login();
+  }
+
+  @Override
+  @CheckForNull
+  public String name() {
+    return get().name();
+  }
+
+  @Override
+  @CheckForNull
+  public Integer userId() {
+    return get().userId();
+  }
+
+  @Override
+  public Set<String> userGroups() {
+    return get().userGroups();
+  }
+
+  @Override
+  public boolean isLoggedIn() {
+    return get().isLoggedIn();
+  }
+
+  @Override
+  public Locale locale() {
+    return get().locale();
+  }
+
+  @Override
+  public UserSession checkLoggedIn() {
+    return get().checkLoggedIn();
+  }
+
+  @Override
+  public UserSession checkGlobalPermission(String globalPermission) {
+    return get().checkGlobalPermission(globalPermission);
+  }
+
+  @Override
+  public UserSession checkGlobalPermission(String globalPermission, @Nullable String errorMessage) {
+    return get().checkGlobalPermission(globalPermission, errorMessage);
+  }
+
+  @Override
+  public boolean hasGlobalPermission(String globalPermission) {
+    return get().hasGlobalPermission(globalPermission);
+  }
+
+  @Override
+  public List<String> globalPermissions() {
+    return get().globalPermissions();
+  }
+
+  @Override
+  public UserSession checkProjectPermission(String projectPermission, String projectKey) {
+    return get().checkProjectPermission(projectPermission, projectKey);
+  }
+
+  @Override
+  public UserSession checkProjectUuidPermission(String projectPermission, String projectUuid) {
+    return get().checkProjectUuidPermission(projectPermission, projectUuid);
+  }
+
+  @Override
+  public boolean hasProjectPermission(String permission, String projectKey) {
+    return get().hasProjectPermission(permission, projectKey);
+  }
+
+  @Override
+  public boolean hasProjectPermissionByUuid(String permission, String projectUuid) {
+    return get().hasProjectPermissionByUuid(permission, projectUuid);
+  }
+
+  @Override
+  public UserSession checkComponentPermission(String projectPermission, String componentKey) {
+    return get().checkComponentPermission(projectPermission, componentKey);
+  }
+
+  @Override
+  public UserSession checkComponentUuidPermission(String permission, String componentUuid) {
+    return get().checkComponentUuidPermission(permission, componentUuid);
+  }
+
+  @Override
+  public boolean hasComponentPermission(String permission, String componentKey) {
+    return get().hasComponentPermission(permission, componentKey);
+  }
+
+  @Override
+  public boolean hasComponentUuidPermission(String permission, String componentUuid) {
+    return get().hasComponentUuidPermission(permission, componentUuid);
+  }
+}
index a49b0e37d487d088c1d632e596b6364d51c65a82..9e683613dfd3b0656151b86a6e6ff39524f5b608 100644 (file)
  */
 package org.sonar.server.user;
 
-import com.google.common.base.Objects;
-import com.google.common.base.Strings;
-import com.google.common.collect.HashMultimap;
-import org.sonar.api.security.DefaultGroups;
-import org.sonar.api.utils.log.Logger;
-import org.sonar.api.utils.log.Loggers;
-import org.sonar.core.permission.GlobalPermissions;
-import org.sonar.core.resource.ResourceDao;
-import org.sonar.core.resource.ResourceDto;
-import org.sonar.core.user.AuthorizationDao;
-import org.sonar.server.exceptions.ForbiddenException;
-import org.sonar.server.exceptions.UnauthorizedException;
-import org.sonar.server.platform.Platform;
-
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
 import java.util.List;
 import java.util.Locale;
-import java.util.Map;
 import java.util.Set;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
 
-import static com.google.common.collect.Lists.newArrayList;
-import static com.google.common.collect.Maps.newHashMap;
-import static com.google.common.collect.Sets.newHashSet;
-
-/**
- * Part of the current HTTP session
- */
-public class UserSession {
-
-  public static final UserSession ANONYMOUS = new UserSession();
-
-  private static final ThreadLocal<UserSession> THREAD_LOCAL = new ThreadLocal<UserSession>();
-  private static final Logger LOG = Loggers.get(UserSession.class);
-  private static final String INSUFFICIENT_PRIVILEGES_MESSAGE = "Insufficient privileges";
-
-  private Integer userId;
-  private String login;
-  private String name;
-  private Set<String> userGroups;
-  private Locale locale = Locale.ENGLISH;
-  List<String> globalPermissions = null;
-
-  HashMultimap<String, String> projectKeyByPermission = HashMultimap.create();
-  HashMultimap<String, String> projectUuidByPermission = HashMultimap.create();
-  Map<String, String> projectKeyByComponentKey = newHashMap();
-  Map<String, String> projectUuidByComponentUuid = newHashMap();
-  List<String> projectPermissions = newArrayList();
-
-  UserSession() {
-    // Do not forget that when forceAuthentication is set to true, the Anyone group should not be set (but this will be check when
-    // authentication will be done in Java)
-    userGroups = newHashSet(DefaultGroups.ANYONE);
-  }
-
+public interface UserSession {
   @CheckForNull
-  public String login() {
-    return login;
-  }
-
-  UserSession setLogin(@Nullable String s) {
-    this.login = Strings.emptyToNull(s);
-    return this;
-  }
+  String login();
 
   @CheckForNull
-  public String name() {
-    return name;
-  }
-
-  UserSession setName(@Nullable String s) {
-    this.name = Strings.emptyToNull(s);
-    return this;
-  }
+  String name();
 
   @CheckForNull
-  public Integer userId() {
-    return userId;
-  }
-
-  UserSession setUserId(@Nullable Integer userId) {
-    this.userId = userId;
-    return this;
-  }
-
-  public Set<String> userGroups() {
-    return userGroups;
-  }
-
-  UserSession setUserGroups(@Nullable String... userGroups) {
-    if (userGroups != null) {
-      this.userGroups.addAll(Arrays.asList(userGroups));
-    }
-    return this;
-  }
+  Integer userId();
 
-  public boolean isLoggedIn() {
-    return login != null;
-  }
+  Set<String> userGroups();
 
-  public Locale locale() {
-    return locale;
-  }
+  boolean isLoggedIn();
 
-  UserSession setLocale(@Nullable Locale l) {
-    this.locale = Objects.firstNonNull(l, Locale.ENGLISH);
-    return this;
-  }
+  Locale locale();
 
-  public UserSession checkLoggedIn() {
-    if (login == null) {
-      throw new UnauthorizedException("Authentication is required");
-    }
-    return this;
-  }
+  /**
+   * Ensures that user is logged in otherwise throws {@link org.sonar.server.exceptions.UnauthorizedException}.
+   */
+  UserSession checkLoggedIn();
 
   /**
-   * Ensures that user implies the specified global permission. If not a {@link org.sonar.server.exceptions.ForbiddenException} is thrown.
+   * Ensures that user implies the specified global permission, otherwise throws a {@link org.sonar.server.exceptions.ForbiddenException}.
    */
-  public UserSession checkGlobalPermission(String globalPermission) {
-    return checkGlobalPermission(globalPermission, null);
-  }
+  UserSession checkGlobalPermission(String globalPermission);
 
-  public UserSession checkGlobalPermission(String globalPermission, @Nullable String errorMessage) {
-    if (!hasGlobalPermission(globalPermission)) {
-      throw new ForbiddenException(errorMessage != null ? errorMessage : INSUFFICIENT_PRIVILEGES_MESSAGE);
-    }
-    return this;
-  }
+  /**
+   * Ensures that user implies the specified global permission, otherwise throws a {@link org.sonar.server.exceptions.ForbiddenException} with
+   * the specified error message.
+   */
+  UserSession checkGlobalPermission(String globalPermission, @Nullable String errorMessage);
 
   /**
    * Does the user have the given permission ?
    */
-  public boolean hasGlobalPermission(String globalPermission) {
-    return globalPermissions().contains(globalPermission);
-  }
+  boolean hasGlobalPermission(String globalPermission);
 
-  public List<String> globalPermissions() {
-    if (globalPermissions == null) {
-      List<String> permissionKeys = authorizationDao().selectGlobalPermissions(login);
-      globalPermissions = new ArrayList<String>();
-      for (String permissionKey : permissionKeys) {
-        if (!GlobalPermissions.ALL.contains(permissionKey)) {
-          LOG.warn("Ignoring unknown permission {} for user {}", permissionKey, login);
-        } else {
-          globalPermissions.add(permissionKey);
-        }
-      }
-    }
-    return globalPermissions;
-  }
+  List<String> globalPermissions();
 
   /**
-   * Ensures that user implies the specified project permission. If not a {@link org.sonar.server.exceptions.ForbiddenException} is thrown.
+   * Ensures that user implies the specified project permission, otherwise throws a {@link org.sonar.server.exceptions.ForbiddenException}.
    */
-  public UserSession checkProjectPermission(String projectPermission, String projectKey) {
-    if (!hasProjectPermission(projectPermission, projectKey)) {
-      throw new ForbiddenException(INSUFFICIENT_PRIVILEGES_MESSAGE);
-    }
-    return this;
-  }
+  UserSession checkProjectPermission(String projectPermission, String projectKey);
 
   /**
-   * Ensures that user implies the specified project permission. If not a {@link org.sonar.server.exceptions.ForbiddenException} is thrown.
+   * Ensures that user implies the specified project permission, otherwise throws a {@link org.sonar.server.exceptions.ForbiddenException}.
    */
-  public UserSession checkProjectUuidPermission(String projectPermission, String projectUuid) {
-    if (!hasProjectPermissionByUuid(projectPermission, projectUuid)) {
-      throw new ForbiddenException(INSUFFICIENT_PRIVILEGES_MESSAGE);
-    }
-    return this;
-  }
+  UserSession checkProjectUuidPermission(String projectPermission, String projectUuid);
 
   /**
    * Does the user have the given project permission ?
    */
-  public boolean hasProjectPermission(String permission, String projectKey) {
-    if (!projectPermissions.contains(permission)) {
-      Collection<String> projectKeys = authorizationDao().selectAuthorizedRootProjectsKeys(userId, permission);
-      for (String key : projectKeys) {
-        projectKeyByPermission.put(permission, key);
-      }
-      projectPermissions.add(permission);
-    }
-    return projectKeyByPermission.get(permission).contains(projectKey);
-  }
+  boolean hasProjectPermission(String permission, String projectKey);
 
   /**
    * Does the user have the given project permission ?
    */
-  public boolean hasProjectPermissionByUuid(String permission, String projectUuid) {
-    if (!projectPermissions.contains(permission)) {
-      Collection<String> projectUuids = authorizationDao().selectAuthorizedRootProjectsUuids(userId, permission);
-      for (String key : projectUuids) {
-        projectUuidByPermission.put(permission, key);
-      }
-      projectPermissions.add(permission);
-    }
-    return projectUuidByPermission.get(permission).contains(projectUuid);
-  }
+  boolean hasProjectPermissionByUuid(String permission, String projectUuid);
 
   /**
-   * Ensures that user implies the specified project permission on a component. If not a {@link org.sonar.server.exceptions.ForbiddenException} is thrown.
+   * Ensures that user implies the specified project permission on a component, otherwise throws a {@link org.sonar.server.exceptions.ForbiddenException}.
    */
-  public UserSession checkComponentPermission(String projectPermission, String componentKey) {
-    if (!hasComponentPermission(projectPermission, componentKey)) {
-      throw new ForbiddenException(INSUFFICIENT_PRIVILEGES_MESSAGE);
-    }
-    return this;
-  }
+  UserSession checkComponentPermission(String projectPermission, String componentKey);
 
   /**
-   * Ensures that user implies the specified component permission on a component. If not a {@link org.sonar.server.exceptions.ForbiddenException} is thrown.
+   * Ensures that user implies the specified component permission on a component, otherwise throws a {@link org.sonar.server.exceptions.ForbiddenException}.
    */
-  public UserSession checkComponentUuidPermission(String permission, String componentUuid) {
-    if (!hasComponentUuidPermission(permission, componentUuid)) {
-      throw new ForbiddenException(INSUFFICIENT_PRIVILEGES_MESSAGE);
-    }
-    return this;
-  }
+  UserSession checkComponentUuidPermission(String permission, String componentUuid);
 
   /**
    * Does the user have the given project permission for a component key ?
    */
-  public boolean hasComponentPermission(String permission, String componentKey) {
-    String projectKey = projectKeyByComponentKey.get(componentKey);
-    if (projectKey == null) {
-      ResourceDto project = resourceDao().getRootProjectByComponentKey(componentKey);
-      if (project == null) {
-        return false;
-      }
-      projectKey = project.getKey();
-    }
-    boolean hasComponentPermission = hasProjectPermission(permission, projectKey);
-    if (hasComponentPermission) {
-      projectKeyByComponentKey.put(componentKey, projectKey);
-      return true;
-    }
-    return false;
-  }
+  boolean hasComponentPermission(String permission, String componentKey);
 
   /**
    * Does the user have the given project permission for a component uuid ?
    */
-  public boolean hasComponentUuidPermission(String permission, String componentUuid) {
-    String projectUuid = projectUuidByComponentUuid.get(componentUuid);
-    if (projectUuid == null) {
-      ResourceDto project = resourceDao().getResource(componentUuid);
-      if (project == null) {
-        return false;
-      }
-      projectUuid = project.getProjectUuid();
-    }
-    boolean hasComponentPermission = hasProjectPermissionByUuid(permission, projectUuid);
-    if (hasComponentPermission) {
-      projectUuidByComponentUuid.put(componentUuid, projectUuid);
-      return true;
-    }
-    return false;
-  }
-
-  AuthorizationDao authorizationDao() {
-    return Platform.component(AuthorizationDao.class);
-  }
-
-  ResourceDao resourceDao() {
-    return Platform.component(ResourceDao.class);
-  }
-
-  public static UserSession get() {
-    return Objects.firstNonNull(THREAD_LOCAL.get(), ANONYMOUS);
-  }
-
-  static void set(UserSession session) {
-    THREAD_LOCAL.set(session);
-  }
-
-  static void remove() {
-    THREAD_LOCAL.remove();
-  }
-
-  static boolean hasSession() {
-    return THREAD_LOCAL.get() != null;
-  }
+  boolean hasComponentUuidPermission(String permission, String componentUuid);
 }
index 22827db8d509d9322adc74839ad0c8612b65c0f7..fdd660f0b020696c8b34833ead63c48b0507ba47 100644 (file)
@@ -21,11 +21,23 @@ package org.sonar.server.user;
 
 import javax.servlet.*;
 import java.io.IOException;
+import org.sonar.api.utils.log.Loggers;
+import org.sonar.server.platform.Platform;
 
 /**
  * @since 3.6
  */
 public class UserSessionFilter implements Filter {
+  private final Platform platform;
+
+  public UserSessionFilter() {
+    this.platform = Platform.getInstance();
+  }
+
+  public UserSessionFilter(Platform platform) {
+    this.platform = platform;
+  }
+
   @Override
   public void init(FilterConfig filterConfig) throws ServletException {
     // nothing to do
@@ -41,7 +53,13 @@ public class UserSessionFilter implements Filter {
     try {
       chain.doFilter(servletRequest, servletResponse);
     } finally {
-      UserSession.remove();
+      ThreadLocalUserSession userSession = platform.getContainer().getComponentByType(ThreadLocalUserSession.class);
+      if (userSession == null) {
+        Loggers.get(UserSessionFilter.class).error("Can not retrieve ThreadLocalUserSession from Platform");
+      }
+      else {
+        userSession.remove();
+      }
     }
   }
 }
index c813976918a25ebea6dded46030157e3c58cbbeb..957a35a373456a99203c1e72773947303af4f209 100644 (file)
@@ -34,9 +34,11 @@ public class ChangePasswordAction implements BaseUsersWsAction {
   private static final String PARAM_PASSWORD = "password";
 
   private final UserUpdater userUpdater;
+  private final UserSession userSession;
 
-  public ChangePasswordAction(UserUpdater userUpdater) {
+  public ChangePasswordAction(UserUpdater userUpdater, UserSession userSession) {
     this.userUpdater = userUpdater;
+    this.userSession = userSession;
   }
 
   @Override
@@ -60,7 +62,7 @@ public class ChangePasswordAction implements BaseUsersWsAction {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession.get().checkLoggedIn().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
+    userSession.checkLoggedIn().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
 
     String login = request.mandatoryParam(PARAM_LOGIN);
     String password = request.mandatoryParam(PARAM_PASSWORD);
index f98d0f2018704e4027c9c5c5055c733985b5e172..47a5e021a354a7b7ebb788d44a6a7203d37850e3 100644 (file)
@@ -44,11 +44,13 @@ public class CreateAction implements BaseUsersWsAction {
   private final UserIndex index;
   private final UserUpdater userUpdater;
   private final I18n i18n;
+  private final UserSession userSession;
 
-  public CreateAction(UserIndex index, UserUpdater userUpdater, I18n i18n) {
+  public CreateAction(UserIndex index, UserUpdater userUpdater, I18n i18n, UserSession userSession) {
     this.index = index;
     this.userUpdater = userUpdater;
     this.i18n = i18n;
+    this.userSession = userSession;
   }
 
   @Override
@@ -90,7 +92,7 @@ public class CreateAction implements BaseUsersWsAction {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession.get().checkLoggedIn().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
+    userSession.checkLoggedIn().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
 
     String login = request.mandatoryParam(PARAM_LOGIN);
     NewUser newUser = NewUser.create()
@@ -128,7 +130,7 @@ public class CreateAction implements BaseUsersWsAction {
   private void writeReactivationMessage(JsonWriter json, String login) {
     json.name("infos").beginArray();
     json.beginObject();
-    String text = i18n.message(UserSession.get().locale(), "user.reactivated", "user.reactivated", login);
+    String text = i18n.message(userSession.locale(), "user.reactivated", "user.reactivated", login);
     json.prop("msg", text);
     json.endObject();
     json.endArray();
index f17dbf099c6e639a7a4f522f886dc4a7994437b7..0b28b42bb75b7c3799d92452b0a4af2e40e3e063 100644 (file)
@@ -26,6 +26,12 @@ import org.sonar.api.utils.text.JsonWriter;
 import org.sonar.server.user.UserSession;
 
 public class CurrentUserAction implements BaseUsersWsAction {
+  private final UserSession userSession;
+
+  public CurrentUserAction(UserSession userSession) {
+    this.userSession = userSession;
+  }
+
 
   @Override
   public void define(NewController context) {
@@ -39,10 +45,9 @@ public class CurrentUserAction implements BaseUsersWsAction {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession session = UserSession.get();
     JsonWriter json = response.newJsonWriter().beginObject();
 
-    writeUserDetails(json, session);
+    writeUserDetails(json, userSession);
 
     json.endObject().close();
   }
index fc53f38bf3a38a21c20d9cf16f5c4b28feb4bb09..5af978d96bce2598c3f73a6aedb209ad60d2924d 100644 (file)
@@ -37,10 +37,12 @@ public class DeactivateAction implements BaseUsersWsAction {
 
   private final UserIndex index;
   private final UserUpdater userUpdater;
+  private final UserSession userSession;
 
-  public DeactivateAction(UserIndex index, UserUpdater userUpdater) {
+  public DeactivateAction(UserIndex index, UserUpdater userUpdater, UserSession userSession) {
     this.index = index;
     this.userUpdater = userUpdater;
+    this.userSession = userSession;
   }
 
   @Override
@@ -59,7 +61,7 @@ public class DeactivateAction implements BaseUsersWsAction {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession.get().checkLoggedIn().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
+    userSession.checkLoggedIn().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
 
     String login = request.mandatoryParam(PARAM_LOGIN);
     userUpdater.deactivateUserByLogin(login);
index 1ab8413d5367aa6c13c0c81170032ce987d7a5e8..8b1adda213d3258b05e9dae9fb3a22e0e50c8184 100644 (file)
@@ -40,10 +40,12 @@ public class UpdateAction implements BaseUsersWsAction {
 
   private final UserIndex index;
   private final UserUpdater userUpdater;
+  private final UserSession userSession;
 
-  public UpdateAction(UserIndex index, UserUpdater userUpdater) {
+  public UpdateAction(UserIndex index, UserUpdater userUpdater, UserSession userSession) {
     this.index = index;
     this.userUpdater = userUpdater;
+    this.userSession = userSession;
   }
 
   @Override
@@ -75,7 +77,7 @@ public class UpdateAction implements BaseUsersWsAction {
 
   @Override
   public void handle(Request request, Response response) throws Exception {
-    UserSession.get().checkLoggedIn().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
+    userSession.checkLoggedIn().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
 
     String login = request.mandatoryParam(PARAM_LOGIN);
     UpdateUser updateUser = UpdateUser.create(login);
index 3f23aad0dbcd35a3208c8df358082fce9fe09a2e..6df77bae14db855750c8cda8eac99f9bf3fe09f3 100644 (file)
@@ -20,6 +20,9 @@
 package org.sonar.server.ws;
 
 import com.google.common.base.Charsets;
+import java.io.OutputStreamWriter;
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
 import org.picocontainer.Startable;
 import org.sonar.api.ServerSide;
 import org.sonar.api.i18n.I18n;
@@ -35,11 +38,6 @@ import org.sonar.server.exceptions.ServerException;
 import org.sonar.server.plugins.MimeTypes;
 import org.sonar.server.user.UserSession;
 
-import javax.servlet.http.HttpServletResponse;
-
-import java.io.OutputStreamWriter;
-import java.util.List;
-
 /**
  * @since 4.2
  */
@@ -47,10 +45,11 @@ import java.util.List;
 public class WebServiceEngine implements Startable {
 
   private final WebService.Context context;
-
   private final I18n i18n;
+  private final UserSession userSession;
 
-  public WebServiceEngine(WebService[] webServices, I18n i18n) {
+  public WebServiceEngine(WebService[] webServices, I18n i18n, UserSession userSession) {
+    this.userSession = userSession;
     context = new WebService.Context();
     for (WebService webService : webServices) {
       webService.define(context);
@@ -125,7 +124,7 @@ public class WebServiceEngine implements Startable {
 
     try {
       json.beginObject();
-      errors.writeJson(json, i18n, UserSession.get().locale());
+      errors.writeJson(json, i18n, userSession.locale());
       json.endObject();
     } finally {
       // TODO if close() fails, the runtime exception should not hide the
index 21a53442e810501c411b67f3736d6f19a20853c4..b4de673212ec06b1fe20d808064f083c9be9cacc 100644 (file)
  */
 package org.sonar.server.activity;
 
+import java.util.List;
+import java.util.Map;
 import org.assertj.core.data.MapEntry;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.config.Settings;
 import org.sonar.api.utils.System2;
@@ -33,9 +36,7 @@ import org.sonar.server.activity.index.ActivityIndexer;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.es.EsTester;
 import org.sonar.server.issue.db.IssueDao;
-
-import java.util.List;
-import java.util.Map;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
@@ -45,9 +46,10 @@ public class ActivityServiceTest {
 
   @ClassRule
   public static DbTester db = new DbTester();
-
   @ClassRule
   public static EsTester es = new EsTester().addDefinitions(new ActivityIndexDefinition(new Settings()));
+  @Rule
+  public UserSessionRule userSession = UserSessionRule.standalone().logon();
 
   System2 system = mock(System2.class);
   ActivityService service;
@@ -60,7 +62,7 @@ public class ActivityServiceTest {
     ActivityIndexer indexer = new ActivityIndexer(dbClient, es.client());
     // indexers are disabled by default
     indexer.setEnabled(true);
-    service = new ActivityService(dbClient, indexer);
+    service = new ActivityService(dbClient, indexer, userSession);
   }
 
   @Test
index 2bf1bb92b00fef3ce0ebd7a6433cc4765fba2645..0ddc742eca49ac01038c6da6bbacf1572b677338 100644 (file)
@@ -21,12 +21,13 @@ package org.sonar.server.activity.ws;
 
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.server.ws.WebService;
 import org.sonar.server.activity.Activity;
 import org.sonar.server.activity.ActivityService;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -35,6 +36,8 @@ public class ActivitiesWebServiceMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   ActivitiesWebService ws;
   ActivityService service;
@@ -67,8 +70,6 @@ public class ActivitiesWebServiceMediumTest {
     activity.setData("foo", "bar");
     service.save(activity);
 
-    MockUserSession.set();
-
     WsTester.TestRequest request = tester.wsTester().newGetRequest("api/activities", "search");
     WsTester.Result result = request.execute();
     assertThat(result.outputAsString()).contains("\"total\":1");
index da282ad3be15e563cd2bc75f0783e6abbc856ea3..3dee07e1a0264c13e6159a638dac2dd93cce784e 100644 (file)
@@ -19,6 +19,7 @@
  */
 package org.sonar.server.batch;
 
+import java.io.File;
 import org.apache.commons.io.FileUtils;
 import org.junit.Before;
 import org.junit.Rule;
@@ -31,16 +32,17 @@ import org.mockito.runners.MockitoJUnitRunner;
 import org.sonar.core.properties.PropertiesDao;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.issue.index.IssueIndex;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
-import java.io.File;
-
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class BatchWsTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   @Rule
   public TemporaryFolder temp = new TemporaryFolder();
@@ -56,9 +58,9 @@ public class BatchWsTest {
   @Before
   public void before() {
     tester = new WsTester(new BatchWs(batchIndex,
-      new GlobalRepositoryAction(mock(DbClient.class), mock(PropertiesDao.class)),
+      new GlobalRepositoryAction(mock(DbClient.class), mock(PropertiesDao.class), userSessionRule),
       new ProjectRepositoryAction(mock(ProjectRepositoryLoader.class)),
-      new IssuesAction(mock(DbClient.class), mock(IssueIndex.class))));
+      new IssuesAction(mock(DbClient.class), mock(IssueIndex.class), userSessionRule)));
   }
 
   @Test
index 9d5ec7d28413c534a0d81e18f26cb264b61e74fc..b6944c777381a9f5980a257d61532d0fb3939ea6 100644 (file)
@@ -35,7 +35,7 @@ import org.sonar.core.properties.PropertyDto;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.measure.persistence.MetricDao;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static com.google.common.collect.Lists.newArrayList;
@@ -44,7 +44,8 @@ import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class GlobalRepositoryActionTest {
-
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
   @Rule
   public ExpectedException thrown = ExpectedException.none();
 
@@ -65,11 +66,13 @@ public class GlobalRepositoryActionTest {
     when(dbClient.openSession(false)).thenReturn(session);
     when(dbClient.metricDao()).thenReturn(metricDao);
 
-    tester = new WsTester(new BatchWs(mock(BatchIndex.class), new GlobalRepositoryAction(dbClient, propertiesDao)));
+    tester = new WsTester(new BatchWs(mock(BatchIndex.class), new GlobalRepositoryAction(dbClient, propertiesDao, userSessionRule)));
   }
 
   @Test
   public void return_metrics() throws Exception {
+    userSessionRule.setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION, GlobalPermissions.PREVIEW_EXECUTION);
+
     when(metricDao.selectEnabled(session)).thenReturn(newArrayList(
       new MetricDto().setId(1).setKey("coverage").setDescription("Coverage by unit tests").setValueType("PERCENT").setQualitative(true)
         .setWorstValue(0d).setBestValue(100d).setOptimizedBestValue(false).setDirection(1).setEnabled(true)
@@ -81,7 +84,7 @@ public class GlobalRepositoryActionTest {
 
   @Test
   public void return_global_settings() throws Exception {
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION, GlobalPermissions.PREVIEW_EXECUTION);
+    userSessionRule.setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION, GlobalPermissions.PREVIEW_EXECUTION);
 
     when(propertiesDao.selectGlobalProperties(session)).thenReturn(newArrayList(
       new PropertyDto().setKey("foo").setValue("bar"),
@@ -95,7 +98,7 @@ public class GlobalRepositoryActionTest {
 
   @Test
   public void return_only_license_settings_without_scan_but_with_preview_permission() throws Exception {
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.PREVIEW_EXECUTION);
+    userSessionRule.setGlobalPermissions(GlobalPermissions.PREVIEW_EXECUTION);
 
     when(propertiesDao.selectGlobalProperties(session)).thenReturn(newArrayList(
       new PropertyDto().setKey("foo").setValue("bar"),
@@ -109,7 +112,7 @@ public class GlobalRepositoryActionTest {
 
   @Test
   public void access_forbidden_without_scan_and_preview_permission() throws Exception {
-    MockUserSession.set().setLogin("john").setGlobalPermissions();
+    userSessionRule.setGlobalPermissions();
 
     when(propertiesDao.selectGlobalProperties(session)).thenReturn(newArrayList(
       new PropertyDto().setKey("foo").setValue("bar"),
index 740b2f2c661071b74aeaddbb9b74a3dd1f65f13b..691cd7802f149dd6f6ec7a05880ee966100ec288 100644 (file)
 
 package org.sonar.server.batch;
 
+import java.io.ByteArrayInputStream;
+import java.util.Arrays;
+import javax.annotation.Nullable;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 import org.sonar.api.config.Settings;
@@ -48,15 +52,10 @@ import org.sonar.server.issue.index.IssueDoc;
 import org.sonar.server.issue.index.IssueIndex;
 import org.sonar.server.issue.index.IssueIndexDefinition;
 import org.sonar.server.issue.index.IssueIndexer;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 import org.sonar.test.DbTests;
 
-import javax.annotation.Nullable;
-
-import java.io.ByteArrayInputStream;
-import java.util.Arrays;
-
 import static com.google.common.collect.Lists.newArrayList;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
@@ -70,9 +69,10 @@ public class IssuesActionTest {
 
   @ClassRule
   public static DbTester db = new DbTester();
-
   @ClassRule
   public static EsTester es = new EsTester().addDefinitions(new IssueIndexDefinition(new Settings()));
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   IssueIndex issueIndex;
   IssueIndexer issueIndexer;
@@ -92,10 +92,10 @@ public class IssuesActionTest {
     this.session = db.myBatis().openSession(false);
 
     DbClient dbClient = new DbClient(db.database(), db.myBatis(), new IssueDao(db.myBatis()), new ComponentDao());
-    issueIndex = new IssueIndex(es.client(), System2.INSTANCE);
+    issueIndex = new IssueIndex(es.client(), System2.INSTANCE, userSessionRule);
     issueIndexer = new IssueIndexer(null, es.client());
     issueAuthorizationIndexer = new IssueAuthorizationIndexer(null, es.client());
-    issuesAction = new IssuesAction(dbClient, issueIndex);
+    issuesAction = new IssuesAction(dbClient, issueIndex, userSessionRule);
     componentDao = new ComponentDao();
 
     tester = new WsTester(new BatchWs(new BatchIndex(mock(Server.class)), issuesAction));
@@ -125,7 +125,7 @@ public class IssuesActionTest {
       .setChecksum(null)
       .setAssignee(null));
 
-    MockUserSession.set().setLogin("henry").setGlobalPermissions(GlobalPermissions.PREVIEW_EXECUTION);
+    userSessionRule.logon("henry").setGlobalPermissions(GlobalPermissions.PREVIEW_EXECUTION);
 
     WsTester.TestRequest request = tester.newGetRequest("batch", "issues").setParam("key", PROJECT_KEY);
 
@@ -164,7 +164,7 @@ public class IssuesActionTest {
       .setChecksum("123456")
       .setAssignee("john"));
 
-    MockUserSession.set().setLogin("henry").setGlobalPermissions(GlobalPermissions.PREVIEW_EXECUTION);
+    userSessionRule.logon("henry").setGlobalPermissions(GlobalPermissions.PREVIEW_EXECUTION);
 
     WsTester.TestRequest request = tester.newGetRequest("batch", "issues").setParam("key", PROJECT_KEY);
 
@@ -203,7 +203,7 @@ public class IssuesActionTest {
       .setChecksum("123456")
       .setAssignee("john"));
 
-    MockUserSession.set().setLogin("henry").setGlobalPermissions(GlobalPermissions.PREVIEW_EXECUTION);
+    userSessionRule.logon("henry").setGlobalPermissions(GlobalPermissions.PREVIEW_EXECUTION);
 
     WsTester.TestRequest request = tester.newGetRequest("batch", "issues").setParam("key", MODULE_KEY);
     ServerIssue serverIssue = ServerIssue.parseDelimitedFrom(new ByteArrayInputStream(request.execute().output()));
@@ -241,7 +241,7 @@ public class IssuesActionTest {
       .setChecksum("123456")
       .setAssignee("john"));
 
-    MockUserSession.set().setLogin("henry").setGlobalPermissions(GlobalPermissions.PREVIEW_EXECUTION);
+    userSessionRule.logon("henry").setGlobalPermissions(GlobalPermissions.PREVIEW_EXECUTION);
 
     WsTester.TestRequest request = tester.newGetRequest("batch", "issues").setParam("key", FILE_KEY);
     ServerIssue serverIssue = ServerIssue.parseDelimitedFrom(new ByteArrayInputStream(request.execute().output()));
@@ -278,7 +278,7 @@ public class IssuesActionTest {
       .setChecksum("123456")
       .setAssignee("john"));
 
-    MockUserSession.set().setLogin("henry").setGlobalPermissions(GlobalPermissions.PREVIEW_EXECUTION);
+    userSessionRule.logon("henry").setGlobalPermissions(GlobalPermissions.PREVIEW_EXECUTION);
 
     WsTester.TestRequest request = tester.newGetRequest("batch", "issues").setParam("key", MODULE_KEY);
     ServerIssue previousIssue = ServerIssue.parseDelimitedFrom(new ByteArrayInputStream(request.execute().output()));
@@ -317,7 +317,7 @@ public class IssuesActionTest {
       .setChecksum("123456")
       .setAssignee("john"));
 
-    MockUserSession.set().setLogin("henry").setGlobalPermissions(GlobalPermissions.PREVIEW_EXECUTION);
+    userSessionRule.logon("henry").setGlobalPermissions(GlobalPermissions.PREVIEW_EXECUTION);
 
     WsTester.TestRequest request = tester.newGetRequest("batch", "issues").setParam("key", PROJECT_KEY);
     ServerIssue serverIssue = ServerIssue.parseDelimitedFrom(new ByteArrayInputStream(request.execute().output()));
@@ -328,7 +328,7 @@ public class IssuesActionTest {
 
   @Test(expected = ForbiddenException.class)
   public void fail_without_preview_permission() throws Exception {
-    MockUserSession.set().setLogin("henry").setGlobalPermissions(GlobalPermissions.PROVISIONING);
+    userSessionRule.logon("henry").setGlobalPermissions(GlobalPermissions.PROVISIONING);
 
     WsTester.TestRequest request = tester.newGetRequest("batch", "issues").setParam("key", PROJECT_KEY);
     request.execute();
index c4074ef4536ff8301acce0a91cdb556e6e2afd20..d3901cf98fdb7447525a9535d661265ade979ea3 100644 (file)
 
 package org.sonar.server.batch;
 
-import org.sonar.core.source.db.FileSourceDto.Type;
-import org.sonar.server.source.db.FileSourceDao;
-
 import com.google.common.collect.ImmutableMap;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rule.Severity;
@@ -45,6 +46,7 @@ import org.sonar.core.qualityprofile.db.QualityProfileDto;
 import org.sonar.core.rule.RuleDto;
 import org.sonar.core.rule.RuleParamDto;
 import org.sonar.core.source.db.FileSourceDto;
+import org.sonar.core.source.db.FileSourceDto.Type;
 import org.sonar.server.component.ComponentTesting;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.ForbiddenException;
@@ -53,12 +55,9 @@ import org.sonar.server.qualityprofile.QProfileTesting;
 import org.sonar.server.qualityprofile.RuleActivation;
 import org.sonar.server.qualityprofile.RuleActivator;
 import org.sonar.server.rule.RuleTesting;
+import org.sonar.server.source.db.FileSourceDao;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
-
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import org.sonar.server.tester.UserSessionRule;
 
 import static com.google.common.collect.Lists.newArrayList;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -68,6 +67,8 @@ public class ProjectRepositoryLoaderMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester().addXoo();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbSession dbSession;
 
@@ -88,7 +89,7 @@ public class ProjectRepositoryLoaderMediumTest {
   @Test
   public void return_project_settings() {
     ComponentDto project = ComponentTesting.newProjectDto();
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, project);
     addDefaultProfile();
 
@@ -112,7 +113,7 @@ public class ProjectRepositoryLoaderMediumTest {
   @Test
   public void not_returned_secured_settings_with_only_preview_permission() {
     ComponentDto project = ComponentTesting.newProjectDto();
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.PREVIEW_EXECUTION).addProjectUuidPermissions(UserRole.USER, project.uuid());
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.PREVIEW_EXECUTION).addProjectUuidPermissions(UserRole.USER, project.uuid());
     tester.get(DbClient.class).componentDao().insert(dbSession, project);
     addDefaultProfile();
 
@@ -135,7 +136,7 @@ public class ProjectRepositoryLoaderMediumTest {
   @Test
   public void return_project_with_module_settings() {
     ComponentDto project = ComponentTesting.newProjectDto();
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, project);
     addDefaultProfile();
 
@@ -171,7 +172,7 @@ public class ProjectRepositoryLoaderMediumTest {
   @Test
   public void return_project_with_module_settings_inherited_from_project() {
     ComponentDto project = ComponentTesting.newProjectDto();
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, project);
     addDefaultProfile();
 
@@ -202,7 +203,7 @@ public class ProjectRepositoryLoaderMediumTest {
   @Test
   public void return_project_with_module_with_sub_module() {
     ComponentDto project = ComponentTesting.newProjectDto();
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, project);
     addDefaultProfile();
 
@@ -250,7 +251,7 @@ public class ProjectRepositoryLoaderMediumTest {
   @Test
   public void return_project_with_two_modules() {
     ComponentDto project = ComponentTesting.newProjectDto();
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, project);
     addDefaultProfile();
 
@@ -295,7 +296,7 @@ public class ProjectRepositoryLoaderMediumTest {
   public void return_provisioned_project_settings() {
     // No snapshot attached on the project -> provisioned project
     ComponentDto project = ComponentTesting.newProjectDto();
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, project);
     addDefaultProfile();
 
@@ -325,7 +326,7 @@ public class ProjectRepositoryLoaderMediumTest {
     // No module properties
 
     ComponentDto subModule = ComponentTesting.newModuleDto(module);
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, subModule);
 
     // Sub module properties
@@ -361,7 +362,7 @@ public class ProjectRepositoryLoaderMediumTest {
     tester.get(DbClient.class).propertiesDao().setProperty(new PropertyDto().setKey("sonar.jira.login.secured").setValue("john").setResourceId(module.getId()), dbSession);
 
     ComponentDto subModule = ComponentTesting.newModuleDto(module);
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, subModule);
 
     // Sub module properties
@@ -395,7 +396,7 @@ public class ProjectRepositoryLoaderMediumTest {
     // No module property
 
     ComponentDto subModule = ComponentTesting.newModuleDto(module);
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, subModule);
     // No sub module property
 
@@ -428,7 +429,7 @@ public class ProjectRepositoryLoaderMediumTest {
     tester.get(DbClient.class).propertiesDao().setProperty(new PropertyDto().setKey("sonar.jira.project.key").setValue("SONAR-SERVER").setResourceId(module.getId()), dbSession);
 
     ComponentDto subModule = ComponentTesting.newModuleDto(module);
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, subModule);
     // No sub module property
 
@@ -449,7 +450,7 @@ public class ProjectRepositoryLoaderMediumTest {
     Date ruleUpdatedAt = DateUtils.parseDateTime("2014-01-14T13:00:00+0100");
 
     ComponentDto project = ComponentTesting.newProjectDto();
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, project);
 
     QualityProfileDto profileDto = QProfileTesting.newDto(QProfileName.createFor(ServerTester.Xoo.KEY, "SonarQube way"), "abcd").setRulesUpdatedAt(
@@ -473,7 +474,7 @@ public class ProjectRepositoryLoaderMediumTest {
     Date ruleUpdatedAt = DateUtils.parseDateTime("2014-01-14T13:00:00+0100");
 
     ComponentDto project = ComponentTesting.newProjectDto();
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, project);
 
     QualityProfileDto profileDto = QProfileTesting.newDto(QProfileName.createFor(ServerTester.Xoo.KEY, "SonarQube way"), "abcd").setRulesUpdatedAt(
@@ -496,7 +497,7 @@ public class ProjectRepositoryLoaderMediumTest {
     Date ruleUpdatedAt = DateUtils.parseDateTime("2014-01-14T13:00:00+0100");
 
     ComponentDto project = ComponentTesting.newProjectDto();
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, project);
 
     QualityProfileDto profileDto = QProfileTesting.newDto(QProfileName.createFor(ServerTester.Xoo.KEY, "SonarQube way"), "abcd").setRulesUpdatedAt(
@@ -516,7 +517,7 @@ public class ProjectRepositoryLoaderMediumTest {
 
   @Test
   public void return_quality_profiles_even_when_project_does_not_exists() {
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     Date ruleUpdatedAt = DateUtils.parseDateTime("2014-01-14T13:00:00+0100");
 
     QualityProfileDto profileDto = QProfileTesting.newDto(QProfileName.createFor(ServerTester.Xoo.KEY, "SonarQube way"), "abcd").setRulesUpdatedAt(
@@ -540,7 +541,7 @@ public class ProjectRepositoryLoaderMediumTest {
 
     // No snapshot attached on the project -> provisioned project
     ComponentDto project = ComponentTesting.newProjectDto();
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, project);
 
     QualityProfileDto profileDto = QProfileTesting.newDto(QProfileName.createFor(ServerTester.Xoo.KEY, "SonarQube way"), "abcd").setRulesUpdatedAt(
@@ -562,7 +563,7 @@ public class ProjectRepositoryLoaderMediumTest {
   @Test
   public void fail_when_no_quality_profile_for_a_language() {
     ComponentDto project = ComponentTesting.newProjectDto().setKey("org.codehaus.sonar:sonar");
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, project);
     dbSession.commit();
 
@@ -577,7 +578,7 @@ public class ProjectRepositoryLoaderMediumTest {
   @Test
   public void return_active_rules() {
     ComponentDto project = ComponentTesting.newProjectDto();
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, project);
 
     QualityProfileDto profileDto = QProfileTesting.newDto(QProfileName.createFor(ServerTester.Xoo.KEY, "SonarQube way"), "abcd").setRulesUpdatedAt(
@@ -612,7 +613,7 @@ public class ProjectRepositoryLoaderMediumTest {
   @Test
   public void return_only_active_rules_from_project_profile() {
     ComponentDto project = ComponentTesting.newProjectDto();
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, project);
 
     RuleKey ruleKey1 = RuleKey.of("squid", "AvoidCycle");
@@ -650,7 +651,7 @@ public class ProjectRepositoryLoaderMediumTest {
   @Test
   public void return_more_than_10_active_rules() {
     ComponentDto project = ComponentTesting.newProjectDto();
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, project);
 
     QualityProfileDto profileDto = QProfileTesting.newDto(QProfileName.createFor(ServerTester.Xoo.KEY, "SonarQube way"), "abcd")
@@ -674,7 +675,7 @@ public class ProjectRepositoryLoaderMediumTest {
     Date ruleUpdatedAt = DateUtils.parseDateTime("2014-01-14T13:00:00+0100");
 
     ComponentDto project = ComponentTesting.newProjectDto();
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, project);
 
     QualityProfileDto profileDto = QProfileTesting.newDto(QProfileName.createFor(ServerTester.Xoo.KEY, "SonarQube way"), "abcd").setRulesUpdatedAt(
@@ -704,7 +705,7 @@ public class ProjectRepositoryLoaderMediumTest {
   @Test
   public void return_manual_rules() {
     ComponentDto project = ComponentTesting.newProjectDto();
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, project);
     addDefaultProfile();
 
@@ -724,7 +725,7 @@ public class ProjectRepositoryLoaderMediumTest {
 
   @Test
   public void fail_if_no_permission() {
-    MockUserSession.set().setLogin("john").setGlobalPermissions();
+    userSessionRule.logon("john").setGlobalPermissions();
 
     ComponentDto project = ComponentTesting.newProjectDto();
     tester.get(DbClient.class).componentDao().insert(dbSession, project);
@@ -740,7 +741,7 @@ public class ProjectRepositoryLoaderMediumTest {
 
   @Test
   public void fail_when_not_preview_and_only_dry_run_permission() {
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.PREVIEW_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.PREVIEW_EXECUTION);
 
     ComponentDto project = ComponentTesting.newProjectDto();
     tester.get(DbClient.class).componentDao().insert(dbSession, project);
@@ -759,7 +760,7 @@ public class ProjectRepositoryLoaderMediumTest {
   @Test
   public void return_file_data_from_single_project() {
     ComponentDto project = ComponentTesting.newProjectDto();
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, project);
     addDefaultProfile();
 
@@ -778,7 +779,7 @@ public class ProjectRepositoryLoaderMediumTest {
   @Test
   public void return_file_data_from_multi_modules() {
     ComponentDto project = ComponentTesting.newProjectDto();
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, project);
     addDefaultProfile();
 
@@ -814,7 +815,7 @@ public class ProjectRepositoryLoaderMediumTest {
     tester.get(FileSourceDao.class).insert(newFileSourceDto(projectFile).setSrcHash("123456"));
 
     ComponentDto module = ComponentTesting.newModuleDto(project);
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     tester.get(DbClient.class).componentDao().insert(dbSession, module);
 
     // File on module
index c2258e44af0d2d36fffa58a08828fafbfa32747e..b7ef762d0fb9b03a76854bd651c485cedfa9eea6 100644 (file)
@@ -22,13 +22,14 @@ package org.sonar.server.batch;
 
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.config.Settings;
 import org.sonar.api.platform.Server;
 import org.sonar.batch.protocol.input.BatchInput.User;
 import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.server.es.EsTester;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.user.index.UserDoc;
 import org.sonar.server.user.index.UserIndex;
 import org.sonar.server.user.index.UserIndexDefinition;
@@ -43,6 +44,8 @@ public class UsersActionTest {
 
   @ClassRule
   public static EsTester es = new EsTester().addDefinitions(new UserIndexDefinition(new Settings()));
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   UserIndex userIndex;
 
@@ -55,7 +58,7 @@ public class UsersActionTest {
     es.truncateIndices();
 
     userIndex = new UserIndex(es.client());
-    usersAction = new UsersAction(userIndex);
+    usersAction = new UsersAction(userIndex, userSessionRule);
 
     tester = new WsTester(new BatchWs(new BatchIndex(mock(Server.class)), usersAction));
   }
@@ -66,7 +69,7 @@ public class UsersActionTest {
       new UserDoc().setLogin("ada.lovelace").setName("Ada Lovelace").setActive(false),
       new UserDoc().setLogin("grace.hopper").setName("Grace Hopper").setActive(true));
 
-    MockUserSession.set().setLogin("sonarqtech").setGlobalPermissions(GlobalPermissions.PREVIEW_EXECUTION);
+    userSessionRule.logon("sonarqtech").setGlobalPermissions(GlobalPermissions.PREVIEW_EXECUTION);
 
     WsTester.TestRequest request = tester.newGetRequest("batch", "users").setParam("logins", "ada.lovelace,grace.hopper");
 
index 9b434ba91d1e07de5ca262dbfd575dd9dd084d11..4ef699790858af3ca7b80c483e1593af8e032c3a 100644 (file)
@@ -23,6 +23,7 @@ package org.sonar.server.component;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.security.DefaultGroups;
 import org.sonar.api.web.UserRole;
@@ -33,10 +34,10 @@ import org.sonar.core.rule.RuleDto;
 import org.sonar.server.component.db.ComponentDao;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.es.EsClient;
-import org.sonar.server.issue.index.IssueIndexDefinition;
 import org.sonar.server.issue.IssueTesting;
 import org.sonar.server.issue.db.IssueDao;
 import org.sonar.server.issue.index.IssueIndex;
+import org.sonar.server.issue.index.IssueIndexDefinition;
 import org.sonar.server.issue.index.IssueIndexer;
 import org.sonar.server.permission.InternalPermissionService;
 import org.sonar.server.permission.PermissionChange;
@@ -44,7 +45,7 @@ import org.sonar.server.rule.RuleTesting;
 import org.sonar.server.rule.db.RuleDao;
 import org.sonar.server.search.IndexClient;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -52,6 +53,8 @@ public class ComponentCleanerServiceMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbClient db;
   IndexClient index;
@@ -92,7 +95,7 @@ public class ComponentCleanerServiceMediumTest {
 
     // project can be seen by anyone
     session.commit();
-    MockUserSession.set().setLogin("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.logon("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
     tester.get(InternalPermissionService.class).addPermission(new PermissionChange().setComponentKey(project.getKey()).setGroup(DefaultGroups.ANYONE).setPermission(UserRole.USER));
 
     assertThat(countIssueAuthorizationDocs()).isEqualTo(1);
index 2f3d3ecc7860d4453bc7e92b0fef2dcb37f6f615..e3176625da28d3a06bd49949f36eec2b0f7ea828 100644 (file)
 
 package org.sonar.server.component;
 
+import java.util.Arrays;
+import java.util.Map;
 import org.assertj.core.api.Fail;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.resources.Qualifiers;
 import org.sonar.api.security.DefaultGroups;
@@ -40,10 +43,7 @@ import org.sonar.server.permission.InternalPermissionService;
 import org.sonar.server.permission.PermissionChange;
 import org.sonar.server.platform.Platform;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
-
-import java.util.Arrays;
-import java.util.Map;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.fail;
@@ -56,6 +56,8 @@ public class ComponentServiceMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbClient db;
   DbSession session;
@@ -108,7 +110,7 @@ public class ComponentServiceMediumTest {
 
     session.commit();
 
-    MockUserSession.set().setLogin("john").addProjectUuidPermissions(UserRole.ADMIN, project.uuid());
+    userSessionRule.logon("john").addProjectUuidPermissions(UserRole.ADMIN, project.uuid());
     service.updateKey(project.key(), "sample2:root");
     session.commit();
 
@@ -132,7 +134,7 @@ public class ComponentServiceMediumTest {
 
     session.commit();
 
-    MockUserSession.set().setLogin("john").addProjectUuidPermissions(UserRole.ADMIN, project.uuid());
+    userSessionRule.logon("john").addProjectUuidPermissions(UserRole.ADMIN, project.uuid());
     service.updateKey(module.key(), "sample:root2:module");
     session.commit();
 
@@ -155,7 +157,7 @@ public class ComponentServiceMediumTest {
 
     session.commit();
 
-    MockUserSession.set().setLogin("john").addProjectUuidPermissions(UserRole.ADMIN, provisionedProject.uuid());
+    userSessionRule.logon("john").addProjectUuidPermissions(UserRole.ADMIN, provisionedProject.uuid());
     service.updateKey(provisionedProject.key(), "provisionedProject2");
     session.commit();
 
@@ -167,7 +169,7 @@ public class ComponentServiceMediumTest {
   @Test(expected = ForbiddenException.class)
   public void fail_to_update_project_key_without_admin_permission() {
     ComponentDto project = createProject("sample:root");
-    MockUserSession.set().setLogin("john").addProjectUuidPermissions(UserRole.USER, project.uuid());
+    userSessionRule.logon("john").addProjectUuidPermissions(UserRole.USER, project.uuid());
     service.updateKey(project.key(), "sample2:root");
   }
 
@@ -182,7 +184,7 @@ public class ComponentServiceMediumTest {
 
     session.commit();
 
-    MockUserSession.set().setLogin("john").addProjectUuidPermissions(UserRole.ADMIN, project.uuid());
+    userSessionRule.logon("john").addProjectUuidPermissions(UserRole.ADMIN, project.uuid());
     Map<String, String> result = service.checkModuleKeysBeforeRenaming(project.key(), "sample", "sample2");
 
     assertThat(result).hasSize(2);
@@ -201,7 +203,7 @@ public class ComponentServiceMediumTest {
 
     session.commit();
 
-    MockUserSession.set().setLogin("john").addProjectUuidPermissions(UserRole.ADMIN, project.uuid());
+    userSessionRule.logon("john").addProjectUuidPermissions(UserRole.ADMIN, project.uuid());
     Map<String, String> result = service.checkModuleKeysBeforeRenaming(project.key(), "sample:root", "foo");
 
     assertThat(result).hasSize(2);
@@ -212,7 +214,7 @@ public class ComponentServiceMediumTest {
   @Test(expected = ForbiddenException.class)
   public void fail_to_check_module_keys_before_renaming_without_admin_permission() {
     ComponentDto project = createProject("sample:root");
-    MockUserSession.set().setLogin("john").addProjectUuidPermissions(UserRole.USER, project.uuid());
+    userSessionRule.logon("john").addProjectUuidPermissions(UserRole.USER, project.uuid());
     service.checkModuleKeysBeforeRenaming(project.key(), "sample", "sample2");
   }
 
@@ -227,7 +229,7 @@ public class ComponentServiceMediumTest {
 
     session.commit();
 
-    MockUserSession.set().setLogin("john").addProjectUuidPermissions(UserRole.ADMIN, project.uuid());
+    userSessionRule.logon("john").addProjectUuidPermissions(UserRole.ADMIN, project.uuid());
     service.bulkUpdateKey(project.key(), "sample", "sample2");
     session.commit();
 
@@ -251,7 +253,7 @@ public class ComponentServiceMediumTest {
 
     session.commit();
 
-    MockUserSession.set().setLogin("john").addProjectUuidPermissions(UserRole.ADMIN, provisionedProject.uuid());
+    userSessionRule.logon("john").addProjectUuidPermissions(UserRole.ADMIN, provisionedProject.uuid());
     service.bulkUpdateKey(provisionedProject.key(), "provisionedProject", "provisionedProject2");
     session.commit();
 
@@ -263,14 +265,14 @@ public class ComponentServiceMediumTest {
   @Test(expected = ForbiddenException.class)
   public void fail_to_bulk_update_project_key_without_admin_permission() {
     ComponentDto project = createProject("sample:root");
-    MockUserSession.set().setLogin("john").addProjectPermissions(UserRole.USER, project.key());
+    userSessionRule.logon("john").addProjectPermissions(UserRole.USER, project.key());
     service.bulkUpdateKey("sample:root", "sample", "sample2");
   }
 
   @Test
   public void create_project() {
     executeStartupTasksToCreateDefaultPermissionTemplate();
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.PROVISIONING);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.PROVISIONING);
 
     String key = service.create(NewComponent.create("struts", "Struts project"));
 
@@ -291,7 +293,7 @@ public class ComponentServiceMediumTest {
   @Test
   public void create_new_project_with_branch() {
     executeStartupTasksToCreateDefaultPermissionTemplate();
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.PROVISIONING);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.PROVISIONING);
 
     String key = service.create(NewComponent.create("struts", "Struts project").setBranch("origin/branch"));
 
@@ -303,7 +305,7 @@ public class ComponentServiceMediumTest {
   @Test
   public void create_view() {
     executeStartupTasksToCreateDefaultPermissionTemplate();
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.PROVISIONING);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.PROVISIONING);
 
     String key = service.create(NewComponent.create("all-project", "All Projects").setQualifier(Qualifiers.VIEW));
 
@@ -323,7 +325,7 @@ public class ComponentServiceMediumTest {
 
   @Test
   public void fail_to_create_new_component_on_invalid_key() {
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.PROVISIONING);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.PROVISIONING);
 
     try {
       service.create(NewComponent.create("struts?parent", "Struts project"));
@@ -336,7 +338,7 @@ public class ComponentServiceMediumTest {
 
   @Test
   public void fail_to_create_new_component_on_invalid_branch() {
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.PROVISIONING);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.PROVISIONING);
 
     try {
       service.create(NewComponent.create("struts", "Struts project").setBranch("origin?branch"));
@@ -349,7 +351,7 @@ public class ComponentServiceMediumTest {
 
   @Test
   public void fail_to_create_new_component_if_key_already_exists() {
-    MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.PROVISIONING);
+    userSessionRule.logon("john").setGlobalPermissions(GlobalPermissions.PROVISIONING);
 
     ComponentDto project = ComponentTesting.newProjectDto().setKey("struts");
     tester.get(ComponentDao.class).insert(session, project);
@@ -406,9 +408,8 @@ public class ComponentServiceMediumTest {
     session.commit();
 
     // project can be seen by anyone
-    MockUserSession.set().setLogin("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.logon("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
     tester.get(InternalPermissionService.class).addPermission(new PermissionChange().setComponentKey(project.getKey()).setGroup(DefaultGroups.ANYONE).setPermission(UserRole.USER));
-    MockUserSession.set();
 
     return project;
   }
index c33a23f2352ff1cc292f5a65d4d118c1281b040f..81b374179f56e741d71f79b65beea8e0722b7974 100644 (file)
 
 package org.sonar.server.component.ws;
 
+import java.util.List;
+import java.util.Locale;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -43,19 +46,24 @@ import org.sonar.server.component.db.ComponentDao;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.measure.persistence.MeasureDao;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
-import java.util.List;
-import java.util.Locale;
-
 import static com.google.common.collect.Lists.newArrayList;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.fail;
-import static org.mockito.Mockito.*;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyListOf;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class ComponentAppActionTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   static final String SUB_PROJECT_KEY = "org.codehaus.sonar:sonar-plugin-api";
   static final String COMPONENT_KEY = "org.codehaus.sonar:sonar-plugin-api:src/main/java/org/sonar/api/Plugin.java";
@@ -96,12 +104,12 @@ public class ComponentAppActionTest {
 
     when(measureDao.findByComponentKeyAndMetricKeys(eq(session), anyString(), anyListOf(String.class))).thenReturn(measures);
 
-    tester = new WsTester(new ComponentsWs(new ComponentAppAction(dbClient, durations, i18n), mock(SearchAction.class)));
+    tester = new WsTester(new ComponentsWs(new ComponentAppAction(dbClient, durations, i18n, userSessionRule), mock(SearchAction.class)));
   }
 
   @Test
   public void app() throws Exception {
-    MockUserSession.set().setLogin("john").addComponentPermission(UserRole.USER, SUB_PROJECT_KEY, COMPONENT_KEY);
+    userSessionRule.logon("john").addComponentPermission(UserRole.USER, SUB_PROJECT_KEY, COMPONENT_KEY);
     ComponentDto project = newProject();
 
     ComponentDto file = ComponentTesting.newFileDto(project)
@@ -124,7 +132,7 @@ public class ComponentAppActionTest {
 
   @Test
   public void app_with_measures() throws Exception {
-    MockUserSession.set().addComponentPermission(UserRole.USER, SUB_PROJECT_KEY, COMPONENT_KEY);
+    userSessionRule.addComponentPermission(UserRole.USER, SUB_PROJECT_KEY, COMPONENT_KEY);
     ComponentDto project = newProject();
     newComponent(project);
 
@@ -147,7 +155,7 @@ public class ComponentAppActionTest {
 
   @Test
   public void app_with_overall_measure() throws Exception {
-    MockUserSession.set().addComponentPermission(UserRole.USER, SUB_PROJECT_KEY, COMPONENT_KEY);
+    userSessionRule.addComponentPermission(UserRole.USER, SUB_PROJECT_KEY, COMPONENT_KEY);
     ComponentDto project = newProject();
     newComponent(project);
 
@@ -161,7 +169,7 @@ public class ComponentAppActionTest {
 
   @Test
   public void app_with_ut_measure() throws Exception {
-    MockUserSession.set().addComponentPermission(UserRole.USER, SUB_PROJECT_KEY, COMPONENT_KEY);
+    userSessionRule.addComponentPermission(UserRole.USER, SUB_PROJECT_KEY, COMPONENT_KEY);
     ComponentDto project = newProject();
     newComponent(project);
 
@@ -174,7 +182,7 @@ public class ComponentAppActionTest {
 
   @Test
   public void app_with_it_measure() throws Exception {
-    MockUserSession.set().addComponentPermission(UserRole.USER, SUB_PROJECT_KEY, COMPONENT_KEY);
+    userSessionRule.addComponentPermission(UserRole.USER, SUB_PROJECT_KEY, COMPONENT_KEY);
     ComponentDto project = newProject();
     newComponent(project);
 
@@ -186,7 +194,7 @@ public class ComponentAppActionTest {
 
   @Test
   public void fail_on_unknown_component() {
-    MockUserSession.set().setLogin("john").addComponentPermission(UserRole.USER, SUB_PROJECT_KEY, COMPONENT_KEY);
+    userSessionRule.logon("john").addComponentPermission(UserRole.USER, SUB_PROJECT_KEY, COMPONENT_KEY);
     when(componentDao.getNullableByUuid(session, COMPONENT_UUID)).thenReturn(null);
 
     try {
index f169e304c191939900bd8ca16fd08be5b2598e43..486e5b3374151fc9aab28366f6e6c4a8c78a1983 100644 (file)
 package org.sonar.server.component.ws;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.i18n.I18n;
 import org.sonar.api.server.ws.RailsHandler;
 import org.sonar.api.server.ws.WebService;
 import org.sonar.api.utils.Durations;
 import org.sonar.server.db.DbClient;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 public class ComponentsWsTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   WebService.Controller controller;
 
   @Before
   public void setUp() {
-    WsTester tester = new WsTester(new ComponentsWs(new ComponentAppAction(mock(DbClient.class), mock(Durations.class), mock(I18n.class)), new SearchAction(mock(DbClient.class))));
+    WsTester tester = new WsTester(new ComponentsWs(new ComponentAppAction(mock(DbClient.class), mock(Durations.class), mock(I18n.class), userSessionRule), new SearchAction(mock(DbClient.class), userSessionRule)));
     controller = tester.controller("api/components");
   }
 
index 27070552002c1c8037d3970f148d27042f88eafd..9ea902ced16ab63de685f9f677645655b58f6392 100644 (file)
@@ -25,6 +25,7 @@ import org.apache.commons.lang.StringUtils;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.server.ws.WebService.Param;
 import org.sonar.api.utils.DateUtils;
@@ -39,7 +40,7 @@ import org.sonar.server.component.SnapshotTesting;
 import org.sonar.server.component.db.ComponentDao;
 import org.sonar.server.component.db.SnapshotDao;
 import org.sonar.server.db.DbClient;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 import org.sonar.test.JsonAssert;
 
@@ -49,6 +50,8 @@ public class ProvisionedProjectsActionTest {
 
   @ClassRule
   public static DbTester db = new DbTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   WsTester ws;
   DbClient dbClient;
@@ -56,22 +59,22 @@ public class ProvisionedProjectsActionTest {
   ComponentDao componentDao;
 
   @After
-  public void tearDown() throws Exception {
+  public void tearDown() {
     dbSession.close();
   }
 
   @Before
-  public void setUp() throws Exception {
+  public void setUp() {
     dbClient = new DbClient(db.database(), db.myBatis(), new ComponentDao(), new SnapshotDao(System2.INSTANCE));
     dbSession = dbClient.openSession(false);
     componentDao = dbClient.componentDao();
     db.truncateTables();
-    ws = new WsTester(new ProjectsWs(new ProvisionedProjectsAction(dbClient)));
+    ws = new WsTester(new ProjectsWs(new ProvisionedProjectsAction(dbClient, userSessionRule)));
   }
 
   @Test
   public void all_provisioned_projects_without_analyzed_projects() throws Exception {
-    MockUserSession.set().setGlobalPermissions(UserRole.ADMIN);
+    userSessionRule.setGlobalPermissions(UserRole.ADMIN);
     ComponentDto analyzedProject = ComponentTesting.newProjectDto("analyzed-uuid-1");
     componentDao.insert(dbSession, newProvisionedProject("1"), newProvisionedProject("2"));
     analyzedProject = componentDao.insert(dbSession, analyzedProject);
@@ -86,7 +89,7 @@ public class ProvisionedProjectsActionTest {
 
   @Test
   public void provisioned_projects_with_correct_paginated() throws Exception {
-    MockUserSession.set().setGlobalPermissions(UserRole.ADMIN);
+    userSessionRule.setGlobalPermissions(UserRole.ADMIN);
     for (int i = 1; i <= 10; i++) {
       componentDao.insert(dbSession, newProvisionedProject(String.valueOf(i)));
     }
@@ -103,7 +106,7 @@ public class ProvisionedProjectsActionTest {
 
   @Test
   public void provisioned_projects_with_desired_fields() throws Exception {
-    MockUserSession.set().setGlobalPermissions(UserRole.ADMIN);
+    userSessionRule.setGlobalPermissions(UserRole.ADMIN);
     componentDao.insert(dbSession, newProvisionedProject("1"));
     dbSession.commit();
 
@@ -118,7 +121,7 @@ public class ProvisionedProjectsActionTest {
 
   @Test
   public void provisioned_projects_with_query() throws Exception {
-    MockUserSession.set().setGlobalPermissions(UserRole.ADMIN);
+    userSessionRule.setGlobalPermissions(UserRole.ADMIN);
     componentDao.insert(dbSession, newProvisionedProject("1"), newProvisionedProject("2"));
     dbSession.commit();
 
@@ -143,7 +146,7 @@ public class ProvisionedProjectsActionTest {
 
   @Test
   public void provisioned_projects_as_defined_in_the_example() throws Exception {
-    MockUserSession.set().setGlobalPermissions(UserRole.ADMIN);
+    userSessionRule.setGlobalPermissions(UserRole.ADMIN);
     ComponentDto hBaseProject = ComponentTesting.newProjectDto("ce4c03d6-430f-40a9-b777-ad877c00aa4d")
       .setKey("org.apache.hbas:hbase")
       .setName("HBase")
index b3665895986d6aad8bd2c0e71d2b207734e859c5..6a13468a02e4ab870fbde3a80ee1e2ac56058afe 100644 (file)
@@ -22,6 +22,7 @@ package org.sonar.server.component.ws;
 
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 import org.sonar.api.web.UserRole;
@@ -30,7 +31,7 @@ import org.sonar.core.user.AuthorizationDao;
 import org.sonar.server.component.db.ComponentDao;
 import org.sonar.server.component.db.ComponentIndexDao;
 import org.sonar.server.db.DbClient;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 import org.sonar.test.DbTests;
 
@@ -43,6 +44,8 @@ public class SearchActionTest {
 
   @ClassRule
   public static DbTester dbTester = new DbTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   WsTester tester;
 
@@ -52,13 +55,13 @@ public class SearchActionTest {
     DbClient dbClient = new DbClient(dbTester.database(), dbTester.myBatis(),
       new ComponentDao(), new AuthorizationDao(dbTester.myBatis()), new ComponentIndexDao()
       );
-    tester = new WsTester(new ComponentsWs(mock(ComponentAppAction.class), new SearchAction(dbClient)));
+    tester = new WsTester(new ComponentsWs(mock(ComponentAppAction.class), new SearchAction(dbClient, userSessionRule)));
   }
 
   @Test
   public void return_projects_from_view() throws Exception {
     dbTester.prepareDbUnit(getClass(), "shared.xml");
-    MockUserSession.set().setLogin("john").addProjectUuidPermissions(UserRole.USER, "EFGH");
+    userSessionRule.logon("john").addProjectUuidPermissions(UserRole.USER, "EFGH");
 
     WsTester.TestRequest request = tester.newGetRequest("api/components", "search").setParam("componentUuid", "EFGH").setParam("q", "st");
     request.execute().assertJson(getClass(), "return_projects_from_view.json");
@@ -67,7 +70,7 @@ public class SearchActionTest {
   @Test
   public void return_projects_from_subview() throws Exception {
     dbTester.prepareDbUnit(getClass(), "shared.xml");
-    MockUserSession.set().setLogin("john").addComponentUuidPermission(UserRole.USER, "EFGH", "FGHI");
+    userSessionRule.logon("john").addComponentUuidPermission(UserRole.USER, "EFGH", "FGHI");
 
     WsTester.TestRequest request = tester.newGetRequest("api/components", "search").setParam("componentUuid", "FGHI").setParam("q", "st");
     request.execute().assertJson(getClass(), "return_projects_from_subview.json");
@@ -76,7 +79,7 @@ public class SearchActionTest {
   @Test
   public void return_only_authorized_projects_from_view() throws Exception {
     dbTester.prepareDbUnit(getClass(), "return_only_authorized_projects_from_view.xml");
-    MockUserSession.set().setLogin("john").addProjectUuidPermissions(UserRole.USER, "EFGH");
+    userSessionRule.logon("john").addProjectUuidPermissions(UserRole.USER, "EFGH");
 
     WsTester.TestRequest request = tester.newGetRequest("api/components", "search").setParam("componentUuid", "EFGH").setParam("q", "st");
     request.execute().assertJson(getClass(), "return_only_authorized_projects_from_view.json");
@@ -85,7 +88,7 @@ public class SearchActionTest {
   @Test
   public void return_paged_result() throws Exception {
     dbTester.prepareDbUnit(getClass(), "shared.xml");
-    MockUserSession.set().setLogin("john").addProjectUuidPermissions(UserRole.USER, "EFGH");
+    userSessionRule.logon("john").addProjectUuidPermissions(UserRole.USER, "EFGH");
 
     WsTester.TestRequest request = tester.newGetRequest("api/components", "search").setParam("componentUuid", "EFGH").setParam("q", "st").setParam("p", "2").setParam("ps", "1");
     request.execute().assertJson(getClass(), "return_paged_result.json");
@@ -94,7 +97,7 @@ public class SearchActionTest {
   @Test
   public void return_only_first_page() throws Exception {
     dbTester.prepareDbUnit(getClass(), "shared.xml");
-    MockUserSession.set().setLogin("john").addProjectUuidPermissions(UserRole.USER, "EFGH");
+    userSessionRule.logon("john").addProjectUuidPermissions(UserRole.USER, "EFGH");
 
     WsTester.TestRequest request = tester.newGetRequest("api/components", "search").setParam("componentUuid", "EFGH").setParam("q", "st").setParam("p", "1").setParam("ps", "1");
     request.execute().assertJson(getClass(), "return_only_first_page.json");
@@ -103,7 +106,7 @@ public class SearchActionTest {
   @Test
   public void fail_when_search_param_is_too_short() throws Exception {
     dbTester.prepareDbUnit(getClass(), "shared.xml");
-    MockUserSession.set().setLogin("john").addProjectUuidPermissions(UserRole.USER, "EFGH");
+    userSessionRule.logon("john").addProjectUuidPermissions(UserRole.USER, "EFGH");
 
     WsTester.TestRequest request = tester.newGetRequest("api/components", "search").setParam("componentUuid", "EFGH").setParam("q", "s");
 
index db73d970b688305968fffc5bcf5b946542384977..82da61498760852a4c9298fac8bd36e2efea7739 100644 (file)
 
 package org.sonar.server.computation.ws;
 
+import java.util.Date;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.core.computation.db.AnalysisReportDto;
 import org.sonar.core.permission.GlobalPermissions;
@@ -29,11 +31,9 @@ import org.sonar.server.activity.Activity;
 import org.sonar.server.activity.ActivityService;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
-import java.util.Date;
-
 /**
  * TODO replace this medium test by a small test
  */
@@ -41,6 +41,8 @@ public class HistoryWsActionMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   HistoryWsAction sut;
   ActivityService activityService;
@@ -74,7 +76,7 @@ public class HistoryWsActionMediumTest {
     activity2.setData("submittedAt", new Date());
     activityService.save(activity2);
 
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
 
     WsTester.TestRequest request = tester.wsTester().newGetRequest("api/computation", "history");
     request.execute().assertJson(getClass(), "list_history_reports.json");
@@ -82,8 +84,6 @@ public class HistoryWsActionMediumTest {
 
   @Test(expected = ForbiddenException.class)
   public void requires_admin_right() throws Exception {
-    MockUserSession.set();
-
     WsTester.TestRequest request = tester.wsTester().newGetRequest("api/computation", "history");
     request.execute();
   }
index fe16f557961c75ed960a1adbeafd47c5162da982..66434bc154cc55fa4726845ad45f336855301c76 100644 (file)
@@ -20,7 +20,9 @@
 
 package org.sonar.server.computation.ws;
 
+import java.io.InputStream;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.server.ws.WebService;
 import org.sonar.core.computation.db.AnalysisReportDto;
@@ -28,15 +30,19 @@ import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.server.computation.ComputationThreadLauncher;
 import org.sonar.server.computation.ReportQueue;
 import org.sonar.server.exceptions.ForbiddenException;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
-import java.io.InputStream;
-
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.*;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 public class SubmitReportWsActionTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   ComputationThreadLauncher workerLauncher = mock(ComputationThreadLauncher.class);
   ReportQueue queue = mock(ReportQueue.class);
@@ -45,7 +51,7 @@ public class SubmitReportWsActionTest {
 
   @Before
   public void before() {
-    sut = new SubmitReportWsAction(queue, workerLauncher);
+    sut = new SubmitReportWsAction(queue, workerLauncher, userSessionRule);
     wsTester = new WsTester(new ComputationWebService(sut));
   }
 
@@ -63,7 +69,7 @@ public class SubmitReportWsActionTest {
 
   @Test
   public void add_element_to_queue_and_launch_analysis_task() throws Exception {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
     AnalysisReportDto dto = mock(AnalysisReportDto.class);
     when(dto.getId()).thenReturn(42L);
     when(queue.add(any(String.class), any(InputStream.class))).thenReturn(new ReportQueue.Item(dto, null));
@@ -81,7 +87,7 @@ public class SubmitReportWsActionTest {
 
   @Test(expected = ForbiddenException.class)
   public void requires_scan_permission() throws Exception {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.DASHBOARD_SHARING);
+    userSessionRule.setGlobalPermissions(GlobalPermissions.DASHBOARD_SHARING);
 
     WsTester.TestRequest request = wsTester
       .newGetRequest(ComputationWebService.API_ENDPOINT, "submit_report")
index 1fd391301e3ee65559c167e0640be6a37ae65cac..981f31297a72e944fbcf5e364c2d3a74e4886152 100644 (file)
@@ -22,13 +22,14 @@ package org.sonar.server.debt;
 
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.server.debt.DebtCharacteristic;
 import org.sonar.api.server.debt.internal.DefaultDebtCharacteristic;
 import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.server.platform.Platform;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -36,6 +37,8 @@ public class DebtMediumTest {
 
   @ClassRule
   public static ServerTester serverTester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(serverTester);
 
   @Before
   public void setUp() {
@@ -56,7 +59,7 @@ public class DebtMediumTest {
 
   @Test
   public void create_characteristic() {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
 
     DebtModelService debtModelService = serverTester.get(DebtModelService.class);
     int nb = debtModelService.characteristics().size();
@@ -73,7 +76,7 @@ public class DebtMediumTest {
 
   @Test
   public void create_sub_characteristic() {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
 
     DebtModelService debtModelService = serverTester.get(DebtModelService.class);
 
index 799435d9b946150b5f7a5f473d6d5e297547a688..bf4bc9d5596aba65eff537cbba9fde2589b5cea2 100644 (file)
 
 package org.sonar.server.debt;
 
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -49,63 +55,58 @@ import org.sonar.server.debt.DebtModelXMLExporter.RuleDebt;
 import org.sonar.server.rule.RuleDefinitionsLoader;
 import org.sonar.server.rule.RuleOperations;
 import org.sonar.server.rule.db.RuleDao;
-import org.sonar.server.user.MockUserSession;
-
-import java.io.Reader;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
+import org.sonar.server.tester.UserSessionRule;
 
 import static com.google.common.collect.Lists.newArrayList;
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.*;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Matchers.isNull;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class DebtModelBackupTest {
 
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
+
   @Mock
   DbClient dbClient;
-
   @Mock
   DbSession session;
-
   @Mock
   DebtModelPluginRepository debtModelPluginRepository;
-
   @Mock
   CharacteristicDao dao;
-
   @Mock
   RuleDao ruleDao;
-
   @Mock
   DebtModelOperations debtModelOperations;
-
   @Mock
   RuleOperations ruleOperations;
-
   @Mock
   DebtCharacteristicsXMLImporter characteristicsXMLImporter;
-
   @Mock
   DebtRulesXMLImporter rulesXMLImporter;
-
   @Mock
   DebtModelXMLExporter debtModelXMLExporter;
-
   @Mock
   RuleDefinitionsLoader defLoader;
-
   @Mock
   System2 system2;
 
   @Captor
   ArgumentCaptor<CharacteristicDto> characteristicCaptor;
-
   @Captor
   ArgumentCaptor<RuleDto> ruleCaptor;
-
   @Captor
   ArgumentCaptor<ArrayList<RuleDebt>> ruleDebtListCaptor;
 
@@ -117,8 +118,8 @@ public class DebtModelBackupTest {
   DebtModelBackup debtModelBackup;
 
   @Before
-  public void setUp() {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+  public void setUp() throws Exception {
+    userSessionRule.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
 
     when(system2.now()).thenReturn(now.getTime());
 
@@ -141,7 +142,7 @@ public class DebtModelBackupTest {
     when(debtModelPluginRepository.createReaderForXMLFile("technical-debt")).thenReturn(defaultModelReader);
 
     debtModelBackup = new DebtModelBackup(dbClient, debtModelOperations, ruleOperations, debtModelPluginRepository, characteristicsXMLImporter, rulesXMLImporter,
-      debtModelXMLExporter, defLoader, system2);
+      debtModelXMLExporter, defLoader, system2, userSessionRule);
   }
 
   @Test
index e9c5cc9b571c98713a04eac8762376701d3bd275..2ef3283dd687706cdb22f71964947bdc4c24a2ed 100644 (file)
 
 package org.sonar.server.debt;
 
+import java.util.Date;
 import org.apache.ibatis.session.SqlSession;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -45,9 +47,7 @@ import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.rule.db.RuleDao;
-import org.sonar.server.user.MockUserSession;
-
-import java.util.Date;
+import org.sonar.server.tester.UserSessionRule;
 
 import static com.google.common.collect.Lists.newArrayList;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -67,6 +67,9 @@ import static org.mockito.Mockito.when;
 @RunWith(MockitoJUnitRunner.class)
 public class DebtModelOperationsTest {
 
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
+
   @Mock
   CharacteristicDao dao;
 
@@ -112,7 +115,7 @@ public class DebtModelOperationsTest {
   public void setUp() {
     when(system2.now()).thenReturn(now.getTime());
 
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
 
     currentId = 10;
     // Associate an id when inserting an object to simulate the db id generator
@@ -128,7 +131,7 @@ public class DebtModelOperationsTest {
     when(dbClient.openSession(false)).thenReturn(session);
     when(dbClient.ruleDao()).thenReturn(ruleDao);
     when(dbClient.debtCharacteristicDao()).thenReturn(dao);
-    service = new DebtModelOperations(dbClient, system2);
+    service = new DebtModelOperations(dbClient, system2, userSessionRule);
   }
 
   @Test
@@ -184,7 +187,7 @@ public class DebtModelOperationsTest {
 
   @Test
   public void fail_to_create_sub_characteristic_when_wrong_permission() {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.DASHBOARD_SHARING);
+    userSessionRule.setGlobalPermissions(GlobalPermissions.DASHBOARD_SHARING);
 
     try {
       service.create("Compilation", 1);
index 32afbfee42a032e125999a17e23453005949d401..f14e9cc6c32c2c45887a9d230a2009ca05c3b41b 100644 (file)
@@ -24,6 +24,7 @@ import org.junit.Before;
 import org.junit.Test;
 import org.sonar.api.server.ws.WebService;
 import org.sonar.server.db.DbClient;
+import org.sonar.server.tester.AnonymousMockUserSession;
 import org.sonar.server.ws.WsTester;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -35,7 +36,7 @@ public class DependenciesWsTest {
 
   @Before
   public void setUp() {
-    WsTester tester = new WsTester(new DependenciesWs(new ShowAction(mock(DbClient.class))));
+    WsTester tester = new WsTester(new DependenciesWs(new ShowAction(mock(DbClient.class), new AnonymousMockUserSession())));
     controller = tester.controller("api/dependencies");
   }
 
index 9f1837bde9f02baf4aef8d318a7cbf13e0b3e24b..ecc362f865e80ba0a16764590da3b51b1269e0fd 100644 (file)
@@ -23,6 +23,7 @@ package org.sonar.server.design.ws;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.server.ws.WebService;
 import org.sonar.api.utils.System2;
@@ -40,7 +41,7 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.design.db.FileDependencyDao;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.exceptions.NotFoundException;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -59,6 +60,8 @@ public class ShowActionTest {
 
   @ClassRule
   public static DbTester dbTester = new DbTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   DbClient dbClient;
 
@@ -73,7 +76,7 @@ public class ShowActionTest {
     dbTester.truncateTables();
     dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), new ComponentDao(), new SnapshotDao(System2.INSTANCE), new FileDependencyDao());
     session = dbClient.openSession(false);
-    tester = new WsTester(new DependenciesWs(new ShowAction(dbClient)));
+    tester = new WsTester(new DependenciesWs(new ShowAction(dbClient, userSessionRule)));
     controller = tester.controller("api/dependencies");
 
     initComponents();
@@ -96,7 +99,7 @@ public class ShowActionTest {
       .setCreatedAt(1000L));
     session.commit();
 
-    MockUserSession.set().addProjectUuidPermissions(UserRole.USER, PROJECT_UUID);
+    userSessionRule.addProjectUuidPermissions(UserRole.USER, PROJECT_UUID);
 
     tester.newGetRequest("api/dependencies", "show")
       .setParam("fromParentUuid", DIR1_UUID)
@@ -107,7 +110,7 @@ public class ShowActionTest {
 
   @Test
   public void return_nothing() throws Exception {
-    MockUserSession.set().addProjectUuidPermissions(UserRole.USER, PROJECT_UUID);
+    userSessionRule.addProjectUuidPermissions(UserRole.USER, PROJECT_UUID);
 
     tester.newGetRequest("api/dependencies", "show")
       .setParam("fromParentUuid", DIR1_UUID)
@@ -118,7 +121,7 @@ public class ShowActionTest {
 
   @Test(expected = ForbiddenException.class)
   public void fail_if_no_user_permission_on_project() throws Exception {
-    MockUserSession.set().addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
+    userSessionRule.addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
 
     tester.newGetRequest("api/dependencies", "show")
       .setParam("fromParentUuid", DIR1_UUID)
@@ -139,7 +142,7 @@ public class ShowActionTest {
       .setCreatedAt(1000L));
     session.commit();
 
-    MockUserSession.set().addProjectUuidPermissions(UserRole.USER, PROJECT_UUID);
+    userSessionRule.addProjectUuidPermissions(UserRole.USER, PROJECT_UUID);
 
     try {
       tester.newGetRequest("api/dependencies", "show")
@@ -165,7 +168,7 @@ public class ShowActionTest {
       .setCreatedAt(1000L));
     session.commit();
 
-    MockUserSession.set().addProjectUuidPermissions(UserRole.USER, PROJECT_UUID);
+    userSessionRule.addProjectUuidPermissions(UserRole.USER, PROJECT_UUID);
 
     tester.newGetRequest("api/dependencies", "show")
       .setParam("fromParentUuid", DIR1_UUID)
@@ -186,7 +189,7 @@ public class ShowActionTest {
       .setCreatedAt(1000L));
     session.commit();
 
-    MockUserSession.set().addProjectUuidPermissions(UserRole.USER, PROJECT_UUID);
+    userSessionRule.addProjectUuidPermissions(UserRole.USER, PROJECT_UUID);
 
     try {
       tester.newGetRequest("api/dependencies", "show")
@@ -212,7 +215,7 @@ public class ShowActionTest {
       .setCreatedAt(1000L));
     session.commit();
 
-    MockUserSession.set().addProjectUuidPermissions(UserRole.USER, PROJECT_UUID);
+    userSessionRule.addProjectUuidPermissions(UserRole.USER, PROJECT_UUID);
 
     try {
       tester.newGetRequest("api/dependencies", "show")
index 87652c229dcbbf615db46650092055f3d11ea44e..6dd6ad0f873bbb84dcf1974bc73e41da654abf55 100644 (file)
 
 package org.sonar.server.duplication.ws;
 
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.server.ws.WebService;
 import org.sonar.server.component.db.ComponentDao;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.measure.persistence.MeasureDao;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 public class DuplicationsWsTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   WsTester tester = new WsTester(new DuplicationsWs(
-    new ShowAction(mock(DbClient.class), mock(ComponentDao.class), mock(MeasureDao.class), mock(DuplicationsParser.class), mock(DuplicationsJsonWriter.class))));
+    new ShowAction(mock(DbClient.class), mock(ComponentDao.class), mock(MeasureDao.class), mock(DuplicationsParser.class), mock(DuplicationsJsonWriter.class), userSessionRule)));
 
   @Test
   public void define_ws() {
index eb19639dc105ce3ce8eab381ceaa0036a34ed026..1ef7b6faed6847ab2952da0709732d629ee684b0 100644 (file)
@@ -21,7 +21,9 @@
 package org.sonar.server.duplication.ws;
 
 import com.google.common.collect.Lists;
+import java.util.List;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -36,11 +38,9 @@ import org.sonar.server.component.db.ComponentDao;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.measure.persistence.MeasureDao;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
-import java.util.List;
-
 import static com.google.common.collect.Lists.newArrayList;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.eq;
@@ -49,6 +49,8 @@ import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class ShowActionTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   @Mock
   DbSession session;
@@ -73,13 +75,13 @@ public class ShowActionTest {
   @Before
   public void setUp() {
     when(dbClient.openSession(false)).thenReturn(session);
-    tester = new WsTester(new DuplicationsWs(new ShowAction(dbClient, componentDao, measureDao, parser, duplicationsJsonWriter)));
+    tester = new WsTester(new DuplicationsWs(new ShowAction(dbClient, componentDao, measureDao, parser, duplicationsJsonWriter, userSessionRule)));
   }
 
   @Test
   public void show_duplications() throws Exception {
     String componentKey = "src/Foo.java";
-    MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, "org.codehaus.sonar:sonar", componentKey);
+    userSessionRule.addComponentPermission(UserRole.CODEVIEWER, "org.codehaus.sonar:sonar", componentKey);
 
     ComponentDto componentDto = new ComponentDto().setId(10L);
     when(componentDao.getNullableByKey(session, componentKey)).thenReturn(componentDto);
@@ -102,7 +104,7 @@ public class ShowActionTest {
   public void show_duplications_by_uuid() throws Exception {
     String uuid = "ABCD";
     String componentKey = "src/Foo.java";
-    MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, "org.codehaus.sonar:sonar", componentKey);
+    userSessionRule.addComponentPermission(UserRole.CODEVIEWER, "org.codehaus.sonar:sonar", componentKey);
 
     when(componentDao.getByUuid(session, uuid)).thenReturn(new ComponentDto().setKey(componentKey));
 
@@ -126,7 +128,7 @@ public class ShowActionTest {
   @Test
   public void no_duplications_when_no_data() throws Exception {
     String componentKey = "src/Foo.java";
-    MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, "org.codehaus.sonar:sonar", componentKey);
+    userSessionRule.addComponentPermission(UserRole.CODEVIEWER, "org.codehaus.sonar:sonar", componentKey);
 
     ComponentDto componentDto = new ComponentDto().setId(10L);
     when(componentDao.getNullableByKey(session, componentKey)).thenReturn(componentDto);
@@ -142,7 +144,7 @@ public class ShowActionTest {
   @Test(expected = NotFoundException.class)
   public void fail_when_file_not_found() throws Exception {
     String componentKey = "src/Foo.java";
-    MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, "org.codehaus.sonar:sonar", componentKey);
+    userSessionRule.addComponentPermission(UserRole.CODEVIEWER, "org.codehaus.sonar:sonar", componentKey);
 
     WsTester.TestRequest request = tester.newGetRequest("api/duplications", "show").setParam("key", componentKey);
     request.execute();
index c1bf8c624be78e93c353e359537eddc3900e18e2..d94ff01ccd5def6b77e419982452bef9255a0158 100644 (file)
@@ -41,6 +41,7 @@ import org.sonar.server.component.ComponentTesting;
 import org.sonar.server.component.db.ComponentDao;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.rule.RuleTesting;
+import org.sonar.server.user.ThreadLocalUserSession;
 import org.sonar.server.user.UserSession;
 
 import java.util.List;
@@ -97,7 +98,7 @@ public class ActionServiceTest {
 
     actions.add("link-to-jira").setConditions(new AlwaysMatch()).setFunctions(function1, function2);
 
-    assertThat(actionService.execute("ABCD", "link-to-jira", mock(UserSession.class))).isNotNull();
+    assertThat(actionService.execute("ABCD", "link-to-jira", mock(ThreadLocalUserSession.class))).isNotNull();
 
     verify(function1).execute(any(Function.Context.class));
     verify(function2).execute(any(Function.Context.class));
@@ -108,7 +109,7 @@ public class ActionServiceTest {
   public void modify_issue_when_executing_a_function() {
     Function function = new TweetFunction();
 
-    UserSession userSession = mock(UserSession.class);
+    UserSession userSession = mock(ThreadLocalUserSession.class);
     when(userSession.login()).thenReturn("arthur");
 
     when(componentDao.getByKey(eq(session), anyString())).thenReturn(mock(ComponentDto.class));
@@ -125,7 +126,7 @@ public class ActionServiceTest {
   public void inject_project_settings_when_executing_a_function() {
     Function function = new TweetFunction();
 
-    UserSession userSession = mock(UserSession.class);
+    UserSession userSession = mock(ThreadLocalUserSession.class);
     when(userSession.login()).thenReturn("arthur");
 
     when(componentDao.getByKey(session, "struts")).thenReturn(new ComponentDto().setKey("struts"));
@@ -146,7 +147,7 @@ public class ActionServiceTest {
 
     actions.add("link-to-jira").setConditions(new AlwaysMatch()).setFunctions(function);
     try {
-      actionService.execute("ABCD", "tweet", mock(UserSession.class));
+      actionService.execute("ABCD", "tweet", mock(ThreadLocalUserSession.class));
       fail();
     } catch (Exception e) {
       assertThat(e).isInstanceOf(IllegalArgumentException.class).hasMessage("Action is not found : tweet");
@@ -163,7 +164,7 @@ public class ActionServiceTest {
 
     actions.add("link-to-jira").setConditions(new NeverMatch()).setFunctions(function);
     try {
-      actionService.execute("ABCD", "link-to-jira", mock(UserSession.class));
+      actionService.execute("ABCD", "link-to-jira", mock(ThreadLocalUserSession.class));
       fail();
     } catch (Exception e) {
       assertThat(e).isInstanceOf(IllegalStateException.class).hasMessage("A condition is not respected");
index 86e574b973a50427618677e8997494e6620194b4..cec5baa96cef351acf6ce3684e4e20adbb3553db 100644 (file)
@@ -31,7 +31,7 @@ import org.sonar.api.user.User;
 import org.sonar.api.user.UserFinder;
 import org.sonar.core.issue.IssueUpdater;
 import org.sonar.core.user.DefaultUser;
-import org.sonar.server.user.UserSession;
+import org.sonar.server.user.ThreadLocalUserSession;
 
 import java.util.List;
 import java.util.Map;
@@ -93,7 +93,7 @@ public class AssignActionTest {
 
     List<Issue> issues = newArrayList((Issue) new DefaultIssue().setKey("ABC"));
     when(userFinder.findByLogin(assignee)).thenReturn(user);
-    assertThat(action.verify(properties, issues, mock(UserSession.class))).isTrue();
+    assertThat(action.verify(properties, issues, mock(ThreadLocalUserSession.class))).isTrue();
     assertThat(properties.get(AssignAction.VERIFIED_ASSIGNEE)).isEqualTo(user);
   }
 
@@ -108,7 +108,7 @@ public class AssignActionTest {
 
     List<Issue> issues = newArrayList((Issue) new DefaultIssue().setKey("ABC"));
     when(userFinder.findByLogin(assignee)).thenReturn(null);
-    action.verify(properties, issues, mock(UserSession.class));
+    action.verify(properties, issues, mock(ThreadLocalUserSession.class));
   }
 
   @Test
@@ -118,8 +118,8 @@ public class AssignActionTest {
     properties.put("assignee", assignee);
 
     List<Issue> issues = newArrayList((Issue) new DefaultIssue().setKey("ABC"));
-    action.verify(properties, issues, mock(UserSession.class));
-    assertThat(action.verify(properties, issues, mock(UserSession.class))).isTrue();
+    action.verify(properties, issues, mock(ThreadLocalUserSession.class));
+    assertThat(action.verify(properties, issues, mock(ThreadLocalUserSession.class))).isTrue();
     assertThat(properties.containsKey(AssignAction.VERIFIED_ASSIGNEE)).isTrue();
     assertThat(properties.get(AssignAction.VERIFIED_ASSIGNEE)).isNull();
   }
index f34308752ce4e3ec857aeb3b6e4decd7ba0fad4c..9453a822e98fc400ba4dfa1689a312f93c9075a7 100644 (file)
 package org.sonar.server.issue;
 
 import com.google.common.collect.Lists;
+import java.util.Map;
 import org.junit.Before;
 import org.junit.Test;
 import org.sonar.api.issue.Issue;
 import org.sonar.api.issue.internal.DefaultIssue;
 import org.sonar.api.issue.internal.IssueChangeContext;
 import org.sonar.core.issue.IssueUpdater;
-import org.sonar.server.user.MockUserSession;
-
-import java.util.Map;
+import org.sonar.server.tester.AnonymousMockUserSession;
 
 import static com.google.common.collect.Maps.newHashMap;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.fail;
-import static org.mockito.Mockito.*;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
 
 public class CommentActionTest {
 
@@ -66,7 +70,7 @@ public class CommentActionTest {
     Map<String, Object> properties = newHashMap();
     properties.put("unknwown", "unknown value");
     try {
-      action.verify(properties, Lists.<Issue>newArrayList(), MockUserSession.create());
+      action.verify(properties, Lists.<Issue>newArrayList(), new AnonymousMockUserSession());
       fail();
     } catch (Exception e) {
       assertThat(e).isInstanceOf(IllegalArgumentException.class).hasMessage("Missing parameter : 'comment'");
index 6b3a71964e24fb301cb82c394a1c6861a121e4db..254395b75844ea6169b4558bba17e52d04488854 100644 (file)
@@ -22,7 +22,12 @@ package org.sonar.server.issue;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
 import org.sonar.api.issue.ActionPlan;
@@ -41,20 +46,24 @@ import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.exceptions.Message;
 import org.sonar.server.issue.actionplan.ActionPlanService;
 import org.sonar.server.issue.filter.IssueFilterService;
-import org.sonar.server.user.UserSession;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import org.sonar.server.tester.UserSessionRule;
+import org.sonar.server.user.ThreadLocalUserSession;
 
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Maps.newHashMap;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.fail;
-import static org.mockito.Mockito.*;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 public class InternalRubyIssueServiceTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   IssueService issueService;
 
@@ -92,7 +101,7 @@ public class InternalRubyIssueServiceTest {
     when(resourceDao.getResource(any(ResourceQuery.class))).thenReturn(project);
 
     service = new InternalRubyIssueService(issueService, issueQueryService, commentService, changelogService, actionPlanService, resourceDao, actionService,
-      issueFilterService, issueBulkChangeService);
+      issueFilterService, issueBulkChangeService, userSessionRule);
   }
 
   @Test
@@ -165,7 +174,7 @@ public class InternalRubyIssueServiceTest {
     assertThat(result.ok()).isTrue();
 
     ArgumentCaptor<ActionPlan> actionPlanCaptor = ArgumentCaptor.forClass(ActionPlan.class);
-    verify(actionPlanService).create(actionPlanCaptor.capture(), any(UserSession.class));
+    verify(actionPlanService).create(actionPlanCaptor.capture(), any(ThreadLocalUserSession.class));
     ActionPlan actionPlan = actionPlanCaptor.getValue();
 
     assertThat(actionPlan).isNotNull();
@@ -177,7 +186,7 @@ public class InternalRubyIssueServiceTest {
 
   @Test
   public void update_action_plan() {
-    when(actionPlanService.findByKey(eq("ABCD"), any(UserSession.class))).thenReturn(DefaultActionPlan.create("Long term"));
+    when(actionPlanService.findByKey(eq("ABCD"), any(ThreadLocalUserSession.class))).thenReturn(DefaultActionPlan.create("Long term"));
 
     Map<String, String> parameters = newHashMap();
     parameters.put("name", "New Long term");
@@ -189,7 +198,7 @@ public class InternalRubyIssueServiceTest {
     assertThat(result.ok()).isTrue();
 
     ArgumentCaptor<ActionPlan> actionPlanCaptor = ArgumentCaptor.forClass(ActionPlan.class);
-    verify(actionPlanService).update(actionPlanCaptor.capture(), any(UserSession.class));
+    verify(actionPlanService).update(actionPlanCaptor.capture(), any(ThreadLocalUserSession.class));
     ActionPlan actionPlan = actionPlanCaptor.getValue();
 
     assertThat(actionPlan).isNotNull();
@@ -201,7 +210,7 @@ public class InternalRubyIssueServiceTest {
 
   @Test
   public void update_action_plan_with_new_project() {
-    when(actionPlanService.findByKey(eq("ABCD"), any(UserSession.class))).thenReturn(DefaultActionPlan.create("Long term").setProjectKey("org.sonar.MultiSample"));
+    when(actionPlanService.findByKey(eq("ABCD"), any(ThreadLocalUserSession.class))).thenReturn(DefaultActionPlan.create("Long term").setProjectKey("org.sonar.MultiSample"));
 
     Map<String, String> parameters = newHashMap();
     parameters.put("name", "New Long term");
@@ -212,7 +221,7 @@ public class InternalRubyIssueServiceTest {
     Result result = service.updateActionPlan("ABCD", parameters);
     assertThat(result.ok()).isTrue();
 
-    verify(actionPlanService).update(actionPlanCaptor.capture(), any(UserSession.class));
+    verify(actionPlanService).update(actionPlanCaptor.capture(), any(ThreadLocalUserSession.class));
     ActionPlan actionPlan = actionPlanCaptor.getValue();
 
     assertThat(actionPlan).isNotNull();
@@ -225,7 +234,7 @@ public class InternalRubyIssueServiceTest {
 
   @Test
   public void not_update_action_plan_when_action_plan_is_not_found() {
-    when(actionPlanService.findByKey(eq("ABCD"), any(UserSession.class))).thenReturn(null);
+    when(actionPlanService.findByKey(eq("ABCD"), any(ThreadLocalUserSession.class))).thenReturn(null);
 
     Result result = service.updateActionPlan("ABCD", null);
     assertThat(result.ok()).isFalse();
@@ -234,38 +243,38 @@ public class InternalRubyIssueServiceTest {
 
   @Test
   public void delete_action_plan() {
-    when(actionPlanService.findByKey(eq("ABCD"), any(UserSession.class))).thenReturn(DefaultActionPlan.create("Long term"));
+    when(actionPlanService.findByKey(eq("ABCD"), any(ThreadLocalUserSession.class))).thenReturn(DefaultActionPlan.create("Long term"));
 
     Result result = service.deleteActionPlan("ABCD");
-    verify(actionPlanService).delete(eq("ABCD"), any(UserSession.class));
+    verify(actionPlanService).delete(eq("ABCD"), any(ThreadLocalUserSession.class));
     assertThat(result.ok()).isTrue();
   }
 
   @Test
   public void not_delete_action_plan_if_action_plan_not_found() {
-    when(actionPlanService.findByKey(eq("ABCD"), any(UserSession.class))).thenReturn(null);
+    when(actionPlanService.findByKey(eq("ABCD"), any(ThreadLocalUserSession.class))).thenReturn(null);
 
     Result result = service.deleteActionPlan("ABCD");
-    verify(actionPlanService, never()).delete(eq("ABCD"), any(UserSession.class));
+    verify(actionPlanService, never()).delete(eq("ABCD"), any(ThreadLocalUserSession.class));
     assertThat(result.ok()).isFalse();
     assertThat(result.errors()).contains(Result.Message.ofL10n("action_plans.errors.action_plan_does_not_exist", "ABCD"));
   }
 
   @Test
   public void close_action_plan() {
-    when(actionPlanService.findByKey(eq("ABCD"), any(UserSession.class))).thenReturn(DefaultActionPlan.create("Long term"));
+    when(actionPlanService.findByKey(eq("ABCD"), any(ThreadLocalUserSession.class))).thenReturn(DefaultActionPlan.create("Long term"));
 
     Result result = service.closeActionPlan("ABCD");
-    verify(actionPlanService).setStatus(eq("ABCD"), eq("CLOSED"), any(UserSession.class));
+    verify(actionPlanService).setStatus(eq("ABCD"), eq("CLOSED"), any(ThreadLocalUserSession.class));
     assertThat(result.ok()).isTrue();
   }
 
   @Test
   public void open_action_plan() {
-    when(actionPlanService.findByKey(eq("ABCD"), any(UserSession.class))).thenReturn(DefaultActionPlan.create("Long term"));
+    when(actionPlanService.findByKey(eq("ABCD"), any(ThreadLocalUserSession.class))).thenReturn(DefaultActionPlan.create("Long term"));
 
     Result result = service.openActionPlan("ABCD");
-    verify(actionPlanService).setStatus(eq("ABCD"), eq("OPEN"), any(UserSession.class));
+    verify(actionPlanService).setStatus(eq("ABCD"), eq("OPEN"), any(ThreadLocalUserSession.class));
     assertThat(result.ok()).isTrue();
   }
 
@@ -401,7 +410,7 @@ public class InternalRubyIssueServiceTest {
     service.createIssueFilter(parameters);
 
     ArgumentCaptor<IssueFilterDto> issueFilterCaptor = ArgumentCaptor.forClass(IssueFilterDto.class);
-    verify(issueFilterService).save(issueFilterCaptor.capture(), any(UserSession.class));
+    verify(issueFilterService).save(issueFilterCaptor.capture(), any(ThreadLocalUserSession.class));
     IssueFilterDto issueFilter = issueFilterCaptor.getValue();
     assertThat(issueFilter.getName()).isEqualTo("Long term");
     assertThat(issueFilter.getDescription()).isEqualTo("Long term issues");
@@ -418,7 +427,7 @@ public class InternalRubyIssueServiceTest {
     service.updateIssueFilter(parameters);
 
     ArgumentCaptor<IssueFilterDto> issueFilterCaptor = ArgumentCaptor.forClass(IssueFilterDto.class);
-    verify(issueFilterService).update(issueFilterCaptor.capture(), any(UserSession.class));
+    verify(issueFilterService).update(issueFilterCaptor.capture(), any(ThreadLocalUserSession.class));
     IssueFilterDto issueFilter = issueFilterCaptor.getValue();
     assertThat(issueFilter.getId()).isEqualTo(10L);
     assertThat(issueFilter.getName()).isEqualTo("Long term");
@@ -429,13 +438,13 @@ public class InternalRubyIssueServiceTest {
   public void update_data() {
     Map<String, Object> data = newHashMap();
     service.updateIssueFilterQuery(10L, data);
-    verify(issueFilterService).updateFilterQuery(eq(10L), eq(data), any(UserSession.class));
+    verify(issueFilterService).updateFilterQuery(eq(10L), eq(data), any(ThreadLocalUserSession.class));
   }
 
   @Test
   public void delete_issue_filter() {
     service.deleteIssueFilter(1L);
-    verify(issueFilterService).delete(eq(1L), any(UserSession.class));
+    verify(issueFilterService).delete(eq(1L), any(ThreadLocalUserSession.class));
   }
 
   @Test
@@ -447,7 +456,7 @@ public class InternalRubyIssueServiceTest {
     service.copyIssueFilter(1L, parameters);
 
     ArgumentCaptor<IssueFilterDto> issueFilterCaptor = ArgumentCaptor.forClass(IssueFilterDto.class);
-    verify(issueFilterService).copy(eq(1L), issueFilterCaptor.capture(), any(UserSession.class));
+    verify(issueFilterService).copy(eq(1L), issueFilterCaptor.capture(), any(ThreadLocalUserSession.class));
     IssueFilterDto issueFilter = issueFilterCaptor.getValue();
     assertThat(issueFilter.getName()).isEqualTo("Copy of Long term");
     assertThat(issueFilter.getDescription()).isEqualTo("Copy of Long term issues");
@@ -566,7 +575,7 @@ public class InternalRubyIssueServiceTest {
     overrideProps.put("pageSize", 20);
     overrideProps.put("pageIndex", 2);
 
-    IssueQuery query = IssueQuery.builder().build();
+    IssueQuery query = IssueQuery.builder(userSessionRule).build();
     when(issueQueryService.createFromMap(eq(overrideProps))).thenReturn(query);
 
     service.execute(10L, overrideProps);
@@ -575,7 +584,7 @@ public class InternalRubyIssueServiceTest {
     ArgumentCaptor<SearchOptions> contextArgumentCaptor = ArgumentCaptor.forClass(SearchOptions.class);
 
     verify(issueFilterService).execute(issueQueryArgumentCaptor.capture(), contextArgumentCaptor.capture());
-    verify(issueFilterService).find(eq(10L), any(UserSession.class));
+    verify(issueFilterService).find(eq(10L), any(ThreadLocalUserSession.class));
 
     SearchOptions searchOptions = contextArgumentCaptor.getValue();
     assertThat(searchOptions.getLimit()).isEqualTo(20);
@@ -610,39 +619,39 @@ public class InternalRubyIssueServiceTest {
   @Test
   public void find_user_issue_filters() {
     service.findIssueFiltersForCurrentUser();
-    verify(issueFilterService).findByUser(any(UserSession.class));
+    verify(issueFilterService).findByUser(any(ThreadLocalUserSession.class));
   }
 
   @Test
   public void find_shared_issue_filters() {
     service.findSharedFiltersForCurrentUser();
-    verify(issueFilterService).findSharedFiltersWithoutUserFilters(any(UserSession.class));
+    verify(issueFilterService).findSharedFiltersWithoutUserFilters(any(ThreadLocalUserSession.class));
   }
 
   @Test
   public void find_favourite_issue_filters() {
     service.findFavouriteIssueFiltersForCurrentUser();
-    verify(issueFilterService).findFavoriteFilters(any(UserSession.class));
+    verify(issueFilterService).findFavoriteFilters(any(ThreadLocalUserSession.class));
   }
 
   @Test
   public void toggle_favourite_issue_filter() {
     service.toggleFavouriteIssueFilter(10L);
-    verify(issueFilterService).toggleFavouriteIssueFilter(eq(10L), any(UserSession.class));
+    verify(issueFilterService).toggleFavouriteIssueFilter(eq(10L), any(ThreadLocalUserSession.class));
   }
 
   @Test
   public void check_if_user_is_authorized_to_see_issue_filter() {
     IssueFilterDto issueFilter = new IssueFilterDto();
     service.isUserAuthorized(issueFilter);
-    verify(issueFilterService).getLoggedLogin(any(UserSession.class));
+    verify(issueFilterService).getLoggedLogin(any(ThreadLocalUserSession.class));
     verify(issueFilterService).verifyCurrentUserCanReadFilter(eq(issueFilter), anyString());
   }
 
   @Test
   public void check_if_user_can_share_issue_filter() {
     service.canUserShareIssueFilter();
-    verify(issueFilterService).canShareFilter(any(UserSession.class));
+    verify(issueFilterService).canShareFilter(any(ThreadLocalUserSession.class));
   }
 
   @Test
@@ -655,7 +664,7 @@ public class InternalRubyIssueServiceTest {
     params.put("set_severity.severity", "MINOR");
     params.put("plan.plan", "3.7");
     service.bulkChange(params, "My comment", true);
-    verify(issueBulkChangeService).execute(any(IssueBulkChangeQuery.class), any(UserSession.class));
+    verify(issueBulkChangeService).execute(any(IssueBulkChangeQuery.class), any(ThreadLocalUserSession.class));
   }
 
   @Test
@@ -702,7 +711,7 @@ public class InternalRubyIssueServiceTest {
   public void list_tags_for_component() {
     Map<String, Long> tags = ImmutableMap.of("tag1", 1L, "tag2", 2L, "tag3", 3L);
     int pageSize = 42;
-    IssueQuery query = IssueQuery.builder().build();
+    IssueQuery query = IssueQuery.builder(userSessionRule).build();
     String componentUuid = "polop";
     Map<String, Object> params = ImmutableMap.<String, Object>of("componentUuids", componentUuid, "resolved", false);
     when(issueQueryService.createFromMap(params)).thenReturn(query);
index 62340cd33f724b6eea6422d811fc400899cc466c..6a6065e547ce9a5beb73333dff99fde59b50a6c0 100644 (file)
 package org.sonar.server.issue;
 
 import com.google.common.base.Joiner;
+import java.util.List;
+import java.util.Map;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.issue.DefaultTransitions;
 import org.sonar.api.issue.Issue;
@@ -48,12 +51,9 @@ import org.sonar.server.permission.PermissionChange;
 import org.sonar.server.rule.RuleTesting;
 import org.sonar.server.rule.db.RuleDao;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.user.UserSession;
 
-import java.util.List;
-import java.util.Map;
-
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Maps.newHashMap;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -63,6 +63,8 @@ public class IssueBulkChangeServiceMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbClient db;
   DbSession session;
@@ -94,11 +96,10 @@ public class IssueBulkChangeServiceMediumTest {
 
     // project can be seen by anyone
     session.commit();
-    MockUserSession.set().setLogin("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.logon("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
     tester.get(InternalPermissionService.class).addPermission(new PermissionChange().setComponentKey(project.getKey()).setGroup(DefaultGroups.ANYONE).setPermission(UserRole.USER));
 
-    userSession = MockUserSession.set()
-      .setLogin("john")
+    userSession = userSessionRule.logon("john")
       .addProjectPermissions(UserRole.USER, project.key());
   }
 
index a781c2deeec04df6d77427a1c6b7f5fc5c5bc312..c209432a407446269c5589be7ec79c29b4b064c8 100644 (file)
@@ -34,7 +34,7 @@ public class IssueBulkChangeServiceTest {
 //
 //  IssueBulkChangeService service;
 //
-//  UserSession userSession = MockUserSession.create().setLogin("john").setUserId(10);
+//  UserSession userSession = new MockUserSession("john").setUserId(10);
 //
 //  IssueDoc issue;
 //  Rule rule;
index b1bb6353453d7ba44569c4e8106e54898d28bde6..fbdec1239255f0160dd0a47640199bb69dcc7a15 100644 (file)
  */
 package org.sonar.server.issue;
 
+import java.util.List;
+import java.util.Locale;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -28,9 +31,7 @@ import org.sonar.api.i18n.I18n;
 import org.sonar.api.issue.internal.FieldDiffs;
 import org.sonar.api.utils.Duration;
 import org.sonar.api.utils.Durations;
-
-import java.util.List;
-import java.util.Locale;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Matchers.any;
@@ -42,6 +43,9 @@ public class IssueChangelogFormatterTest {
 
   private static final Locale DEFAULT_LOCALE = Locale.getDefault();
 
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
+
   @Mock
   private I18n i18n;
 
@@ -53,7 +57,7 @@ public class IssueChangelogFormatterTest {
 
   @Before
   public void before() {
-    formatter = new IssueChangelogFormatter(i18n, durations);
+    formatter = new IssueChangelogFormatter(i18n, durations, userSessionRule);
   }
 
   @Test
index febbeeba6f99b1b52f7c3c0f7baf10b753efe513..914e2584e2c592c094980a35b9e1eb4c72fc70af 100644 (file)
  */
 package org.sonar.server.issue;
 
+import java.util.Arrays;
+import java.util.Locale;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -30,17 +33,20 @@ import org.sonar.api.user.User;
 import org.sonar.api.user.UserFinder;
 import org.sonar.core.issue.db.IssueChangeDao;
 import org.sonar.core.user.DefaultUser;
-import org.sonar.server.user.MockUserSession;
-
-import java.util.Arrays;
-import java.util.Locale;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.*;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class IssueChangelogServiceTest {
 
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
+
   @Mock
   IssueChangeDao changeDao;
 
@@ -57,7 +63,7 @@ public class IssueChangelogServiceTest {
 
   @Before
   public void setUp() {
-    service = new IssueChangelogService(changeDao, userFinder, issueService, formatter);
+    service = new IssueChangelogService(changeDao, userFinder, issueService, formatter, userSessionRule);
   }
 
   @Test
@@ -81,7 +87,7 @@ public class IssueChangelogServiceTest {
   @Test
   public void format_diffs() {
     FieldDiffs diffs = new FieldDiffs().setUserLogin("arthur").setDiff("severity", "MAJOR", "BLOCKER");
-    MockUserSession.set();
+    userSessionRule.logon();
     service.formatDiffs(diffs);
     verify(formatter).format(any(Locale.class), eq(diffs));
   }
index f95030fe975a0350470232210040db14bd4c9dab..2eb0a14762594d54d82c2c0b0138aac1d0a2b478 100644 (file)
 
 package org.sonar.server.issue;
 
+import java.util.List;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.issue.Issue;
 import org.sonar.api.issue.internal.DefaultIssueComment;
@@ -49,9 +51,7 @@ import org.sonar.server.rule.RuleTesting;
 import org.sonar.server.rule.db.RuleDao;
 import org.sonar.server.search.IndexClient;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
-
-import java.util.List;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -59,6 +59,8 @@ public class IssueCommentServiceMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbClient db;
   IndexClient indexClient;
@@ -91,10 +93,10 @@ public class IssueCommentServiceMediumTest {
 
     // project can be seen by anyone
     session.commit();
-    MockUserSession.set().setLogin("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.logon("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
     tester.get(InternalPermissionService.class).addPermission(new PermissionChange().setComponentKey(project.getKey()).setGroup(DefaultGroups.ANYONE).setPermission(UserRole.USER));
 
-    MockUserSession.set().setLogin("gandalf");
+    userSessionRule.logon("gandalf");
 
     session.commit();
   }
@@ -111,7 +113,7 @@ public class IssueCommentServiceMediumTest {
     session.commit();
     tester.get(IssueIndexer.class).indexAll();
 
-    service.addComment(issue.getKey(), "my comment", MockUserSession.get());
+    service.addComment(issue.getKey(), "my comment", userSessionRule);
 
     List<DefaultIssueComment> comments = service.findComments(issue.getKey());
     assertThat(comments).hasSize(1);
@@ -128,7 +130,7 @@ public class IssueCommentServiceMediumTest {
     session.commit();
     tester.get(IssueIndexer.class).indexAll();
 
-    service.addComment(issue.getKey(), "my comment", MockUserSession.get());
+    service.addComment(issue.getKey(), "my comment", userSessionRule);
 
     List<DefaultIssueComment> comments = service.findComments(issue.getKey());
     assertThat(comments).hasSize(1);
index f98a68f2551a54fa66b20ab98c3126988c15812f..456a53d0a6e1e2b671eb24465c54559464717ea2 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.sonar.server.issue;
 
+import java.util.Collections;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -43,19 +44,22 @@ import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.exceptions.UnauthorizedException;
 import org.sonar.server.rule.RuleTesting;
-import org.sonar.server.user.MockUserSession;
-
-import java.util.Collections;
+import org.sonar.server.tester.UserSessionRule;
 
 import static com.google.common.collect.Lists.newArrayList;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.fail;
-import static org.mockito.Mockito.*;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class IssueCommentServiceTest {
-
-  @Mock  
+  @Mock
   private DbClient dbClient;
 
   @Mock
@@ -75,11 +79,8 @@ public class IssueCommentServiceTest {
 
   @Rule
   public ExpectedException throwable = ExpectedException.none();
-
-  @Before
-  public void setUpUser() {
-    MockUserSession.set().setLogin("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
-  }
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone().logon("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
 
   @Before
   public void setUp() {
@@ -106,7 +107,7 @@ public class IssueCommentServiceTest {
     when(issueService.getByKeyForUpdate(session, "ABCD")).thenReturn(issueDto);
     when(issueCommentService.findComments(session, "ABCD")).thenReturn(newArrayList(new DefaultIssueComment()));
 
-    issueCommentService.addComment("ABCD", "my comment", MockUserSession.get());
+    issueCommentService.addComment("ABCD", "my comment", userSessionRule);
 
     verify(updater).addComment(eq(issueDto.toDefaultIssue()), eq("my comment"), any(IssueChangeContext.class));
     verify(issueService).saveIssue(eq(session), eq(issueDto.toDefaultIssue()), any(IssueChangeContext.class), eq("my comment"));
@@ -115,10 +116,9 @@ public class IssueCommentServiceTest {
   @Test
   public void should_be_logged_when_adding_comment() {
     throwable.expect(UnauthorizedException.class);
+    userSessionRule.anonymous();
 
-    MockUserSession.set().setLogin(null);
-
-    issueCommentService.addComment("myIssue", "my comment", MockUserSession.get());
+    issueCommentService.addComment("myIssue", "my comment", userSessionRule);
 
     verify(updater, never()).addComment(any(DefaultIssue.class), anyString(), any(IssueChangeContext.class));
     verifyZeroInteractions(issueService);
@@ -128,7 +128,7 @@ public class IssueCommentServiceTest {
   public void should_prevent_adding_empty_comment() {
     throwable.expect(BadRequestException.class);
 
-    issueCommentService.addComment("myIssue", " ", MockUserSession.get());
+    issueCommentService.addComment("myIssue", " ", userSessionRule);
 
     verify(updater, never()).addComment(any(DefaultIssue.class), anyString(), any(IssueChangeContext.class));
     verifyZeroInteractions(issueService);
@@ -138,7 +138,7 @@ public class IssueCommentServiceTest {
   public void should_prevent_adding_null_comment() {
     throwable.expect(BadRequestException.class);
 
-    issueCommentService.addComment("myIssue", null, MockUserSession.get());
+    issueCommentService.addComment("myIssue", null, userSessionRule);
 
     verify(updater, never()).addComment(any(DefaultIssue.class), anyString(), any(IssueChangeContext.class));
     verifyZeroInteractions(issueService);
@@ -152,7 +152,7 @@ public class IssueCommentServiceTest {
     when(issueCommentService.findComments(session, "ABCD")).thenReturn(Collections.<DefaultIssueComment>emptyList());
 
     try {
-      issueCommentService.addComment("ABCD", "my comment", MockUserSession.get());
+      issueCommentService.addComment("ABCD", "my comment", userSessionRule);
       fail();
     } catch (Exception e) {
       assertThat(e).isInstanceOf(BadRequestException.class).hasMessage("Fail to add a comment on issue ABCD");
@@ -163,7 +163,7 @@ public class IssueCommentServiceTest {
   public void should_delete_comment() {
     when(changeDao.selectCommentByKey("ABCD")).thenReturn(new DefaultIssueComment().setUserLogin("admin").setIssueKey("EFGH"));
 
-    issueCommentService.deleteComment("ABCD", MockUserSession.get());
+    issueCommentService.deleteComment("ABCD", userSessionRule);
 
     verify(changeDao).delete("ABCD");
     verify(issueService).getByKey("EFGH");
@@ -175,7 +175,7 @@ public class IssueCommentServiceTest {
 
     when(changeDao.selectCommentByKey("ABCD")).thenReturn(null);
 
-    issueCommentService.deleteComment("ABCD", MockUserSession.get());
+    issueCommentService.deleteComment("ABCD", userSessionRule);
 
     verify(changeDao, never()).delete(anyString());
   }
@@ -186,7 +186,7 @@ public class IssueCommentServiceTest {
 
     when(changeDao.selectCommentByKey("ABCD")).thenReturn(new DefaultIssueComment().setUserLogin("julien"));
 
-    issueCommentService.deleteComment("ABCD", MockUserSession.get());
+    issueCommentService.deleteComment("ABCD", userSessionRule);
 
     verify(changeDao, never()).delete(anyString());
   }
@@ -195,7 +195,7 @@ public class IssueCommentServiceTest {
   public void should_update_comment() {
     when(changeDao.selectCommentByKey("ABCD")).thenReturn(new DefaultIssueComment().setIssueKey("EFGH").setUserLogin("admin"));
 
-    issueCommentService.editComment("ABCD", "updated comment", MockUserSession.get());
+    issueCommentService.editComment("ABCD", "updated comment", userSessionRule);
 
     verify(changeDao).update(any(IssueChangeDto.class));
     verify(issueService).getByKey("EFGH");
@@ -207,7 +207,7 @@ public class IssueCommentServiceTest {
 
     when(changeDao.selectCommentByKey("ABCD")).thenReturn(null);
 
-    issueCommentService.editComment("ABCD", "updated comment", MockUserSession.get());
+    issueCommentService.editComment("ABCD", "updated comment", userSessionRule);
 
     verify(changeDao, never()).update(any(IssueChangeDto.class));
   }
@@ -216,7 +216,7 @@ public class IssueCommentServiceTest {
   public void should_prevent_updating_empty_comment() {
     throwable.expect(BadRequestException.class);
 
-    issueCommentService.editComment("ABCD", "", MockUserSession.get());
+    issueCommentService.editComment("ABCD", "", userSessionRule);
 
     verify(changeDao, never()).update(any(IssueChangeDto.class));
   }
@@ -225,7 +225,7 @@ public class IssueCommentServiceTest {
   public void should_prevent_updating_null_comment() {
     throwable.expect(BadRequestException.class);
 
-    issueCommentService.editComment("ABCD", null, MockUserSession.get());
+    issueCommentService.editComment("ABCD", null, userSessionRule);
 
     verify(changeDao, never()).update(any(IssueChangeDto.class));
   }
@@ -236,7 +236,7 @@ public class IssueCommentServiceTest {
 
     when(changeDao.selectCommentByKey("ABCD")).thenReturn(new DefaultIssueComment().setUserLogin("julien"));
 
-    issueCommentService.editComment("ABCD", "updated comment", MockUserSession.get());
+    issueCommentService.editComment("ABCD", "updated comment", userSessionRule);
 
     verify(changeDao, never()).update(any(IssueChangeDto.class));
   }
index 4b1645ef987ce6577bca1b04c0a69bba148189a9..09ba7ca9fafbeba9a63fcad8face07a04bab7e83 100644 (file)
@@ -22,9 +22,14 @@ package org.sonar.server.issue;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Map;
 import org.assertj.core.api.Fail;
-import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Matchers;
@@ -43,9 +48,7 @@ import org.sonar.core.user.AuthorDao;
 import org.sonar.server.component.ComponentService;
 import org.sonar.server.component.db.ComponentDao;
 import org.sonar.server.db.DbClient;
-import org.sonar.server.user.MockUserSession;
-
-import java.util.*;
+import org.sonar.server.tester.UserSessionRule;
 
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Maps.newHashMap;
@@ -60,6 +63,8 @@ import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class IssueQueryServiceTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   @Mock
   DbClient dbClient;
@@ -95,12 +100,7 @@ public class IssueQueryServiceTest {
       }
     });
 
-    issueQueryService = new IssueQueryService(dbClient, componentService, system);
-  }
-
-  @After
-  public void tearDown() {
-    MockUserSession.set();
+    issueQueryService = new IssueQueryService(dbClient, componentService, system, userSessionRule);
   }
 
   @Test
@@ -277,7 +277,7 @@ public class IssueQueryServiceTest {
 
     when(componentService.getDistinctQualifiers(isA(DbSession.class), anyCollection())).thenReturn(Sets.newHashSet(Qualifiers.VIEW));
 
-    MockUserSession.set().addProjectUuidPermissions(UserRole.USER, viewUuid);
+    userSessionRule.addProjectUuidPermissions(UserRole.USER, viewUuid);
 
     IssueQuery query = issueQueryService.createFromMap(map);
     assertThat(query.viewUuids()).containsExactly(viewUuid);
@@ -292,8 +292,6 @@ public class IssueQueryServiceTest {
 
     when(componentService.getDistinctQualifiers(isA(DbSession.class), anyCollection())).thenReturn(Sets.newHashSet(Qualifiers.VIEW));
 
-    MockUserSession.set();
-
     IssueQuery query = issueQueryService.createFromMap(map);
     assertThat(query.viewUuids()).isNotEmpty().doesNotContain(subViewUuid);
   }
index 5af86be2654ab2d443454ea6d8c5b16b3820d687..b1f41636075153d7f01e8e004c438ab94b8b36ca 100644 (file)
 package org.sonar.server.issue;
 
 import com.google.common.collect.Lists;
+import java.util.Date;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.issue.Issue;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rule.Severity;
-
-import java.util.Date;
+import org.sonar.server.tester.UserSessionRule;
 
 import static com.google.common.collect.Lists.newArrayList;
 import static org.assertj.core.api.Assertions.assertThat;
 
 public class IssueQueryTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   @Test
   public void build_query() {
-    IssueQuery query = IssueQuery.builder()
+    IssueQuery query = IssueQuery.builder(userSessionRule)
       .issueKeys(newArrayList("ABCDE"))
       .severities(newArrayList(Severity.BLOCKER))
       .statuses(Lists.newArrayList(Issue.STATUS_RESOLVED))
@@ -82,7 +85,7 @@ public class IssueQueryTest {
 
   @Test
   public void build_query_without_dates() {
-    IssueQuery query = IssueQuery.builder()
+    IssueQuery query = IssueQuery.builder(userSessionRule)
       .issueKeys(newArrayList("ABCDE"))
       .createdAfter(null)
       .createdBefore(null)
@@ -98,7 +101,7 @@ public class IssueQueryTest {
   @Test
   public void throw_exception_if_sort_is_not_valid() {
     try {
-      IssueQuery.builder()
+      IssueQuery.builder(userSessionRule)
         .sort("UNKNOWN")
         .build();
     } catch (Exception e) {
@@ -108,7 +111,7 @@ public class IssueQueryTest {
 
   @Test
   public void collection_params_should_not_be_null_but_empty() {
-    IssueQuery query = IssueQuery.builder()
+    IssueQuery query = IssueQuery.builder(userSessionRule)
       .issueKeys(null)
       .componentUuids(null)
       .moduleUuids(null)
@@ -138,7 +141,7 @@ public class IssueQueryTest {
 
   @Test
   public void test_default_query() throws Exception {
-    IssueQuery query = IssueQuery.builder().build();
+    IssueQuery query = IssueQuery.builder(userSessionRule).build();
     assertThat(query.issueKeys()).isEmpty();
     assertThat(query.componentUuids()).isEmpty();
     assertThat(query.moduleUuids()).isEmpty();
@@ -162,7 +165,7 @@ public class IssueQueryTest {
 
   @Test
   public void should_accept_null_sort() {
-    IssueQuery query = IssueQuery.builder().sort(null).build();
+    IssueQuery query = IssueQuery.builder(userSessionRule).sort(null).build();
     assertThat(query.sort()).isNull();
   }
 }
index 7a12ce178c2384291025a289b99aa39c33a82079..494dc0f85978ac8a210c4090994e7d9d99bb0de1 100644 (file)
@@ -22,9 +22,13 @@ package org.sonar.server.issue;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Sets;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.CoreProperties;
 import org.sonar.api.config.Settings;
@@ -60,18 +64,14 @@ import org.sonar.server.rule.RuleTesting;
 import org.sonar.server.rule.db.RuleDao;
 import org.sonar.server.source.db.FileSourceDb;
 import org.sonar.server.source.index.FileSourcesUpdaterHelper;
-import org.sonar.server.source.index.SourceLineResultSetIterator;
 import org.sonar.server.source.index.SourceLineIndexer;
+import org.sonar.server.source.index.SourceLineResultSetIterator;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.user.NewUser;
 import org.sonar.server.user.UserUpdater;
 import org.sonar.server.user.db.GroupDao;
 
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.entry;
 import static org.junit.Assert.fail;
@@ -80,6 +80,8 @@ public class IssueServiceMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbClient db;
   IssueIndex IssueIndex;
@@ -123,11 +125,11 @@ public class IssueServiceMediumTest {
     saveIssue(IssueTesting.newDto(rule, file, project).setActionPlanKey("P1"));
     saveIssue(IssueTesting.newDto(rule, file, project).setActionPlanKey("P2").setResolution("NONE"));
 
-    SearchResult<IssueDoc> result = service.search(IssueQuery.builder().build(), new SearchOptions());
+    SearchResult<IssueDoc> result = service.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions());
     assertThat(result.getDocs()).hasSize(2);
     assertThat(result.getFacets().getNames()).isEmpty();
 
-    result = service.search(IssueQuery.builder().build(), new SearchOptions().addFacets("actionPlans", "assignees"));
+    result = service.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions().addFacets("actionPlans", "assignees"));
     assertThat(result.getFacets().getNames()).hasSize(2);
     assertThat(result.getFacets().get("actionPlans")).hasSize(2);
     assertThat(result.getFacets().get("assignees")).hasSize(1);
@@ -155,7 +157,7 @@ public class IssueServiceMediumTest {
     RuleDto rule = newRule();
     ComponentDto project = newProject();
     ComponentDto file = newFile(project);
-    MockUserSession.set().setLogin("john");
+    userSessionRule.logon("john");
 
     IssueDto issue = saveIssue(IssueTesting.newDto(rule, file, project).setStatus(Issue.STATUS_OPEN));
 
@@ -171,7 +173,7 @@ public class IssueServiceMediumTest {
     RuleDto rule = newRule();
     ComponentDto project = newProject();
     ComponentDto file = newFile(project);
-    MockUserSession.set().setLogin("john");
+    userSessionRule.logon("john");
 
     IssueDto issue = saveIssue(IssueTesting.newDto(rule, file, project));
 
@@ -192,7 +194,7 @@ public class IssueServiceMediumTest {
     RuleDto rule = newRule();
     ComponentDto project = newProject();
     ComponentDto file = newFile(project);
-    MockUserSession.set().setLogin("john");
+    userSessionRule.logon("john");
 
     IssueDto issue = saveIssue(IssueTesting.newDto(rule, file, project).setAssignee("perceval"));
 
@@ -213,7 +215,7 @@ public class IssueServiceMediumTest {
     RuleDto rule = newRule();
     ComponentDto project = newProject();
     ComponentDto file = newFile(project);
-    MockUserSession.set().setLogin("john");
+    userSessionRule.logon("john");
 
     IssueDto issue = saveIssue(IssueTesting.newDto(rule, file, project));
 
@@ -230,7 +232,7 @@ public class IssueServiceMediumTest {
     RuleDto rule = newRule();
     ComponentDto project = newProject();
     ComponentDto file = newFile(project);
-    MockUserSession.set().setLogin("john").addProjectPermissions(UserRole.USER, project.key());
+    userSessionRule.logon("john").addProjectPermissions(UserRole.USER, project.key());
 
     IssueDto issue = saveIssue(IssueTesting.newDto(rule, file, project));
 
@@ -251,7 +253,7 @@ public class IssueServiceMediumTest {
     RuleDto rule = newRule();
     ComponentDto project = newProject();
     ComponentDto file = newFile(project);
-    MockUserSession.set().setLogin("john");
+    userSessionRule.logon("john");
 
     String actionPlanKey = "EFGH";
     db.actionPlanDao().save(new ActionPlanDto().setKey(actionPlanKey).setProjectId(project.getId()));
@@ -269,7 +271,7 @@ public class IssueServiceMediumTest {
     RuleDto rule = newRule();
     ComponentDto project = newProject();
     ComponentDto file = newFile(project);
-    MockUserSession.set().setLogin("john");
+    userSessionRule.logon("john");
 
     IssueDto issue = saveIssue(IssueTesting.newDto(rule, file, project));
     try {
@@ -285,7 +287,7 @@ public class IssueServiceMediumTest {
     RuleDto rule = newRule();
     ComponentDto project = newProject();
     ComponentDto file = newFile(project);
-    MockUserSession.set().setLogin("john").addProjectPermissions(UserRole.ISSUE_ADMIN, project.key());
+    userSessionRule.logon("john").addProjectPermissions(UserRole.ISSUE_ADMIN, project.key());
 
     IssueDto issue = saveIssue(IssueTesting.newDto(rule, file, project).setSeverity(Severity.BLOCKER));
 
@@ -300,7 +302,7 @@ public class IssueServiceMediumTest {
   public void create_manual_issue() {
     ComponentDto project = newProject();
     ComponentDto file = newFile(project);
-    MockUserSession.set().setLogin("john").addProjectPermissions(UserRole.USER, project.key());
+    userSessionRule.logon("john").addProjectPermissions(UserRole.USER, project.key());
 
     RuleDto manualRule = RuleTesting.newManualRule("manualRuleKey");
     tester.get(RuleDao.class).insert(session, manualRule);
@@ -326,7 +328,7 @@ public class IssueServiceMediumTest {
     newSourceLine(file, 1, "arthur");
     createDefaultGroup();
     newUser("arthur");
-    MockUserSession.set().setLogin("john").addProjectPermissions(UserRole.USER, project.key());
+    userSessionRule.logon("john").addProjectPermissions(UserRole.USER, project.key());
 
     RuleDto manualRule = RuleTesting.newManualRule("manualRuleKey");
     tester.get(RuleDao.class).insert(session, manualRule);
@@ -350,7 +352,7 @@ public class IssueServiceMediumTest {
   public void create_manual_issue_with_major_severity_when_no_severity() {
     ComponentDto project = newProject();
     ComponentDto file = newFile(project);
-    MockUserSession.set().setLogin("john").addProjectPermissions(UserRole.USER, project.key());
+    userSessionRule.logon("john").addProjectPermissions(UserRole.USER, project.key());
 
     RuleDto manualRule = RuleTesting.newManualRule("manualRuleKey");
     tester.get(RuleDao.class).insert(session, manualRule);
@@ -366,7 +368,7 @@ public class IssueServiceMediumTest {
   public void create_manual_issue_with_rule_name_when_no_message() {
     ComponentDto project = newProject();
     ComponentDto file = newFile(project);
-    MockUserSession.set().setLogin("john").addProjectPermissions(UserRole.USER, project.key());
+    userSessionRule.logon("john").addProjectPermissions(UserRole.USER, project.key());
 
     RuleDto manualRule = RuleTesting.newManualRule("manualRuleKey").setName("Manual rule name");
     tester.get(RuleDao.class).insert(session, manualRule);
@@ -386,7 +388,7 @@ public class IssueServiceMediumTest {
     newSourceLine(file, 1, "unknown");
     createDefaultGroup();
     newUser("arthur");
-    MockUserSession.set().setLogin("john").addProjectPermissions(UserRole.USER, project.key());
+    userSessionRule.logon("john").addProjectPermissions(UserRole.USER, project.key());
 
     RuleDto manualRule = RuleTesting.newManualRule("manualRuleKey");
     tester.get(RuleDao.class).insert(session, manualRule);
@@ -404,7 +406,7 @@ public class IssueServiceMediumTest {
     ComponentDto file = newFile(project);
     // No author on line 1
     newSourceLine(file, 1, "");
-    MockUserSession.set().setLogin("john").addProjectPermissions(UserRole.USER, project.key());
+    userSessionRule.logon("john").addProjectPermissions(UserRole.USER, project.key());
 
     RuleDto manualRule = RuleTesting.newManualRule("manualRuleKey");
     tester.get(RuleDao.class).insert(session, manualRule);
@@ -421,7 +423,7 @@ public class IssueServiceMediumTest {
     RuleDto rule = newRule();
     ComponentDto project = newProject();
     ComponentDto file = newFile(project);
-    MockUserSession.set().setLogin("john").addProjectPermissions(UserRole.USER, project.key());
+    userSessionRule.logon("john").addProjectPermissions(UserRole.USER, project.key());
 
     try {
       service.createManualIssue(file.key(), rule.getKey(), null, "Fix it", null, 2d);
@@ -435,7 +437,7 @@ public class IssueServiceMediumTest {
   public void fail_create_manual_issue_if_rule_does_not_exists() {
     ComponentDto project = newProject();
     ComponentDto file = newFile(project);
-    MockUserSession.set().setLogin("john").addProjectPermissions(UserRole.USER, project.key());
+    userSessionRule.logon("john").addProjectPermissions(UserRole.USER, project.key());
 
     service.createManualIssue(file.key(), RuleKey.of("rule", "unknown"), 10, "Fix it", null, 2d);
   }
@@ -447,7 +449,7 @@ public class IssueServiceMediumTest {
     ComponentDto file = newFile(project);
 
     // User has not the 'user' role on the project
-    MockUserSession.set().setLogin("john").addProjectPermissions(UserRole.CODEVIEWER, project.key());
+    userSessionRule.logon("john").addProjectPermissions(UserRole.CODEVIEWER, project.key());
 
     RuleDto manualRule = RuleTesting.newManualRule("manualRuleKey");
     tester.get(RuleDao.class).insert(session, manualRule);
@@ -463,7 +465,7 @@ public class IssueServiceMediumTest {
     ComponentDto file = newFile(project);
     saveIssue(IssueTesting.newDto(rule, file, project));
 
-    List<IssueDoc> result = service.search(IssueQuery.builder().build(), new SearchOptions()).getDocs();
+    List<IssueDoc> result = service.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions()).getDocs();
     assertThat(result).hasSize(1);
   }
 
@@ -490,7 +492,7 @@ public class IssueServiceMediumTest {
     RuleDto rule = newRule();
     ComponentDto project = newProject();
     ComponentDto file = newFile(project);
-    MockUserSession.set().setLogin("john");
+    userSessionRule.logon("john");
 
     IssueDto issue = saveIssue(IssueTesting.newDto(rule, file, project));
 
@@ -537,7 +539,7 @@ public class IssueServiceMediumTest {
   }
 
   private IssueQuery projectQuery(String projectUuid) {
-    return IssueQuery.builder().projectUuids(Arrays.asList(projectUuid)).resolved(false).build();
+    return IssueQuery.builder(userSessionRule).projectUuids(Arrays.asList(projectUuid)).resolved(false).build();
   }
 
   @Test
@@ -568,12 +570,12 @@ public class IssueServiceMediumTest {
     ComponentDto project = ComponentTesting.newProjectDto();
     tester.get(ComponentDao.class).insert(session, project);
 
-    MockUserSession.set().setLogin("admin").addProjectPermissions(UserRole.USER, project.key()).setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.logon("admin").addProjectPermissions(UserRole.USER, project.key()).setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
     session.commit();
 
     // project can be seen by group "anyone"
     tester.get(InternalPermissionService.class).addPermission(new PermissionChange().setComponentKey(project.getKey()).setGroup(DefaultGroups.ANYONE).setPermission(UserRole.USER));
-    MockUserSession.set();
+    userSessionRule.logon();
 
     return project;
   }
index eb064aa92326fa4766b988f90d42c9a9e8c86d7b..f9ffcdf429ca7ed164aa86f0e1145d0193c21dd4 100644 (file)
 
 package org.sonar.server.issue;
 
+import java.util.Date;
+import java.util.List;
 import org.apache.commons.lang.time.DateUtils;
 import org.assertj.core.api.Assertions;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.core.issue.db.IssueDto;
-
-import java.util.Date;
-import java.util.List;
+import org.sonar.server.tester.UserSessionRule;
 
 import static com.google.common.collect.Lists.newArrayList;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -34,6 +35,8 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 public class IssuesFinderSortTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   @Test
   public void should_sort_by_assignee() {
@@ -43,7 +46,7 @@ public class IssuesFinderSortTest {
     IssueDto issue4 = new IssueDto().setId(4L).setAssignee(null);
     List<IssueDto> dtoList = newArrayList(issue1, issue2, issue3, issue4);
 
-    IssueQuery query = IssueQuery.builder().sort(IssueQuery.SORT_BY_ASSIGNEE).asc(true).build();
+    IssueQuery query = IssueQuery.builder(userSessionRule).sort(IssueQuery.SORT_BY_ASSIGNEE).asc(true).build();
     IssuesFinderSort issuesFinderSort = new IssuesFinderSort(dtoList, query);
 
     List<IssueDto> result = newArrayList(issuesFinderSort.sort());
@@ -62,7 +65,7 @@ public class IssuesFinderSortTest {
     IssueDto issue3 = new IssueDto().setId(3L).setStatus("OPEN");
     List<IssueDto> dtoList = newArrayList(issue1, issue2, issue3);
 
-    IssueQuery query = IssueQuery.builder().sort(IssueQuery.SORT_BY_STATUS).asc(false).build();
+    IssueQuery query = IssueQuery.builder(userSessionRule).sort(IssueQuery.SORT_BY_STATUS).asc(false).build();
     IssuesFinderSort issuesFinderSort = new IssuesFinderSort(dtoList, query);
 
     List<IssueDto> result = newArrayList(issuesFinderSort.sort());
@@ -80,7 +83,7 @@ public class IssuesFinderSortTest {
     IssueDto issue3 = new IssueDto().setId(3L).setSeverity("MAJOR");
     List<IssueDto> dtoList = newArrayList(issue1, issue2, issue3);
 
-    IssueQuery query = IssueQuery.builder().sort(IssueQuery.SORT_BY_SEVERITY).asc(true).build();
+    IssueQuery query = IssueQuery.builder(userSessionRule).sort(IssueQuery.SORT_BY_SEVERITY).asc(true).build();
     IssuesFinderSort issuesFinderSort = new IssuesFinderSort(dtoList, query);
 
     List<IssueDto> result = newArrayList(issuesFinderSort.sort());
@@ -98,7 +101,7 @@ public class IssuesFinderSortTest {
     IssueDto issue3 = new IssueDto().setId(3L).setSeverity("MAJOR");
     List<IssueDto> dtoList = newArrayList(issue1, issue2, issue3);
 
-    IssueQuery query = IssueQuery.builder().sort(IssueQuery.SORT_BY_SEVERITY).asc(false).build();
+    IssueQuery query = IssueQuery.builder(userSessionRule).sort(IssueQuery.SORT_BY_SEVERITY).asc(false).build();
     IssuesFinderSort issuesFinderSort = new IssuesFinderSort(dtoList, query);
 
     List<IssueDto> result = newArrayList(issuesFinderSort.sort());
@@ -120,7 +123,7 @@ public class IssuesFinderSortTest {
     IssueDto issue3 = new IssueDto().setId(3L).setIssueCreationDate(date2);
     List<IssueDto> dtoList = newArrayList(issue1, issue2, issue3);
 
-    IssueQuery query = IssueQuery.builder().sort(IssueQuery.SORT_BY_CREATION_DATE).asc(false).build();
+    IssueQuery query = IssueQuery.builder(userSessionRule).sort(IssueQuery.SORT_BY_CREATION_DATE).asc(false).build();
     IssuesFinderSort issuesFinderSort = new IssuesFinderSort(dtoList, query);
 
     List<IssueDto> result = newArrayList(issuesFinderSort.sort());
@@ -142,7 +145,7 @@ public class IssuesFinderSortTest {
     IssueDto issue3 = new IssueDto().setId(3L).setIssueUpdateDate(date2);
     List<IssueDto> dtoList = newArrayList(issue1, issue2, issue3);
 
-    IssueQuery query = IssueQuery.builder().sort(IssueQuery.SORT_BY_UPDATE_DATE).asc(false).build();
+    IssueQuery query = IssueQuery.builder(userSessionRule).sort(IssueQuery.SORT_BY_UPDATE_DATE).asc(false).build();
     IssuesFinderSort issuesFinderSort = new IssuesFinderSort(dtoList, query);
 
     List<IssueDto> result = newArrayList(issuesFinderSort.sort());
@@ -164,7 +167,7 @@ public class IssuesFinderSortTest {
     IssueDto issue3 = new IssueDto().setId(3L).setIssueCloseDate(date2);
     List<IssueDto> dtoList = newArrayList(issue1, issue2, issue3);
 
-    IssueQuery query = IssueQuery.builder().sort(IssueQuery.SORT_BY_CLOSE_DATE).asc(false).build();
+    IssueQuery query = IssueQuery.builder(userSessionRule).sort(IssueQuery.SORT_BY_CLOSE_DATE).asc(false).build();
     IssuesFinderSort issuesFinderSort = new IssuesFinderSort(dtoList, query);
 
     List<IssueDto> result = newArrayList(issuesFinderSort.sort());
@@ -183,7 +186,7 @@ public class IssuesFinderSortTest {
     IssueDto issue4 = new IssueDto().setId(4L).setAssignee(null);
     List<IssueDto> dtoList = newArrayList(issue1, issue2, issue3, issue4);
 
-    IssueQuery query = IssueQuery.builder().sort(null).build();
+    IssueQuery query = IssueQuery.builder(userSessionRule).sort(null).build();
     IssuesFinderSort issuesFinderSort = new IssuesFinderSort(dtoList, query);
 
     List<IssueDto> result = newArrayList(issuesFinderSort.sort());
index 4e3c4e331319d8fa7b87f7a953ea44a22624cb8b..9da70d4d60636c052c600485cd4fd138b5d520dc 100644 (file)
@@ -31,7 +31,7 @@ import org.sonar.api.issue.internal.IssueChangeContext;
 import org.sonar.core.issue.DefaultActionPlan;
 import org.sonar.core.issue.IssueUpdater;
 import org.sonar.server.issue.actionplan.ActionPlanService;
-import org.sonar.server.user.UserSession;
+import org.sonar.server.user.ThreadLocalUserSession;
 
 import java.util.List;
 import java.util.Map;
@@ -102,8 +102,8 @@ public class PlanActionTest {
     ActionPlan actionPlan = new DefaultActionPlan().setProjectKey("struts");
 
     List<Issue> issues = newArrayList((Issue) new DefaultIssue().setKey("ABC").setProjectKey("struts"));
-    when(actionPlanService.findByKey(eq(planKey), any(UserSession.class))).thenReturn(actionPlan);
-    assertThat(action.verify(properties, issues, mock(UserSession.class))).isTrue();
+    when(actionPlanService.findByKey(eq(planKey), any(ThreadLocalUserSession.class))).thenReturn(actionPlan);
+    assertThat(action.verify(properties, issues, mock(ThreadLocalUserSession.class))).isTrue();
     assertThat(properties.get(PlanAction.VERIFIED_ACTION_PLAN)).isEqualTo(actionPlan);
   }
 
@@ -117,8 +117,8 @@ public class PlanActionTest {
     properties.put("plan", planKey);
 
     List<Issue> issues = newArrayList((Issue) new DefaultIssue().setKey("ABC").setProjectKey("struts"));
-    when(actionPlanService.findByKey(eq(planKey), any(UserSession.class))).thenReturn(null);
-    action.verify(properties, issues, mock(UserSession.class));
+    when(actionPlanService.findByKey(eq(planKey), any(ThreadLocalUserSession.class))).thenReturn(null);
+    action.verify(properties, issues, mock(ThreadLocalUserSession.class));
   }
 
   @Test
@@ -128,7 +128,7 @@ public class PlanActionTest {
     properties.put("plan", planKey);
 
     List<Issue> issues = newArrayList((Issue) new DefaultIssue().setKey("ABC").setProjectKey("struts"));
-    action.verify(properties, issues, mock(UserSession.class));
+    action.verify(properties, issues, mock(ThreadLocalUserSession.class));
     assertThat(properties.containsKey(PlanAction.VERIFIED_ACTION_PLAN)).isTrue();
     assertThat(properties.get(PlanAction.VERIFIED_ACTION_PLAN)).isNull();
   }
@@ -142,9 +142,9 @@ public class PlanActionTest {
     Map<String, Object> properties = newHashMap();
     properties.put("plan", planKey);
 
-    when(actionPlanService.findByKey(eq(planKey), any(UserSession.class))).thenReturn(new DefaultActionPlan().setProjectKey("struts"));
+    when(actionPlanService.findByKey(eq(planKey), any(ThreadLocalUserSession.class))).thenReturn(new DefaultActionPlan().setProjectKey("struts"));
     List<Issue> issues = newArrayList(new DefaultIssue().setKey("ABC").setProjectKey("struts"), (Issue) new DefaultIssue().setKey("ABE").setProjectKey("mybatis"));
-    action.verify(properties, issues, mock(UserSession.class));
+    action.verify(properties, issues, mock(ThreadLocalUserSession.class));
   }
 
   @Test
index cb2f6cc1deb4253674b6b11b6ca853c9d2a59d88..093e41fa9c1ce8d63946eef4620849828371904d 100644 (file)
 package org.sonar.server.issue;
 
 import com.google.common.collect.Lists;
+import java.util.Map;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.issue.Issue;
 import org.sonar.api.issue.internal.DefaultIssue;
 import org.sonar.api.issue.internal.IssueChangeContext;
 import org.sonar.api.web.UserRole;
 import org.sonar.core.issue.IssueUpdater;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
+import org.sonar.server.tester.AnonymousMockUserSession;
 import org.sonar.server.user.UserSession;
-import org.sonar.server.user.UserSessionTestUtils;
-
-import java.util.Map;
 
 import static com.google.common.collect.Maps.newHashMap;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -46,17 +46,19 @@ import static org.mockito.Mockito.when;
 
 public class SetSeverityActionTest {
 
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
+
+  private UserSession userSessionMock = mock(UserSession.class);
+
   private SetSeverityAction action;
 
   private IssueUpdater issueUpdater = mock(IssueUpdater.class);
 
-  private UserSession userSession;
-
   @Before
   public void before() {
-    action = new SetSeverityAction(issueUpdater);
-    userSession = mock(UserSession.class);
-    UserSessionTestUtils.setUserSession(userSession);
+    action = new SetSeverityAction(issueUpdater, userSessionRule);
+    userSessionRule.set(userSessionMock);
   }
 
   @Test
@@ -78,7 +80,7 @@ public class SetSeverityActionTest {
     Map<String, Object> properties = newHashMap();
     properties.put("unknwown", "unknown value");
     try {
-      action.verify(properties, Lists.<Issue>newArrayList(), MockUserSession.create());
+      action.verify(properties, Lists.<Issue>newArrayList(), new AnonymousMockUserSession());
       fail();
     } catch (Exception e) {
       assertThat(e).isInstanceOf(IllegalArgumentException.class).hasMessage("Missing parameter : 'severity'");
@@ -88,14 +90,14 @@ public class SetSeverityActionTest {
 
   @Test
   public void should_support_only_unresolved_issues() {
-    when(userSession.hasProjectPermission(UserRole.ISSUE_ADMIN, "foo:bar")).thenReturn(true);
+    when(userSessionMock.hasProjectPermission(UserRole.ISSUE_ADMIN, "foo:bar")).thenReturn(true);
     assertThat(action.supports(new DefaultIssue().setProjectKey("foo:bar").setResolution(null))).isTrue();
     assertThat(action.supports(new DefaultIssue().setProjectKey("foo:bar").setResolution(Issue.RESOLUTION_FIXED))).isFalse();
   }
 
   @Test
   public void should_support_only_issues_with_issue_admin_permission() {
-    when(userSession.hasProjectPermission(UserRole.ISSUE_ADMIN, "foo:bar")).thenReturn(true);
+    when(userSessionMock.hasProjectPermission(UserRole.ISSUE_ADMIN, "foo:bar")).thenReturn(true);
     assertThat(action.supports(new DefaultIssue().setProjectKey("foo:bar").setResolution(null))).isTrue();
     assertThat(action.supports(new DefaultIssue().setProjectKey("foo:bar2").setResolution(null))).isFalse();
   }
index 9d8afb767ce07f7a24d7f22829f5e8b4a809010d..86945151adeb7091a24dce7354d734bca6f857a1 100644 (file)
 package org.sonar.server.issue;
 
 import com.google.common.collect.Lists;
+import java.util.Map;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.issue.Issue;
 import org.sonar.api.issue.internal.DefaultIssue;
 import org.sonar.api.issue.internal.IssueChangeContext;
 import org.sonar.core.issue.workflow.IssueWorkflow;
 import org.sonar.core.issue.workflow.Transition;
-import org.sonar.server.user.MockUserSession;
-
-import java.util.Map;
+import org.sonar.server.tester.UserSessionRule;
 
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Maps.newHashMap;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.fail;
-import static org.mockito.Mockito.*;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
 
 public class TransitionActionTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   private TransitionAction action;
 
@@ -46,7 +54,7 @@ public class TransitionActionTest {
 
   @Before
   public void before() {
-    action = new TransitionAction(workflow);
+    action = new TransitionAction(workflow, userSessionRule);
   }
 
   @Test
@@ -88,7 +96,7 @@ public class TransitionActionTest {
     Map<String, Object> properties = newHashMap();
     properties.put("unknwown", transition);
     try {
-      action.verify(properties, Lists.<Issue>newArrayList(), MockUserSession.create());
+      action.verify(properties, Lists.<Issue>newArrayList(), userSessionRule);
       fail();
     } catch (Exception e) {
       assertThat(e).isInstanceOf(IllegalArgumentException.class).hasMessage("Missing parameter : 'transition'");
index c10fcad35b275f07aef1c2cdf3875ac1e5246e48..4d17c6e4667c4d5b476de2a0c0078faad99629af 100644 (file)
@@ -47,7 +47,7 @@ import org.sonar.core.resource.ResourceQuery;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.exceptions.NotFoundException;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.MockUserSession;
 import org.sonar.server.user.UserSession;
 
 import java.util.Collection;
@@ -87,9 +87,9 @@ public class ActionPlanServiceTest {
 
   String projectKey = "org.sonar.Sample";
 
-  UserSession projectAdministratorUserSession = MockUserSession.create().setLogin("nicolas").setName("Nicolas").addProjectPermissions(UserRole.ADMIN, projectKey);
-  UserSession projectUserSession = MockUserSession.create().setLogin("nicolas").setName("Nicolas").addProjectPermissions(UserRole.USER, projectKey);
-  UserSession unauthorizedUserSession = MockUserSession.create().setLogin("nicolas").setName("Nicolas");
+  UserSession projectAdministratorUserSession = new MockUserSession("nicolas").setName("Nicolas").addProjectPermissions(UserRole.ADMIN, projectKey);
+  UserSession projectUserSession = new MockUserSession("nicolas").setName("Nicolas").addProjectPermissions(UserRole.USER, projectKey);
+  UserSession unauthorizedUserSession = new MockUserSession("nicolas").setName("Nicolas");
 
   private ActionPlanService actionPlanService;
 
index b36e727f2d7f67ea27c1110319c384b9da3fb9f9..ee80ba9d5a7535688c4848b7d1f9bc449e27bc58 100644 (file)
 
 package org.sonar.server.issue.filter;
 
+import java.util.Arrays;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.runners.MockitoJUnitRunner;
 import org.sonar.core.issue.db.IssueFilterDto;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
-import java.util.Arrays;
-
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class AppActionTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   @Mock
   IssueFilterService service;
@@ -48,27 +50,27 @@ public class AppActionTest {
 
   @Before
   public void setUp() {
-    action = new AppAction(service, writer);
+    action = new AppAction(service, writer, userSessionRule);
     tester = new WsTester(new IssueFilterWs(action, mock(ShowAction.class), mock(FavoritesAction.class)));
   }
 
   @Test
   public void anonymous_app() throws Exception {
-    MockUserSession.set().setLogin(null);
+    userSessionRule.anonymous();
     tester.newGetRequest("api/issue_filters", "app").execute().assertJson(getClass(), "anonymous_page.json");
   }
 
   @Test
   public void logged_in_app() throws Exception {
-    MockUserSession.set().setLogin("eric").setUserId(123);
+    userSessionRule.logon("eric").setUserId(123);
     tester.newGetRequest("api/issue_filters", "app").execute()
       .assertJson(getClass(), "logged_in_page.json");
   }
 
   @Test
   public void logged_in_app_with_favorites() throws Exception {
-    MockUserSession session = MockUserSession.set().setLogin("eric").setUserId(123);
-    when(service.findFavoriteFilters(session)).thenReturn(Arrays.asList(
+    userSessionRule.logon("eric").setUserId(123);
+    when(service.findFavoriteFilters(userSessionRule)).thenReturn(Arrays.asList(
       new IssueFilterDto().setId(6L).setName("My issues"),
       new IssueFilterDto().setId(13L).setName("Blocker issues")
     ));
@@ -78,8 +80,8 @@ public class AppActionTest {
 
   @Test
   public void logged_in_app_with_selected_filter() throws Exception {
-    MockUserSession session = MockUserSession.set().setLogin("eric").setUserId(123);
-    when(service.find(13L, session)).thenReturn(
+    userSessionRule.logon("eric").setUserId(123);
+    when(service.find(13L, userSessionRule)).thenReturn(
       new IssueFilterDto().setId(13L).setName("Blocker issues").setData("severity=BLOCKER").setUserLogin("eric")
     );
 
@@ -90,8 +92,8 @@ public class AppActionTest {
   @Test
   public void app_selected_filter_can_not_be_modified() throws Exception {
     // logged-in user is 'eric' but filter is owned by 'simon'
-    MockUserSession session = MockUserSession.set().setLogin("eric").setUserId(123).setGlobalPermissions("none");
-    when(service.find(13L, session)).thenReturn(
+    userSessionRule.logon("eric").setUserId(123).setGlobalPermissions("none");
+    when(service.find(13L, userSessionRule)).thenReturn(
       new IssueFilterDto().setId(13L).setName("Blocker issues").setData("severity=BLOCKER").setUserLogin("simon").setShared(true)
     );
 
index 4d4b0816f14fa3dd4a32b8a053733aa6a824a2de..f65c6cc731c3ef272032377bb59bff85bcbfaff3 100644 (file)
 
 package org.sonar.server.issue.filter;
 
+import java.util.Arrays;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.runners.MockitoJUnitRunner;
 import org.sonar.core.issue.db.IssueFilterDto;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
-import java.util.Arrays;
-
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class FavoritesActionTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   @Mock
   IssueFilterService service;
@@ -49,13 +51,13 @@ public class FavoritesActionTest {
 
   @Before
   public void setUp() {
-    action = new FavoritesAction(service);
+    action = new FavoritesAction(service, userSessionRule);
     tester = new WsTester(new IssueFilterWs(mock(AppAction.class), mock(ShowAction.class), action));
   }
 
   @Test
   public void favorites_of_anonymous() throws Exception {
-    MockUserSession.set();
+    userSessionRule.logon();
 
     tester.newGetRequest("api/issue_filters", "favorites").execute()
       .assertJson("{\"favoriteFilters\": []}");
@@ -63,8 +65,8 @@ public class FavoritesActionTest {
 
   @Test
   public void favorites_of_logged_in_user() throws Exception {
-    MockUserSession session = MockUserSession.set().setLogin("eric").setUserId(123);
-    when(service.findFavoriteFilters(session)).thenReturn(Arrays.asList(
+    userSessionRule.logon("eric").setUserId(123);
+    when(service.findFavoriteFilters(userSessionRule)).thenReturn(Arrays.asList(
       new IssueFilterDto().setId(13L).setName("Blocker issues").setData("severity=BLOCKER").setUserLogin("simon").setShared(true)
     ));
 
index cdccfdb2ca9aff1824fa543cc0387c6644bff164..7d99241c37af4712f9992374e22760d52b68dcc4 100644 (file)
@@ -43,7 +43,8 @@ import org.sonar.server.exceptions.UnauthorizedException;
 import org.sonar.server.issue.IssueQuery;
 import org.sonar.server.issue.index.IssueDoc;
 import org.sonar.server.issue.index.IssueIndex;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.AnonymousMockUserSession;
+import org.sonar.server.tester.MockUserSession;
 import org.sonar.server.user.UserSession;
 
 import java.util.Collections;
@@ -64,7 +65,7 @@ public class IssueFilterServiceTest {
   IssueIndex issueIndex = mock(IssueIndex.class);
   AuthorizationDao authorizationDao = mock(AuthorizationDao.class);
   IssueFilterSerializer issueFilterSerializer = mock(IssueFilterSerializer.class);
-  UserSession userSession = MockUserSession.create().setLogin("john");
+  UserSession userSession = new MockUserSession("john");
   IssueFilterService service = new IssueFilterService(issueFilterDao, issueFilterFavouriteDao, issueIndex, authorizationDao, issueFilterSerializer);
 
   @Test
@@ -110,9 +111,8 @@ public class IssueFilterServiceTest {
 
   @Test
   public void should_not_find_by_id_if_not_logged() {
-    UserSession userSession = MockUserSession.create().setLogin(null);
     try {
-      service.find(1L, userSession);
+      service.find(1L, new AnonymousMockUserSession());
       fail();
     } catch (Exception e) {
       assertThat(e).isInstanceOf(UnauthorizedException.class).hasMessage("User is not logged in");
@@ -144,9 +144,8 @@ public class IssueFilterServiceTest {
 
   @Test
   public void should_not_find_by_user_if_not_logged() {
-    UserSession userSession = MockUserSession.create().setLogin(null);
     try {
-      service.findByUser(userSession);
+      service.findByUser(new AnonymousMockUserSession());
       fail();
     } catch (Exception e) {
       assertThat(e).isInstanceOf(UnauthorizedException.class).hasMessage("User is not logged in");
@@ -174,10 +173,9 @@ public class IssueFilterServiceTest {
 
   @Test
   public void should_not_save_if_not_logged() {
-    UserSession userSession = MockUserSession.create().setLogin(null);
     try {
       IssueFilterDto issueFilter = new IssueFilterDto().setName("My Issue");
-      service.save(issueFilter, userSession);
+      service.save(issueFilter, new AnonymousMockUserSession());
       fail();
     } catch (Exception e) {
       assertThat(e).isInstanceOf(UnauthorizedException.class).hasMessage("User is not logged in");
@@ -417,7 +415,7 @@ public class IssueFilterServiceTest {
 
     try {
       IssueFilterDto issueFilter = new IssueFilterDto().setId(1L).setName("My filter").setShared(true).setUserLogin("new.owner");
-      service.update(issueFilter, MockUserSession.create().setUserId(1).setLogin(currentUser));
+      service.update(issueFilter, new MockUserSession(currentUser).setUserId(1));
       fail();
     } catch (Exception e) {
       assertThat(e).isInstanceOf(ForbiddenException.class).hasMessage("User is not authorized to change the owner of this filter");
@@ -535,7 +533,7 @@ public class IssueFilterServiceTest {
 
   @Test
   public void should_execute_from_issue_query() {
-    IssueQuery issueQuery = IssueQuery.builder().build();
+    IssueQuery issueQuery = IssueQuery.builder(userSession).build();
     SearchOptions searchOptions = new SearchOptions().setPage(2, 50);
 
     SearchResult<IssueDoc> result = mock(SearchResult.class);
@@ -573,10 +571,8 @@ public class IssueFilterServiceTest {
 
   @Test
   public void should_not_find_favourite_issue_filter_if_not_logged() {
-    UserSession userSession = MockUserSession.create().setLogin(null);
-
     try {
-      service.findFavoriteFilters(userSession);
+      service.findFavoriteFilters(new AnonymousMockUserSession());
       fail();
     } catch (Exception e) {
       assertThat(e).isInstanceOf(UnauthorizedException.class).hasMessage("User is not logged in");
@@ -662,14 +658,13 @@ public class IssueFilterServiceTest {
   @Test
   public void user_can_share_filter_if_logged_and_own_sharing_permission() {
     when(authorizationDao.selectGlobalPermissions("john")).thenReturn(newArrayList(GlobalPermissions.DASHBOARD_SHARING));
-    UserSession userSession = MockUserSession.create().setLogin("john");
+    UserSession userSession = new MockUserSession("john");
     assertThat(service.canShareFilter(userSession)).isTrue();
 
-    userSession = MockUserSession.create().setLogin(null);
-    assertThat(service.canShareFilter(userSession)).isFalse();
+    assertThat(service.canShareFilter(new AnonymousMockUserSession())).isFalse();
 
     when(authorizationDao.selectGlobalPermissions("john")).thenReturn(Collections.<String>emptyList());
-    userSession = MockUserSession.create().setLogin("john");
+    userSession = new MockUserSession("john");
     assertThat(service.canShareFilter(userSession)).isFalse();
   }
 
index a02a6c1fad08a4693d01e66de420172da9d00d40..9460ab54bdecd2fb7b1fc8ecafc1c1c2bde56b18 100644 (file)
@@ -24,7 +24,8 @@ import org.junit.Test;
 import org.sonar.api.utils.text.JsonWriter;
 import org.sonar.core.issue.db.IssueFilterDto;
 import org.sonar.core.permission.GlobalPermissions;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.AnonymousMockUserSession;
+import org.sonar.server.tester.MockUserSession;
 import org.sonar.server.user.UserSession;
 
 import java.io.StringWriter;
@@ -37,8 +38,7 @@ public class IssueFilterWriterTest {
 
   @Test
   public void write_filter() {
-    UserSession userSession = MockUserSession.set();
-    test(userSession,
+    test(new AnonymousMockUserSession(),
       new IssueFilterDto()
         .setId(13L)
         .setName("Blocker issues")
@@ -59,8 +59,7 @@ public class IssueFilterWriterTest {
 
   @Test
   public void can_modify_if_logged_user_own_filter() {
-    UserSession userSession = MockUserSession.set().setLogin("simon");
-    test(userSession,
+    test(new MockUserSession("simon"),
       new IssueFilterDto()
         .setId(13L)
         .setName("Blocker issues")
@@ -81,7 +80,7 @@ public class IssueFilterWriterTest {
 
   @Test
   public void can_modify_if_logged_user_has_permission() {
-    UserSession userSession = MockUserSession.set().setLogin("simon").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    UserSession userSession = new MockUserSession("simon").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
     test(userSession,
       new IssueFilterDto()
         .setId(13L)
index f85e678d89f66e48d888a9039754babc7db8e6ac..322945d463cafbf1f71d5b9bdbba68ff61b4605a 100644 (file)
 package org.sonar.server.issue.filter;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.runners.MockitoJUnitRunner;
 import org.sonar.api.server.ws.WebService;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
 @RunWith(MockitoJUnitRunner.class)
 public class IssueFilterWsTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   @Mock
   IssueFilterService service;
@@ -44,7 +48,7 @@ public class IssueFilterWsTest {
 
   @Before
   public void setUp() {
-    ws = new IssueFilterWs(new AppAction(service, issueFilterWriter), new ShowAction(service, issueFilterWriter), new FavoritesAction(service));
+    ws = new IssueFilterWs(new AppAction(service, issueFilterWriter, userSessionRule), new ShowAction(service, issueFilterWriter, userSessionRule), new FavoritesAction(service, userSessionRule));
     tester = new WsTester(ws);
   }
 
index 7642f62d48a2d0a9e3997f5d76e187349216df55..bf7eff3a0782b42075e2cffe3c10ecf0b0a1986c 100644 (file)
 package org.sonar.server.issue.filter;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.runners.MockitoJUnitRunner;
 import org.sonar.core.issue.db.IssueFilterDto;
 import org.sonar.server.exceptions.NotFoundException;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -37,6 +38,8 @@ import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class ShowActionTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   @Mock
   IssueFilterService service;
@@ -49,15 +52,15 @@ public class ShowActionTest {
 
   @Before
   public void setUp() {
-    action = new ShowAction(service, writer);
+    action = new ShowAction(service, writer, userSessionRule);
     tester = new WsTester(new IssueFilterWs(mock(AppAction.class), action, mock(FavoritesAction.class)));
   }
 
   @Test
   public void show_filter() throws Exception {
     // logged-in user is 'eric' but filter is owned by 'simon'
-    MockUserSession session = MockUserSession.set().setLogin("eric").setUserId(123).setGlobalPermissions("none");
-    when(service.find(13L, session)).thenReturn(
+    userSessionRule.logon("eric").setUserId(123).setGlobalPermissions("none");
+    when(service.find(13L, userSessionRule)).thenReturn(
       new IssueFilterDto().setId(13L).setName("Blocker issues").setDescription("All Blocker Issues").setData("severity=BLOCKER").setUserLogin("simon").setShared(true)
     );
 
@@ -67,8 +70,8 @@ public class ShowActionTest {
 
   @Test
   public void show_unknown_filter() throws Exception {
-    MockUserSession session = MockUserSession.set().setLogin("eric").setUserId(123).setGlobalPermissions("none");
-    when(service.find(42L, session)).thenThrow(new NotFoundException("Filter 42 does not exist"));
+    userSessionRule.logon("eric").setUserId(123).setGlobalPermissions("none");
+    when(service.find(42L, userSessionRule)).thenThrow(new NotFoundException("Filter 42 does not exist"));
 
     try {
       tester.newGetRequest("api/issue_filters", "show").setParam("id", "42").execute();
index 30b6b500075e93ec4894b57c152600417eeb5aff..01ef670374a047d41082edbb0c347c9422673651 100644 (file)
@@ -22,9 +22,16 @@ package org.sonar.server.issue.index;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Lists;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+import javax.annotation.Nullable;
 import org.assertj.core.api.Fail;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.config.Settings;
 import org.sonar.api.issue.Issue;
@@ -43,15 +50,11 @@ import org.sonar.server.es.SearchResult;
 import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.issue.IssueQuery;
 import org.sonar.server.issue.IssueTesting;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.view.index.ViewDoc;
 import org.sonar.server.view.index.ViewIndexDefinition;
 import org.sonar.server.view.index.ViewIndexer;
 
-import javax.annotation.Nullable;
-
-import java.util.*;
-
 import static com.google.common.collect.Lists.newArrayList;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.entry;
@@ -63,6 +66,8 @@ public class IssueIndexTest {
 
   @ClassRule
   public static EsTester tester = new EsTester().addDefinitions(new IssueIndexDefinition(new Settings()), new ViewIndexDefinition(new Settings()));
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   IssueIndex index;
 
@@ -80,7 +85,7 @@ public class IssueIndexTest {
     when(system.getDefaultTimeZone()).thenReturn(TimeZone.getTimeZone("+01:00"));
     when(system.now()).thenReturn(System.currentTimeMillis());
 
-    index = new IssueIndex(tester.client(), system);
+    index = new IssueIndex(tester.client(), system, userSessionRule);
 
   }
 
@@ -141,9 +146,9 @@ public class IssueIndexTest {
       IssueTesting.newDoc("1", ComponentTesting.newFileDto(project)),
       IssueTesting.newDoc("2", ComponentTesting.newFileDto(project)));
 
-    assertThat(index.search(IssueQuery.builder().issueKeys(newArrayList("1", "2")).build(), new SearchOptions()).getDocs()).hasSize(2);
-    assertThat(index.search(IssueQuery.builder().issueKeys(newArrayList("1")).build(), new SearchOptions()).getDocs()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().issueKeys(newArrayList("3", "4")).build(), new SearchOptions()).getDocs()).isEmpty();
+    assertThat(index.search(IssueQuery.builder(userSessionRule).issueKeys(newArrayList("1", "2")).build(), new SearchOptions()).getDocs()).hasSize(2);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).issueKeys(newArrayList("1")).build(), new SearchOptions()).getDocs()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).issueKeys(newArrayList("3", "4")).build(), new SearchOptions()).getDocs()).isEmpty();
   }
 
   @Test
@@ -160,8 +165,8 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE5", subModule),
       IssueTesting.newDoc("ISSUE6", ComponentTesting.newFileDto(subModule)));
 
-    assertThat(index.search(IssueQuery.builder().projectUuids(newArrayList(project.uuid())).build(), new SearchOptions()).getDocs()).hasSize(6);
-    assertThat(index.search(IssueQuery.builder().projectUuids(newArrayList("unknown")).build(), new SearchOptions()).getDocs()).isEmpty();
+    assertThat(index.search(IssueQuery.builder(userSessionRule).projectUuids(newArrayList(project.uuid())).build(), new SearchOptions()).getDocs()).hasSize(6);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).projectUuids(newArrayList("unknown")).build(), new SearchOptions()).getDocs()).isEmpty();
   }
 
   @Test
@@ -174,7 +179,7 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE2", ComponentTesting.newFileDto(project)),
       IssueTesting.newDoc("ISSUE3", ComponentTesting.newFileDto(project2)));
 
-    SearchResult<IssueDoc> result = index.search(IssueQuery.builder().build(), new SearchOptions().addFacets(newArrayList("projectUuids")));
+    SearchResult<IssueDoc> result = index.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions().addFacets(newArrayList("projectUuids")));
     assertThat(result.getFacets().getNames()).containsOnly("projectUuids");
     assertThat(result.getFacets().get("projectUuids")).containsOnly(entry("ABCD", 2L), entry("EFGH", 1L));
   }
@@ -191,15 +196,15 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE5", subModule),
       IssueTesting.newDoc("ISSUE2", file));
 
-    assertThat(index.search(IssueQuery.builder().projectUuids(newArrayList(project.uuid())).moduleUuids(newArrayList(file.uuid())).build(), new SearchOptions()).getDocs())
+    assertThat(index.search(IssueQuery.builder(userSessionRule).projectUuids(newArrayList(project.uuid())).moduleUuids(newArrayList(file.uuid())).build(), new SearchOptions()).getDocs())
       .isEmpty();
-    assertThat(index.search(IssueQuery.builder().projectUuids(newArrayList(project.uuid())).moduleUuids(newArrayList(module.uuid())).build(), new SearchOptions()).getDocs())
+    assertThat(index.search(IssueQuery.builder(userSessionRule).projectUuids(newArrayList(project.uuid())).moduleUuids(newArrayList(module.uuid())).build(), new SearchOptions()).getDocs())
       .hasSize(1);
-    assertThat(index.search(IssueQuery.builder().projectUuids(newArrayList(project.uuid())).moduleUuids(newArrayList(subModule.uuid())).build(), new SearchOptions()).getDocs())
+    assertThat(index.search(IssueQuery.builder(userSessionRule).projectUuids(newArrayList(project.uuid())).moduleUuids(newArrayList(subModule.uuid())).build(), new SearchOptions()).getDocs())
       .hasSize(2);
-    assertThat(index.search(IssueQuery.builder().projectUuids(newArrayList(project.uuid())).moduleUuids(newArrayList(project.uuid())).build(), new SearchOptions()).getDocs())
+    assertThat(index.search(IssueQuery.builder(userSessionRule).projectUuids(newArrayList(project.uuid())).moduleUuids(newArrayList(project.uuid())).build(), new SearchOptions()).getDocs())
       .isEmpty();
-    assertThat(index.search(IssueQuery.builder().projectUuids(newArrayList(project.uuid())).moduleUuids(newArrayList("unknown")).build(), new SearchOptions()).getDocs()).isEmpty();
+    assertThat(index.search(IssueQuery.builder(userSessionRule).projectUuids(newArrayList(project.uuid())).moduleUuids(newArrayList("unknown")).build(), new SearchOptions()).getDocs()).isEmpty();
   }
 
   @Test
@@ -221,19 +226,19 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE5", subModule),
       IssueTesting.newDoc("ISSUE6", file3));
 
-    assertThat(index.search(IssueQuery.builder().fileUuids(newArrayList(file1.uuid(), file2.uuid(), file3.uuid())).build(), new SearchOptions())
+    assertThat(index.search(IssueQuery.builder(userSessionRule).fileUuids(newArrayList(file1.uuid(), file2.uuid(), file3.uuid())).build(), new SearchOptions())
       .getDocs()).hasSize(3);
-    assertThat(index.search(IssueQuery.builder().fileUuids(newArrayList(file1.uuid())).build(), new SearchOptions())
+    assertThat(index.search(IssueQuery.builder(userSessionRule).fileUuids(newArrayList(file1.uuid())).build(), new SearchOptions())
       .getDocs()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().moduleRootUuids(newArrayList(subModule.uuid())).build(), new SearchOptions())
+    assertThat(index.search(IssueQuery.builder(userSessionRule).moduleRootUuids(newArrayList(subModule.uuid())).build(), new SearchOptions())
       .getDocs()).hasSize(2);
-    assertThat(index.search(IssueQuery.builder().moduleRootUuids(newArrayList(module.uuid())).build(), new SearchOptions())
+    assertThat(index.search(IssueQuery.builder(userSessionRule).moduleRootUuids(newArrayList(module.uuid())).build(), new SearchOptions())
       .getDocs()).hasSize(4);
-    assertThat(index.search(IssueQuery.builder().projectUuids(newArrayList(project.uuid())).build(), new SearchOptions())
+    assertThat(index.search(IssueQuery.builder(userSessionRule).projectUuids(newArrayList(project.uuid())).build(), new SearchOptions())
       .getDocs()).hasSize(6);
-    assertThat(index.search(IssueQuery.builder().viewUuids(newArrayList(view)).build(), new SearchOptions())
+    assertThat(index.search(IssueQuery.builder(userSessionRule).viewUuids(newArrayList(view)).build(), new SearchOptions())
       .getDocs()).hasSize(6);
-    assertThat(index.search(IssueQuery.builder().projectUuids(newArrayList("unknown")).build(), new SearchOptions())
+    assertThat(index.search(IssueQuery.builder(userSessionRule).projectUuids(newArrayList("unknown")).build(), new SearchOptions())
       .getDocs()).isEmpty();
   }
 
@@ -256,15 +261,15 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE5", subModule),
       IssueTesting.newDoc("ISSUE6", file3));
 
-    assertThat(index.search(IssueQuery.builder().projectUuids(newArrayList("unknown")).build(), new SearchOptions()).getDocs()).isEmpty();
-    assertThat(index.search(IssueQuery.builder().projectUuids(newArrayList(project.uuid())).build(), new SearchOptions()).getDocs()).hasSize(6);
-    assertThat(index.search(IssueQuery.builder().viewUuids(newArrayList(view)).build(), new SearchOptions()).getDocs()).hasSize(6);
-    assertThat(index.search(IssueQuery.builder().moduleUuids(newArrayList(module.uuid())).build(), new SearchOptions()).getDocs()).hasSize(2);
-    assertThat(index.search(IssueQuery.builder().moduleUuids(newArrayList(subModule.uuid())).build(), new SearchOptions()).getDocs()).hasSize(2); // XXX
+    assertThat(index.search(IssueQuery.builder(userSessionRule).projectUuids(newArrayList("unknown")).build(), new SearchOptions()).getDocs()).isEmpty();
+    assertThat(index.search(IssueQuery.builder(userSessionRule).projectUuids(newArrayList(project.uuid())).build(), new SearchOptions()).getDocs()).hasSize(6);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).viewUuids(newArrayList(view)).build(), new SearchOptions()).getDocs()).hasSize(6);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).moduleUuids(newArrayList(module.uuid())).build(), new SearchOptions()).getDocs()).hasSize(2);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).moduleUuids(newArrayList(subModule.uuid())).build(), new SearchOptions()).getDocs()).hasSize(2); // XXX
     // Misleading
     // !
-    assertThat(index.search(IssueQuery.builder().fileUuids(newArrayList(file1.uuid())).build(), new SearchOptions()).getDocs()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().fileUuids(newArrayList(file1.uuid(), file2.uuid(), file3.uuid())).build(), new SearchOptions()).getDocs()).hasSize(3);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).fileUuids(newArrayList(file1.uuid())).build(), new SearchOptions()).getDocs()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).fileUuids(newArrayList(file1.uuid(), file2.uuid(), file3.uuid())).build(), new SearchOptions()).getDocs()).hasSize(3);
   }
 
   @Test
@@ -281,7 +286,7 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE4", file2),
       IssueTesting.newDoc("ISSUE5", file3));
 
-    SearchResult<IssueDoc> result = index.search(IssueQuery.builder().build(), new SearchOptions().addFacets(newArrayList("fileUuids")));
+    SearchResult<IssueDoc> result = index.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions().addFacets(newArrayList("fileUuids")));
     assertThat(result.getFacets().getNames()).containsOnly("fileUuids");
     assertThat(result.getFacets().get("fileUuids"))
       .containsOnly(entry("A", 1L), entry("ABCD", 1L), entry("BCDE", 2L), entry("CDEF", 1L));
@@ -297,9 +302,9 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE1", file1).setDirectoryPath("/src/main/xoo"),
       IssueTesting.newDoc("ISSUE2", file2).setDirectoryPath("/"));
 
-    assertThat(index.search(IssueQuery.builder().directories(newArrayList("/src/main/xoo")).build(), new SearchOptions()).getDocs()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().directories(newArrayList("/")).build(), new SearchOptions()).getDocs()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().directories(newArrayList("unknown")).build(), new SearchOptions()).getDocs()).isEmpty();
+    assertThat(index.search(IssueQuery.builder(userSessionRule).directories(newArrayList("/src/main/xoo")).build(), new SearchOptions()).getDocs()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).directories(newArrayList("/")).build(), new SearchOptions()).getDocs()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).directories(newArrayList("unknown")).build(), new SearchOptions()).getDocs()).isEmpty();
   }
 
   @Test
@@ -312,7 +317,7 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE1", file1).setDirectoryPath("/src/main/xoo"),
       IssueTesting.newDoc("ISSUE2", file2).setDirectoryPath("/"));
 
-    SearchResult<IssueDoc> result = index.search(IssueQuery.builder().build(), new SearchOptions().addFacets(newArrayList("directories")));
+    SearchResult<IssueDoc> result = index.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions().addFacets(newArrayList("directories")));
     assertThat(result.getFacets().getNames()).containsOnly("directories");
     assertThat(result.getFacets().get("directories")).containsOnly(entry("/src/main/xoo", 1L), entry("/", 1L));
   }
@@ -337,10 +342,10 @@ public class IssueIndexTest {
     String view2 = "CDEF";
     indexView(view2, newArrayList(project2.uuid()));
 
-    assertThat(index.search(IssueQuery.builder().viewUuids(newArrayList(view1)).build(), new SearchOptions()).getDocs()).hasSize(2);
-    assertThat(index.search(IssueQuery.builder().viewUuids(newArrayList(view2)).build(), new SearchOptions()).getDocs()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().viewUuids(newArrayList(view1, view2)).build(), new SearchOptions()).getDocs()).hasSize(3);
-    assertThat(index.search(IssueQuery.builder().viewUuids(newArrayList("unknown")).build(), new SearchOptions()).getDocs()).isEmpty();
+    assertThat(index.search(IssueQuery.builder(userSessionRule).viewUuids(newArrayList(view1)).build(), new SearchOptions()).getDocs()).hasSize(2);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).viewUuids(newArrayList(view2)).build(), new SearchOptions()).getDocs()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).viewUuids(newArrayList(view1, view2)).build(), new SearchOptions()).getDocs()).hasSize(3);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).viewUuids(newArrayList("unknown")).build(), new SearchOptions()).getDocs()).isEmpty();
   }
 
   @Test
@@ -352,9 +357,9 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE1", file).setSeverity(Severity.INFO),
       IssueTesting.newDoc("ISSUE2", file).setSeverity(Severity.MAJOR));
 
-    assertThat(index.search(IssueQuery.builder().severities(newArrayList(Severity.INFO, Severity.MAJOR)).build(), new SearchOptions()).getDocs()).hasSize(2);
-    assertThat(index.search(IssueQuery.builder().severities(newArrayList(Severity.INFO)).build(), new SearchOptions()).getDocs()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().severities(newArrayList(Severity.BLOCKER)).build(), new SearchOptions()).getDocs()).isEmpty();
+    assertThat(index.search(IssueQuery.builder(userSessionRule).severities(newArrayList(Severity.INFO, Severity.MAJOR)).build(), new SearchOptions()).getDocs()).hasSize(2);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).severities(newArrayList(Severity.INFO)).build(), new SearchOptions()).getDocs()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).severities(newArrayList(Severity.BLOCKER)).build(), new SearchOptions()).getDocs()).isEmpty();
   }
 
   @Test
@@ -367,7 +372,7 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE2", file).setSeverity(Severity.INFO),
       IssueTesting.newDoc("ISSUE3", file).setSeverity(Severity.MAJOR));
 
-    SearchResult<IssueDoc> result = index.search(IssueQuery.builder().build(), new SearchOptions().addFacets(newArrayList("severities")));
+    SearchResult<IssueDoc> result = index.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions().addFacets(newArrayList("severities")));
     assertThat(result.getFacets().getNames()).containsOnly("severities");
     assertThat(result.getFacets().get("severities")).containsOnly(entry("INFO", 2L), entry("MAJOR", 1L));
   }
@@ -381,9 +386,9 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE1", file).setStatus(Issue.STATUS_CLOSED),
       IssueTesting.newDoc("ISSUE2", file).setStatus(Issue.STATUS_OPEN));
 
-    assertThat(index.search(IssueQuery.builder().statuses(newArrayList(Issue.STATUS_CLOSED, Issue.STATUS_OPEN)).build(), new SearchOptions()).getDocs()).hasSize(2);
-    assertThat(index.search(IssueQuery.builder().statuses(newArrayList(Issue.STATUS_CLOSED)).build(), new SearchOptions()).getDocs()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().statuses(newArrayList(Issue.STATUS_CONFIRMED)).build(), new SearchOptions()).getDocs()).isEmpty();
+    assertThat(index.search(IssueQuery.builder(userSessionRule).statuses(newArrayList(Issue.STATUS_CLOSED, Issue.STATUS_OPEN)).build(), new SearchOptions()).getDocs()).hasSize(2);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).statuses(newArrayList(Issue.STATUS_CLOSED)).build(), new SearchOptions()).getDocs()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).statuses(newArrayList(Issue.STATUS_CONFIRMED)).build(), new SearchOptions()).getDocs()).isEmpty();
   }
 
   @Test
@@ -396,7 +401,7 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE2", file).setStatus(Issue.STATUS_CLOSED),
       IssueTesting.newDoc("ISSUE3", file).setStatus(Issue.STATUS_OPEN));
 
-    SearchResult<IssueDoc> result = index.search(IssueQuery.builder().build(), new SearchOptions().addFacets(newArrayList("statuses")));
+    SearchResult<IssueDoc> result = index.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions().addFacets(newArrayList("statuses")));
     assertThat(result.getFacets().getNames()).containsOnly("statuses");
     assertThat(result.getFacets().get("statuses")).containsOnly(entry("CLOSED", 2L), entry("OPEN", 1L));
   }
@@ -410,10 +415,10 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE1", file).setResolution(Issue.RESOLUTION_FALSE_POSITIVE),
       IssueTesting.newDoc("ISSUE2", file).setResolution(Issue.RESOLUTION_FIXED));
 
-    assertThat(index.search(IssueQuery.builder().resolutions(newArrayList(Issue.RESOLUTION_FALSE_POSITIVE, Issue.RESOLUTION_FIXED)).build(), new SearchOptions()).getDocs())
+    assertThat(index.search(IssueQuery.builder(userSessionRule).resolutions(newArrayList(Issue.RESOLUTION_FALSE_POSITIVE, Issue.RESOLUTION_FIXED)).build(), new SearchOptions()).getDocs())
       .hasSize(2);
-    assertThat(index.search(IssueQuery.builder().resolutions(newArrayList(Issue.RESOLUTION_FALSE_POSITIVE)).build(), new SearchOptions()).getDocs()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().resolutions(newArrayList(Issue.RESOLUTION_REMOVED)).build(), new SearchOptions()).getDocs()).isEmpty();
+    assertThat(index.search(IssueQuery.builder(userSessionRule).resolutions(newArrayList(Issue.RESOLUTION_FALSE_POSITIVE)).build(), new SearchOptions()).getDocs()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).resolutions(newArrayList(Issue.RESOLUTION_REMOVED)).build(), new SearchOptions()).getDocs()).isEmpty();
   }
 
   @Test
@@ -426,7 +431,7 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE2", file).setResolution(Issue.RESOLUTION_FALSE_POSITIVE),
       IssueTesting.newDoc("ISSUE3", file).setResolution(Issue.RESOLUTION_FIXED));
 
-    SearchResult<IssueDoc> result = index.search(IssueQuery.builder().build(), new SearchOptions().addFacets(newArrayList("resolutions")));
+    SearchResult<IssueDoc> result = index.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions().addFacets(newArrayList("resolutions")));
     assertThat(result.getFacets().getNames()).containsOnly("resolutions");
     assertThat(result.getFacets().get("resolutions")).containsOnly(entry("FALSE-POSITIVE", 2L), entry("FIXED", 1L));
   }
@@ -441,9 +446,9 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE2", file).setStatus(Issue.STATUS_OPEN).setResolution(null),
       IssueTesting.newDoc("ISSUE3", file).setStatus(Issue.STATUS_OPEN).setResolution(null));
 
-    assertThat(index.search(IssueQuery.builder().resolved(true).build(), new SearchOptions()).getDocs()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().resolved(false).build(), new SearchOptions()).getDocs()).hasSize(2);
-    assertThat(index.search(IssueQuery.builder().resolved(null).build(), new SearchOptions()).getDocs()).hasSize(3);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).resolved(true).build(), new SearchOptions()).getDocs()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).resolved(false).build(), new SearchOptions()).getDocs()).hasSize(2);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).resolved(null).build(), new SearchOptions()).getDocs()).hasSize(3);
   }
 
   @Test
@@ -455,9 +460,9 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE1", file).setActionPlanKey("plan1"),
       IssueTesting.newDoc("ISSUE2", file).setActionPlanKey("plan2"));
 
-    assertThat(index.search(IssueQuery.builder().actionPlans(newArrayList("plan1")).build(), new SearchOptions()).getDocs()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().actionPlans(newArrayList("plan1", "plan2")).build(), new SearchOptions()).getDocs()).hasSize(2);
-    assertThat(index.search(IssueQuery.builder().actionPlans(newArrayList("unknown")).build(), new SearchOptions()).getDocs()).isEmpty();
+    assertThat(index.search(IssueQuery.builder(userSessionRule).actionPlans(newArrayList("plan1")).build(), new SearchOptions()).getDocs()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).actionPlans(newArrayList("plan1", "plan2")).build(), new SearchOptions()).getDocs()).hasSize(2);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).actionPlans(newArrayList("unknown")).build(), new SearchOptions()).getDocs()).isEmpty();
   }
 
   @Test
@@ -469,7 +474,7 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE1", file).setActionPlanKey("plan1"),
       IssueTesting.newDoc("ISSUE2", file).setActionPlanKey("plan2"));
 
-    SearchResult<IssueDoc> result = index.search(IssueQuery.builder().build(), new SearchOptions().addFacets(newArrayList("actionPlans")));
+    SearchResult<IssueDoc> result = index.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions().addFacets(newArrayList("actionPlans")));
     assertThat(result.getFacets().getNames()).containsOnly("actionPlans");
     assertThat(result.getFacets().get("actionPlans")).containsOnly(entry("plan1", 1L), entry("plan2", 1L));
   }
@@ -484,9 +489,9 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE2", file).setActionPlanKey(null),
       IssueTesting.newDoc("ISSUE3", file).setActionPlanKey(null));
 
-    assertThat(index.search(IssueQuery.builder().planned(true).build(), new SearchOptions()).getDocs()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().planned(false).build(), new SearchOptions()).getDocs()).hasSize(2);
-    assertThat(index.search(IssueQuery.builder().planned(null).build(), new SearchOptions()).getDocs()).hasSize(3);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).planned(true).build(), new SearchOptions()).getDocs()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).planned(false).build(), new SearchOptions()).getDocs()).hasSize(2);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).planned(null).build(), new SearchOptions()).getDocs()).hasSize(3);
   }
 
   @Test
@@ -497,8 +502,8 @@ public class IssueIndexTest {
 
     indexIssues(IssueTesting.newDoc("ISSUE1", file).setRuleKey(ruleKey.toString()));
 
-    assertThat(index.search(IssueQuery.builder().rules(newArrayList(ruleKey)).build(), new SearchOptions()).getDocs()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().rules(newArrayList(RuleKey.of("rule", "without issue"))).build(), new SearchOptions()).getDocs()).isEmpty();
+    assertThat(index.search(IssueQuery.builder(userSessionRule).rules(newArrayList(ruleKey)).build(), new SearchOptions()).getDocs()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).rules(newArrayList(RuleKey.of("rule", "without issue"))).build(), new SearchOptions()).getDocs()).isEmpty();
   }
 
   @Test
@@ -509,9 +514,9 @@ public class IssueIndexTest {
 
     indexIssues(IssueTesting.newDoc("ISSUE1", file).setRuleKey(ruleKey.toString()).setLanguage("xoo"));
 
-    assertThat(index.search(IssueQuery.builder().languages(newArrayList("xoo")).build(),
+    assertThat(index.search(IssueQuery.builder(userSessionRule).languages(newArrayList("xoo")).build(),
       new SearchOptions()).getDocs()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().languages(newArrayList("unknown")).build(), new SearchOptions()).getDocs()).isEmpty();
+    assertThat(index.search(IssueQuery.builder(userSessionRule).languages(newArrayList("unknown")).build(), new SearchOptions()).getDocs()).isEmpty();
   }
 
   @Test
@@ -522,7 +527,7 @@ public class IssueIndexTest {
 
     indexIssues(IssueTesting.newDoc("ISSUE1", file).setRuleKey(ruleKey.toString()).setLanguage("xoo"));
 
-    SearchResult<IssueDoc> result = index.search(IssueQuery.builder().build(), new SearchOptions().addFacets(newArrayList("languages")));
+    SearchResult<IssueDoc> result = index.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions().addFacets(newArrayList("languages")));
     assertThat(result.getFacets().getNames()).containsOnly("languages");
     assertThat(result.getFacets().get("languages")).containsOnly(entry("xoo", 1L));
   }
@@ -537,9 +542,9 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE2", file).setAssignee("simon"),
       IssueTesting.newDoc("ISSUE3", file).setAssignee(null));
 
-    assertThat(index.search(IssueQuery.builder().assignees(newArrayList("steph")).build(), new SearchOptions()).getDocs()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().assignees(newArrayList("steph", "simon")).build(), new SearchOptions()).getDocs()).hasSize(2);
-    assertThat(index.search(IssueQuery.builder().assignees(newArrayList("unknown")).build(), new SearchOptions()).getDocs()).isEmpty();
+    assertThat(index.search(IssueQuery.builder(userSessionRule).assignees(newArrayList("steph")).build(), new SearchOptions()).getDocs()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).assignees(newArrayList("steph", "simon")).build(), new SearchOptions()).getDocs()).hasSize(2);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).assignees(newArrayList("unknown")).build(), new SearchOptions()).getDocs()).isEmpty();
   }
 
   @Test
@@ -553,7 +558,7 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE3", file).setAssignee("simon"),
       IssueTesting.newDoc("ISSUE4", file).setAssignee(null));
 
-    SearchResult<IssueDoc> result = index.search(IssueQuery.builder().build(), new SearchOptions().addFacets(newArrayList("assignees")));
+    SearchResult<IssueDoc> result = index.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions().addFacets(newArrayList("assignees")));
     assertThat(result.getFacets().getNames()).containsOnly("assignees");
     assertThat(result.getFacets().get("assignees")).containsOnly(entry("steph", 1L), entry("simon", 2L), entry("", 1L));
   }
@@ -569,7 +574,7 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE3", file).setAssignee("simon"),
       IssueTesting.newDoc("ISSUE4", file).setAssignee(null));
 
-    SearchResult<IssueDoc> result = index.search(IssueQuery.builder().assignees(Arrays.asList("j-b")).build(), new SearchOptions().addFacets(newArrayList("assignees")));
+    SearchResult<IssueDoc> result = index.search(IssueQuery.builder(userSessionRule).assignees(Arrays.asList("j-b")).build(), new SearchOptions().addFacets(newArrayList("assignees")));
     assertThat(result.getFacets().getNames()).containsOnly("assignees");
     assertThat(result.getFacets().get("assignees")).containsOnly(entry("j-b", 1L), entry("simon", 2L), entry("", 1L));
   }
@@ -584,9 +589,9 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE2", file).setAssignee(null),
       IssueTesting.newDoc("ISSUE3", file).setAssignee(null));
 
-    assertThat(index.search(IssueQuery.builder().assigned(true).build(), new SearchOptions()).getDocs()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().assigned(false).build(), new SearchOptions()).getDocs()).hasSize(2);
-    assertThat(index.search(IssueQuery.builder().assigned(null).build(), new SearchOptions()).getDocs()).hasSize(3);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).assigned(true).build(), new SearchOptions()).getDocs()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).assigned(false).build(), new SearchOptions()).getDocs()).hasSize(2);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).assigned(null).build(), new SearchOptions()).getDocs()).hasSize(3);
   }
 
   @Test
@@ -598,9 +603,9 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE1", file).setReporter("fabrice"),
       IssueTesting.newDoc("ISSUE2", file).setReporter("stephane"));
 
-    assertThat(index.search(IssueQuery.builder().reporters(newArrayList("fabrice", "stephane")).build(), new SearchOptions()).getDocs()).hasSize(2);
-    assertThat(index.search(IssueQuery.builder().reporters(newArrayList("fabrice")).build(), new SearchOptions()).getDocs()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().reporters(newArrayList("unknown")).build(), new SearchOptions()).getDocs()).isEmpty();
+    assertThat(index.search(IssueQuery.builder(userSessionRule).reporters(newArrayList("fabrice", "stephane")).build(), new SearchOptions()).getDocs()).hasSize(2);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).reporters(newArrayList("fabrice")).build(), new SearchOptions()).getDocs()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).reporters(newArrayList("unknown")).build(), new SearchOptions()).getDocs()).isEmpty();
   }
 
   @Test
@@ -613,9 +618,9 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE2", file).setAuthorLogin("simon"),
       IssueTesting.newDoc("ISSUE3", file).setAssignee(null));
 
-    assertThat(index.search(IssueQuery.builder().authors(newArrayList("steph")).build(), new SearchOptions()).getDocs()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().authors(newArrayList("steph", "simon")).build(), new SearchOptions()).getDocs()).hasSize(2);
-    assertThat(index.search(IssueQuery.builder().authors(newArrayList("unknown")).build(), new SearchOptions()).getDocs()).isEmpty();
+    assertThat(index.search(IssueQuery.builder(userSessionRule).authors(newArrayList("steph")).build(), new SearchOptions()).getDocs()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).authors(newArrayList("steph", "simon")).build(), new SearchOptions()).getDocs()).hasSize(2);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).authors(newArrayList("unknown")).build(), new SearchOptions()).getDocs()).isEmpty();
   }
 
   @Test
@@ -629,7 +634,7 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE3", file).setAuthorLogin("simon"),
       IssueTesting.newDoc("ISSUE4", file).setAuthorLogin(null));
 
-    SearchResult<IssueDoc> result = index.search(IssueQuery.builder().build(), new SearchOptions().addFacets(newArrayList("authors")));
+    SearchResult<IssueDoc> result = index.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions().addFacets(newArrayList("authors")));
     assertThat(result.getFacets().getNames()).containsOnly("authors");
     assertThat(result.getFacets().get("authors")).containsOnly(entry("steph", 1L), entry("simon", 2L));
   }
@@ -643,11 +648,11 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE1", file).setFuncCreationDate(DateUtils.parseDate("2014-09-20")),
       IssueTesting.newDoc("ISSUE2", file).setFuncCreationDate(DateUtils.parseDate("2014-09-23")));
 
-    assertThat(index.search(IssueQuery.builder().createdAfter(DateUtils.parseDate("2014-09-19")).build(), new SearchOptions()).getDocs()).hasSize(2);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).createdAfter(DateUtils.parseDate("2014-09-19")).build(), new SearchOptions()).getDocs()).hasSize(2);
     // Lower bound is excluded
-    assertThat(index.search(IssueQuery.builder().createdAfter(DateUtils.parseDate("2014-09-20")).build(), new SearchOptions()).getDocs()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().createdAfter(DateUtils.parseDate("2014-09-21")).build(), new SearchOptions()).getDocs()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().createdAfter(DateUtils.parseDate("2014-09-25")).build(), new SearchOptions()).getDocs()).isEmpty();
+    assertThat(index.search(IssueQuery.builder(userSessionRule).createdAfter(DateUtils.parseDate("2014-09-20")).build(), new SearchOptions()).getDocs()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).createdAfter(DateUtils.parseDate("2014-09-21")).build(), new SearchOptions()).getDocs()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).createdAfter(DateUtils.parseDate("2014-09-25")).build(), new SearchOptions()).getDocs()).isEmpty();
   }
 
   @Test
@@ -659,11 +664,11 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE1", file).setFuncCreationDate(DateUtils.parseDate("2014-09-20")),
       IssueTesting.newDoc("ISSUE2", file).setFuncCreationDate(DateUtils.parseDate("2014-09-23")));
 
-    assertThat(index.search(IssueQuery.builder().createdBefore(DateUtils.parseDate("2014-09-19")).build(), new SearchOptions()).getDocs()).isEmpty();
+    assertThat(index.search(IssueQuery.builder(userSessionRule).createdBefore(DateUtils.parseDate("2014-09-19")).build(), new SearchOptions()).getDocs()).isEmpty();
     // Upper bound is excluded
-    assertThat(index.search(IssueQuery.builder().createdBefore(DateUtils.parseDate("2014-09-20")).build(), new SearchOptions()).getDocs()).isEmpty();
-    assertThat(index.search(IssueQuery.builder().createdBefore(DateUtils.parseDate("2014-09-21")).build(), new SearchOptions()).getDocs()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().createdBefore(DateUtils.parseDate("2014-09-25")).build(), new SearchOptions()).getDocs()).hasSize(2);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).createdBefore(DateUtils.parseDate("2014-09-20")).build(), new SearchOptions()).getDocs()).isEmpty();
+    assertThat(index.search(IssueQuery.builder(userSessionRule).createdBefore(DateUtils.parseDate("2014-09-21")).build(), new SearchOptions()).getDocs()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).createdBefore(DateUtils.parseDate("2014-09-25")).build(), new SearchOptions()).getDocs()).hasSize(2);
   }
 
   @Test
@@ -676,37 +681,37 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE2", file).setFuncCreationDate(DateUtils.parseDate("2014-09-23")));
 
     // 19 < createdAt < 25
-    assertThat(index.search(IssueQuery.builder()
+    assertThat(index.search(IssueQuery.builder(userSessionRule)
       .createdAfter(DateUtils.parseDate("2014-09-19")).createdBefore(DateUtils.parseDate("2014-09-25"))
       .build(), new SearchOptions()).getDocs()).hasSize(2);
 
     // 20 < createdAt < 25: excludes first issue
-    assertThat(index.search(IssueQuery.builder()
+    assertThat(index.search(IssueQuery.builder(userSessionRule)
       .createdAfter(DateUtils.parseDate("2014-09-20")).createdBefore(DateUtils.parseDate("2014-09-25"))
       .build(), new SearchOptions()).getDocs()).hasSize(1);
 
     // 21 < createdAt < 25
-    assertThat(index.search(IssueQuery.builder()
+    assertThat(index.search(IssueQuery.builder(userSessionRule)
       .createdAfter(DateUtils.parseDate("2014-09-21")).createdBefore(DateUtils.parseDate("2014-09-25"))
       .build(), new SearchOptions()).getDocs()).hasSize(1);
 
     // 21 < createdAt < 24
-    assertThat(index.search(IssueQuery.builder()
+    assertThat(index.search(IssueQuery.builder(userSessionRule)
       .createdAfter(DateUtils.parseDate("2014-09-21")).createdBefore(DateUtils.parseDate("2014-09-24"))
       .build(), new SearchOptions()).getDocs()).hasSize(1);
 
     // 21 < createdAt < 23: excludes second issue
-    assertThat(index.search(IssueQuery.builder()
+    assertThat(index.search(IssueQuery.builder(userSessionRule)
       .createdAfter(DateUtils.parseDate("2014-09-21")).createdBefore(DateUtils.parseDate("2014-09-23"))
       .build(), new SearchOptions()).getDocs()).isEmpty();
 
     // 19 < createdAt < 21: only first issue
-    assertThat(index.search(IssueQuery.builder()
+    assertThat(index.search(IssueQuery.builder(userSessionRule)
       .createdAfter(DateUtils.parseDate("2014-09-19")).createdBefore(DateUtils.parseDate("2014-09-21"))
       .build(), new SearchOptions()).getDocs()).hasSize(1);
 
     // 20 < createdAt < 20: nothing
-    assertThat(index.search(IssueQuery.builder()
+    assertThat(index.search(IssueQuery.builder(userSessionRule)
       .createdAfter(DateUtils.parseDate("2014-09-20")).createdBefore(DateUtils.parseDate("2014-09-20"))
       .build(), new SearchOptions()).getDocs()).isEmpty();
   }
@@ -714,7 +719,7 @@ public class IssueIndexTest {
   @Test
   public void filter_by_created_before_must_be_lower_than_after() {
     try {
-      index.search(IssueQuery.builder().createdAfter(DateUtils.parseDate("2014-09-20")).createdBefore(DateUtils.parseDate("2014-09-19")).build(), new SearchOptions());
+      index.search(IssueQuery.builder(userSessionRule).createdAfter(DateUtils.parseDate("2014-09-20")).createdBefore(DateUtils.parseDate("2014-09-19")).build(), new SearchOptions());
       Fail.failBecauseExceptionWasNotThrown(IllegalArgumentException.class);
     } catch (IllegalArgumentException exception) {
       assertThat(exception.getMessage()).isEqualTo("Start bound cannot be larger than end bound");
@@ -724,7 +729,7 @@ public class IssueIndexTest {
   @Test
   public void filter_by_created_after_must_not_be_in_future() {
     try {
-      index.search(IssueQuery.builder().createdAfter(new Date(Long.MAX_VALUE)).build(), new SearchOptions());
+      index.search(IssueQuery.builder(userSessionRule).createdAfter(new Date(Long.MAX_VALUE)).build(), new SearchOptions());
       Fail.failBecauseExceptionWasNotThrown(IllegalArgumentException.class);
     } catch (IllegalArgumentException exception) {
       assertThat(exception.getMessage()).isEqualTo("Start bound cannot be in the future");
@@ -738,8 +743,8 @@ public class IssueIndexTest {
 
     indexIssues(IssueTesting.newDoc("ISSUE1", file).setFuncCreationDate(DateUtils.parseDate("2014-09-20")));
 
-    assertThat(index.search(IssueQuery.builder().createdAt(DateUtils.parseDate("2014-09-20")).build(), new SearchOptions()).getDocs()).hasSize(1);
-    assertThat(index.search(IssueQuery.builder().createdAt(DateUtils.parseDate("2014-09-21")).build(), new SearchOptions()).getDocs()).isEmpty();
+    assertThat(index.search(IssueQuery.builder(userSessionRule).createdAt(DateUtils.parseDate("2014-09-20")).build(), new SearchOptions()).getDocs()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).createdAt(DateUtils.parseDate("2014-09-21")).build(), new SearchOptions()).getDocs()).isEmpty();
   }
 
   @Test
@@ -747,7 +752,7 @@ public class IssueIndexTest {
 
     SearchOptions options = fixtureForCreatedAtFacet();
 
-    IssueQuery query = IssueQuery.builder()
+    IssueQuery query = IssueQuery.builder(userSessionRule)
       .createdAfter(DateUtils.parseDateTime("2014-09-01T00:00:00+0100"))
       .createdBefore(DateUtils.parseDateTime("2014-09-08T00:00:00+0100"))
       .checkAuthorization(false)
@@ -770,7 +775,7 @@ public class IssueIndexTest {
 
     SearchOptions SearchOptions = fixtureForCreatedAtFacet();
 
-    Map<String, Long> createdAt = index.search(IssueQuery.builder()
+    Map<String, Long> createdAt = index.search(IssueQuery.builder(userSessionRule)
         .createdAfter(DateUtils.parseDateTime("2014-09-01T00:00:00+0100"))
         .createdBefore(DateUtils.parseDateTime("2014-09-21T00:00:00+0100")).build(),
       SearchOptions).getFacets().get("createdAt");
@@ -786,7 +791,7 @@ public class IssueIndexTest {
 
     SearchOptions SearchOptions = fixtureForCreatedAtFacet();
 
-    Map<String, Long> createdAt = index.search(IssueQuery.builder()
+    Map<String, Long> createdAt = index.search(IssueQuery.builder(userSessionRule)
         .createdAfter(DateUtils.parseDateTime("2014-09-01T00:00:00+0100"))
         .createdBefore(DateUtils.parseDateTime("2015-01-19T00:00:00+0100")).build(),
       SearchOptions).getFacets().get("createdAt");
@@ -803,7 +808,7 @@ public class IssueIndexTest {
   public void facet_on_created_at_with_more_than_20_months() {
     SearchOptions SearchOptions = fixtureForCreatedAtFacet();
 
-    Map<String, Long> createdAt = index.search(IssueQuery.builder()
+    Map<String, Long> createdAt = index.search(IssueQuery.builder(userSessionRule)
         .createdAfter(DateUtils.parseDateTime("2011-01-01T00:00:00+0100"))
         .createdBefore(DateUtils.parseDateTime("2016-01-01T00:00:00+0100")).build(),
       SearchOptions).getFacets().get("createdAt");
@@ -821,7 +826,7 @@ public class IssueIndexTest {
   public void facet_on_created_at_with_bounds_outside_of_data() {
     SearchOptions options = fixtureForCreatedAtFacet();
 
-    Map<String, Long> createdAt = index.search(IssueQuery.builder()
+    Map<String, Long> createdAt = index.search(IssueQuery.builder(userSessionRule)
       .createdAfter(DateUtils.parseDateTime("2009-01-01T00:00:00+0100"))
       .createdBefore(DateUtils.parseDateTime("2016-01-01T00:00:00+0100"))
       .build(), options).getFacets().get("createdAt");
@@ -840,7 +845,7 @@ public class IssueIndexTest {
   public void facet_on_created_at_without_start_bound() {
     SearchOptions SearchOptions = fixtureForCreatedAtFacet();
 
-    Map<String, Long> createdAt = index.search(IssueQuery.builder()
+    Map<String, Long> createdAt = index.search(IssueQuery.builder(userSessionRule)
         .createdBefore(DateUtils.parseDateTime("2016-01-01T00:00:00+0100")).build(),
       SearchOptions).getFacets().get("createdAt");
     assertThat(createdAt).containsOnly(
@@ -855,7 +860,7 @@ public class IssueIndexTest {
   public void facet_on_created_at_without_issues() {
     SearchOptions SearchOptions = new SearchOptions().addFacets("createdAt");
 
-    Map<String, Long> createdAt = index.search(IssueQuery.builder().build(),
+    Map<String, Long> createdAt = index.search(IssueQuery.builder(userSessionRule).build(),
       SearchOptions).getFacets().get("createdAt");
     assertThat(createdAt).isEmpty();
   }
@@ -885,17 +890,17 @@ public class IssueIndexTest {
       indexIssues(IssueTesting.newDoc("ISSUE" + i, file));
     }
 
-    IssueQuery.Builder query = IssueQuery.builder();
+    IssueQuery.Builder query = IssueQuery.builder(userSessionRule);
     // There are 12 issues in total, with 10 issues per page, the page 2 should only contain 2 elements
     SearchResult<IssueDoc> result = index.search(query.build(), new SearchOptions().setPage(2, 10));
     assertThat(result.getDocs()).hasSize(2);
     assertThat(result.getTotal()).isEqualTo(12);
 
-    result = index.search(IssueQuery.builder().build(), new SearchOptions().setOffset(0).setLimit(5));
+    result = index.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions().setOffset(0).setLimit(5));
     assertThat(result.getDocs()).hasSize(5);
     assertThat(result.getTotal()).isEqualTo(12);
 
-    result = index.search(IssueQuery.builder().build(), new SearchOptions().setOffset(2).setLimit(0));
+    result = index.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions().setOffset(2).setLimit(0));
     assertThat(result.getDocs()).hasSize(10);
     assertThat(result.getTotal()).isEqualTo(12);
   }
@@ -911,7 +916,7 @@ public class IssueIndexTest {
     }
     indexIssues(issues.toArray(new IssueDoc[] {}));
 
-    IssueQuery.Builder query = IssueQuery.builder();
+    IssueQuery.Builder query = IssueQuery.builder(userSessionRule);
     SearchResult<IssueDoc> result = index.search(query.build(), new SearchOptions().setLimit(Integer.MAX_VALUE));
     assertThat(result.getDocs()).hasSize(SearchOptions.MAX_LIMIT);
   }
@@ -926,13 +931,13 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE2", file).setStatus(Issue.STATUS_CLOSED),
       IssueTesting.newDoc("ISSUE3", file).setStatus(Issue.STATUS_REOPENED));
 
-    IssueQuery.Builder query = IssueQuery.builder().sort(IssueQuery.SORT_BY_STATUS).asc(true);
+    IssueQuery.Builder query = IssueQuery.builder(userSessionRule).sort(IssueQuery.SORT_BY_STATUS).asc(true);
     SearchResult<IssueDoc> result = index.search(query.build(), new SearchOptions());
     assertThat(result.getDocs().get(0).status()).isEqualTo(Issue.STATUS_CLOSED);
     assertThat(result.getDocs().get(1).status()).isEqualTo(Issue.STATUS_OPEN);
     assertThat(result.getDocs().get(2).status()).isEqualTo(Issue.STATUS_REOPENED);
 
-    query = IssueQuery.builder().sort(IssueQuery.SORT_BY_STATUS).asc(false);
+    query = IssueQuery.builder(userSessionRule).sort(IssueQuery.SORT_BY_STATUS).asc(false);
     result = index.search(query.build(), new SearchOptions());
     assertThat(result.getDocs().get(0).status()).isEqualTo(Issue.STATUS_REOPENED);
     assertThat(result.getDocs().get(1).status()).isEqualTo(Issue.STATUS_OPEN);
@@ -951,7 +956,7 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE4", file).setSeverity(Severity.CRITICAL),
       IssueTesting.newDoc("ISSUE5", file).setSeverity(Severity.MAJOR));
 
-    IssueQuery.Builder query = IssueQuery.builder().sort(IssueQuery.SORT_BY_SEVERITY).asc(true);
+    IssueQuery.Builder query = IssueQuery.builder(userSessionRule).sort(IssueQuery.SORT_BY_SEVERITY).asc(true);
     SearchResult<IssueDoc> result = index.search(query.build(), new SearchOptions());
     assertThat(result.getDocs().get(0).severity()).isEqualTo(Severity.INFO);
     assertThat(result.getDocs().get(1).severity()).isEqualTo(Severity.MINOR);
@@ -959,7 +964,7 @@ public class IssueIndexTest {
     assertThat(result.getDocs().get(3).severity()).isEqualTo(Severity.CRITICAL);
     assertThat(result.getDocs().get(4).severity()).isEqualTo(Severity.BLOCKER);
 
-    query = IssueQuery.builder().sort(IssueQuery.SORT_BY_SEVERITY).asc(false);
+    query = IssueQuery.builder(userSessionRule).sort(IssueQuery.SORT_BY_SEVERITY).asc(false);
     result = index.search(query.build(), new SearchOptions());
     assertThat(result.getDocs().get(0).severity()).isEqualTo(Severity.BLOCKER);
     assertThat(result.getDocs().get(1).severity()).isEqualTo(Severity.CRITICAL);
@@ -977,13 +982,13 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE1", file).setAssignee("steph"),
       IssueTesting.newDoc("ISSUE2", file).setAssignee("simon"));
 
-    IssueQuery.Builder query = IssueQuery.builder().sort(IssueQuery.SORT_BY_ASSIGNEE).asc(true);
+    IssueQuery.Builder query = IssueQuery.builder(userSessionRule).sort(IssueQuery.SORT_BY_ASSIGNEE).asc(true);
     SearchResult<IssueDoc> result = index.search(query.build(), new SearchOptions());
     assertThat(result.getDocs()).hasSize(2);
     assertThat(result.getDocs().get(0).assignee()).isEqualTo("simon");
     assertThat(result.getDocs().get(1).assignee()).isEqualTo("steph");
 
-    query = IssueQuery.builder().sort(IssueQuery.SORT_BY_ASSIGNEE).asc(false);
+    query = IssueQuery.builder(userSessionRule).sort(IssueQuery.SORT_BY_ASSIGNEE).asc(false);
     result = index.search(query.build(), new SearchOptions());
     assertThat(result.getDocs()).hasSize(2);
     assertThat(result.getDocs().get(0).assignee()).isEqualTo("steph");
@@ -999,13 +1004,13 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE1", file).setFuncCreationDate(DateUtils.parseDateTime("2014-09-23T00:00:00+0100")),
       IssueTesting.newDoc("ISSUE2", file).setFuncCreationDate(DateUtils.parseDateTime("2014-09-24T00:00:00+0100")));
 
-    IssueQuery.Builder query = IssueQuery.builder().sort(IssueQuery.SORT_BY_CREATION_DATE).asc(true);
+    IssueQuery.Builder query = IssueQuery.builder(userSessionRule).sort(IssueQuery.SORT_BY_CREATION_DATE).asc(true);
     SearchResult<IssueDoc> result = index.search(query.build(), new SearchOptions());
     assertThat(result.getDocs()).hasSize(2);
     assertThat(result.getDocs().get(0).creationDate()).isEqualTo(DateUtils.parseDateTime("2014-09-23T00:00:00+0100"));
     assertThat(result.getDocs().get(1).creationDate()).isEqualTo(DateUtils.parseDateTime("2014-09-24T00:00:00+0100"));
 
-    query = IssueQuery.builder().sort(IssueQuery.SORT_BY_CREATION_DATE).asc(false);
+    query = IssueQuery.builder(userSessionRule).sort(IssueQuery.SORT_BY_CREATION_DATE).asc(false);
     result = index.search(query.build(), new SearchOptions());
     assertThat(result.getDocs()).hasSize(2);
     assertThat(result.getDocs().get(0).creationDate()).isEqualTo(DateUtils.parseDateTime("2014-09-24T00:00:00+0100"));
@@ -1021,13 +1026,13 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE1", file).setFuncUpdateDate(DateUtils.parseDateTime("2014-09-23T00:00:00+0100")),
       IssueTesting.newDoc("ISSUE2", file).setFuncUpdateDate(DateUtils.parseDateTime("2014-09-24T00:00:00+0100")));
 
-    IssueQuery.Builder query = IssueQuery.builder().sort(IssueQuery.SORT_BY_UPDATE_DATE).asc(true);
+    IssueQuery.Builder query = IssueQuery.builder(userSessionRule).sort(IssueQuery.SORT_BY_UPDATE_DATE).asc(true);
     SearchResult<IssueDoc> result = index.search(query.build(), new SearchOptions());
     assertThat(result.getDocs()).hasSize(2);
     assertThat(result.getDocs().get(0).updateDate()).isEqualTo(DateUtils.parseDateTime("2014-09-23T00:00:00+0100"));
     assertThat(result.getDocs().get(1).updateDate()).isEqualTo(DateUtils.parseDateTime("2014-09-24T00:00:00+0100"));
 
-    query = IssueQuery.builder().sort(IssueQuery.SORT_BY_UPDATE_DATE).asc(false);
+    query = IssueQuery.builder(userSessionRule).sort(IssueQuery.SORT_BY_UPDATE_DATE).asc(false);
     result = index.search(query.build(), new SearchOptions());
     assertThat(result.getDocs()).hasSize(2);
     assertThat(result.getDocs().get(0).updateDate()).isEqualTo(DateUtils.parseDateTime("2014-09-24T00:00:00+0100"));
@@ -1044,14 +1049,14 @@ public class IssueIndexTest {
       IssueTesting.newDoc("ISSUE2", file).setFuncCloseDate(DateUtils.parseDateTime("2014-09-24T00:00:00+0100")),
       IssueTesting.newDoc("ISSUE3", file).setFuncCloseDate(null));
 
-    IssueQuery.Builder query = IssueQuery.builder().sort(IssueQuery.SORT_BY_CLOSE_DATE).asc(true);
+    IssueQuery.Builder query = IssueQuery.builder(userSessionRule).sort(IssueQuery.SORT_BY_CLOSE_DATE).asc(true);
     SearchResult<IssueDoc> result = index.search(query.build(), new SearchOptions());
     assertThat(result.getDocs()).hasSize(3);
     assertThat(result.getDocs().get(0).closeDate()).isNull();
     assertThat(result.getDocs().get(1).closeDate()).isEqualTo(DateUtils.parseDateTime("2014-09-23T00:00:00+0100"));
     assertThat(result.getDocs().get(2).closeDate()).isEqualTo(DateUtils.parseDateTime("2014-09-24T00:00:00+0100"));
 
-    query = IssueQuery.builder().sort(IssueQuery.SORT_BY_CLOSE_DATE).asc(false);
+    query = IssueQuery.builder(userSessionRule).sort(IssueQuery.SORT_BY_CLOSE_DATE).asc(false);
     result = index.search(query.build(), new SearchOptions());
     assertThat(result.getDocs()).hasSize(3);
     assertThat(result.getDocs().get(0).closeDate()).isEqualTo(DateUtils.parseDateTime("2014-09-24T00:00:00+0100"));
@@ -1078,7 +1083,7 @@ public class IssueIndexTest {
       IssueTesting.newDoc("F2_3", file2).setLine(109));
 
     // ascending sort -> F1 then F2. Line "0" first.
-    IssueQuery.Builder query = IssueQuery.builder().sort(IssueQuery.SORT_BY_FILE_LINE).asc(true);
+    IssueQuery.Builder query = IssueQuery.builder(userSessionRule).sort(IssueQuery.SORT_BY_FILE_LINE).asc(true);
     SearchResult<IssueDoc> result = index.search(query.build(), new SearchOptions());
     assertThat(result.getDocs()).hasSize(6);
     assertThat(result.getDocs().get(0).key()).isEqualTo("F1_1");
@@ -1089,7 +1094,7 @@ public class IssueIndexTest {
     assertThat(result.getDocs().get(5).key()).isEqualTo("F2_3");
 
     // descending sort -> F2 then F1
-    query = IssueQuery.builder().sort(IssueQuery.SORT_BY_FILE_LINE).asc(false);
+    query = IssueQuery.builder(userSessionRule).sort(IssueQuery.SORT_BY_FILE_LINE).asc(false);
     result = index.search(query.build(), new SearchOptions());
     assertThat(result.getDocs()).hasSize(6);
     assertThat(result.getDocs().get(0).key()).isEqualTo("F2_3");
@@ -1117,20 +1122,20 @@ public class IssueIndexTest {
     // project3 can be seen by nobody
     indexIssue(IssueTesting.newDoc("ISSUE3", file3), null, null);
 
-    MockUserSession.set().setUserGroups("sonar-users");
-    assertThat(index.search(IssueQuery.builder().build(), new SearchOptions()).getDocs()).hasSize(1);
+    userSessionRule.logon().setUserGroups("sonar-users");
+    assertThat(index.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions()).getDocs()).hasSize(1);
 
-    MockUserSession.set().setUserGroups("sonar-admins");
-    assertThat(index.search(IssueQuery.builder().build(), new SearchOptions()).getDocs()).hasSize(1);
+    userSessionRule.logon().setUserGroups("sonar-admins");
+    assertThat(index.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions()).getDocs()).hasSize(1);
 
-    MockUserSession.set().setUserGroups("sonar-users", "sonar-admins");
-    assertThat(index.search(IssueQuery.builder().build(), new SearchOptions()).getDocs()).hasSize(2);
+    userSessionRule.logon().setUserGroups("sonar-users", "sonar-admins");
+    assertThat(index.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions()).getDocs()).hasSize(2);
 
-    MockUserSession.set().setUserGroups("another group");
-    assertThat(index.search(IssueQuery.builder().build(), new SearchOptions()).getDocs()).isEmpty();
+    userSessionRule.logon().setUserGroups("another group");
+    assertThat(index.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions()).getDocs()).isEmpty();
 
-    MockUserSession.set().setUserGroups("sonar-users", "sonar-admins");
-    assertThat(index.search(IssueQuery.builder().projectUuids(newArrayList(project3.uuid())).build(), new SearchOptions()).getDocs()).isEmpty();
+    userSessionRule.logon().setUserGroups("sonar-users", "sonar-admins");
+    assertThat(index.search(IssueQuery.builder(userSessionRule).projectUuids(newArrayList(project3.uuid())).build(), new SearchOptions()).getDocs()).isEmpty();
   }
 
   @Test
@@ -1148,18 +1153,18 @@ public class IssueIndexTest {
     indexIssue(IssueTesting.newDoc("ISSUE2", file2), null, "max");
     indexIssue(IssueTesting.newDoc("ISSUE3", file3), null, null);
 
-    MockUserSession.set().setLogin("john");
+    userSessionRule.logon("john");
 
-    assertThat(index.search(IssueQuery.builder().build(), new SearchOptions()).getDocs()).hasSize(1);
+    assertThat(index.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions()).getDocs()).hasSize(1);
 
-    MockUserSession.set().setLogin("max");
-    assertThat(index.search(IssueQuery.builder().build(), new SearchOptions()).getDocs()).hasSize(1);
+    userSessionRule.logon("max");
+    assertThat(index.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions()).getDocs()).hasSize(1);
 
-    MockUserSession.set().setLogin("another guy");
-    assertThat(index.search(IssueQuery.builder().build(), new SearchOptions()).getDocs()).hasSize(0);
+    userSessionRule.logon("another guy");
+    assertThat(index.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions()).getDocs()).hasSize(0);
 
-    MockUserSession.set().setLogin("john");
-    assertThat(index.search(IssueQuery.builder().projectUuids(newArrayList(project3.key())).build(), new SearchOptions()).getDocs()).hasSize(0);
+    userSessionRule.logon("john");
+    assertThat(index.search(IssueQuery.builder(userSessionRule).projectUuids(newArrayList(project3.key())).build(), new SearchOptions()).getDocs()).hasSize(0);
   }
 
   @Test
@@ -1174,8 +1179,8 @@ public class IssueIndexTest {
     indexIssue(IssueTesting.newDoc("ISSUE1", file1), "sonar-users", "john");
     indexIssue(IssueTesting.newDoc("ISSUE2", file2), null, "max");
 
-    MockUserSession.set().setLogin("john").setUserGroups("sonar-users");
-    assertThat(index.search(IssueQuery.builder().build(), new SearchOptions()).getDocs()).hasSize(1);
+    userSessionRule.logon("john").setUserGroups("sonar-users");
+    assertThat(index.search(IssueQuery.builder(userSessionRule).build(), new SearchOptions()).getDocs()).hasSize(1);
   }
 
   @Test
@@ -1197,7 +1202,7 @@ public class IssueIndexTest {
     index.deleteClosedIssuesOfProjectBefore(project.uuid(), yesterday);
 
     // ASSERT
-    List<IssueDoc> issues = index.search(IssueQuery.builder().projectUuids(newArrayList(project.uuid())).build(), new SearchOptions()).getDocs();
+    List<IssueDoc> issues = index.search(IssueQuery.builder(userSessionRule).projectUuids(newArrayList(project.uuid())).build(), new SearchOptions()).getDocs();
     List<Date> dates = newArrayList();
     for (IssueDoc issue : issues) {
       dates.add(issue.closeDate());
@@ -1287,10 +1292,10 @@ public class IssueIndexTest {
     // project3 can be seen by nobody
     indexIssue(IssueTesting.newDoc("ISSUE3", file2), null, null);
 
-    MockUserSession.set().setUserGroups("sonar-users");
+    userSessionRule.setUserGroups("sonar-users");
     assertThat(Lists.newArrayList(index.selectIssuesForBatch(project1))).hasSize(1);
 
-    MockUserSession.set().setUserGroups("another group");
+    userSessionRule.setUserGroups("another group");
     assertThat(Lists.newArrayList(index.selectIssuesForBatch(project2))).isEmpty();
   }
 
index ef2f33b5ee09cee1355b5fb2bd61784fb904fa2f..28ba950a7f9d9007f9770e3843abe84472373fd3 100644 (file)
@@ -20,7 +20,9 @@
 
 package org.sonar.server.issue.ws;
 
+import java.io.StringWriter;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -34,11 +36,9 @@ import org.sonar.api.web.UserRole;
 import org.sonar.core.issue.workflow.Transition;
 import org.sonar.server.issue.ActionService;
 import org.sonar.server.issue.IssueService;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.test.JsonAssert;
 
-import java.io.StringWriter;
-
 import static com.google.common.collect.Lists.newArrayList;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
@@ -46,6 +46,8 @@ import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class IssueActionsWriterTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   @Mock
   IssueService issueService;
@@ -57,7 +59,7 @@ public class IssueActionsWriterTest {
 
   @Before
   public void setUp() {
-    writer = new IssueActionsWriter(issueService, actionService);
+    writer = new IssueActionsWriter(issueService, actionService, userSessionRule);
   }
 
   @Test
@@ -70,7 +72,7 @@ public class IssueActionsWriterTest {
       .setProjectKey("sample")
       .setRuleKey(RuleKey.of("squid", "AvoidCycle"));
 
-    MockUserSession.set().setLogin("john").addProjectUuidPermissions(UserRole.ISSUE_ADMIN, "ABCD");
+    userSessionRule.logon("john").addProjectUuidPermissions(UserRole.ISSUE_ADMIN, "ABCD");
 
     testActions(issue,
       "{\"actions\": " +
@@ -87,7 +89,7 @@ public class IssueActionsWriterTest {
       .setProjectKey("sample")
       .setRuleKey(RuleKey.of("squid", "AvoidCycle"));
 
-    MockUserSession.set().setLogin("john");
+    userSessionRule.logon("john");
     Action action = mock(Action.class);
     when(action.key()).thenReturn("link-to-jira");
     when(actionService.listAvailableActions(eq(issue))).thenReturn(newArrayList(action));
@@ -108,7 +110,7 @@ public class IssueActionsWriterTest {
       .setRuleKey(RuleKey.of("squid", "AvoidCycle"))
       .setResolution("CLOSED");
 
-    MockUserSession.set().setLogin("john");
+    userSessionRule.logon("john");
 
     testActions(issue,
       "{\"actions\": " +
@@ -125,8 +127,6 @@ public class IssueActionsWriterTest {
       .setProjectKey("sample")
       .setRuleKey(RuleKey.of("squid", "AvoidCycle"));
 
-    MockUserSession.set();
-
     testActions(issue,
       "{\"actions\": []}");
   }
@@ -140,7 +140,7 @@ public class IssueActionsWriterTest {
       .setRuleKey(RuleKey.of("squid", "AvoidCycle"))
       .setAssignee("john");
 
-    MockUserSession.set().setLogin("john");
+    userSessionRule.logon("john");
 
     testActions(issue,
       "{\"actions\": " +
@@ -158,7 +158,7 @@ public class IssueActionsWriterTest {
       .setRuleKey(RuleKey.of("squid", "AvoidCycle"));
 
     when(issueService.listTransitions(eq(issue))).thenReturn(newArrayList(Transition.create("reopen", "RESOLVED", "REOPEN")));
-    MockUserSession.set().setLogin("john");
+    userSessionRule.logon("john");
 
     testTransitions(issue,
       "{\"transitions\": [\n" +
@@ -174,7 +174,7 @@ public class IssueActionsWriterTest {
       .setProjectKey("sample")
       .setRuleKey(RuleKey.of("squid", "AvoidCycle"));
 
-    MockUserSession.set().setLogin("john");
+    userSessionRule.logon("john");
 
     testTransitions(issue,
       "{\"transitions\": []}");
index 86828306900929697382a79123c637d0988ea2fa..07923c3b45466ad862708f52cb2a6cd610bdd8f4 100644 (file)
@@ -21,6 +21,9 @@
 package org.sonar.server.issue.ws;
 
 import com.google.common.collect.Lists;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -56,14 +59,10 @@ import org.sonar.server.issue.actionplan.ActionPlanService;
 import org.sonar.server.rule.Rule;
 import org.sonar.server.rule.RuleService;
 import org.sonar.server.source.SourceService;
-import org.sonar.server.user.MockUserSession;
-import org.sonar.server.user.UserSession;
+import org.sonar.server.tester.UserSessionRule;
+import org.sonar.server.user.ThreadLocalUserSession;
 import org.sonar.server.ws.WsTester;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-
 import static com.google.common.collect.Lists.newArrayList;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.eq;
@@ -76,6 +75,9 @@ import static org.mockito.Mockito.when;
 @RunWith(MockitoJUnitRunner.class)
 public class IssueShowActionTest {
 
+  @org.junit.Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
+
   @Mock
   DbClient dbClient;
 
@@ -142,8 +144,10 @@ public class IssueShowActionTest {
     when(i18n.message(any(Locale.class), eq("created"), eq((String) null))).thenReturn("Created");
 
     tester = new WsTester(new IssuesWs(
-      new IssueShowAction(dbClient, issueService, issueChangelogService, commentService,
-        new IssueActionsWriter(issueService, actionService), actionPlanService, userFinder, debtModel, ruleService, i18n, durations)
+      new IssueShowAction(
+          dbClient, issueService, issueChangelogService, commentService,
+          new IssueActionsWriter(issueService, actionService, userSessionRule),
+          actionPlanService, userFinder, debtModel, ruleService, i18n, durations, userSessionRule)
       ));
   }
 
@@ -182,7 +186,6 @@ public class IssueShowActionTest {
       .setCreationDate(issueCreationDate);
     when(issueService.getByKey(issueKey)).thenReturn(issue);
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issueKey);
     request.execute().assertJson(getClass(), "show_issue.json");
   }
@@ -232,7 +235,6 @@ public class IssueShowActionTest {
       .setCreationDate(issueCreationDate);
     when(issueService.getByKey(issueKey)).thenReturn(issue);
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issueKey);
     request.execute().assertJson(getClass(), "show_issue_with_sub_project.json");
   }
@@ -285,7 +287,6 @@ public class IssueShowActionTest {
       .setCreationDate(issueCreationDate);
     when(issueService.getByKey(issueKey)).thenReturn(issue);
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issueKey);
     request.execute().assertJson(getClass(), "show_issue_with_sub_project.json");
   }
@@ -316,7 +317,6 @@ public class IssueShowActionTest {
       .setProjectUuid(project.uuid());
     when(issueService.getByKey(issueKey)).thenReturn(issue);
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issueKey);
     request.execute().assertJson(getClass(), "show_issue_on_removed_component.json");
   }
@@ -327,9 +327,8 @@ public class IssueShowActionTest {
       .setActionPlanKey("AP-ABCD");
     when(issueService.getByKey(issue.key())).thenReturn(issue);
 
-    when(actionPlanService.findByKey(eq(issue.actionPlanKey()), any(UserSession.class))).thenReturn(new DefaultActionPlan().setKey("AP-ABCD").setName("Version 4.2"));
+    when(actionPlanService.findByKey(eq(issue.actionPlanKey()), any(ThreadLocalUserSession.class))).thenReturn(new DefaultActionPlan().setKey("AP-ABCD").setName("Version 4.2"));
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issue.key());
     request.execute().assertJson(getClass(), "show_issue_with_action_plan.json");
   }
@@ -345,7 +344,6 @@ public class IssueShowActionTest {
     when(userFinder.findByLogin("john")).thenReturn(new DefaultUser().setLogin("john").setName("John"));
     when(userFinder.findByLogin("steven")).thenReturn(new DefaultUser().setLogin("steven").setName("Steven"));
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issue.key());
     request.execute().assertJson(getClass(), "show_issue_with_users.json");
   }
@@ -358,7 +356,6 @@ public class IssueShowActionTest {
 
     when(durations.encode(debt)).thenReturn("2h1min");
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issue.key());
     request.execute().assertJson(getClass(), "show_issue_with_technical_debt.json");
   }
@@ -373,7 +370,6 @@ public class IssueShowActionTest {
     when(debtModel.characteristicById(2)).thenReturn(new DefaultDebtCharacteristic().setKey("K2").setId(2).setName("Readability").setParentId(1));
     when(debtModel.characteristicByKey("K2")).thenReturn(new DefaultDebtCharacteristic().setKey("K2").setId(2).setName("Readability").setParentId(1));
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issue.key());
     request.execute().assertJson(getClass(), "show_issue_with_characteristics.json");
   }
@@ -388,7 +384,6 @@ public class IssueShowActionTest {
     when(debtModel.characteristicById(2)).thenReturn(new DefaultDebtCharacteristic().setKey("K2").setId(2).setName("Readability").setParentId(1));
     when(debtModel.characteristicByKey("K2")).thenReturn(new DefaultDebtCharacteristic().setKey("K2").setId(2).setName("Readability").setParentId(1));
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issue.key());
     request.execute().assertJson(getClass(), "show_issue_with_characteristics.json");
   }
@@ -410,7 +405,6 @@ public class IssueShowActionTest {
     when(i18n.ageFromNow(any(Locale.class), eq(updateDate))).thenReturn("9 days");
     when(i18n.formatDateTime(any(Locale.class), eq(closedDate))).thenReturn("Jan 24, 2014 10:03 AM");
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issue.key());
     request.execute().assertJson(getClass(), "show_issue_with_dates.json");
   }
@@ -442,7 +436,7 @@ public class IssueShowActionTest {
     when(i18n.ageFromNow(any(Locale.class), eq(date1))).thenReturn("9 days");
     when(i18n.ageFromNow(any(Locale.class), eq(date2))).thenReturn("10 days");
 
-    MockUserSession.set().setLogin("arthur");
+    userSessionRule.logon("arthur");
     WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issue.key());
     request.execute().assertJson(getClass(), "show_issue_with_comments.json");
   }
@@ -456,7 +450,7 @@ public class IssueShowActionTest {
 
     when(issueService.listTransitions(eq(issue))).thenReturn(newArrayList(Transition.create("reopen", "RESOLVED", "REOPEN")));
 
-    MockUserSession.set().setLogin("john");
+    userSessionRule.logon("john");
     WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issue.key());
     request.execute().assertJson(getClass(), "show_issue_with_transitions.json");
   }
@@ -467,7 +461,7 @@ public class IssueShowActionTest {
       .setStatus("OPEN");
     when(issueService.getByKey(issue.key())).thenReturn(issue);
 
-    MockUserSession.set().setLogin("john");
+    userSessionRule.logon("john");
     WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issue.key());
     request.execute().assertJson(getClass(), "show_issue_with_actions.json");
   }
@@ -496,7 +490,6 @@ public class IssueShowActionTest {
     when(i18n.formatDateTime(any(Locale.class), eq(date1))).thenReturn("Fev 22, 2014 10:03 AM");
     when(i18n.formatDateTime(any(Locale.class), eq(date2))).thenReturn("Fev 23, 2014 10:03 AM");
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.newGetRequest("api/issues", "show").setParam("key", issue.key());
     request.execute().assertJson(getClass(), "show_issue_with_changelog.json");
   }
index 80f52c213bc0e8152f61a862c8e618f832bfe8c6..fd1144b14952c11d8883c15ddee8779c1e231a02 100644 (file)
 
 package org.sonar.server.issue.ws;
 
+import java.util.List;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.resources.Qualifiers;
 import org.sonar.api.rule.RuleStatus;
@@ -45,20 +47,20 @@ import org.sonar.server.permission.PermissionChange;
 import org.sonar.server.rule.RuleTesting;
 import org.sonar.server.rule.db.RuleDao;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.view.index.ViewDoc;
 import org.sonar.server.view.index.ViewIndexer;
 import org.sonar.server.ws.WsTester;
 import org.sonar.server.ws.WsTester.Result;
 
-import java.util.List;
-
 import static com.google.common.collect.Lists.newArrayList;
 
 public class SearchActionComponentsMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbClient db;
   DbSession session;
@@ -361,7 +363,7 @@ public class SearchActionComponentsMediumTest {
     session.commit();
     tester.get(IssueIndexer.class).indexAll();
 
-    MockUserSession.set().setLogin("john");
+    userSessionRule.logon("john");
     WsTester.Result result = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
       .setParam("resolved", "false")
       .setParam(WebService.Param.FACETS, "directories")
@@ -380,7 +382,7 @@ public class SearchActionComponentsMediumTest {
     indexView(view.uuid(), newArrayList(project.uuid()));
 
     setAnyoneProjectPermission(view, UserRole.USER);
-    MockUserSession.set().setLogin("john").addProjectUuidPermissions(UserRole.USER, view.uuid());
+    userSessionRule.logon("john").addProjectUuidPermissions(UserRole.USER, view.uuid());
 
     wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
       .setParam(IssueFilterParameters.COMPONENT_UUIDS, view.uuid())
@@ -400,7 +402,7 @@ public class SearchActionComponentsMediumTest {
 
     setAnyoneProjectPermission(view, UserRole.USER);
     // User has wrong permission on the view, no issue will be returned
-    MockUserSession.set().setLogin("john").addProjectUuidPermissions(UserRole.CODEVIEWER, view.uuid());
+    userSessionRule.logon("john").addProjectUuidPermissions(UserRole.CODEVIEWER, view.uuid());
 
     wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
       .setParam(IssueFilterParameters.COMPONENT_UUIDS, view.uuid())
@@ -421,7 +423,7 @@ public class SearchActionComponentsMediumTest {
     indexView(subView.uuid(), newArrayList(project.uuid()));
 
     setAnyoneProjectPermission(view, UserRole.USER);
-    MockUserSession.set().setLogin("john").addComponentUuidPermission(UserRole.USER, view.uuid(), subView.uuid());
+    userSessionRule.logon("john").addComponentUuidPermission(UserRole.USER, view.uuid(), subView.uuid());
 
     wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
       .setParam(IssueFilterParameters.COMPONENT_UUIDS, subView.uuid())
@@ -443,7 +445,7 @@ public class SearchActionComponentsMediumTest {
 
     setAnyoneProjectPermission(view, UserRole.USER);
     // User has wrong permission on the view, no issue will be returned
-    MockUserSession.set().setLogin("john").addComponentUuidPermission(UserRole.CODEVIEWER, view.uuid(), subView.uuid());
+    userSessionRule.logon("john").addComponentUuidPermission(UserRole.CODEVIEWER, view.uuid(), subView.uuid());
 
     wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
       .setParam(IssueFilterParameters.COMPONENT_UUIDS, subView.uuid())
@@ -547,9 +549,8 @@ public class SearchActionComponentsMediumTest {
   }
 
   private void setAnyoneProjectPermission(ComponentDto project, String permission) {
-    MockUserSession.set().setLogin("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.logon("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
     tester.get(InternalPermissionService.class).addPermission(new PermissionChange().setComponentKey(project.getKey()).setGroup(DefaultGroups.ANYONE).setPermission(permission));
-    MockUserSession.set();
   }
 
   private IssueDto insertIssue(IssueDto issue) {
index ac71b09d645b6bb14b9b7e0651e06952d71b9fbb..46858518bae649837112adf79866683151c9fb43 100644 (file)
@@ -24,6 +24,7 @@ import com.google.common.collect.ImmutableMap;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.rule.RuleStatus;
 import org.sonar.api.security.DefaultGroups;
@@ -32,7 +33,11 @@ import org.sonar.api.utils.DateUtils;
 import org.sonar.api.utils.KeyValueFormat;
 import org.sonar.api.web.UserRole;
 import org.sonar.core.component.ComponentDto;
-import org.sonar.core.issue.db.*;
+import org.sonar.core.issue.db.ActionPlanDao;
+import org.sonar.core.issue.db.ActionPlanDto;
+import org.sonar.core.issue.db.IssueChangeDao;
+import org.sonar.core.issue.db.IssueChangeDto;
+import org.sonar.core.issue.db.IssueDto;
 import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.core.rule.RuleDto;
@@ -50,7 +55,7 @@ import org.sonar.server.rule.RuleTesting;
 import org.sonar.server.rule.db.RuleDao;
 import org.sonar.server.search.QueryContext;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -59,6 +64,8 @@ public class SearchActionMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbClient db;
   DbSession session;
@@ -156,7 +163,7 @@ public class SearchActionMediumTest {
     session.commit();
     tester.get(IssueIndexer.class).indexAll();
 
-    MockUserSession.set().setLogin("john");
+    userSessionRule.logon("john");
     WsTester.Result result = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION).execute();
     result.assertJson(this.getClass(), "issue_with_comment.json");
   }
@@ -190,7 +197,7 @@ public class SearchActionMediumTest {
     session.commit();
     tester.get(IssueIndexer.class).indexAll();
 
-    MockUserSession.set().setLogin("john");
+    userSessionRule.logon("john");
     WsTester.Result result = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION).setParam(IssueFilterParameters.HIDE_COMMENTS, "true").execute();
     result.assertJson(this.getClass(), "issue_with_comment_hidden.json");
     assertThat(result.outputAsString()).doesNotContain("fabrice");
@@ -264,7 +271,7 @@ public class SearchActionMediumTest {
     session.commit();
     tester.get(IssueIndexer.class).indexAll();
 
-    MockUserSession.set().setLogin("john");
+    userSessionRule.logon("john");
     WsTester.Result result = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
       .setParam("extra_fields", "actions,transitions,assigneeName,reporterName,actionPlanName").execute();
     result.assertJson(this.getClass(), "issue_with_extra_fields.json");
@@ -398,7 +405,7 @@ public class SearchActionMediumTest {
     session.commit();
     tester.get(IssueIndexer.class).indexAll();
 
-    MockUserSession.set().setLogin("john");
+    userSessionRule.logon("john");
     WsTester.Result result = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
       .setParam("resolved", "false")
       .setParam(WebService.Param.FACETS, "statuses,severities,resolutions,projectUuids,rules,fileUuids,assignees,languages,actionPlans")
@@ -422,7 +429,7 @@ public class SearchActionMediumTest {
     session.commit();
     tester.get(IssueIndexer.class).indexAll();
 
-    MockUserSession.set().setLogin("john");
+    userSessionRule.logon("john");
     WsTester.Result result = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
       .setParam("resolved", "false")
       .setParam("severities", "MAJOR,MINOR")
@@ -465,7 +472,7 @@ public class SearchActionMediumTest {
     session.commit();
     tester.get(IssueIndexer.class).indexAll();
 
-    MockUserSession.set().setLogin("john");
+    userSessionRule.logon("john");
     wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
       .setParam("resolved", "false")
       .setParam("assignees", "__me__")
@@ -476,7 +483,7 @@ public class SearchActionMediumTest {
 
   @Test
   public void filter_by_assigned_to_me_unauthenticated() throws Exception {
-    MockUserSession.set();
+    userSessionRule.logon();
 
     ComponentDto project = insertComponent(ComponentTesting.newProjectDto("ABCD").setKey("MyProject"));
     setDefaultProjectPermission(project);
@@ -537,7 +544,7 @@ public class SearchActionMediumTest {
     session.commit();
     tester.get(IssueIndexer.class).indexAll();
 
-    MockUserSession.set().setLogin("john-bob.polop");
+    userSessionRule.logon("john-bob.polop");
     wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
       .setParam("resolved", "false")
       .setParam("assignees", "alice")
@@ -674,9 +681,9 @@ public class SearchActionMediumTest {
 
   private void setDefaultProjectPermission(ComponentDto project) {
     // project can be seen by anyone and by code viewer
-    MockUserSession.set().setLogin("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.logon("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
     tester.get(InternalPermissionService.class).addPermission(new PermissionChange().setComponentKey(project.getKey()).setGroup(DefaultGroups.ANYONE).setPermission(UserRole.USER));
-    MockUserSession.set();
+    userSessionRule.logon();
   }
 
   private ComponentDto insertComponent(ComponentDto component) {
index aba6615812e5dbc84a76d3a3d95862aeec294738..57190440976e521df061f12a0209dc11cf52fcad 100644 (file)
 package org.sonar.server.permission;
 
 import com.google.common.collect.Maps;
+import java.util.Collection;
+import java.util.Map;
+import javax.annotation.Nullable;
 import org.elasticsearch.action.search.SearchResponse;
 import org.elasticsearch.search.SearchHit;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.web.UserRole;
 import org.sonar.core.component.ComponentDto;
@@ -38,12 +42,7 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.es.EsClient;
 import org.sonar.server.issue.index.IssueIndexDefinition;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
-
-import javax.annotation.Nullable;
-
-import java.util.Collection;
-import java.util.Map;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -54,6 +53,8 @@ public class InternalPermissionServiceMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbClient db;
   DbSession session;
@@ -81,7 +82,7 @@ public class InternalPermissionServiceMediumTest {
   @Test
   public void add_project_permission_to_user() {
     // init
-    MockUserSession.set().setLogin("admin").addProjectPermissions(UserRole.ADMIN, project.key());
+    userSessionRule.logon("admin").addProjectPermissions(UserRole.ADMIN, project.key());
     UserDto user = new UserDto().setLogin("john").setName("John");
     db.userDao().insert(session, user);
     session.commit();
@@ -101,7 +102,7 @@ public class InternalPermissionServiceMediumTest {
 
   @Test
   public void remove_project_permission_to_user() {
-    MockUserSession.set().setLogin("admin").addProjectPermissions(UserRole.ADMIN, project.key());
+    userSessionRule.logon("admin").addProjectPermissions(UserRole.ADMIN, project.key());
 
     UserDto user1 = new UserDto().setLogin("user1").setName("User1");
     db.userDao().insert(session, user1);
@@ -125,7 +126,7 @@ public class InternalPermissionServiceMediumTest {
 
   @Test
   public void remove_all_component_user_permissions() {
-    MockUserSession.set().setLogin("admin").addProjectPermissions(UserRole.ADMIN, project.key());
+    userSessionRule.logon("admin").addProjectPermissions(UserRole.ADMIN, project.key());
 
     UserDto user = new UserDto().setLogin("user1").setName("User1");
     db.userDao().insert(session, user);
@@ -153,7 +154,7 @@ public class InternalPermissionServiceMediumTest {
   @Test
   public void add_and_remove_permission_to_group() {
     // init
-    MockUserSession.set().setLogin("admin").addProjectPermissions(UserRole.ADMIN, project.key());
+    userSessionRule.logon("admin").addProjectPermissions(UserRole.ADMIN, project.key());
     GroupDto group = new GroupDto().setName("group1");
     db.groupDao().insert(session, group);
     session.commit();
index d5938bb4aa638c13257ca89f02a5e5c83e799088..530450cdcc20fda119d4c945a309852437a6e158 100644 (file)
@@ -22,6 +22,7 @@ package org.sonar.server.permission;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
+import java.util.List;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -30,7 +31,12 @@ import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.runners.MockitoJUnitRunner;
 import org.sonar.api.web.UserRole;
-import org.sonar.core.permission.*;
+import org.sonar.core.permission.GlobalPermissions;
+import org.sonar.core.permission.PermissionQuery;
+import org.sonar.core.permission.PermissionTemplateDao;
+import org.sonar.core.permission.PermissionTemplateDto;
+import org.sonar.core.permission.PermissionTemplateGroupDto;
+import org.sonar.core.permission.PermissionTemplateUserDto;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.core.persistence.MyBatis;
 import org.sonar.core.properties.PropertiesDao;
@@ -38,12 +44,16 @@ import org.sonar.core.user.GroupDto;
 import org.sonar.core.user.UserDao;
 import org.sonar.core.user.UserDto;
 import org.sonar.server.exceptions.BadRequestException;
-import org.sonar.server.user.MockUserSession;
-
-import java.util.List;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.*;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class InternalPermissionTemplateServiceTest {
@@ -55,6 +65,9 @@ public class InternalPermissionTemplateServiceTest {
   private static final PermissionTemplateDto DEFAULT_TEMPLATE =
     new PermissionTemplateDto().setId(1L).setName(DEFAULT_KEY).setDescription(DEFAULT_DESC).setKeyPattern(DEFAULT_PATTERN);
 
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
+  
   @Mock
   PermissionTemplateDao permissionTemplateDao;
 
@@ -77,11 +90,11 @@ public class InternalPermissionTemplateServiceTest {
 
   @Before
   public void setUp() {
-    MockUserSession.set().setLogin("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.logon("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
 
     MyBatis myBatis = mock(MyBatis.class);
     when(myBatis.openSession(false)).thenReturn(session);
-    service = new InternalPermissionTemplateService(myBatis, permissionTemplateDao, userDao, finder);
+    service = new InternalPermissionTemplateService(myBatis, permissionTemplateDao, userDao, finder, userSessionRule);
   }
 
   @Test
@@ -203,7 +216,7 @@ public class InternalPermissionTemplateServiceTest {
 
   @Test
   public void should_retrieve_all_permission_templates_from_project() {
-    MockUserSession.set().setLogin("admin").addProjectPermissions(UserRole.ADMIN, "org.sample.Sample");
+    userSessionRule.logon("admin").addProjectPermissions(UserRole.ADMIN, "org.sample.Sample");
 
     PermissionTemplateDto template1 =
       new PermissionTemplateDto().setId(1L).setName("template1").setDescription("template1");
index 409e59566f69ad0ccdf9b456e623a0b63debaa54..4d62088342f041659bac80bf9b5a1952c603555e 100644 (file)
@@ -34,11 +34,17 @@ import org.sonar.core.user.UserDto;
 import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.exceptions.UnauthorizedException;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 
-import static org.mockito.Mockito.*;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.stub;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 public class PermissionTemplateUpdaterTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   private static final UserDto DEFAULT_USER = new UserDto().setId(1L).setLogin("user").setName("user");
   private static final GroupDto DEFAULT_GROUP = new GroupDto().setId(1L).setName("group");
@@ -50,7 +56,7 @@ public class PermissionTemplateUpdaterTest {
 
   @Before
   public void setUpCommonMocks() {
-    MockUserSession.set().setLogin("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.logon("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
     userDao = mock(UserDao.class);
     stub(userDao.selectActiveUserByLogin("user")).toReturn(DEFAULT_USER);
     stub(userDao.selectGroupByName("group")).toReturn(DEFAULT_GROUP);
@@ -63,7 +69,7 @@ public class PermissionTemplateUpdaterTest {
     when(permissionTemplateDao.selectTemplateByKey("my_template")).thenReturn(new PermissionTemplateDto().setId(1L));
 
     PermissionTemplateUpdater updater =
-      new PermissionTemplateUpdater("my_template", UserRole.USER, "user", permissionTemplateDao, userDao) {
+      new PermissionTemplateUpdater("my_template", UserRole.USER, "user", permissionTemplateDao, userDao, userSessionRule) {
       @Override
       void doExecute(Long templateId, String permission) {
         permissionTemplateDao.addUserPermission(1L, 1L, UserRole.USER);
@@ -83,7 +89,7 @@ public class PermissionTemplateUpdaterTest {
     when(permissionTemplateDao.selectTemplateByKey("my_template")).thenReturn(null);
 
     PermissionTemplateUpdater updater =
-      new PermissionTemplateUpdater("my_template", UserRole.USER, "user", permissionTemplateDao, userDao) {
+      new PermissionTemplateUpdater("my_template", UserRole.USER, "user", permissionTemplateDao, userDao, userSessionRule) {
         @Override
         void doExecute(Long templateId, String permission) {
         }
@@ -100,7 +106,7 @@ public class PermissionTemplateUpdaterTest {
     when(permissionTemplateDao.selectTemplateByKey("my_template")).thenReturn(new PermissionTemplateDto().setId(1L));
 
     PermissionTemplateUpdater updater =
-      new PermissionTemplateUpdater("my_template", "invalid", "user", permissionTemplateDao, userDao) {
+      new PermissionTemplateUpdater("my_template", "invalid", "user", permissionTemplateDao, userDao, userSessionRule) {
         @Override
         void doExecute(Long templateId, String permission) {
         }
@@ -113,9 +119,9 @@ public class PermissionTemplateUpdaterTest {
     expected.expect(UnauthorizedException.class);
     expected.expectMessage("Authentication is required");
 
-    MockUserSession.set();
+    userSessionRule.anonymous();
 
-    PermissionTemplateUpdater updater = new PermissionTemplateUpdater(null, null, null, null, null) {
+    PermissionTemplateUpdater updater = new PermissionTemplateUpdater(null, null, null, null, null, userSessionRule) {
         @Override
         void doExecute(Long templateId, String permission) {
         }
@@ -128,9 +134,9 @@ public class PermissionTemplateUpdaterTest {
     expected.expect(ForbiddenException.class);
     expected.expectMessage("Insufficient privileges");
 
-    MockUserSession.set().setLogin("user").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.logon("user").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
 
-    PermissionTemplateUpdater updater = new PermissionTemplateUpdater(null, null, null, null, null) {
+    PermissionTemplateUpdater updater = new PermissionTemplateUpdater(null, null, null, null, null, userSessionRule) {
       @Override
       void doExecute(Long templateId, String permission) {
       }
index 1c5dd04158f3402a178d0a08dbf684bb7a6ef905..7e695485ac830652d0545b5539561be8e1ad2890 100644 (file)
@@ -20,6 +20,9 @@
 package org.sonar.server.platform.ws;
 
 import com.google.common.collect.ImmutableSet;
+import java.util.Date;
+import java.util.Locale;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -27,19 +30,18 @@ import org.mockito.runners.MockitoJUnitRunner;
 import org.sonar.api.platform.Server;
 import org.sonar.api.utils.DateUtils;
 import org.sonar.core.i18n.DefaultI18n;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 import org.sonar.server.ws.WsTester.Result;
 
-import java.util.Date;
-import java.util.Locale;
-
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyZeroInteractions;
 import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class L10nWsTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   @Mock
   DefaultI18n i18n;
@@ -50,13 +52,13 @@ public class L10nWsTest {
   @Test
   public void should_allow_client_to_cache_messages() throws Exception {
     Locale locale = Locale.PRC;
-    MockUserSession.set().setLocale(locale);
+    userSessionRule.setLocale(locale);
 
     Date now = new Date();
     Date aBitLater = new Date(now.getTime() + 1000);
     when(server.getStartedAt()).thenReturn(now);
 
-    Result result = new WsTester(new L10nWs(i18n, server)).newGetRequest("api/l10n", "index").setParam("ts", DateUtils.formatDateTime(aBitLater)).execute();
+    Result result = new WsTester(new L10nWs(i18n, server, userSessionRule)).newGetRequest("api/l10n", "index").setParam("ts", DateUtils.formatDateTime(aBitLater)).execute();
     verifyZeroInteractions(i18n);
     verify(server).getStartedAt();
 
@@ -66,7 +68,7 @@ public class L10nWsTest {
   @Test
   public void should_return_all_l10n_messages_using_accept_header_with_cache_expired() throws Exception {
     Locale locale = Locale.PRC;
-    MockUserSession.set().setLocale(locale);
+    userSessionRule.setLocale(locale);
 
     Date now = new Date();
     Date aBitEarlier = new Date(now.getTime() - 1000);
@@ -81,7 +83,7 @@ public class L10nWsTest {
     when(i18n.message(locale, key2, key2)).thenReturn(key2);
     when(i18n.message(locale, key3, key3)).thenReturn(key3);
 
-    Result result = new WsTester(new L10nWs(i18n, server)).newGetRequest("api/l10n", "index").setParam("ts", DateUtils.formatDateTime(aBitEarlier)).execute();
+    Result result = new WsTester(new L10nWs(i18n, server, userSessionRule)).newGetRequest("api/l10n", "index").setParam("ts", DateUtils.formatDateTime(aBitEarlier)).execute();
     verify(i18n).getPropertyKeys();
     verify(i18n).message(locale, key1, key1);
     verify(i18n).message(locale, key2, key2);
@@ -93,7 +95,7 @@ public class L10nWsTest {
   @Test
   public void should_override_locale_when_locale_param_is_set() throws Exception {
     Locale locale = Locale.PRC;
-    MockUserSession.set().setLocale(locale);
+    userSessionRule.setLocale(locale);
     Locale override = Locale.JAPANESE;
 
     String key1 = "key1";
@@ -105,7 +107,7 @@ public class L10nWsTest {
     when(i18n.message(override, key2, key2)).thenReturn(key2);
     when(i18n.message(override, key3, key3)).thenReturn(key3);
 
-    Result result = new WsTester(new L10nWs(i18n, server)).newGetRequest("api/l10n", "index").setParam("locale", override.toString()).execute();
+    Result result = new WsTester(new L10nWs(i18n, server, userSessionRule)).newGetRequest("api/l10n", "index").setParam("locale", override.toString()).execute();
     verify(i18n).getPropertyKeys();
     verify(i18n).message(override, key1, key1);
     verify(i18n).message(override, key2, key2);
index ec567be0b1d8288321e09cabe2ba0db62e30d1ee..86517b09fdf7b3b795e8dbfbf981760d9e4643ba 100644 (file)
@@ -20,6 +20,8 @@
 
 package org.sonar.server.platform.ws;
 
+import java.util.LinkedHashMap;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.Response;
@@ -27,37 +29,32 @@ import org.sonar.api.server.ws.internal.SimpleGetRequest;
 import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.platform.monitoring.Monitor;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
-import java.util.LinkedHashMap;
-
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 public class SystemInfoWsActionTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone().logon("login")
+      .setName("name");
 
   Monitor monitor1 = mock(Monitor.class);
   Monitor monitor2 = mock(Monitor.class);
-  SystemInfoWsAction sut = new SystemInfoWsAction(monitor1, monitor2);
+  SystemInfoWsAction sut = new SystemInfoWsAction(userSessionRule, monitor1, monitor2);
 
   @Test(expected = ForbiddenException.class)
   public void should_fail_when_does_not_have_admin_right() {
-    MockUserSession.set()
-      .setLogin("login")
-      .setName("name")
-      .setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
 
     sut.handle(mock(Request.class), mock(Response.class));
   }
 
   @Test
   public void write_json() {
-    MockUserSession.set()
-      .setLogin("login")
-      .setName("name")
-      .setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
 
     LinkedHashMap<String, Object> attributes1 = new LinkedHashMap<>();
     attributes1.put("foo", "bar");
index 96c2879b88eb0c10702387e0080259acbf973b50..a475adf91f72c2066aefd41a01716f6a3b7a7473 100644 (file)
@@ -23,6 +23,7 @@ import org.junit.Test;
 import org.sonar.api.config.Settings;
 import org.sonar.api.server.ws.WebService;
 import org.sonar.server.platform.Platform;
+import org.sonar.server.tester.AnonymousMockUserSession;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
@@ -32,7 +33,7 @@ public class SystemWsTest {
   @Test
   public void define() {
     SystemRestartWsAction action1 = new SystemRestartWsAction(mock(Settings.class), mock(Platform.class));
-    SystemInfoWsAction action2 = new SystemInfoWsAction();
+    SystemInfoWsAction action2 = new SystemInfoWsAction(new AnonymousMockUserSession());
     SystemWs ws = new SystemWs(action1, action2);
     WebService.Context context = new WebService.Context();
 
index 3d2260eba4f6c52794212fb8fd934a8dae4491ff..11f91f15ef61aafdd39b46d68c5e5071c2a0213c 100644 (file)
@@ -19,7 +19,6 @@
  */
 package org.sonar.server.plugins.ws;
 
-import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -29,7 +28,7 @@ import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.plugins.PluginDownloader;
 import org.sonar.server.plugins.ServerPluginRepository;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -40,9 +39,12 @@ import static org.mockito.Mockito.verify;
 public class CancelAllPluginsWsActionTest {
   private static final String DUMMY_CONTROLLER_KEY = "dummy";
 
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone().setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+
   private PluginDownloader pluginDownloader = mock(PluginDownloader.class);
   private ServerPluginRepository pluginRepository = mock(ServerPluginRepository.class);
-  private CancelAllPluginsWsAction underTest = new CancelAllPluginsWsAction(pluginDownloader, pluginRepository);
+  private CancelAllPluginsWsAction underTest = new CancelAllPluginsWsAction(pluginDownloader, pluginRepository, userSessionRule);
 
   private Request request = mock(Request.class);
   private WsTester.TestResponse response = new WsTester.TestResponse();
@@ -50,11 +52,6 @@ public class CancelAllPluginsWsActionTest {
   @Rule
   public ExpectedException expectedException = ExpectedException.none();
 
-  @Before
-  public void setUp() {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
-  }
-
   @Test
   public void action_cancel_all_is_defined() {
     WsTester wsTester = new WsTester();
@@ -80,7 +77,7 @@ public class CancelAllPluginsWsActionTest {
     expectedException.expectMessage("Insufficient privileges");
 
     // no permission on user
-    MockUserSession.set().setGlobalPermissions();
+    userSessionRule.setGlobalPermissions();
 
     underTest.handle(request, response);
   }
index dae2573c115705a4d4860760f398544145bd8822..1be07a384518f32c0fb9fac1503ba4afff48aa2a 100644 (file)
@@ -29,7 +29,7 @@ import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.plugins.PluginDownloader;
 import org.sonar.server.plugins.UpdateCenterMatrixFactory;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 import org.sonar.updatecenter.common.Plugin;
 import org.sonar.updatecenter.common.PluginUpdate;
@@ -49,11 +49,14 @@ public class InstallPluginsWsActionTest {
   private static final String ACTION_KEY = "install";
   private static final String KEY_PARAM = "key";
   private static final String PLUGIN_KEY = "pluginKey";
+  
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   private UpdateCenterMatrixFactory updateCenterFactory = mock(UpdateCenterMatrixFactory.class);
   private UpdateCenter updateCenter = mock(UpdateCenter.class);
   private PluginDownloader pluginDownloader = mock(PluginDownloader.class);
-  private InstallPluginsWsAction underTest = new InstallPluginsWsAction(updateCenterFactory, pluginDownloader);
+  private InstallPluginsWsAction underTest = new InstallPluginsWsAction(updateCenterFactory, pluginDownloader, userSessionRule);
 
   private WsTester wsTester = new WsTester(new PluginsWs(underTest));
   private WsTester.TestRequest invalidRequest = wsTester.newPostRequest(CONTROLLER_KEY, ACTION_KEY);
@@ -67,7 +70,7 @@ public class InstallPluginsWsActionTest {
   public void wireMocks() {
     when(updateCenterFactory.getUpdateCenter(anyBoolean())).thenReturn(updateCenter);
 
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
   }
 
   @Test
@@ -76,7 +79,7 @@ public class InstallPluginsWsActionTest {
     expectedException.expectMessage("Insufficient privileges");
 
     // no permission on user
-    MockUserSession.set().setGlobalPermissions();
+    userSessionRule.setGlobalPermissions();
 
     validRequest.execute();
   }
index 85a3bba714fe4251422808663d038e7f1a33c517..42f42aab24654031a8ab1f7275d722d3fb9c0c65 100644 (file)
@@ -19,7 +19,6 @@
  */
 package org.sonar.server.plugins.ws;
 
-import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -28,7 +27,7 @@ import org.sonar.api.server.ws.WebService;
 import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.plugins.ServerPluginRepository;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -43,29 +42,26 @@ public class UninstallPluginsWsActionTest {
   private static final String KEY_PARAM = "key";
   private static final String PLUGIN_KEY = "findbugs";
 
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone().setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+  @Rule
+  public ExpectedException expectedException = ExpectedException.none();
+
   private ServerPluginRepository pluginRepository = mock(ServerPluginRepository.class);
-  private UninstallPluginsWsAction underTest = new UninstallPluginsWsAction(pluginRepository);
+  private UninstallPluginsWsAction underTest = new UninstallPluginsWsAction(pluginRepository, userSessionRule);
 
   private WsTester wsTester = new WsTester(new PluginsWs(underTest));
   private Request invalidRequest = wsTester.newGetRequest(CONTROLLER_KEY, ACTION_KEY);
   private Request validRequest = wsTester.newGetRequest(CONTROLLER_KEY, ACTION_KEY).setParam(KEY_PARAM, PLUGIN_KEY);
   private WsTester.TestResponse response = new WsTester.TestResponse();
 
-  @Rule
-  public ExpectedException expectedException = ExpectedException.none();
-
-  @Before
-  public void setUp() {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
-  }
-
   @Test
   public void user_must_have_system_admin_permission() throws Exception {
     expectedException.expect(ForbiddenException.class);
     expectedException.expectMessage("Insufficient privileges");
 
     // no permission on user
-    MockUserSession.set().setGlobalPermissions();
+    userSessionRule.setGlobalPermissions();
 
     underTest.handle(validRequest, response);
   }
index 82a1f39c29d371b68952aff2772dc01f1d86a282..750dae46318521461bbd60f830c56efced312a0d 100644 (file)
@@ -30,7 +30,7 @@ import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.plugins.PluginDownloader;
 import org.sonar.server.plugins.UpdateCenterMatrixFactory;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 import org.sonar.updatecenter.common.Plugin;
 import org.sonar.updatecenter.common.PluginUpdate;
@@ -52,10 +52,13 @@ public class UpdatePluginsWsActionTest {
   private static final String KEY_PARAM = "key";
   private static final String PLUGIN_KEY = "pluginKey";
 
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
+
   private UpdateCenterMatrixFactory updateCenterFactory = mock(UpdateCenterMatrixFactory.class);
   private UpdateCenter updateCenter = mock(UpdateCenter.class);
   private PluginDownloader pluginDownloader = mock(PluginDownloader.class);
-  private UpdatePluginsWsAction underTest = new UpdatePluginsWsAction(updateCenterFactory, pluginDownloader);
+  private UpdatePluginsWsAction underTest = new UpdatePluginsWsAction(updateCenterFactory, pluginDownloader, userSessionRule);
 
   private WsTester wsTester = new WsTester(new PluginsWs(underTest));
   private Request invalidRequest = wsTester.newGetRequest(CONTROLLER_KEY, ACTION_KEY);
@@ -69,7 +72,7 @@ public class UpdatePluginsWsActionTest {
   public void setUp() {
     when(updateCenterFactory.getUpdateCenter(anyBoolean())).thenReturn(updateCenter);
 
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
   }
 
   @Test
@@ -78,7 +81,7 @@ public class UpdatePluginsWsActionTest {
     expectedException.expectMessage("Insufficient privileges");
 
     // no permission on user
-    MockUserSession.set().setGlobalPermissions();
+    userSessionRule.setGlobalPermissions();
 
     underTest.handle(validRequest, response);
   }
index 572f295a85f97adcf7f4a91f508f4f00939d6bdc..121d64b2b5969c1423ff03525ac7b023386357ff 100644 (file)
@@ -21,7 +21,11 @@ package org.sonar.server.qualitygate;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -49,20 +53,27 @@ import org.sonar.server.component.db.ComponentDao;
 import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.exceptions.NotFoundException;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
+import org.sonar.server.user.AnonymousUserSession;
+import org.sonar.server.tester.MockUserSession;
 import org.sonar.server.user.UserSession;
-import org.sonar.server.user.UserSessionTestUtils;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.*;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class QualityGatesTest {
 
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
+
   @Mock
   DbSession session;
 
@@ -88,18 +99,18 @@ public class QualityGatesTest {
 
   static final String PROJECT_KEY = "SonarQube";
 
-  UserSession authorizedProfileAdminUserSession = MockUserSession.create().setLogin("gaudol").setName("Olivier").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
-  UserSession authorizedProjectAdminUserSession = MockUserSession.create().setLogin("gaudol").setName("Olivier").addProjectPermissions(UserRole.ADMIN, PROJECT_KEY);
-  UserSession unauthorizedUserSession = MockUserSession.create().setLogin("polop").setName("Polop");
-  UserSession unauthenticatedUserSession = MockUserSession.create();
+  UserSession authorizedProfileAdminUserSession = new MockUserSession("gaudol").setName("Olivier").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+  UserSession authorizedProjectAdminUserSession = new MockUserSession("gaudol").setName("Olivier").addProjectPermissions(UserRole.ADMIN, PROJECT_KEY);
+  UserSession unauthorizedUserSession = new MockUserSession("polop").setName("Polop");
+  UserSession unauthenticatedUserSession = AnonymousUserSession.INSTANCE;
 
   @Before
   public void initialize() {
     when(componentDao.getById(anyLong(), eq(session))).thenReturn(new ComponentDto().setId(1L).setKey(PROJECT_KEY));
 
     when(myBatis.openSession(false)).thenReturn(session);
-    qGates = new QualityGates(dao, conditionDao, metricFinder, propertiesDao, componentDao, myBatis);
-    UserSessionTestUtils.setUserSession(authorizedProfileAdminUserSession);
+    qGates = new QualityGates(dao, conditionDao, metricFinder, propertiesDao, componentDao, myBatis, userSessionRule);
+    userSessionRule.set(authorizedProfileAdminUserSession);
   }
 
   @Test
@@ -121,14 +132,14 @@ public class QualityGatesTest {
 
   @Test(expected = ForbiddenException.class)
   public void should_fail_create_on_anonymous() {
-    UserSessionTestUtils.setUserSession(unauthenticatedUserSession);
+    userSessionRule.set(unauthenticatedUserSession);
     assertThat(qGates.currentUserHasWritePermission()).isFalse();
     qGates.create("polop");
   }
 
   @Test(expected = ForbiddenException.class)
   public void should_fail_create_on_missing_permission() {
-    UserSessionTestUtils.setUserSession(unauthorizedUserSession);
+    userSessionRule.set(unauthorizedUserSession);
     qGates.create("polop");
   }
 
@@ -521,7 +532,7 @@ public class QualityGatesTest {
 
   @Test
   public void associate_project_with_project_admin_permission() {
-    UserSessionTestUtils.setUserSession(authorizedProjectAdminUserSession);
+    userSessionRule.set(authorizedProjectAdminUserSession);
 
     Long qGateId = 42L;
     Long projectId = 24L;
@@ -548,7 +559,7 @@ public class QualityGatesTest {
 
   @Test
   public void dissociate_project_with_project_admin_permission() {
-    UserSessionTestUtils.setUserSession(authorizedProjectAdminUserSession);
+    userSessionRule.set(authorizedProjectAdminUserSession);
 
     Long qGateId = 42L;
     Long projectId = 24L;
index e9278558413c17dd409cb6f29bc309e98b97af8b..771b43ce3ed0759c0b44540d301ac6a967759740 100644 (file)
@@ -25,6 +25,7 @@ import com.google.common.collect.Multimap;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rule.RuleStatus;
@@ -50,6 +51,7 @@ import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import org.sonar.server.tester.UserSessionRule;
 
 import static com.google.common.collect.Lists.newArrayList;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -58,6 +60,8 @@ public class ActiveRuleBackendMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbClient db;
   RuleDao dao;
index 454835e56f33fccbe6e8efabfb8c126eea7283a5..6417ff3686db3ccde419e0b4bdd5ec12597d933b 100644 (file)
@@ -27,6 +27,7 @@ import org.custommonkey.xmlunit.XMLUnit;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rule.Severity;
@@ -44,6 +45,7 @@ import javax.xml.stream.XMLStreamException;
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.util.List;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.fail;
@@ -52,6 +54,8 @@ public class QProfileBackuperMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbClient db;
   DbSession dbSession;
index 9652b9b7ef1b281fb8b9822b628e7281f0bc98e1..8a095cc4547668cf69a206645274482a1cae6d05 100644 (file)
@@ -24,6 +24,7 @@ import org.assertj.core.data.MapEntry;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.rule.Severity;
 import org.sonar.api.server.rule.RuleParamType;
@@ -37,6 +38,7 @@ import org.sonar.server.qualityprofile.QProfileComparison.QProfileComparisonResu
 import org.sonar.server.qualityprofile.index.ActiveRuleIndex;
 import org.sonar.server.rule.RuleTesting;
 import org.sonar.server.tester.ServerTester;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -44,6 +46,8 @@ public class QProfileComparisonMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester().addXoo();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbClient db;
   DbSession dbSession;
index 87a3dc9f4ec24c666ce0969c3433d7eaa8b967a7..37ae08f67674e036e2852b96780773a74e99c114 100644 (file)
@@ -24,6 +24,7 @@ import com.google.common.collect.Lists;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.rule.Severity;
 import org.sonar.api.server.rule.RuleParamType;
@@ -41,6 +42,7 @@ import javax.annotation.Nullable;
 
 import java.util.List;
 import java.util.Map;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.fail;
@@ -49,6 +51,8 @@ public class QProfileCopierMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbClient db;
   DbSession dbSession;
index cb0271b1bfb10cad5c953d7a3dc58820192a9a6e..25ebecadd78e1c1c879deece7f5d06e9e543a6c4 100644 (file)
@@ -46,6 +46,7 @@ import java.io.IOException;
 import java.io.Reader;
 import java.io.Writer;
 import java.util.List;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.fail;
@@ -57,6 +58,8 @@ public class QProfileExportersTest {
     XooRulesDefinition.class, XooProfileDefinition.class,
     XooExporter.class, StandardExporter.class,
     XooProfileImporter.class, XooProfileImporterWithMessages.class, XooProfileImporterWithError.class);
+  @org.junit.Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbClient db;
   DbSession dbSession;
index db41edd60b6d4c6c3df15b8b01952b700590e9f4..9feeb7c08ed1e638f65759bdc49a30e36f9235b4 100644 (file)
@@ -22,6 +22,7 @@ package org.sonar.server.qualityprofile;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.server.rule.RuleParamType;
 import org.sonar.core.component.ComponentDto;
@@ -36,7 +37,8 @@ import org.sonar.server.qualityprofile.index.ActiveRuleIndex;
 import org.sonar.server.rule.RuleTesting;
 import org.sonar.server.search.IndexClient;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
+import org.sonar.server.tester.MockUserSession;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.fail;
@@ -48,6 +50,8 @@ public class QProfileFactoryMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbClient db;
   DbSession dbSession;
@@ -325,7 +329,7 @@ public class QProfileFactoryMediumTest {
     assertThat(factory.getByProjectAndLanguage("org.codehaus.sonar:sonar", "xoo")).isNull();
 
     tester.get(QProfileProjectOperations.class).addProject(profileDto.getKey(), project.uuid(),
-      MockUserSession.set().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN), dbSession);
+      new MockUserSession("me").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN), dbSession);
     dbSession.commit();
     dbSession.clearCache();
     assertThat(factory.getByProjectAndLanguage("org.codehaus.sonar:sonar", "xoo").getKey()).isEqualTo(XOO_P1_KEY);
index 2710183163e59e5e5f71a396d5d3b524aa2aed1d..22f97568b4fa887fcad33767fef371839083de12 100644 (file)
@@ -23,6 +23,7 @@ package org.sonar.server.qualityprofile;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.web.UserRole;
 import org.sonar.core.component.ComponentDto;
@@ -33,7 +34,8 @@ import org.sonar.core.qualityprofile.db.QualityProfileDto;
 import org.sonar.core.user.UserDto;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
+import org.sonar.server.tester.MockUserSession;
 import org.sonar.server.user.UserSession;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -42,6 +44,8 @@ public class QProfileProjectOperationsMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbClient db;
   DbSession dbSession;
@@ -52,8 +56,8 @@ public class QProfileProjectOperationsMediumTest {
   static final String PROJECT_KEY = "SonarQube";
   static final String PROJECT_UUID = "ABCD";
 
-  UserSession authorizedProfileAdminUserSession = MockUserSession.create().setLogin("john").setName("John").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
-  UserSession authorizedProjectAdminUserSession = MockUserSession.create().setLogin("john").setName("John").addProjectPermissions(UserRole.ADMIN, PROJECT_KEY);
+  UserSession authorizedProfileAdminUserSession = new MockUserSession("john").setName("John").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+  UserSession authorizedProjectAdminUserSession = new MockUserSession("john").setName("John").addProjectPermissions(UserRole.ADMIN, PROJECT_KEY);
 
   @Before
   public void before() {
@@ -142,7 +146,7 @@ public class QProfileProjectOperationsMediumTest {
     db.userDao().insert(dbSession, user);
     tester.get(PermissionFacade.class).insertUserPermission(project1.getId(), user.getId(), UserRole.USER, dbSession);
     tester.get(PermissionFacade.class).insertUserPermission(project2.getId(), user.getId(), UserRole.USER, dbSession);
-    UserSession userSession = MockUserSession.set().setUserId(user.getId().intValue()).setLogin("john").setName("John")
+    UserSession userSession = userSessionRule.logon("john").setUserId(user.getId().intValue()).setName("John")
       .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     dbSession.commit();
index b3d89740951d96c322aac26f796e3bdd830d8cb7..841b09973270e2eff2b0e87bcbdb907960252866 100644 (file)
@@ -24,6 +24,7 @@ import com.google.common.collect.ImmutableMap;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.profiles.ProfileDefinition;
 import org.sonar.api.profiles.RulesProfile;
@@ -44,6 +45,7 @@ import org.sonar.server.qualityprofile.index.ActiveRuleIndex;
 import org.sonar.server.tester.ServerTester;
 
 import javax.annotation.Nullable;
+import org.sonar.server.tester.UserSessionRule;
 
 import static com.google.common.collect.Lists.newArrayList;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -55,6 +57,8 @@ public class QProfileResetMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester().addXoo().addComponents(PROFILE_DEFS, RULE_DEFS);
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbClient db;
   DbSession dbSession;
index 8ed0fea39b52c724ef48a62e2be885353e03f4e5..8578e79503f6b019811f583618a7bc1e6244171c 100644 (file)
@@ -22,6 +22,11 @@ package org.sonar.server.qualityprofile;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Multimap;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.Writer;
+import java.util.List;
+import java.util.Map;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
@@ -50,13 +55,7 @@ import org.sonar.server.rule.RuleTesting;
 import org.sonar.server.search.FacetValue;
 import org.sonar.server.search.Result;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
-
-import java.io.IOException;
-import java.io.Reader;
-import java.io.Writer;
-import java.util.List;
-import java.util.Map;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.sonar.server.qualityprofile.QProfileTesting.XOO_P1_KEY;
@@ -66,6 +65,8 @@ public class QProfileServiceMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester().addComponents(XooProfileImporter.class, XooExporter.class);
+  @org.junit.Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbClient db;
   DbSession dbSession;
@@ -99,7 +100,7 @@ public class QProfileServiceMediumTest {
 
   @Test
   public void create_profile() {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN).setLogin("me");
+    userSessionRule.logon().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     QualityProfileDto profile = service.create(QProfileName.createFor("xoo", "New Profile"), null).profile();
 
@@ -110,7 +111,7 @@ public class QProfileServiceMediumTest {
 
   @Test
   public void create_profile_with_xml() {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN).setLogin("me");
+    userSessionRule.logon().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     db.ruleDao().insert(dbSession, RuleTesting.newDto(RuleKey.of("xoo", "R1")).setLanguage("xoo").setSeverity("MINOR"));
     dbSession.commit();
@@ -128,7 +129,7 @@ public class QProfileServiceMediumTest {
 
   @Test
   public void count_by_all_profiles() {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN).setLogin("me");
+    userSessionRule.logon().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     service.activate(XOO_P1_KEY, new RuleActivation(RuleTesting.XOO_X1).setSeverity("BLOCKER"));
     service.activate(XOO_P2_KEY, new RuleActivation(RuleTesting.XOO_X1).setSeverity("BLOCKER"));
@@ -143,7 +144,7 @@ public class QProfileServiceMediumTest {
 
   @Test
   public void stat_for_all_profiles() {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN).setLogin("me");
+    userSessionRule.logon().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     service.activate(XOO_P1_KEY, new RuleActivation(RuleTesting.XOO_X1).setSeverity("MINOR"));
     service.activate(XOO_P2_KEY, new RuleActivation(RuleTesting.XOO_X1).setSeverity("BLOCKER"));
@@ -160,7 +161,7 @@ public class QProfileServiceMediumTest {
 
   @Test
   public void count_by_deprecated() {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN).setLogin("me");
+    userSessionRule.logon().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     // create deprecated rule
     RuleDto deprecatedXooRule = RuleTesting.newDto(RuleKey.of("xoo", "deprecated1"))
@@ -178,7 +179,7 @@ public class QProfileServiceMediumTest {
 
   @Test
   public void search_qprofile_activity() {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN).setLogin("david");
+    userSessionRule.logon("david").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     UserDto user = new UserDto().setLogin("david").setName("David").setEmail("dav@id.com").setCreatedAt(System.currentTimeMillis()).setUpdatedAt(System.currentTimeMillis());
     db.userDao().insert(dbSession, user);
@@ -211,7 +212,7 @@ public class QProfileServiceMediumTest {
 
   @Test
   public void search_qprofile_activity_without_severity() {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN).setLogin("me");
+    userSessionRule.logon().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     RuleKey ruleKey = RuleKey.of("xoo", "deleted_rule");
 
@@ -230,7 +231,7 @@ public class QProfileServiceMediumTest {
 
   @Test
   public void search_qprofile_activity_with_user_not_found() {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN).setLogin("david");
+    userSessionRule.logon("david").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     // We need an actual rule in DB to test RuleName in Activity
     db.ruleDao().getByKey(dbSession, RuleTesting.XOO_X1);
@@ -253,7 +254,7 @@ public class QProfileServiceMediumTest {
 
   @Test
   public void search_qprofile_activity_with_rule_not_found() {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN).setLogin("me");
+    userSessionRule.logon().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     RuleKey ruleKey = RuleKey.of("xoo", "deleted_rule");
 
@@ -309,7 +310,7 @@ public class QProfileServiceMediumTest {
 
   @Test
   public void set_default() {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN).setLogin("me");
+    userSessionRule.logon().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     assertThat(service.getDefault("xoo")).isNull();
 
index 853e5240325b9ad8644053726843aafc1a5a33c3..7fca985bdd330084aa84d42f0b74347fa60a6402 100644 (file)
 package org.sonar.server.qualityprofile;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.runners.MockitoJUnitRunner;
-import org.sonar.server.user.UserSession;
+import org.sonar.server.tester.UserSessionRule;
+import org.sonar.server.user.ThreadLocalUserSession;
 
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.eq;
@@ -33,6 +35,8 @@ import static org.mockito.Mockito.verify;
 
 @RunWith(MockitoJUnitRunner.class)
 public class QProfilesTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   @Mock
   QProfileProjectOperations projectOperations;
@@ -47,7 +51,7 @@ public class QProfilesTest {
 
   @Before
   public void setUp() {
-    qProfiles = new QProfiles(projectOperations, projectLookup, profileLookup);
+    qProfiles = new QProfiles(projectOperations, projectLookup, profileLookup, userSessionRule);
   }
 
   @Test
@@ -117,24 +121,24 @@ public class QProfilesTest {
   @Test
   public void add_project() {
     qProfiles.addProject("sonar-way-java", "ABCD");
-    verify(projectOperations).addProject(eq("sonar-way-java"), eq("ABCD"), any(UserSession.class));
+    verify(projectOperations).addProject(eq("sonar-way-java"), eq("ABCD"), any(ThreadLocalUserSession.class));
   }
 
   @Test
   public void remove_project_by_quality_profile_key() {
     qProfiles.removeProject("sonar-way-java", "ABCD");
-    verify(projectOperations).removeProject(eq("sonar-way-java"), eq("ABCD"), any(UserSession.class));
+    verify(projectOperations).removeProject(eq("sonar-way-java"), eq("ABCD"), any(ThreadLocalUserSession.class));
   }
 
   @Test
   public void remove_project_by_language() {
     qProfiles.removeProjectByLanguage("java", 10L);
-    verify(projectOperations).removeProject(eq("java"), eq(10L), any(UserSession.class));
+    verify(projectOperations).removeProject(eq("java"), eq(10L), any(ThreadLocalUserSession.class));
   }
 
   @Test
   public void remove_all_projects() {
     qProfiles.removeAllProjects("sonar-way-java");
-    verify(projectOperations).removeAllProjects(eq("sonar-way-java"), any(UserSession.class));
+    verify(projectOperations).removeAllProjects(eq("sonar-way-java"), any(ThreadLocalUserSession.class));
   }
 }
index b0c5ba6c34056a9618d0c51c9c07e6e9b13f082e..758b54fe8f3dfc2509ec52d6e14ad4b5cfdba628 100644 (file)
@@ -21,9 +21,15 @@ package org.sonar.server.qualityprofile;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import javax.annotation.Nullable;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rule.RuleStatus;
@@ -45,17 +51,13 @@ import org.sonar.server.rule.index.RuleIndex;
 import org.sonar.server.rule.index.RuleQuery;
 import org.sonar.server.search.QueryContext;
 import org.sonar.server.tester.ServerTester;
-
-import javax.annotation.Nullable;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.fail;
-import static org.sonar.server.qualityprofile.QProfileTesting.*;
+import static org.sonar.server.qualityprofile.QProfileTesting.XOO_P1_KEY;
+import static org.sonar.server.qualityprofile.QProfileTesting.XOO_P2_KEY;
+import static org.sonar.server.qualityprofile.QProfileTesting.XOO_P3_KEY;
 
 public class RuleActivatorMediumTest {
 
@@ -65,6 +67,8 @@ public class RuleActivatorMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbClient db;
   DbSession dbSession;
@@ -840,7 +844,7 @@ public class RuleActivatorMediumTest {
     // 0. No active rules so far (base case) and plenty rules available
     verifyZeroActiveRules(XOO_P1_KEY);
     assertThat(tester.get(RuleIndex.class)
-      .search(new RuleQuery().setRepositories(Arrays.asList("bulk")), new QueryContext()).getTotal())
+      .search(new RuleQuery().setRepositories(Arrays.asList("bulk")), new QueryContext(userSessionRule)).getTotal())
       .isEqualTo(bulkSize);
 
     // 1. bulk activate all the rules
index 7df4a80432442e59f1a90a53c053660805cb42c7..f5ceee8a51667d633cf9c41cbdd3a7ccc0453534 100644 (file)
  */
 package org.sonar.server.qualityprofile.ws;
 
+import java.util.List;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rule.RuleStatus;
@@ -37,11 +39,9 @@ import org.sonar.server.qualityprofile.QProfileName;
 import org.sonar.server.qualityprofile.QProfileTesting;
 import org.sonar.server.qualityprofile.RuleActivator;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
-import java.util.List;
-
 import static org.assertj.core.api.Assertions.assertThat;
 
 public class QProfileChangeParentActionMediumTest {
@@ -49,6 +49,8 @@ public class QProfileChangeParentActionMediumTest {
   // TODO Replace with DbTester + EsTester once DaoV2 is removed
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   QProfilesWs ws;
   DbClient db;
@@ -62,7 +64,7 @@ public class QProfileChangeParentActionMediumTest {
     ws = tester.get(QProfilesWs.class);
     wsTester = tester.get(WsTester.class);
     session = db.openSession(false);
-    MockUserSession.set().setLogin("gandalf").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("gandalf").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
   }
 
   @After
@@ -257,7 +259,7 @@ public class QProfileChangeParentActionMediumTest {
 
   @Test(expected = ForbiddenException.class)
   public void fail_if_missing_permission() throws Exception {
-    MockUserSession.set().setLogin("anakin");
+    userSessionRule.logon("anakin");
     wsTester.newGetRequest(QProfilesWs.API_ENDPOINT, "change_parent")
       .setParam(QProfileIdentificationParamUtils.PARAM_PROFILE_KEY, "polop")
       .setParam("parentKey", "pulup")
index 2dc5f9fe3b3d2507ff4138558c1311bc61df72d0..49447da26119c66201e4e39ab5594288cad822b4 100644 (file)
@@ -23,6 +23,7 @@ import org.apache.commons.lang.StringUtils;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rule.RuleStatus;
@@ -39,6 +40,7 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.qualityprofile.QProfileName;
 import org.sonar.server.qualityprofile.QProfileTesting;
 import org.sonar.server.tester.ServerTester;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 public class QProfileCompareActionMediumTest {
@@ -53,6 +55,8 @@ public class QProfileCompareActionMediumTest {
           .done();
       }
     });
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   private DbClient db;
 
index 47b508037681a62798ff7261afb3ef24dad2d1cf..3681fdc3b83ce65d5ef1d858957252ab4108f6aa 100644 (file)
@@ -20,6 +20,7 @@
 package org.sonar.server.qualityprofile.ws;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -29,7 +30,7 @@ import org.sonar.core.qualityprofile.db.QualityProfileDto;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.language.LanguageTesting;
 import org.sonar.server.qualityprofile.QProfileCopier;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static org.mockito.Mockito.mock;
@@ -39,6 +40,9 @@ import static org.mockito.Mockito.when;
 @RunWith(MockitoJUnitRunner.class)
 public class QProfileCopyActionTest {
 
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
+
   private WsTester tester;
 
   // TODO Replace with proper DbTester + EsTester medium test during removal of DaoV2
@@ -51,12 +55,12 @@ public class QProfileCopyActionTest {
       mock(RuleActivationActions.class),
       mock(BulkRuleActivationActions.class),
       mock(ProjectAssociationActions.class),
-      new QProfileCopyAction(qProfileCopier, LanguageTesting.newLanguages("xoo"))));
+      new QProfileCopyAction(qProfileCopier, LanguageTesting.newLanguages("xoo"), userSessionRule)));
   }
 
   @Test
   public void copy_nominal() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     String fromProfileKey = "xoo-sonar-way-23456";
     String toName = "Other Sonar Way";
@@ -76,7 +80,7 @@ public class QProfileCopyActionTest {
 
   @Test
   public void copy_with_parent() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     String fromProfileKey = "xoo-sonar-way-23456";
     String toName = "Other Sonar Way";
@@ -97,7 +101,7 @@ public class QProfileCopyActionTest {
 
   @Test(expected = IllegalArgumentException.class)
   public void fail_on_missing_key() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     tester.newPostRequest("api/qualityprofiles", "copy")
       .setParam("name", "Other Sonar Way")
@@ -106,7 +110,7 @@ public class QProfileCopyActionTest {
 
   @Test(expected = IllegalArgumentException.class)
   public void fail_on_missing_name() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     tester.newPostRequest("api/qualityprofiles", "copy")
       .setParam("key", "sonar-way-xoo1-13245")
@@ -115,7 +119,7 @@ public class QProfileCopyActionTest {
 
   @Test(expected = ForbiddenException.class)
   public void fail_on_missing_permission() throws Exception {
-    MockUserSession.set().setLogin("obiwan");
+    userSessionRule.logon("obiwan");
 
     tester.newPostRequest("api/qualityprofiles", "copy")
       .setParam("key", "sonar-way-xoo1-13245")
index 1c772b887e7591cf86aba41bc1cbb8f61b8a5ede..431a070b3c4c59e228a38ddba7a93072124d5568 100644 (file)
@@ -22,12 +22,13 @@ package org.sonar.server.qualityprofile.ws;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.BadRequestException;
-import org.sonar.server.qualityprofile.*;
+import org.sonar.server.qualityprofile.QProfileExporters;
 import org.sonar.server.qualityprofile.QProfileExportersTest.StandardExporter;
 import org.sonar.server.qualityprofile.QProfileExportersTest.XooExporter;
 import org.sonar.server.qualityprofile.QProfileExportersTest.XooProfileDefinition;
@@ -35,8 +36,9 @@ import org.sonar.server.qualityprofile.QProfileExportersTest.XooProfileImporter;
 import org.sonar.server.qualityprofile.QProfileExportersTest.XooProfileImporterWithError;
 import org.sonar.server.qualityprofile.QProfileExportersTest.XooProfileImporterWithMessages;
 import org.sonar.server.qualityprofile.QProfileExportersTest.XooRulesDefinition;
+import org.sonar.server.qualityprofile.QProfileLoader;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 public class QProfileCreateActionMediumTest {
@@ -47,6 +49,8 @@ public class QProfileCreateActionMediumTest {
     XooRulesDefinition.class, XooProfileDefinition.class,
     XooExporter.class, StandardExporter.class,
     XooProfileImporter.class, XooProfileImporterWithMessages.class, XooProfileImporterWithError.class);
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbClient db;
   DbSession dbSession;
@@ -70,7 +74,7 @@ public class QProfileCreateActionMediumTest {
 
   @Test
   public void create_nominal() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     wsTester.newPostRequest("api/qualityprofiles", "create")
       .setParam("backup_XooProfileImporter", "a value for xoo importer")
@@ -81,7 +85,7 @@ public class QProfileCreateActionMediumTest {
 
   @Test
   public void create_with_messages() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     wsTester.newPostRequest("api/qualityprofiles", "create")
       .setParam("backup_XooProfileImporter", "a value for xoo importer")
@@ -93,7 +97,7 @@ public class QProfileCreateActionMediumTest {
 
   @Test(expected = BadRequestException.class)
   public void fail_on_error_from_importer() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     wsTester.newPostRequest("api/qualityprofiles", "create")
       .setParam("backup_XooProfileImporter", "a value for xoo importer")
index 8a4245850bb85743b085b4592109d63431280f3b..1f785995342a67fec78ec70a92ae67cb0f400fd9 100644 (file)
@@ -20,6 +20,7 @@
 package org.sonar.server.qualityprofile.ws;
 
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.server.ws.WebService.Action;
 import org.sonar.api.utils.System2;
@@ -29,7 +30,7 @@ import org.sonar.core.qualityprofile.db.QualityProfileDao;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.language.LanguageTesting;
 import org.sonar.server.qualityprofile.QProfileFactory;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -39,6 +40,8 @@ public class QProfileCreateActionTest {
 
   @ClassRule
   public static final DbTester db = new DbTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   @Test
   public void should_not_fail_on_no_importers() throws Exception {
@@ -48,12 +51,12 @@ public class QProfileCreateActionTest {
     String xooKey = "xoo";
     WsTester wsTester = new WsTester(new QProfilesWs(
       mock(RuleActivationActions.class), mock(BulkRuleActivationActions.class), mock(ProjectAssociationActions.class),
-      new QProfileCreateAction(dbClient, new QProfileFactory(dbClient), null, LanguageTesting.newLanguages(xooKey))));
+      new QProfileCreateAction(dbClient, new QProfileFactory(dbClient), null, LanguageTesting.newLanguages(xooKey), userSessionRule)));
 
     Action create = wsTester.controller("api/qualityprofiles").action("create");
     assertThat(create.params()).hasSize(2);
 
-    MockUserSession.set().setLogin("anakin").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("anakin").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     wsTester.newPostRequest("api/qualityprofiles", "create")
       .setParam("language", xooKey).setParam("name", "Yeehaw!").execute().assertJson(getClass(), "create-no-importer.json");
index 17fc490bd18135cdffbac60261ce948c55dc6858..7ba826b07ab7f9cc20ade13c596d62b586394849 100644 (file)
@@ -22,6 +22,7 @@ package org.sonar.server.qualityprofile.ws;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.resources.Language;
 import org.sonar.api.resources.Languages;
@@ -41,7 +42,7 @@ import org.sonar.server.language.LanguageTesting;
 import org.sonar.server.qualityprofile.QProfileFactory;
 import org.sonar.server.qualityprofile.db.ActiveRuleDao;
 import org.sonar.server.rule.db.RuleDao;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -51,6 +52,8 @@ public class QProfileDeleteActionTest {
 
   @ClassRule
   public static DbTester dbTester = new DbTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   private DbClient dbClient;
 
@@ -80,7 +83,7 @@ public class QProfileDeleteActionTest {
       mock(RuleActivationActions.class),
       mock(BulkRuleActivationActions.class),
       mock(ProjectAssociationActions.class),
-      new QProfileDeleteAction(new Languages(xoo1, xoo2), new QProfileFactory(dbClient), dbClient)));
+      new QProfileDeleteAction(new Languages(xoo1, xoo2), new QProfileFactory(dbClient), dbClient, userSessionRule)));
   }
 
   @After
@@ -98,7 +101,7 @@ public class QProfileDeleteActionTest {
     qualityProfileDao.insertProjectProfileAssociation(project.uuid(), profileKey, session);
     session.commit();
 
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     tester.newPostRequest("api/qualityprofiles", "delete").setParam("profileKey", "sonar-way-xoo1-12345").execute().assertNoContent();
 
@@ -116,7 +119,7 @@ public class QProfileDeleteActionTest {
     qualityProfileDao.insertProjectProfileAssociation(project.uuid(), profileKey, session);
     session.commit();
 
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     tester.newPostRequest("api/qualityprofiles", "delete").setParam("profileName", "Sonar way").setParam("language", xoo1.getKey()).execute().assertNoContent();
 
@@ -126,37 +129,37 @@ public class QProfileDeleteActionTest {
 
   @Test(expected = ForbiddenException.class)
   public void fail_on_missing_permission() throws Exception {
-    MockUserSession.set().setLogin("obiwan");
+    userSessionRule.logon("obiwan");
     tester.newPostRequest("api/qualityprofiles", "delete").execute();
   }
 
   @Test(expected = IllegalArgumentException.class)
   public void fail_on_missing_arguments() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
     tester.newPostRequest("api/qualityprofiles", "delete").execute();
   }
 
   @Test(expected = IllegalArgumentException.class)
   public void fail_on_missing_language() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
     tester.newPostRequest("api/qualityprofiles", "delete").setParam("profileName", "Polop").execute();
   }
 
   @Test(expected = IllegalArgumentException.class)
   public void fail_on_missing_name() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
     tester.newPostRequest("api/qualityprofiles", "delete").setParam("language", xoo1.getKey()).execute();
   }
 
   @Test(expected = IllegalArgumentException.class)
   public void fail_on_too_many_arguments() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
     tester.newPostRequest("api/qualityprofiles", "delete").setParam("profileName", "Polop").setParam("language", xoo1.getKey()).setParam("profileKey", "polop").execute();
   }
 
   @Test(expected = NotFoundException.class)
   public void fail_on_unexisting_profile() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
     tester.newPostRequest("api/qualityprofiles", "delete").setParam("profileName", "Polop").setParam("language", xoo1.getKey()).execute();
   }
 }
index 974f4d8aa1851825fb6d205731adc9bf05027e11..d145d0f74213c30433f12746558986f5fcee474d 100644 (file)
@@ -24,6 +24,7 @@ import org.apache.commons.lang.StringUtils;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.mockito.Matchers;
 import org.mockito.invocation.InvocationOnMock;
@@ -42,6 +43,7 @@ import org.sonar.server.language.LanguageTesting;
 import org.sonar.server.qualityprofile.*;
 import org.sonar.server.qualityprofile.index.ActiveRuleIndex;
 import org.sonar.server.search.IndexClient;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 import org.sonar.server.ws.WsTester.Result;
 
@@ -57,6 +59,8 @@ public class QProfileExportActionTest {
 
   @ClassRule
   public static final DbTester db = new DbTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   WsTester wsTester;
 
@@ -87,7 +91,7 @@ public class QProfileExportActionTest {
     when(activeRuleIndex.findByProfile(Matchers.anyString())).thenReturn(Sets.<ActiveRule>newHashSet().iterator());
 
     when(indexClient.get(ActiveRuleIndex.class)).thenReturn(activeRuleIndex);
-    exporters = new QProfileExporters(new QProfileLoader(dbClient, indexClient), null, null, new ProfileExporter[] {exporter1, exporter2}, null);
+    exporters = new QProfileExporters(new QProfileLoader(dbClient, indexClient, userSessionRule), null, null, new ProfileExporter[] {exporter1, exporter2}, null);
     wsTester = new WsTester(new QProfilesWs(mock(RuleActivationActions.class),
       mock(BulkRuleActivationActions.class),
       mock(ProjectAssociationActions.class),
index 44fbc09dd1df16763451a34cca3bef88197a6dfd..58dcf278b0b820f1c57acba2a4a809600cd49de7 100644 (file)
@@ -22,6 +22,7 @@ package org.sonar.server.qualityprofile.ws;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rule.RuleStatus;
@@ -37,12 +38,15 @@ import org.sonar.server.qualityprofile.QProfileTesting;
 import org.sonar.server.qualityprofile.RuleActivation;
 import org.sonar.server.qualityprofile.RuleActivator;
 import org.sonar.server.tester.ServerTester;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 public class QProfileInheritanceActionMediumTest {
 
   @ClassRule
   public static final ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   private WsTester wsTester;
 
index 06e5285064ab8e551c1a8757b7f255bb57f2eac6..29cb83fcfe27b6a129fbd5f2a833dd06d0392a80 100644 (file)
@@ -22,6 +22,7 @@ package org.sonar.server.qualityprofile.ws;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 import org.sonar.api.utils.System2;
@@ -37,7 +38,7 @@ import org.sonar.server.component.db.ComponentDao;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.qualityprofile.QProfileTesting;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.user.db.UserDao;
 import org.sonar.server.ws.WsTester;
 import org.sonar.server.ws.WsTester.TestRequest;
@@ -50,6 +51,8 @@ public class QProfileProjectsActionTest {
 
   @ClassRule
   public static final DbTester dbTester = new DbTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   private WsTester wsTester;
 
@@ -79,9 +82,9 @@ public class QProfileProjectsActionTest {
       mock(RuleActivationActions.class),
       mock(BulkRuleActivationActions.class),
       mock(ProjectAssociationActions.class),
-      new QProfileProjectsAction(dbClient)));
+      new QProfileProjectsAction(dbClient, userSessionRule)));
 
-    MockUserSession.set().setLogin("obiwan").setUserId(userId.intValue());
+    userSessionRule.logon("obiwan").setUserId(userId.intValue());
     new UserDao(dbTester.myBatis(), mock(System2.class))
       .insert(session, new UserDto()
         .setActive(true)
index c5c7a994b61501fa05a052f0d9316fb11e42fc62..0374142ccef1b722b0065f83563763801855a5c7 100644 (file)
@@ -22,6 +22,7 @@ package org.sonar.server.qualityprofile.ws;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.utils.System2;
 import org.sonar.core.permission.GlobalPermissions;
@@ -33,7 +34,7 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.qualityprofile.QProfileFactory;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -43,6 +44,8 @@ public class QProfileRenameActionTest {
 
   @ClassRule
   public static DbTester dbTester = new DbTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   private DbClient dbClient;
 
@@ -68,7 +71,7 @@ public class QProfileRenameActionTest {
       mock(RuleActivationActions.class),
       mock(BulkRuleActivationActions.class),
       mock(ProjectAssociationActions.class),
-      new QProfileRenameAction(new QProfileFactory(dbClient))));
+      new QProfileRenameAction(new QProfileFactory(dbClient), userSessionRule)));
   }
 
   @After
@@ -78,7 +81,7 @@ public class QProfileRenameActionTest {
 
   @Test
   public void rename_nominal() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     tester.newPostRequest("api/qualityprofiles", "rename")
       .setParam("key", "sonar-way-xoo2-23456")
@@ -90,7 +93,7 @@ public class QProfileRenameActionTest {
 
   @Test(expected = BadRequestException.class)
   public void do_nothing_on_conflict() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     tester.newPostRequest("api/qualityprofiles", "rename")
       .setParam("key", "sonar-way-xoo2-23456")
@@ -100,7 +103,7 @@ public class QProfileRenameActionTest {
 
   @Test(expected = IllegalArgumentException.class)
   public void fail_on_missing_key() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     tester.newPostRequest("api/qualityprofiles", "rename")
       .setParam("name", "Other Sonar Way")
@@ -109,7 +112,7 @@ public class QProfileRenameActionTest {
 
   @Test(expected = IllegalArgumentException.class)
   public void fail_on_missing_name() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     tester.newPostRequest("api/qualityprofiles", "rename")
       .setParam("key", "sonar-way-xoo1-13245")
@@ -118,7 +121,7 @@ public class QProfileRenameActionTest {
 
   @Test(expected = ForbiddenException.class)
   public void fail_on_missing_permission() throws Exception {
-    MockUserSession.set().setLogin("obiwan");
+    userSessionRule.logon("obiwan");
 
     tester.newPostRequest("api/qualityprofiles", "rename")
       .setParam("key", "sonar-way-xoo1-13245")
@@ -128,7 +131,7 @@ public class QProfileRenameActionTest {
 
   @Test(expected = IllegalArgumentException.class)
   public void fail_on_unknown_profile() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     tester.newPostRequest("api/qualityprofiles", "rename")
       .setParam("key", "polop")
index cbf140bffa7ab7ec578ca90d19d16dede3f13c10..70bb0eaf12a373118475d562ed1079455c190f67 100644 (file)
@@ -19,7 +19,9 @@
  */
 package org.sonar.server.qualityprofile.ws;
 
+import java.io.Reader;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -31,11 +33,9 @@ import org.sonar.server.language.LanguageTesting;
 import org.sonar.server.qualityprofile.BulkChangeResult;
 import org.sonar.server.qualityprofile.QProfileBackuper;
 import org.sonar.server.qualityprofile.QProfileName;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
-import java.io.Reader;
-
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
@@ -44,6 +44,8 @@ import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class QProfileRestoreActionTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   // TODO Replace with proper DbTester + EsTester medium test once DaoV2 is removed
   @Mock
@@ -57,12 +59,12 @@ public class QProfileRestoreActionTest {
       mock(RuleActivationActions.class),
       mock(BulkRuleActivationActions.class),
       mock(ProjectAssociationActions.class),
-      new QProfileRestoreAction(backuper, LanguageTesting.newLanguages("xoo"))));
+      new QProfileRestoreAction(backuper, LanguageTesting.newLanguages("xoo"), userSessionRule)));
   }
 
   @Test
   public void restore_profile() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     QualityProfileDto profile = QualityProfileDto.createFor("xoo-sonar-way-12345")
       .setDefault(false).setLanguage("xoo").setName("Sonar way");
@@ -76,14 +78,14 @@ public class QProfileRestoreActionTest {
 
   @Test(expected = IllegalArgumentException.class)
   public void fail_on_missing_backup() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     tester.newGetRequest("api/qualityprofiles", "restore").execute();
   }
 
   @Test(expected = ForbiddenException.class)
   public void fail_on_misssing_permission() throws Exception {
-    MockUserSession.set().setLogin("obiwan");
+    userSessionRule.logon("obiwan");
 
     tester.newPostRequest("api/qualityprofiles", "restore").setParam("backup", "<polop><palap/></polop>").execute();
   }
index 136e83fc0bb84374ebdd2f9a7816a8c61960192e..a01c788be43b2f42e7e36a03984afe3d44021d98 100644 (file)
@@ -23,6 +23,7 @@ import org.assertj.core.api.Fail;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.utils.System2;
 import org.sonar.core.permission.GlobalPermissions;
@@ -36,7 +37,7 @@ import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.language.LanguageTesting;
 import org.sonar.server.qualityprofile.QProfileFactory;
 import org.sonar.server.qualityprofile.QProfileLookup;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -46,6 +47,8 @@ public class QProfileSetDefaultActionTest {
 
   @ClassRule
   public static DbTester dbTester = new DbTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   private DbClient dbClient;
 
@@ -71,7 +74,7 @@ public class QProfileSetDefaultActionTest {
       mock(RuleActivationActions.class),
       mock(BulkRuleActivationActions.class),
       mock(ProjectAssociationActions.class),
-      new QProfileSetDefaultAction(LanguageTesting.newLanguages(xoo1Key, xoo2Key), new QProfileLookup(dbClient), new QProfileFactory(dbClient))));
+      new QProfileSetDefaultAction(LanguageTesting.newLanguages(xoo1Key, xoo2Key), new QProfileLookup(dbClient), new QProfileFactory(dbClient), userSessionRule)));
   }
 
   @After
@@ -81,7 +84,7 @@ public class QProfileSetDefaultActionTest {
 
   @Test
   public void set_default_profile_using_key() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
 
     checkDefaultProfile(xoo1Key, "sonar-way-xoo1-12345");
@@ -102,7 +105,7 @@ public class QProfileSetDefaultActionTest {
 
   @Test
   public void set_default_profile_using_language_and_name() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     tester.newPostRequest("api/qualityprofiles", "set_default").setParam("language", xoo2Key).setParam("profileName", "Sonar way").execute().assertNoContent();
 
@@ -112,7 +115,7 @@ public class QProfileSetDefaultActionTest {
 
   @Test
   public void fail_to_set_default_profile_using_key() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     try {
       tester.newPostRequest("api/qualityprofiles", "set_default").setParam("profileKey", "unknown-profile-666").execute();
@@ -127,7 +130,7 @@ public class QProfileSetDefaultActionTest {
 
   @Test
   public void fail_to_set_default_profile_using_language_and_name() throws Exception {
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     try {
       tester.newPostRequest("api/qualityprofiles", "set_default").setParam("language", xoo2Key).setParam("profileName", "Unknown").execute();
@@ -141,7 +144,7 @@ public class QProfileSetDefaultActionTest {
 
   @Test
   public void fail_on_missing_permission() throws Exception {
-    MockUserSession.set().setLogin("obiwan");
+    userSessionRule.logon("obiwan");
 
     try {
       tester.newPostRequest("api/qualityprofiles", "set_default").setParam("profileKey", "sonar-way-xoo2-23456").execute().assertNoContent();
index b2de87d9bdaae15c32f11e682d4bb8bb65e9ea90..fce5c1e8d373d6da9e8be3187357eaa11fd9591e 100644 (file)
@@ -23,6 +23,7 @@ import com.google.common.collect.ImmutableSet;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rule.RuleStatus;
@@ -47,7 +48,7 @@ import org.sonar.server.rule.ws.SearchAction;
 import org.sonar.server.search.QueryContext;
 import org.sonar.server.search.ws.SearchOptions;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -57,6 +58,9 @@ public class QProfilesWsMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester)
+      .logon("gandalf").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
   QProfilesWs ws;
   DbClient db;
@@ -70,8 +74,6 @@ public class QProfilesWsMediumTest {
     ws = tester.get(QProfilesWs.class);
     wsTester = tester.get(WsTester.class);
     session = db.openSession(false);
-    MockUserSession.set().setLogin("gandalf").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
-
   }
 
   @After
@@ -335,7 +337,7 @@ public class QProfilesWsMediumTest {
     // 2. Assert ActiveRule with BLOCKER severity
     assertThat(tester.get(RuleIndex.class).search(
       new RuleQuery().setSeverities(ImmutableSet.of("BLOCKER")),
-      new QueryContext()).getHits()).hasSize(2);
+      new QueryContext(userSessionRule)).getHits()).hasSize(2);
 
     // 1. Activate Rule with query returning 2 hits
     WsTester.TestRequest request = wsTester.newGetRequest(QProfilesWs.API_ENDPOINT, BulkRuleActivationActions.BULK_ACTIVATE_ACTION);
index 130b3caab9ad2eaa079d36fd88f4624c8116f729..7f6dc975e6db0b444415aeac917f3eacab05262c 100644 (file)
@@ -20,7 +20,9 @@
 
 package org.sonar.server.qualityprofile.ws;
 
+import java.io.Reader;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.i18n.I18n;
 import org.sonar.api.profiles.ProfileImporter;
@@ -33,14 +35,15 @@ import org.sonar.server.language.LanguageTesting;
 import org.sonar.server.qualityprofile.QProfileExporters;
 import org.sonar.server.qualityprofile.QProfileService;
 import org.sonar.server.rule.RuleService;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
-import java.io.Reader;
-
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 public class QProfilesWsTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   WebService.Controller controller;
 
@@ -58,25 +61,25 @@ public class QProfilesWsTest {
 
     controller = new WsTester(new QProfilesWs(
       new RuleActivationActions(profileService),
-      new BulkRuleActivationActions(profileService, ruleService, i18n),
-      new ProjectAssociationActions(null, null, null, languages),
-      new QProfileCreateAction(null, null, null, languages, importers),
+      new BulkRuleActivationActions(profileService, ruleService, i18n, userSessionRule),
+      new ProjectAssociationActions(null, null, null, languages, userSessionRule),
+      new QProfileCreateAction(null, null, null, languages, importers, userSessionRule),
       new QProfileImportersAction(importers),
       new QProfileRestoreBuiltInAction(null),
       new QProfileSearchAction(languages, null, null, null),
-      new QProfileSetDefaultAction(languages, null, null),
-      new QProfileProjectsAction(null),
+      new QProfileSetDefaultAction(languages, null, null, userSessionRule),
+      new QProfileProjectsAction(null, userSessionRule),
       new QProfileBackupAction(null, null, null, languages),
-      new QProfileRestoreAction(null, languages),
+      new QProfileRestoreAction(null, languages, userSessionRule),
       new QProfileChangelogAction(null, null, null, languages),
-      new QProfileChangeParentAction(null, null, null, languages),
+      new QProfileChangeParentAction(null, null, null, languages, userSessionRule),
       new QProfileCompareAction(null, null, null, languages),
-      new QProfileCopyAction(null, languages),
-      new QProfileDeleteAction(languages, null, null),
+      new QProfileCopyAction(null, languages, userSessionRule),
+      new QProfileDeleteAction(languages, null, null, userSessionRule),
       new QProfileExportAction(null, null, null, mock(QProfileExporters.class), languages),
       new QProfileExportersAction(),
       new QProfileInheritanceAction(null, null, null, null, languages),
-      new QProfileRenameAction(null)
+      new QProfileRenameAction(null, userSessionRule)
     )).controller(QProfilesWs.API_ENDPOINT);
   }
 
index cf2e19f64f01c5c61c9e659e19bc429209d9e3e7..ff3138efd8b1f089b3d42d8c70c52def7520a32c 100644 (file)
@@ -31,6 +31,7 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.tester.ServerTester;
 
 import java.util.Collections;
+import org.sonar.server.tester.UserSessionRule;
 
 import static com.google.common.collect.Lists.newArrayList;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -40,6 +41,8 @@ public class DefaultRuleFinderMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @org.junit.Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   private DbClient dbClient;
   private DefaultRuleFinder finder;
index 778bb4bb11694bbbe49114a9654257a8a1807f0b..9b45602d1dd737c69defcbdee66a8ceb452b0330 100644 (file)
 package org.sonar.server.rule;
 
 import com.google.common.collect.ImmutableMap;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import javax.annotation.Nullable;
 import org.apache.commons.lang.time.DateUtils;
 import org.junit.After;
 import org.junit.Before;
@@ -50,14 +54,7 @@ import org.sonar.server.rule.index.RuleQuery;
 import org.sonar.server.search.QueryContext;
 import org.sonar.server.search.Result;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
-import org.sonar.server.user.UserSession;
-
-import javax.annotation.Nullable;
-
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import org.sonar.server.tester.UserSessionRule;
 
 import static com.google.common.collect.Sets.newHashSet;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -69,6 +66,8 @@ public class RegisterRulesMediumTest {
 
   @ClassRule
   public static final ServerTester TESTER = new ServerTester().addXoo().addComponents(RULE_DEFS);
+  @org.junit.Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(TESTER);
 
   RuleIndex ruleIndex;
   ActiveRuleIndex activeRuleIndex;
@@ -135,7 +134,7 @@ public class RegisterRulesMediumTest {
     assertThat(ruleParams).hasSize(2);
 
     // verify es
-    Result<Rule> searchResult = ruleIndex.search(new RuleQuery(), new QueryContext());
+    Result<Rule> searchResult = ruleIndex.search(new RuleQuery(), new QueryContext(userSessionRule));
     assertThat(searchResult.getTotal()).isEqualTo(1);
     assertThat(searchResult.getHits()).hasSize(1);
     Rule rule = ruleIndex.getByKey(RuleKey.of("xoo", "x1"));
@@ -182,8 +181,8 @@ public class RegisterRulesMediumTest {
     register(rules);
 
     // verify that rules are indexed
-    Result<Rule> searchResult = ruleIndex.search(new RuleQuery(), new QueryContext());
-    searchResult = ruleIndex.search(new RuleQuery().setKey("xoo:x1"), new QueryContext());
+    Result<Rule> searchResult = ruleIndex.search(new RuleQuery(), new QueryContext(userSessionRule));
+    searchResult = ruleIndex.search(new RuleQuery().setKey("xoo:x1"), new QueryContext(userSessionRule));
     assertThat(searchResult.getTotal()).isEqualTo(1);
     assertThat(searchResult.getHits()).hasSize(1);
     assertThat(searchResult.getHits().get(0).key()).isEqualTo(RuleKey.of("xoo", "x1"));
@@ -358,7 +357,7 @@ public class RegisterRulesMediumTest {
     });
 
     // Create a profile and activate rule
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN).setLogin("me");
+    userSessionRule.logon().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
     db.qualityProfileDao().insert(dbSession, QProfileTesting.newXooP1());
     dbSession.commit();
     dbSession.clearCache();
@@ -388,7 +387,7 @@ public class RegisterRulesMediumTest {
     register(rules);
 
     // create a profile and activate rule
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN).setLogin("me");
+    userSessionRule.logon().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
     db.qualityProfileDao().insert(dbSession, QProfileTesting.newXooP1());
     dbSession.commit();
     dbSession.clearCache();
@@ -420,7 +419,7 @@ public class RegisterRulesMediumTest {
     });
 
     // Create profile and activate rule
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN).setLogin("me");
+    userSessionRule.logon().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
     db.qualityProfileDao().insert(dbSession, QProfileTesting.newXooP1());
     dbSession.commit();
     dbSession.clearCache();
@@ -463,7 +462,7 @@ public class RegisterRulesMediumTest {
     assertThat(rule.tags()).isEmpty();
 
     // User adds tag
-    TESTER.get(RuleUpdater.class).update(RuleUpdate.createForPluginRule(RuleTesting.XOO_X1).setTags(newHashSet("tag2")), UserSession.get());
+    TESTER.get(RuleUpdater.class).update(RuleUpdate.createForPluginRule(RuleTesting.XOO_X1).setTags(newHashSet("tag2")), userSessionRule);
     dbSession.clearCache();
     rule = ruleIndex.getByKey(RuleTesting.XOO_X1);
     assertThat(rule.systemTags()).containsOnly("tag1");
index 3a6a06873a940b7b272411d924306ae6a7b58561..7ffc74e00b9a36026e3cb1f37dcc255d3c722f20 100644 (file)
@@ -21,6 +21,8 @@
 package org.sonar.server.rule;
 
 import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -34,19 +36,23 @@ import org.sonar.server.paging.PagedResult;
 import org.sonar.server.rule.index.RuleQuery;
 import org.sonar.server.search.QueryContext;
 import org.sonar.server.search.Result;
-import org.sonar.server.user.UserSession;
-
-import java.util.HashMap;
-import java.util.List;
+import org.sonar.server.tester.UserSessionRule;
+import org.sonar.server.user.ThreadLocalUserSession;
 
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Maps.newHashMap;
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.*;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class RubyRuleServiceTest {
 
+  @org.junit.Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
+
   @Mock
   RuleService ruleService;
 
@@ -63,7 +69,7 @@ public class RubyRuleServiceTest {
 
   @Before
   public void setUp() {
-    service = new RubyRuleService(ruleService, updater);
+    service = new RubyRuleService(ruleService, updater, userSessionRule);
   }
 
   @Test
@@ -161,7 +167,7 @@ public class RubyRuleServiceTest {
 
     service.updateRule(ImmutableMap.<String, Object>of("ruleKey", "squid:S001"));
 
-    verify(updater).update(any(RuleUpdate.class), any(UserSession.class));
+    verify(updater).update(any(RuleUpdate.class), any(ThreadLocalUserSession.class));
   }
 
   @Test
index f24f72374020d7bdbe85bc5ac134e94eebbbba97..d97afc80ab096a72531199f2309a91d1789c63e5 100644 (file)
@@ -43,6 +43,7 @@ import org.sonar.server.tester.ServerTester;
 
 import java.util.Collection;
 import java.util.List;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -53,6 +54,8 @@ public class RuleBackendMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @org.junit.Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   RuleDao dao = tester.get(RuleDao.class);
   RuleIndex index = tester.get(RuleIndex.class);
@@ -432,7 +435,7 @@ public class RuleBackendMediumTest {
     assertThat(index.getByKey(RuleTesting.XOO_X2)).isNotNull();
 
     // 2. assert find does not get REMOVED
-    List<Rule> rules = index.search(new RuleQuery(), new QueryContext()).getHits();
+    List<Rule> rules = index.search(new RuleQuery(), new QueryContext(userSessionRule)).getHits();
     assertThat(rules).hasSize(1);
     assertThat(rules.get(0).key()).isEqualTo(RuleTesting.XOO_X1);
   }
index 2a9900c0854ce603dac6fca585e79ae7328d158a..5ffaae8e5e28e9298b7f9cbd94cd8b91afda6f53 100644 (file)
@@ -43,6 +43,7 @@ import org.sonar.server.search.BaseIndex;
 import org.sonar.server.tester.ServerTester;
 
 import java.util.List;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.fail;
@@ -51,6 +52,8 @@ public class RuleCreatorMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @org.junit.Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbSession dbSession;
   DbClient db = tester.get(DbClient.class);
index 9ff5e40059af315f2ca7a690ed9356ac82f5a6e7..5f6d53b03ed9b2ab036fe761518c78f6b31eb221 100644 (file)
@@ -43,6 +43,7 @@ import org.sonar.server.search.BaseIndex;
 import org.sonar.server.tester.ServerTester;
 
 import java.util.List;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -50,6 +51,8 @@ public class RuleDeleterMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @org.junit.Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbClient db = tester.get(DbClient.class);
   RuleDao dao = tester.get(RuleDao.class);
index b471f488f63d9610d5665ad23363689456b72f78..91dba0e04f42d8fe668db0babc382aaf016d4981 100644 (file)
@@ -38,15 +38,18 @@ import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.rule.RuleOperations.RuleChange;
 import org.sonar.server.rule.db.RuleDao;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.MockUserSession;
 import org.sonar.server.user.UserSession;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.*;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class RuleOperationsTest {
-
   @Mock
   DbClient dbClient;
 
@@ -62,7 +65,7 @@ public class RuleOperationsTest {
   @Captor
   ArgumentCaptor<RuleDto> ruleCaptor;
 
-  UserSession authorizedUserSession = MockUserSession.create().setLogin("nicolas").setName("Nicolas").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+  UserSession authorizedUserSession = new MockUserSession("nicolas").setName("Nicolas").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
   RuleOperations operations;
 
index d9a9268f8db6c2bc895a62ee84950022da8bb063..320f6ec9ebae3217b7d65211a2bbe197bcc73a90 100644 (file)
@@ -21,6 +21,8 @@ package org.sonar.server.rule;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Sets;
+import java.util.Collections;
+import java.util.Set;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
@@ -38,10 +40,7 @@ import org.sonar.server.rule.db.RuleDao;
 import org.sonar.server.rule.index.RuleIndex;
 import org.sonar.server.rule.index.RuleNormalizer;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
-
-import java.util.Collections;
-import java.util.Set;
+import org.sonar.server.tester.UserSessionRule;
 
 import static com.google.common.collect.Lists.newArrayList;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -51,6 +50,8 @@ public class RuleServiceMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @org.junit.Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   RuleDao dao = tester.get(RuleDao.class);
   RuleIndex index = tester.get(RuleIndex.class);
@@ -70,9 +71,7 @@ public class RuleServiceMediumTest {
 
   @Test
   public void get_rule_by_key() {
-    MockUserSession.set()
-      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN)
-      .setLogin("me");
+    userSessionRule.logon().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     RuleKey key = RuleKey.of("java", "S001");
 
@@ -88,9 +87,7 @@ public class RuleServiceMediumTest {
 
   @Test
   public void get_non_null_rule_by_key() {
-    MockUserSession.set()
-      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN)
-      .setLogin("me");
+    userSessionRule.logon().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     RuleKey key = RuleKey.of("java", "S001");
 
@@ -109,9 +106,7 @@ public class RuleServiceMediumTest {
 
   @Test
   public void get_rule_by_key_escape_description_on_manual_rule() {
-    MockUserSession.set()
-      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN)
-      .setLogin("me");
+    userSessionRule.logon().logon().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     RuleDto manualRule = RuleTesting.newManualRule("My manual")
       .setDescription("<div>Manual rule desc</div>");
@@ -126,9 +121,7 @@ public class RuleServiceMediumTest {
 
   @Test
   public void get_rule_by_keys() {
-    MockUserSession.set()
-      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN)
-      .setLogin("me");
+    userSessionRule.setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     dao.insert(dbSession, RuleTesting.newDto(RuleKey.of("java", "S001")));
     dbSession.commit();
@@ -164,9 +157,7 @@ public class RuleServiceMediumTest {
 
   @Test
   public void update_rule() {
-    MockUserSession.set()
-      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN)
-      .setLogin("me");
+    userSessionRule.logon("me").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     RuleKey key = RuleKey.of("java", "S001");
 
@@ -186,7 +177,7 @@ public class RuleServiceMediumTest {
 
   @Test(expected = UnauthorizedException.class)
   public void do_not_update_if_not_granted() {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
 
     RuleKey key = RuleKey.of("java", "S001");
 
@@ -201,9 +192,7 @@ public class RuleServiceMediumTest {
 
   @Test
   public void create_rule() {
-    MockUserSession.set()
-      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN)
-      .setLogin("me");
+    userSessionRule.logon().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     // Create template rule
     RuleKey templateRuleKey = RuleKey.of("java", "S001");
@@ -227,16 +216,14 @@ public class RuleServiceMediumTest {
 
   @Test(expected = UnauthorizedException.class)
   public void do_not_create_if_not_granted() {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+    userSessionRule.setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
 
     service.create(NewRule.createForCustomRule("MY_CUSTOM", RuleKey.of("java", "S001")));
   }
 
   @Test
   public void delete_rule() {
-    MockUserSession.set()
-      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN)
-      .setLogin("me");
+    userSessionRule.logon().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     // Create template rule
     RuleKey templateRuleKey = RuleKey.of("java", "S001");
@@ -257,8 +244,8 @@ public class RuleServiceMediumTest {
   }
 
   @Test(expected = UnauthorizedException.class)
-  public void do_not_delete_if_not_granted() {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+  public void do_not_delete_if_not_granted() throws Exception {
+    userSessionRule.setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
 
     service.delete(RuleKey.of("java", "S001"));
   }
index 7b01cfe2510e3ff6f00441b6420a0d1270f5d774..78f192c8bed408897526aa6095f5805174e5f754 100644 (file)
  */
 package org.sonar.server.rule;
 
-import org.sonar.server.search.BaseIndex;
-
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
+import java.util.Set;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
@@ -48,11 +47,9 @@ import org.sonar.server.qualityprofile.RuleActivator;
 import org.sonar.server.qualityprofile.index.ActiveRuleIndex;
 import org.sonar.server.rule.db.RuleDao;
 import org.sonar.server.rule.index.RuleIndex;
+import org.sonar.server.search.BaseIndex;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
-import org.sonar.server.user.UserSession;
-
-import java.util.Set;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.fail;
@@ -63,6 +60,8 @@ public class RuleUpdaterMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @org.junit.Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbClient db = tester.get(DbClient.class);
   RuleDao ruleDao = tester.get(RuleDao.class);
@@ -89,7 +88,7 @@ public class RuleUpdaterMediumTest {
 
     RuleUpdate update = RuleUpdate.createForPluginRule(RULE_KEY).setTags(Sets.newHashSet("java9"));
     try {
-      updater.update(update, UserSession.get());
+      updater.update(update, userSessionRule);
       fail();
     } catch (IllegalArgumentException e) {
       assertThat(e).hasMessage("Rule with REMOVED status cannot be updated: squid:S001");
@@ -111,7 +110,7 @@ public class RuleUpdaterMediumTest {
 
     RuleUpdate update = RuleUpdate.createForPluginRule(RULE_KEY);
     assertThat(update.isEmpty()).isTrue();
-    updater.update(update, UserSession.get());
+    updater.update(update, userSessionRule);
 
     dbSession.clearCache();
     RuleDto rule = ruleDao.getNullableByKey(dbSession, RULE_KEY);
@@ -126,7 +125,7 @@ public class RuleUpdaterMediumTest {
 
   @Test
   public void set_markdown_note() {
-    MockUserSession.set().setLogin("me");
+    userSessionRule.logon("me");
 
     ruleDao.insert(dbSession, RuleTesting.newDto(RULE_KEY)
       .setNoteData(null)
@@ -142,7 +141,7 @@ public class RuleUpdaterMediumTest {
 
     RuleUpdate update = RuleUpdate.createForPluginRule(RULE_KEY);
     update.setMarkdownNote("my *note*");
-    updater.update(update, UserSession.get());
+    updater.update(update, userSessionRule);
 
     dbSession.clearCache();
     RuleDto rule = ruleDao.getNullableByKey(dbSession, RULE_KEY);
@@ -166,7 +165,7 @@ public class RuleUpdaterMediumTest {
     dbSession.commit();
 
     RuleUpdate update = RuleUpdate.createForPluginRule(RULE_KEY).setMarkdownNote(null);
-    updater.update(update, UserSession.get());
+    updater.update(update, userSessionRule);
 
     dbSession.clearCache();
     RuleDto rule = ruleDao.getNullableByKey(dbSession, RULE_KEY);
@@ -186,7 +185,7 @@ public class RuleUpdaterMediumTest {
 
     // java8 is a system tag -> ignore
     RuleUpdate update = RuleUpdate.createForPluginRule(RULE_KEY).setTags(Sets.newHashSet("bug", "java8"));
-    updater.update(update, UserSession.get());
+    updater.update(update, userSessionRule);
 
     dbSession.clearCache();
     RuleDto rule = ruleDao.getNullableByKey(dbSession, RULE_KEY);
@@ -206,7 +205,7 @@ public class RuleUpdaterMediumTest {
     dbSession.commit();
 
     RuleUpdate update = RuleUpdate.createForPluginRule(RULE_KEY).setTags(null);
-    updater.update(update, UserSession.get());
+    updater.update(update, userSessionRule);
 
     dbSession.clearCache();
     RuleDto rule = ruleDao.getNullableByKey(dbSession, RULE_KEY);
@@ -236,7 +235,7 @@ public class RuleUpdaterMediumTest {
     RuleUpdate update = RuleUpdate.createForPluginRule(RULE_KEY)
       .setDebtSubCharacteristic("SOFT_RELIABILITY")
       .setDebtRemediationFunction(fn);
-    updater.update(update, UserSession.get());
+    updater.update(update, userSessionRule);
     dbSession.clearCache();
 
     // verify debt is overridden
@@ -270,7 +269,7 @@ public class RuleUpdaterMediumTest {
 
     RuleUpdate update = RuleUpdate.createForPluginRule(RULE_KEY)
       .setDebtRemediationFunction(new DefaultDebtRemediationFunction(DebtRemediationFunction.Type.LINEAR, "2d", null));
-    updater.update(update, UserSession.get());
+    updater.update(update, userSessionRule);
     dbSession.clearCache();
 
     // verify debt is overridden
@@ -304,7 +303,7 @@ public class RuleUpdaterMediumTest {
 
     RuleUpdate update = RuleUpdate.createForPluginRule(RULE_KEY)
       .setDebtRemediationFunction(new DefaultDebtRemediationFunction(DebtRemediationFunction.Type.CONSTANT_ISSUE, null, "10min"));
-    updater.update(update, UserSession.get());
+    updater.update(update, userSessionRule);
     dbSession.clearCache();
 
     // verify debt is overridden
@@ -339,7 +338,7 @@ public class RuleUpdaterMediumTest {
 
     RuleUpdate update = RuleUpdate.createForPluginRule(RULE_KEY)
       .setDebtSubCharacteristic(RuleUpdate.DEFAULT_DEBT_CHARACTERISTIC);
-    updater.update(update, UserSession.get());
+    updater.update(update, userSessionRule);
     dbSession.clearCache();
 
     // verify debt is coming from default values
@@ -374,7 +373,7 @@ public class RuleUpdaterMediumTest {
 
     RuleUpdate update = RuleUpdate.createForPluginRule(RULE_KEY)
       .setDebtSubCharacteristic(null);
-    updater.update(update, UserSession.get());
+    updater.update(update, userSessionRule);
 
     // verify db
     dbSession.clearCache();
@@ -426,7 +425,7 @@ public class RuleUpdaterMediumTest {
       .setSeverity("MAJOR")
       .setStatus(RuleStatus.READY)
       .setParameters(ImmutableMap.of("regex", "b.*"));
-    updater.update(update, UserSession.get());
+    updater.update(update, userSessionRule);
 
     dbSession.clearCache();
 
@@ -468,7 +467,7 @@ public class RuleUpdaterMediumTest {
       .setMarkdownDescription("New description")
       .setSeverity("MAJOR")
       .setStatus(RuleStatus.READY);
-    updater.update(update, UserSession.get());
+    updater.update(update, userSessionRule);
 
     dbSession.clearCache();
 
@@ -511,7 +510,7 @@ public class RuleUpdaterMediumTest {
     // Update custom rule parameter 'regex', add 'message' and remove 'format'
     RuleUpdate update = RuleUpdate.createForCustomRule(customRule.getKey())
       .setParameters(ImmutableMap.of("regex", "b.*", "message", "a message"));
-    updater.update(update, UserSession.get());
+    updater.update(update, userSessionRule);
 
     dbSession.clearCache();
 
@@ -556,7 +555,7 @@ public class RuleUpdaterMediumTest {
       .setName("")
       .setMarkdownDescription("New desc");
     try {
-      updater.update(update, UserSession.get());
+      updater.update(update, userSessionRule);
       fail();
     } catch (Exception e) {
       assertThat(e).isInstanceOf(IllegalArgumentException.class).hasMessage("The name is missing");
@@ -580,7 +579,7 @@ public class RuleUpdaterMediumTest {
       .setName("New name")
       .setMarkdownDescription("");
     try {
-      updater.update(update, UserSession.get());
+      updater.update(update, userSessionRule);
       fail();
     } catch (Exception e) {
       assertThat(e).isInstanceOf(IllegalArgumentException.class).hasMessage("The description is missing");
@@ -603,7 +602,7 @@ public class RuleUpdaterMediumTest {
       .setName("New name")
       .setMarkdownDescription("New description")
       .setSeverity(Severity.CRITICAL);
-    updater.update(update, UserSession.get());
+    updater.update(update, userSessionRule);
 
     dbSession.clearCache();
 
index 9e27542bbb7b01072b29868912b5d6bbdb1501ce..a518646c6f9eefd5cea20af3bbe52cf1d6baa8d9 100644 (file)
@@ -61,6 +61,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import org.sonar.server.tester.UserSessionRule;
 
 import static com.google.common.collect.Lists.newArrayList;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -70,6 +71,8 @@ public class RuleIndexMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @org.junit.Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   protected DbClient db;
 
@@ -136,15 +139,15 @@ public class RuleIndexMediumTest {
 
     // should not have any facet!
     RuleQuery query = new RuleQuery();
-    Result result = index.search(query, new QueryContext());
+    Result result = index.search(query, new QueryContext(userSessionRule));
     assertThat(result.getFacets()).isEmpty();
 
     // should not have any facet on non matching query!
-    result = index.search(new RuleQuery().setQueryText("aeiou"), new QueryContext().addFacets(Arrays.asList("repositories")));
+    result = index.search(new RuleQuery().setQueryText("aeiou"), new QueryContext(userSessionRule).addFacets(Arrays.asList("repositories")));
     assertThat(result.getFacets()).isEmpty();
 
     // Repositories Facet is preset
-    result = index.search(query, new QueryContext().addFacets(Arrays.asList("repositories", "tags")));
+    result = index.search(query, new QueryContext(userSessionRule).addFacets(Arrays.asList("repositories", "tags")));
     assertThat(result.getFacets()).isNotNull();
     assertThat(result.getFacets()).hasSize(2);
 
@@ -168,7 +171,7 @@ public class RuleIndexMediumTest {
     dao.insert(dbSession, RuleTesting.newDto(RuleKey.of("javascript", "S001")));
     dbSession.commit();
 
-    QueryContext options = new QueryContext().setFieldsToReturn(null);
+    QueryContext options = new QueryContext(userSessionRule).setFieldsToReturn(null);
     Result<Rule> results = index.search(new RuleQuery(), options);
     assertThat(results.getHits()).hasSize(1);
     Rule hit = Iterables.getFirst(results.getHits(), null);
@@ -176,7 +179,7 @@ public class RuleIndexMediumTest {
     assertThat(hit.htmlDescription()).isNotNull();
     assertThat(hit.name()).isNotNull();
 
-    options = new QueryContext().setFieldsToReturn(Collections.<String>emptyList());
+    options = new QueryContext(userSessionRule).setFieldsToReturn(Collections.<String>emptyList());
     results = index.search(new RuleQuery(), options);
     assertThat(results.getHits()).hasSize(1);
     hit = Iterables.getFirst(results.getHits(), null);
@@ -190,7 +193,7 @@ public class RuleIndexMediumTest {
     dao.insert(dbSession, RuleTesting.newDto(RuleKey.of("javascript", "S001")));
     dbSession.commit();
 
-    QueryContext options = new QueryContext();
+    QueryContext options = new QueryContext(userSessionRule);
     options.addFieldsToReturn(RuleNormalizer.RuleField.LANGUAGE.field(), RuleNormalizer.RuleField.STATUS.field());
     Result<Rule> results = index.search(new RuleQuery(), options);
     assertThat(results.getHits()).hasSize(1);
@@ -215,19 +218,19 @@ public class RuleIndexMediumTest {
 
     // substring
     RuleQuery query = new RuleQuery().setQueryText("test");
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(1);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(1);
 
     // substring
     query = new RuleQuery().setQueryText("partial match");
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(1);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(1);
 
     // case-insensitive
     query = new RuleQuery().setQueryText("TESTING");
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(1);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(1);
 
     // not found
     query = new RuleQuery().setQueryText("not present");
-    assertThat(index.search(query, new QueryContext()).getHits()).isEmpty();
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).isEmpty();
   }
 
   @Test
@@ -239,16 +242,16 @@ public class RuleIndexMediumTest {
 
     // key
     RuleQuery query = new RuleQuery().setQueryText("X001");
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(2);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(2);
 
     // partial key does not match
     query = new RuleQuery().setQueryText("X00");
     // TODO fix non-partial match for Key search
-    assertThat(index.search(query, new QueryContext()).getHits()).isEmpty();
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).isEmpty();
 
     // repo:key -> nice-to-have !
     query = new RuleQuery().setQueryText("javascript:X001");
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(1);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(1);
   }
 
   @Test
@@ -260,12 +263,12 @@ public class RuleIndexMediumTest {
 
     // key
     RuleQuery query = new RuleQuery().setKey(RuleKey.of("javascript", "X001").toString());
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(1);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(1);
 
     // partial key does not match
     query = new RuleQuery().setKey("X001");
     // TODO fix non-partial match for Key search
-    assertThat(index.search(query, new QueryContext()).getHits()).isEmpty();
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).isEmpty();
   }
 
   @Test
@@ -274,7 +277,7 @@ public class RuleIndexMediumTest {
     dao.insert(dbSession, RuleTesting.newDto(RuleKey.of("java", "S002")));
     dbSession.commit();
 
-    Result results = index.search(new RuleQuery(), new QueryContext());
+    Result results = index.search(new RuleQuery(), new QueryContext(userSessionRule));
 
     assertThat(results.getTotal()).isEqualTo(2);
     assertThat(results.getHits()).hasSize(2);
@@ -288,7 +291,7 @@ public class RuleIndexMediumTest {
     }
     dbSession.commit();
 
-    Result results = index.search(new RuleQuery(), new QueryContext().setScroll(true));
+    Result results = index.search(new RuleQuery(), new QueryContext(userSessionRule).setScroll(true));
 
     assertThat(results.getTotal()).isEqualTo(max);
     assertThat(results.getHits()).hasSize(0);
@@ -343,9 +346,9 @@ public class RuleIndexMediumTest {
       .setDefaultRemediationFunction(null).setDefaultRemediationCoefficient(null));
     dbSession.commit();
 
-    assertThat(index.search(new RuleQuery().setHasDebtCharacteristic(null), new QueryContext()).getTotal()).isEqualTo(4);
-    assertThat(index.search(new RuleQuery().setHasDebtCharacteristic(true), new QueryContext()).getTotal()).isEqualTo(2);
-    assertThat(index.search(new RuleQuery().setHasDebtCharacteristic(false), new QueryContext()).getTotal()).isEqualTo(2);
+    assertThat(index.search(new RuleQuery().setHasDebtCharacteristic(null), new QueryContext(userSessionRule)).getTotal()).isEqualTo(4);
+    assertThat(index.search(new RuleQuery().setHasDebtCharacteristic(true), new QueryContext(userSessionRule)).getTotal()).isEqualTo(2);
+    assertThat(index.search(new RuleQuery().setHasDebtCharacteristic(false), new QueryContext(userSessionRule)).getTotal()).isEqualTo(2);
   }
 
   @Test
@@ -388,7 +391,7 @@ public class RuleIndexMediumTest {
       .setDefaultRemediationFunction(null).setDefaultRemediationCoefficient(null));
     dbSession.commit();
 
-    QueryContext withDebtCharFacet = new QueryContext().addFacets(Arrays.asList(RuleIndex.FACET_DEBT_CHARACTERISTICS));
+    QueryContext withDebtCharFacet = new QueryContext(userSessionRule).addFacets(Arrays.asList(RuleIndex.FACET_DEBT_CHARACTERISTICS));
 
     // Facet show results on characs, subcharacs and uncharacterized rules 
     Result<Rule> result1 = index.search(new RuleQuery(), withDebtCharFacet);
@@ -446,17 +449,17 @@ public class RuleIndexMediumTest {
     dbSession.commit();
 
     RuleQuery query = new RuleQuery().setRepositories(Arrays.asList("checkstyle", "pmd"));
-    Result<Rule> results = index.search(query, new QueryContext());
+    Result<Rule> results = index.search(query, new QueryContext(userSessionRule));
     assertThat(results.getHits()).hasSize(1);
     assertThat(Iterables.getFirst(results.getHits(), null).key().rule()).isEqualTo("S002");
 
     // no results
     query = new RuleQuery().setRepositories(Arrays.asList("checkstyle"));
-    assertThat(index.search(query, new QueryContext()).getHits()).isEmpty();
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).isEmpty();
 
     // empty list => no filter
     query = new RuleQuery().setRepositories(Collections.<String>emptyList());
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(2);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(2);
   }
 
   @Test
@@ -467,22 +470,22 @@ public class RuleIndexMediumTest {
     dbSession.commit();
 
     RuleQuery query = new RuleQuery().setLanguages(Arrays.asList("cobol", "js"));
-    Result<Rule> results = index.search(query, new QueryContext());
+    Result<Rule> results = index.search(query, new QueryContext(userSessionRule));
 
     assertThat(results.getHits()).hasSize(1);
     assertThat(Iterables.getFirst(results.getHits(), null).key().rule()).isEqualTo("S002");
 
     // no results
     query = new RuleQuery().setLanguages(Arrays.asList("cpp"));
-    assertThat(index.search(query, new QueryContext()).getHits()).isEmpty();
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).isEmpty();
 
     // empty list => no filter
     query = new RuleQuery().setLanguages(Collections.<String>emptyList());
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(2);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(2);
 
     // null list => no filter
     query = new RuleQuery().setLanguages(null);
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(2);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(2);
   }
 
   @Test
@@ -507,36 +510,36 @@ public class RuleIndexMediumTest {
     Result<Rule> results;
 
     // 0. we have 2 rules in index
-    results = index.search(new RuleQuery(), new QueryContext());
+    results = index.search(new RuleQuery(), new QueryContext(userSessionRule));
     assertThat(results.getHits()).hasSize(2);
 
     // filter by non-subChar
     query = new RuleQuery().setDebtCharacteristics(ImmutableSet.of("toto"));
-    assertThat(index.search(query, new QueryContext()).getHits()).isEmpty();
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).isEmpty();
 
     // filter by subChar
     query = new RuleQuery().setDebtCharacteristics(ImmutableSet.of(char11.getKey()));
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(1);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(1);
 
     // filter by Char
     query = new RuleQuery().setDebtCharacteristics(ImmutableSet.of(char1.getKey()));
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(1);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(1);
 
     // filter by Char and SubChar
     query = new RuleQuery().setDebtCharacteristics(ImmutableSet.of(char11.getKey(), char1.getKey()));
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(1);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(1);
 
     // match by Char
     query = new RuleQuery().setQueryText(char1.getKey());
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(1);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(1);
 
     // match by SubChar
     query = new RuleQuery().setQueryText(char11.getKey());
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(1);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(1);
 
     // match by SubChar & Char
     query = new RuleQuery().setQueryText(char11.getKey() + " " + char1.getKey());
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(1);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(1);
   }
 
   @Test
@@ -585,26 +588,26 @@ public class RuleIndexMediumTest {
     Result<Rule> results;
 
     // 0. we have 4 rules in index
-    results = index.search(new RuleQuery(), new QueryContext());
+    results = index.search(new RuleQuery(), new QueryContext(userSessionRule));
     assertThat(results.getHits()).hasSize(4);
 
     // filter by subChar
     query = new RuleQuery().setDebtCharacteristics(ImmutableSet.of(char11.getKey()));
-    assertThat(ruleKeys(index.search(query, new QueryContext()).getHits())).containsOnly("S001", "S002", "S004");
+    assertThat(ruleKeys(index.search(query, new QueryContext(userSessionRule)).getHits())).containsOnly("S001", "S002", "S004");
 
     query = new RuleQuery().setDebtCharacteristics(ImmutableSet.of(char21.getKey()));
-    assertThat(ruleKeys(index.search(query, new QueryContext()).getHits())).containsOnly("S003");
+    assertThat(ruleKeys(index.search(query, new QueryContext(userSessionRule)).getHits())).containsOnly("S003");
 
     // filter by Char
     query = new RuleQuery().setDebtCharacteristics(ImmutableSet.of(char1.getKey()));
-    assertThat(ruleKeys(index.search(query, new QueryContext()).getHits())).containsOnly("S001", "S002", "S004");
+    assertThat(ruleKeys(index.search(query, new QueryContext(userSessionRule)).getHits())).containsOnly("S001", "S002", "S004");
 
     query = new RuleQuery().setDebtCharacteristics(ImmutableSet.of(char2.getKey()));
-    assertThat(ruleKeys(index.search(query, new QueryContext()).getHits())).containsOnly("S003");
+    assertThat(ruleKeys(index.search(query, new QueryContext(userSessionRule)).getHits())).containsOnly("S003");
 
     // filter by Char and SubChar
     query = new RuleQuery().setDebtCharacteristics(ImmutableSet.of(char11.getKey(), char1.getKey(), char2.getKey(), char21.getKey()));
-    assertThat(ruleKeys(index.search(query, new QueryContext()).getHits())).containsOnly("S001", "S002", "S003", "S004");
+    assertThat(ruleKeys(index.search(query, new QueryContext(userSessionRule)).getHits())).containsOnly("S001", "S002", "S003", "S004");
   }
 
   @Test
@@ -614,21 +617,21 @@ public class RuleIndexMediumTest {
     dbSession.commit();
 
     RuleQuery query = new RuleQuery().setSeverities(Arrays.asList(Severity.INFO, Severity.MINOR));
-    Result<Rule> results = index.search(query, new QueryContext());
+    Result<Rule> results = index.search(query, new QueryContext(userSessionRule));
     assertThat(results.getHits()).hasSize(1);
     assertThat(Iterables.getFirst(results.getHits(), null).key().rule()).isEqualTo("S002");
 
     // no results
     query = new RuleQuery().setSeverities(Arrays.asList(Severity.MINOR));
-    assertThat(index.search(query, new QueryContext()).getHits()).isEmpty();
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).isEmpty();
 
     // empty list => no filter
     query = new RuleQuery().setSeverities(Collections.<String>emptyList());
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(2);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(2);
 
     // null list => no filter
     query = new RuleQuery().setSeverities(null);
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(2);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(2);
   }
 
   @Test
@@ -638,21 +641,21 @@ public class RuleIndexMediumTest {
     dbSession.commit();
 
     RuleQuery query = new RuleQuery().setStatuses(Arrays.asList(RuleStatus.DEPRECATED, RuleStatus.READY));
-    Result<Rule> results = index.search(query, new QueryContext());
+    Result<Rule> results = index.search(query, new QueryContext(userSessionRule));
     assertThat(results.getHits()).hasSize(1);
     assertThat(Iterables.getFirst(results.getHits(), null).key().rule()).isEqualTo("S002");
 
     // no results
     query = new RuleQuery().setStatuses(Arrays.asList(RuleStatus.DEPRECATED));
-    assertThat(index.search(query, new QueryContext()).getHits()).isEmpty();
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).isEmpty();
 
     // empty list => no filter
     query = new RuleQuery().setStatuses(Collections.<RuleStatus>emptyList());
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(2);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(2);
 
     // null list => no filter
     query = new RuleQuery().setStatuses(null);
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(2);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(2);
   }
 
   @Test
@@ -664,14 +667,14 @@ public class RuleIndexMediumTest {
 
     // ascending
     RuleQuery query = new RuleQuery().setSortField(RuleNormalizer.RuleField.NAME);
-    Result<Rule> results = index.search(query, new QueryContext());
+    Result<Rule> results = index.search(query, new QueryContext(userSessionRule));
     assertThat(results.getHits()).hasSize(3);
     assertThat(Iterables.getFirst(results.getHits(), null).key().rule()).isEqualTo("S002");
     assertThat(Iterables.getLast(results.getHits(), null).key().rule()).isEqualTo("S003");
 
     // descending
     query = new RuleQuery().setSortField(RuleNormalizer.RuleField.NAME).setAscendingSort(false);
-    results = index.search(query, new QueryContext());
+    results = index.search(query, new QueryContext(userSessionRule));
     assertThat(results.getHits()).hasSize(3);
     assertThat(Iterables.getFirst(results.getHits(), null).key().rule()).isEqualTo("S003");
     assertThat(Iterables.getLast(results.getHits(), null).key().rule()).isEqualTo("S002");
@@ -709,25 +712,25 @@ public class RuleIndexMediumTest {
 
     // 1. get all active rules.
     Result<Rule> result = index.search(new RuleQuery().setActivation(true),
-      new QueryContext());
+      new QueryContext(userSessionRule));
     assertThat(result.getHits()).hasSize(2);
 
     // 2. get all inactive rules.
     result = index.search(new RuleQuery().setActivation(false),
-      new QueryContext());
+      new QueryContext(userSessionRule));
     assertThat(result.getHits()).hasSize(1);
     assertThat(result.getHits().get(0).name()).isEqualTo(rule3.getName());
 
     // 3. get all rules not active on profile
     index.search(new RuleQuery().setActivation(false).setQProfileKey(qualityProfileDto2.getKey()),
-      new QueryContext());
+      new QueryContext(userSessionRule));
     // TODO
     assertThat(result.getHits()).hasSize(1);
 
     // 4. get all active rules on profile
     result = index.search(new RuleQuery().setActivation(true)
       .setQProfileKey(qualityProfileDto2.getKey()),
-      new QueryContext());
+      new QueryContext(userSessionRule));
     assertThat(result.getHits()).hasSize(1);
     assertThat(result.getHits().get(0).name()).isEqualTo(rule1.getName());
 
@@ -769,17 +772,17 @@ public class RuleIndexMediumTest {
 
     // 0. get all rules
     Result<Rule> result = index.search(new RuleQuery(),
-      new QueryContext());
+      new QueryContext(userSessionRule));
     assertThat(result.getHits()).hasSize(4);
 
     // 1. get all active rules
     result = index.search(new RuleQuery().setActivation(true),
-      new QueryContext());
+      new QueryContext(userSessionRule));
     assertThat(result.getHits()).hasSize(3);
 
     // 2. get all inactive rules.
     result = index.search(new RuleQuery().setActivation(false),
-      new QueryContext());
+      new QueryContext(userSessionRule));
     assertThat(result.getHits()).hasSize(1);
     assertThat(result.getHits().get(0).name()).isEqualTo(rule4.getName());
 
@@ -787,7 +790,7 @@ public class RuleIndexMediumTest {
     result = index.search(new RuleQuery().setActivation(true)
       .setQProfileKey(qualityProfileDto1.getKey())
       .setInheritance(ImmutableSet.of(ActiveRule.Inheritance.INHERITED.name())),
-      new QueryContext()
+      new QueryContext(userSessionRule)
       );
     assertThat(result.getHits()).hasSize(0);
 
@@ -795,7 +798,7 @@ public class RuleIndexMediumTest {
     result = index.search(new RuleQuery().setActivation(true)
       .setQProfileKey(qualityProfileDto2.getKey())
       .setInheritance(ImmutableSet.of(ActiveRule.Inheritance.INHERITED.name())),
-      new QueryContext()
+      new QueryContext(userSessionRule)
       );
     assertThat(result.getHits()).hasSize(2);
 
@@ -803,7 +806,7 @@ public class RuleIndexMediumTest {
     result = index.search(new RuleQuery().setActivation(true)
       .setQProfileKey(qualityProfileDto1.getKey())
       .setInheritance(ImmutableSet.of(ActiveRule.Inheritance.OVERRIDES.name())),
-      new QueryContext()
+      new QueryContext(userSessionRule)
       );
     assertThat(result.getHits()).hasSize(0);
 
@@ -811,7 +814,7 @@ public class RuleIndexMediumTest {
     result = index.search(new RuleQuery().setActivation(true)
       .setQProfileKey(qualityProfileDto2.getKey())
       .setInheritance(ImmutableSet.of(ActiveRule.Inheritance.OVERRIDES.name())),
-      new QueryContext()
+      new QueryContext(userSessionRule)
       );
     assertThat(result.getHits()).hasSize(1);
 
@@ -820,7 +823,7 @@ public class RuleIndexMediumTest {
       .setQProfileKey(qualityProfileDto1.getKey())
       .setInheritance(ImmutableSet.of(
         ActiveRule.Inheritance.INHERITED.name(), ActiveRule.Inheritance.OVERRIDES.name())),
-      new QueryContext()
+      new QueryContext(userSessionRule)
       );
     assertThat(result.getHits()).hasSize(0);
 
@@ -829,7 +832,7 @@ public class RuleIndexMediumTest {
       .setQProfileKey(qualityProfileDto2.getKey())
       .setInheritance(ImmutableSet.of(
         ActiveRule.Inheritance.INHERITED.name(), ActiveRule.Inheritance.OVERRIDES.name())),
-      new QueryContext()
+      new QueryContext(userSessionRule)
       );
     assertThat(result.getHits()).hasSize(3);
   }
@@ -855,12 +858,12 @@ public class RuleIndexMediumTest {
 
     // 1. get all active rules.
     Result<Rule> result = index.search(new RuleQuery().setActivation(true).setQProfileKey(qualityProfileDto1.getKey()),
-      new QueryContext());
+      new QueryContext(userSessionRule));
     assertThat(result.getHits()).hasSize(2);
 
     // 2. get rules with active severity critical.
     result = index.search(new RuleQuery().setActivation(true).setQProfileKey(qualityProfileDto1.getKey()).setActiveSeverities(Arrays.asList("CRITICAL")),
-      new QueryContext().addFacets(Arrays.asList(RuleIndex.FACET_ACTIVE_SEVERITIES)));
+      new QueryContext(userSessionRule).addFacets(Arrays.asList(RuleIndex.FACET_ACTIVE_SEVERITIES)));
     assertThat(result.getHits()).hasSize(1);
     assertThat(result.getHits().get(0).name()).isEqualTo(rule2.getName());
     // check stickyness of active severity facet
@@ -868,7 +871,7 @@ public class RuleIndexMediumTest {
 
     // 3. count activation severities of all active rules
     result = index.search(new RuleQuery(),
-      new QueryContext().addFacets(Arrays.asList(RuleIndex.FACET_ACTIVE_SEVERITIES)));
+      new QueryContext(userSessionRule).addFacets(Arrays.asList(RuleIndex.FACET_ACTIVE_SEVERITIES)));
     assertThat(result.getHits()).hasSize(3);
     assertThat(result.getFacetValues(RuleIndex.FACET_ACTIVE_SEVERITIES)).containsOnly(new FacetValue("BLOCKER", 2), new FacetValue("CRITICAL", 1));
   }
@@ -903,38 +906,38 @@ public class RuleIndexMediumTest {
 
     // find all
     RuleQuery query = new RuleQuery();
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(2);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(2);
 
     // tag1 in query
     query = new RuleQuery().setQueryText("tag1");
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(1);
-    assertThat(Iterables.getFirst(index.search(query, new QueryContext()).getHits(), null).tags()).containsExactly("tag1");
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(1);
+    assertThat(Iterables.getFirst(index.search(query, new QueryContext(userSessionRule)).getHits(), null).tags()).containsExactly("tag1");
 
     // tag1 and tag2 in query
     query = new RuleQuery().setQueryText("tag1 tag2");
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(2);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(2);
 
     // tag2 in filter
     query = new RuleQuery().setTags(ImmutableSet.of("tag2"));
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(1);
-    assertThat(Iterables.getFirst(index.search(query, new QueryContext()).getHits(), null).tags()).containsExactly("tag2");
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(1);
+    assertThat(Iterables.getFirst(index.search(query, new QueryContext(userSessionRule)).getHits(), null).tags()).containsExactly("tag2");
 
     // tag2 in filter and tag1 tag2 in query
     query = new RuleQuery().setTags(ImmutableSet.of("tag2")).setQueryText("tag1");
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(0);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(0);
 
     // tag2 in filter and tag1 in query
     query = new RuleQuery().setTags(ImmutableSet.of("tag2")).setQueryText("tag1 tag2");
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(1);
-    assertThat(Iterables.getFirst(index.search(query, new QueryContext()).getHits(), null).tags()).containsExactly("tag2");
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(1);
+    assertThat(Iterables.getFirst(index.search(query, new QueryContext(userSessionRule)).getHits(), null).tags()).containsExactly("tag2");
 
     // null list => no filter
     query = new RuleQuery().setTags(Collections.<String>emptySet());
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(2);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(2);
 
     // null list => no filter
     query = new RuleQuery().setTags(null);
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(2);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(2);
   }
 
   @Test
@@ -945,26 +948,26 @@ public class RuleIndexMediumTest {
 
     // find all
     RuleQuery query = new RuleQuery();
-    Result<Rule> results = index.search(query, new QueryContext());
+    Result<Rule> results = index.search(query, new QueryContext(userSessionRule));
     assertThat(results.getHits()).hasSize(2);
 
     // Only template
     query = new RuleQuery().setIsTemplate(true);
-    results = index.search(query, new QueryContext());
+    results = index.search(query, new QueryContext(userSessionRule));
     assertThat(results.getHits()).hasSize(1);
     assertThat(Iterables.getFirst(results.getHits(), null).key().rule()).isEqualTo("S002");
     assertThat(Iterables.getFirst(results.getHits(), null).isTemplate()).isTrue();
 
     // Only not template
     query = new RuleQuery().setIsTemplate(false);
-    results = index.search(query, new QueryContext());
+    results = index.search(query, new QueryContext(userSessionRule));
     assertThat(results.getHits()).hasSize(1);
     assertThat(Iterables.getFirst(results.getHits(), null).isTemplate()).isFalse();
     assertThat(Iterables.getFirst(results.getHits(), null).key().rule()).isEqualTo("S001");
 
     // null => no filter
     query = new RuleQuery().setIsTemplate(null);
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(2);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(2);
   }
 
   @Test
@@ -976,19 +979,19 @@ public class RuleIndexMediumTest {
 
     // find all
     RuleQuery query = new RuleQuery();
-    Result<Rule> results = index.search(query, new QueryContext());
+    Result<Rule> results = index.search(query, new QueryContext(userSessionRule));
     assertThat(results.getHits()).hasSize(2);
 
     // Only custom rule
     query = new RuleQuery().setTemplateKey("java:S001");
-    results = index.search(query, new QueryContext());
+    results = index.search(query, new QueryContext(userSessionRule));
     assertThat(results.getHits()).hasSize(1);
     assertThat(Iterables.getFirst(results.getHits(), null).key().rule()).isEqualTo("S001_MY_CUSTOM");
     assertThat(Iterables.getFirst(results.getHits(), null).templateKey()).isEqualTo(RuleKey.of("java", "S001"));
 
     // null => no filter
     query = new RuleQuery().setTemplateKey(null);
-    assertThat(index.search(query, new QueryContext()).getHits()).hasSize(2);
+    assertThat(index.search(query, new QueryContext(userSessionRule)).getHits()).hasSize(2);
   }
 
   @Test
@@ -1006,7 +1009,7 @@ public class RuleIndexMediumTest {
 
     // find all
     RuleQuery query = new RuleQuery();
-    Result<Rule> results = index.search(query, new QueryContext());
+    Result<Rule> results = index.search(query, new QueryContext(userSessionRule));
     assertThat(results.getHits()).hasSize(2);
 
     // get params
@@ -1023,7 +1026,7 @@ public class RuleIndexMediumTest {
 
     // find all
     RuleQuery query = new RuleQuery();
-    Result<Rule> results = index.search(query, new QueryContext());
+    Result<Rule> results = index.search(query, new QueryContext(userSessionRule));
     assertThat(results.getHits()).hasSize(2);
 
     // find custom rule
@@ -1038,7 +1041,7 @@ public class RuleIndexMediumTest {
     dbSession.commit();
 
     // from 0 to 1 included
-    QueryContext options = new QueryContext();
+    QueryContext options = new QueryContext(userSessionRule);
     options.setOffset(0).setLimit(2);
     Result results = index.search(new RuleQuery(), options);
     assertThat(results.getTotal()).isEqualTo(3);
@@ -1073,19 +1076,19 @@ public class RuleIndexMediumTest {
     dbSession.commit();
 
     // 0. find all rules;
-    assertThat(index.search(new RuleQuery(), new QueryContext()).getHits()).hasSize(2);
+    assertThat(index.search(new RuleQuery(), new QueryContext(userSessionRule)).getHits()).hasSize(2);
 
     // 1. find all rules available since a date;
     RuleQuery availableSinceQuery = new RuleQuery()
       .setAvailableSince(since);
-    List<Rule> hits = index.search(availableSinceQuery, new QueryContext()).getHits();
+    List<Rule> hits = index.search(availableSinceQuery, new QueryContext(userSessionRule)).getHits();
     assertThat(hits).hasSize(1);
     assertThat(hits.get(0).key()).isEqualTo(RuleKey.of("java", "S002"));
 
     // 2. find no new rules since tomorrow.
     RuleQuery availableSinceNowQuery = new RuleQuery()
       .setAvailableSince(DateUtils.addDays(since, 1));
-    assertThat(index.search(availableSinceNowQuery, new QueryContext()).getHits()).hasSize(0);
+    assertThat(index.search(availableSinceNowQuery, new QueryContext(userSessionRule)).getHits()).hasSize(0);
   }
 
   @Test
@@ -1113,7 +1116,7 @@ public class RuleIndexMediumTest {
     assertThat(rule.name()).isEqualTo(nameWithProtectedChars);
 
     RuleQuery protectedCharsQuery = new RuleQuery().setQueryText(nameWithProtectedChars);
-    List<Rule> results = index.search(protectedCharsQuery, new QueryContext()).getHits();
+    List<Rule> results = index.search(protectedCharsQuery, new QueryContext(userSessionRule)).getHits();
     assertThat(results).hasSize(1);
     assertThat(results.get(0).key()).isEqualTo(RuleTesting.XOO_X1);
   }
@@ -1135,10 +1138,10 @@ public class RuleIndexMediumTest {
 
     // 0 assert Base
     assertThat(index.countAll()).isEqualTo(9);
-    assertThat(index.search(new RuleQuery(), new QueryContext()).getHits()).hasSize(9);
+    assertThat(index.search(new RuleQuery(), new QueryContext(userSessionRule)).getHits()).hasSize(9);
 
     // 1 Facet with no filters at all
-    Map<String, Collection<FacetValue>> facets = index.search(new RuleQuery(), new QueryContext().addFacets(Arrays.asList("languages", "repositories", "tags"))).getFacets();
+    Map<String, Collection<FacetValue>> facets = index.search(new RuleQuery(), new QueryContext(userSessionRule).addFacets(Arrays.asList("languages", "repositories", "tags"))).getFacets();
     assertThat(facets.keySet()).hasSize(3);
     assertThat(facets.get(RuleIndex.FACET_LANGUAGES)).extracting("key").containsOnly("cpp", "java", "cobol");
     assertThat(facets.get(RuleIndex.FACET_REPOSITORIES)).extracting("key").containsOnly("xoo", "foo");
@@ -1148,7 +1151,7 @@ public class RuleIndexMediumTest {
     // -- lang facet should still have all language
     Result<Rule> result = index.search(new RuleQuery()
       .setLanguages(ImmutableList.<String>of("cpp"))
-      , new QueryContext().addFacets(Arrays.asList("languages", "repositories", "tags")));
+      , new QueryContext(userSessionRule).addFacets(Arrays.asList("languages", "repositories", "tags")));
     assertThat(result.getHits()).hasSize(3);
     assertThat(result.getFacets()).hasSize(3);
     assertThat(result.getFacets().get(RuleIndex.FACET_LANGUAGES)).extracting("key").containsOnly("cpp", "java", "cobol");
@@ -1160,7 +1163,7 @@ public class RuleIndexMediumTest {
     result = index.search(new RuleQuery()
       .setLanguages(ImmutableList.<String>of("cpp"))
       .setTags(ImmutableList.<String>of("T2"))
-      , new QueryContext().addFacets(Arrays.asList("languages", "repositories", "tags")));
+      , new QueryContext(userSessionRule).addFacets(Arrays.asList("languages", "repositories", "tags")));
     assertThat(result.getHits()).hasSize(1);
     assertThat(result.getFacets().keySet()).hasSize(3);
     assertThat(result.getFacets().get(RuleIndex.FACET_LANGUAGES)).extracting("key").containsOnly("cpp", "java");
@@ -1174,7 +1177,7 @@ public class RuleIndexMediumTest {
     result = index.search(new RuleQuery()
       .setLanguages(ImmutableList.<String>of("cpp", "java"))
       .setTags(ImmutableList.<String>of("T2"))
-      , new QueryContext().addFacets(Arrays.asList("languages", "repositories", "tags")));
+      , new QueryContext(userSessionRule).addFacets(Arrays.asList("languages", "repositories", "tags")));
     assertThat(result.getHits()).hasSize(2);
     assertThat(result.getFacets().keySet()).hasSize(3);
     assertThat(result.getFacets().get(RuleIndex.FACET_LANGUAGES)).extracting("key").containsOnly("cpp", "java");
index fee153a4d3afddcaded7531f1bc5c4f586555d59..56ac88982726b2c1e1220567b72f030a218a470a 100644 (file)
@@ -20,6 +20,8 @@
 package org.sonar.server.rule.ws;
 
 import com.google.common.collect.ImmutableList;
+import java.util.Locale;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -37,11 +39,9 @@ import org.sonar.core.qualityprofile.db.QualityProfileDto;
 import org.sonar.server.qualityprofile.QProfileLoader;
 import org.sonar.server.qualityprofile.QProfileTesting;
 import org.sonar.server.rule.RuleRepositories;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
-import java.util.Locale;
-
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.isA;
 import static org.mockito.Mockito.mock;
@@ -49,6 +49,8 @@ import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class AppActionTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   @Mock
   Languages languages;
@@ -67,10 +69,10 @@ public class AppActionTest {
 
   @Test
   public void should_generate_app_init_info() throws Exception {
-    AppAction app = new AppAction(languages, ruleRepositories, i18n, debtModel, profileLoader);
+    AppAction app = new AppAction(languages, ruleRepositories, i18n, debtModel, profileLoader, userSessionRule);
     WsTester tester = new WsTester(new RulesWebService(app));
 
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+    userSessionRule.setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
     QualityProfileDto profile1 = QProfileTesting.newXooP1();
     QualityProfileDto profile2 = QProfileTesting.newXooP2().setParentKee(QProfileTesting.XOO_P1_KEY);
index 0bb5e5e4b129d65648d9c7640046e065621ae062..df8e83952e4bbe1b927360894a5acefbfd206541 100644 (file)
@@ -23,6 +23,7 @@ package org.sonar.server.rule.ws;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.runners.MockitoJUnitRunner;
@@ -38,7 +39,7 @@ import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.rule.RuleTesting;
 import org.sonar.server.rule.db.RuleDao;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -49,6 +50,9 @@ public class CreateActionMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester).logon()
+      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
   WsTester wsTester;
   RuleDao ruleDao;
@@ -69,10 +73,6 @@ public class CreateActionMediumTest {
 
   @Test
   public void create_custom_rule() throws Exception {
-    MockUserSession.set()
-      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN)
-      .setLogin("me");
-
     // Template rule
     RuleDto templateRule = ruleDao.insert(session, RuleTesting.newTemplateRule(RuleKey.of("java", "S001")));
     RuleParamDto param = RuleParamDto.createFor(templateRule).setName("regex").setType("STRING").setDescription("Reg ex").setDefaultValue(".*");
@@ -92,10 +92,6 @@ public class CreateActionMediumTest {
 
   @Test
   public void create_manual_rule() throws Exception {
-    MockUserSession.set()
-      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN)
-      .setLogin("me");
-
     WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "create")
       .setParam("manual_key", "MY_MANUAL")
       .setParam("name", "My manual rule")
@@ -106,10 +102,6 @@ public class CreateActionMediumTest {
 
   @Test
   public void create_manual_rule_without_severity() throws Exception {
-    MockUserSession.set()
-      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN)
-      .setLogin("me");
-
     WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "create")
       .setParam("manual_key", "MY_MANUAL")
       .setParam("name", "My manual rule")
@@ -119,10 +111,6 @@ public class CreateActionMediumTest {
 
   @Test
   public void fail_if_custom_key_and_manual_key_parameters_are_not_set() {
-    MockUserSession.set()
-      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN)
-      .setLogin("me");
-
     WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "create")
       .setParam("key", "MY_MANUAL")
       .setParam("name", "My manual rule")
@@ -139,10 +127,6 @@ public class CreateActionMediumTest {
 
   @Test
   public void create_manual_rule_with_prevent_reactivation_param_to_true() throws Exception {
-    MockUserSession.set()
-      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN)
-      .setLogin("me");
-
     String key = "MY_MANUAL";
 
     // insert a removed rule
index 9bc23ade21a118b07b8b4de6629a23c5123bfe06..676e034d7467000cfee678d2b6d1615cfd9ce548 100644 (file)
@@ -19,6 +19,7 @@
  */
 package org.sonar.server.rule.ws;
 
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.resources.Languages;
 import org.sonar.api.server.debt.DebtModel;
@@ -26,12 +27,15 @@ import org.sonar.api.server.ws.internal.SimpleGetRequest;
 import org.sonar.server.rule.index.RuleNormalizer;
 import org.sonar.server.search.QueryContext;
 import org.sonar.server.search.ws.SearchOptions;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.text.MacroInterpreter;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 public class RuleMappingTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   Languages languages = new Languages();
   MacroInterpreter macroInterpreter = mock(MacroInterpreter.class);
@@ -39,7 +43,7 @@ public class RuleMappingTest {
 
   @Test
   public void toQueryOptions_load_all_fields() {
-    RuleMapping mapping = new RuleMapping(languages, macroInterpreter, debtModel);
+    RuleMapping mapping = new RuleMapping(languages, macroInterpreter, debtModel, userSessionRule);
     SimpleGetRequest request = new SimpleGetRequest();
     request.setParam("p", "1");
     request.setParam("ps", "10");
@@ -50,7 +54,7 @@ public class RuleMappingTest {
 
   @Test
   public void toQueryOptions_load_only_few_simple_fields() {
-    RuleMapping mapping = new RuleMapping(languages, macroInterpreter, debtModel);
+    RuleMapping mapping = new RuleMapping(languages, macroInterpreter, debtModel, userSessionRule);
     SimpleGetRequest request = new SimpleGetRequest();
     request.setParam("p", "1");
     request.setParam("ps", "10");
@@ -65,7 +69,7 @@ public class RuleMappingTest {
 
   @Test
   public void toQueryOptions_langName_requires_lang() {
-    RuleMapping mapping = new RuleMapping(languages, macroInterpreter, debtModel);
+    RuleMapping mapping = new RuleMapping(languages, macroInterpreter, debtModel, userSessionRule);
     SimpleGetRequest request = new SimpleGetRequest();
     request.setParam("p", "1");
     request.setParam("ps", "10");
@@ -77,7 +81,7 @@ public class RuleMappingTest {
 
   @Test
   public void toQueryOptions_debt_requires_group_of_fields() {
-    RuleMapping mapping = new RuleMapping(languages, macroInterpreter, debtModel);
+    RuleMapping mapping = new RuleMapping(languages, macroInterpreter, debtModel, userSessionRule);
     SimpleGetRequest request = new SimpleGetRequest();
     request.setParam("p", "1");
     request.setParam("ps", "10");
@@ -92,7 +96,7 @@ public class RuleMappingTest {
 
   @Test
   public void toQueryOptions_html_note_requires_markdown_note() {
-    RuleMapping mapping = new RuleMapping(languages, macroInterpreter, debtModel);
+    RuleMapping mapping = new RuleMapping(languages, macroInterpreter, debtModel, userSessionRule);
     SimpleGetRequest request = new SimpleGetRequest();
     request.setParam("p", "1");
     request.setParam("ps", "10");
@@ -104,7 +108,7 @@ public class RuleMappingTest {
 
   @Test
   public void toQueryOptions_debt_characteristics() {
-    RuleMapping mapping = new RuleMapping(languages, macroInterpreter, debtModel);
+    RuleMapping mapping = new RuleMapping(languages, macroInterpreter, debtModel, userSessionRule);
     SimpleGetRequest request = new SimpleGetRequest();
     request.setParam("p", "1");
     request.setParam("ps", "10");
@@ -117,7 +121,7 @@ public class RuleMappingTest {
 
   @Test
   public void toQueryOptions_debt_overloaded() {
-    RuleMapping mapping = new RuleMapping(languages, macroInterpreter, debtModel);
+    RuleMapping mapping = new RuleMapping(languages, macroInterpreter, debtModel, userSessionRule);
     SimpleGetRequest request = new SimpleGetRequest();
     request.setParam("p", "1");
     request.setParam("ps", "10");
index f0775422e0577cbe552a239eeaa7d613b766aa17..31eb6a06a611c32a0ff7ed03738613b9e546790a 100644 (file)
 package org.sonar.server.rule.ws;
 
 import com.google.common.collect.ImmutableSet;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Date;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rule.RuleStatus;
@@ -48,19 +52,17 @@ import org.sonar.server.rule.db.RuleDao;
 import org.sonar.server.rule.index.RuleNormalizer;
 import org.sonar.server.search.ws.SearchOptions;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
-import java.util.Calendar;
-import java.util.Collections;
-import java.util.Date;
-
 import static org.assertj.core.api.Assertions.assertThat;
 
 public class RulesWebServiceMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   private static final String API_ENDPOINT = "api/rules";
   private static final String API_SEARCH_METHOD = "search";
@@ -119,8 +121,6 @@ public class RulesWebServiceMediumTest {
     session.commit();
     session.clearCache();
 
-    MockUserSession.set();
-
     // 1. With Activation
     WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SHOW_METHOD);
     request.setParam(ShowAction.PARAM_KEY, rule.getKey().toString());
@@ -137,7 +137,6 @@ public class RulesWebServiceMediumTest {
 
   @Test
   public void search_no_rules() throws Exception {
-    MockUserSession.set();
     WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD);
     request.setParam(SearchOptions.PARAM_FIELDS, "actives");
     WsTester.Result result = request.execute();
@@ -151,7 +150,6 @@ public class RulesWebServiceMediumTest {
     ruleDao.insert(session, RuleTesting.newXooX2());
     session.commit();
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD);
     request.setParam(SearchAction.PARAM_KEY, RuleTesting.XOO_X1.toString());
     request.setParam(SearchOptions.PARAM_FIELDS, "actives");
@@ -172,7 +170,6 @@ public class RulesWebServiceMediumTest {
     ruleDao.insert(session, RuleTesting.newXooX2());
     session.commit();
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD);
     WsTester.Result result = request.execute();
 
@@ -185,7 +182,6 @@ public class RulesWebServiceMediumTest {
     ruleDao.insert(session, RuleTesting.newXooX2().setDescription("A *Xoo* rule").setDescriptionFormat(Format.MARKDOWN));
     session.commit();
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD).setParam(SearchOptions.PARAM_FIELDS, "name,htmlDesc,mdDesc");
     WsTester.Result result = request.execute();
 
@@ -209,7 +205,6 @@ public class RulesWebServiceMediumTest {
       );
     session.commit();
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD);
     request.setParam(SearchOptions.PARAM_FIELDS, "debtChar,debtCharName,debtSubChar,debtSubCharName,debtRemFn,debtOverloaded,defaultDebtChar,defaultDebtSubChar,defaultDebtRemFn");
     request.setParam(SearchAction.PARAM_FACETS, "debt_characteristics");
@@ -234,7 +229,6 @@ public class RulesWebServiceMediumTest {
       );
     session.commit();
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD);
     request.setParam(SearchOptions.PARAM_FIELDS, "debtChar,debtCharName,debtSubChar,debtSubCharName,debtRemFn,debtOverloaded,defaultDebtChar,defaultDebtSubChar,defaultDebtRemFn");
     WsTester.Result result = request.execute();
@@ -258,7 +252,6 @@ public class RulesWebServiceMediumTest {
       );
     session.commit();
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD);
     request.setParam(SearchOptions.PARAM_FIELDS, "debtChar,debtCharName,debtSubChar,debtSubCharName,debtRemFn,debtOverloaded,defaultDebtChar,defaultDebtSubChar,defaultDebtRemFn");
     WsTester.Result result = request.execute();
@@ -282,7 +275,6 @@ public class RulesWebServiceMediumTest {
       );
     session.commit();
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD);
     request.setParam(SearchOptions.PARAM_FIELDS, "debtChar,debtCharName,debtSubChar,debtSubCharName,debtRemFn,debtOverloaded,defaultDebtChar,defaultDebtSubChar,defaultDebtRemFn");
     WsTester.Result result = request.execute();
@@ -339,7 +331,6 @@ public class RulesWebServiceMediumTest {
       );
     session.commit();
 
-    MockUserSession.set();
     WsTester.Result result = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD)
       .setParam(SearchOptions.PARAM_FIELDS, "debtChar,debtCharName,debtSubChar,debtSubCharName,debtRemFn,debtOverloaded,defaultDebtChar,defaultDebtSubChar,defaultDebtRemFn")
       .setParam("debt_characteristics", "SOFT_RELIABILITY")
@@ -355,7 +346,6 @@ public class RulesWebServiceMediumTest {
     ruleDao.insert(session, RuleTesting.newXooX2()).setTemplateId(templateRule.getId());
     session.commit();
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD);
     request.setParam(SearchOptions.PARAM_FIELDS, "isTemplate");
     request.setParam(SearchAction.PARAM_IS_TEMPLATE, "true");
@@ -370,7 +360,6 @@ public class RulesWebServiceMediumTest {
     ruleDao.insert(session, RuleTesting.newXooX2()).setTemplateId(templateRule.getId());
     session.commit();
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD);
     request.setParam(SearchOptions.PARAM_FIELDS, "templateKey");
     request.setParam(SearchAction.PARAM_TEMPLATE_KEY, "xoo:x1");
@@ -390,7 +379,6 @@ public class RulesWebServiceMediumTest {
     tester.get(ActiveRuleDao.class).insert(session, activeRule);
     session.commit();
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD);
     request.setParam(SearchOptions.PARAM_TEXT_QUERY, "x1");
     request.setParam(SearchAction.PARAM_ACTIVATION, "true");
@@ -420,7 +408,6 @@ public class RulesWebServiceMediumTest {
 
     session.commit();
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD);
     request.setParam(SearchOptions.PARAM_TEXT_QUERY, "x1");
     request.setParam(SearchAction.PARAM_ACTIVATION, "true");
@@ -457,7 +444,6 @@ public class RulesWebServiceMediumTest {
 
     session.commit();
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD);
     request.setParam(SearchOptions.PARAM_TEXT_QUERY, "x1");
     request.setParam(SearchAction.PARAM_ACTIVATION, "true");
@@ -501,7 +487,6 @@ public class RulesWebServiceMediumTest {
     tester.get(ActiveRuleDao.class).addParam(session, activeRule, activeRuleParam2);
     session.commit();
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD);
     request.setParam(SearchOptions.PARAM_TEXT_QUERY, "x1");
     request.setParam(SearchAction.PARAM_ACTIVATION, "true");
@@ -527,7 +512,6 @@ public class RulesWebServiceMediumTest {
     ruleDao.insert(session, rule2);
     session.commit();
 
-    MockUserSession.set();
     tester.wsTester().newGetRequest(API_ENDPOINT, API_TAGS_METHOD).execute().assertJson(this.getClass(), "get_tags.json");
     tester.wsTester().newGetRequest(API_ENDPOINT, API_TAGS_METHOD)
       .setParam("ps", "1").execute().assertJson(this.getClass(), "get_tags_limited.json");
@@ -543,7 +527,6 @@ public class RulesWebServiceMediumTest {
     ruleDao.insert(session, rule);
     session.commit();
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD);
     request.setParam(SearchOptions.PARAM_FIELDS, "htmlNote, mdNote");
     WsTester.Result result = request.execute();
@@ -560,7 +543,6 @@ public class RulesWebServiceMediumTest {
       .setSystemTags(ImmutableSet.of("tag2")));
     session.commit();
 
-    MockUserSession.set();
     WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD);
     request.setParam(SearchAction.PARAM_TAGS, "tag1");
     request.setParam(SearchOptions.PARAM_FIELDS, "sysTags, tags");
@@ -604,7 +586,6 @@ public class RulesWebServiceMediumTest {
     session.commit();
 
     // 1. Sort Name Asc
-    MockUserSession.set();
     WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD);
     request.setParam(SearchOptions.PARAM_FIELDS, "");
     request.setParam(SearchOptions.PARAM_SORT, "name");
@@ -634,7 +615,6 @@ public class RulesWebServiceMediumTest {
     Date since = new Date();
 
     // 1. find today's rules
-    MockUserSession.set();
     WsTester.TestRequest request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD);
     request.setParam(SearchOptions.PARAM_FIELDS, "");
     request.setParam(SearchAction.PARAM_AVAILABLE_SINCE, DateUtils.formatDate(since));
@@ -647,7 +627,6 @@ public class RulesWebServiceMediumTest {
     c.add(Calendar.DATE, 1); // number of days to add
 
     // 2. no rules since tomorrow
-    MockUserSession.set();
     request = tester.wsTester().newGetRequest(API_ENDPOINT, API_SEARCH_METHOD);
     request.setParam(SearchOptions.PARAM_FIELDS, "");
     request.setParam(SearchAction.PARAM_AVAILABLE_SINCE, DateUtils.formatDate(c.getTime()));
index 0eb34a9428c386e965e6f25163de251ac70b668b..3a63e84a41a3072775957f66b598500d2dda1674 100644 (file)
@@ -23,6 +23,7 @@ package org.sonar.server.rule.ws;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rule.RuleStatus;
@@ -40,7 +41,7 @@ import org.sonar.server.rule.RuleService;
 import org.sonar.server.rule.RuleTesting;
 import org.sonar.server.rule.db.RuleDao;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static com.google.common.collect.Sets.newHashSet;
@@ -49,6 +50,9 @@ public class ShowActionMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester).logon()
+      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
   WsTester wsTester;
 
@@ -72,10 +76,6 @@ public class ShowActionMediumTest {
 
   @Test
   public void show_rule() throws Exception {
-    MockUserSession.set()
-      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN)
-      .setLogin("me");
-
     RuleDto ruleDto = ruleDao.insert(session,
       RuleTesting.newDto(RuleKey.of("java", "S001"))
         .setName("Rule S001")
@@ -100,10 +100,6 @@ public class ShowActionMediumTest {
 
   @Test
   public void show_rule_with_default_debt_infos() throws Exception {
-    MockUserSession.set()
-      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN)
-      .setLogin("me");
-
     CharacteristicDto characteristicDto = new CharacteristicDto().setKey("API").setName("Api").setEnabled(true);
     tester.get(CharacteristicDao.class).insert(characteristicDto, session);
     CharacteristicDto subCharacteristicDto = new CharacteristicDto().setKey("API_ABUSE").setName("API Abuse").setEnabled(true).setParentId(characteristicDto.getId());
@@ -138,10 +134,6 @@ public class ShowActionMediumTest {
 
   @Test
   public void show_rule_with_overridden_debt() throws Exception {
-    MockUserSession.set()
-      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN)
-      .setLogin("me");
-
     CharacteristicDto characteristicDto = new CharacteristicDto().setKey("API").setName("Api").setEnabled(true);
     tester.get(CharacteristicDao.class).insert(characteristicDto, session);
     CharacteristicDto subCharacteristicDto = new CharacteristicDto().setKey("API_ABUSE").setName("API Abuse").setEnabled(true).setParentId(characteristicDto.getId());
@@ -174,10 +166,6 @@ public class ShowActionMediumTest {
 
   @Test
   public void show_rule_with_default_and_overridden_debt_infos() throws Exception {
-    MockUserSession.set()
-      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN)
-      .setLogin("me");
-
     CharacteristicDto defaultCharacteristic = new CharacteristicDto().setKey("API").setName("Api").setEnabled(true);
     tester.get(CharacteristicDao.class).insert(defaultCharacteristic, session);
     CharacteristicDto defaultSubCharacteristic = new CharacteristicDto().setKey("API_ABUSE").setName("API Abuse").setEnabled(true).setParentId(defaultCharacteristic.getId());
@@ -215,10 +203,6 @@ public class ShowActionMediumTest {
 
   @Test
   public void show_rule_with_no_default_and_no_overridden_debt() throws Exception {
-    MockUserSession.set()
-      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN)
-      .setLogin("me");
-
     RuleDto ruleDto = ruleDao.insert(session,
       RuleTesting.newDto(RuleKey.of("java", "S001"))
         .setName("Rule S001")
@@ -247,10 +231,6 @@ public class ShowActionMediumTest {
 
   @Test
   public void show_rule_with_overridden_disable_debt() throws Exception {
-    MockUserSession.set()
-      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN)
-      .setLogin("me");
-
     RuleDto ruleDto = ruleDao.insert(session,
       RuleTesting.newDto(RuleKey.of("java", "S001"))
         .setName("Rule S001")
@@ -278,10 +258,6 @@ public class ShowActionMediumTest {
 
   @Test
   public void encode_html_description_of_custom_rule() throws Exception {
-    MockUserSession.set()
-      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN)
-      .setLogin("me");
-
     // Template rule
     RuleDto templateRule = ruleDao.insert(session, RuleTesting.newTemplateRule(RuleKey.of("java", "S001")));
     session.commit();
@@ -302,10 +278,6 @@ public class ShowActionMediumTest {
 
   @Test
   public void encode_html_description_of_manual_rule() throws Exception {
-    MockUserSession.set()
-      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN)
-      .setLogin("me");
-
     // Manual rule
     NewRule manualRule = NewRule.createForManualRule("MY_MANUAL")
       .setName("My manual")
index 2db2133379a3cb3836971f558f58a48fa9483684..fa6bae4d8870e4f79e7b17c9a37220e8c48524be 100644 (file)
@@ -24,6 +24,7 @@ import com.google.common.collect.ImmutableMap;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rule.RuleStatus;
@@ -38,7 +39,7 @@ import org.sonar.server.rule.RuleService;
 import org.sonar.server.rule.RuleTesting;
 import org.sonar.server.rule.db.RuleDao;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -48,6 +49,9 @@ public class UpdateActionMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester).
+      logon().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
   WsTester wsTester;
 
@@ -71,10 +75,6 @@ public class UpdateActionMediumTest {
 
   @Test
   public void update_custom_rule() throws Exception {
-    MockUserSession.set()
-      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN)
-      .setLogin("me");
-
     // Template rule
     RuleDto templateRule = ruleDao.insert(session, RuleTesting.newTemplateRule(RuleKey.of("java", "S001")));
     RuleParamDto param = RuleParamDto.createFor(templateRule).setName("regex").setType("STRING").setDescription("Reg ex").setDefaultValue(".*");
@@ -103,10 +103,6 @@ public class UpdateActionMediumTest {
 
   @Test
   public void fail_to_update_custom_when_description_is_empty() {
-    MockUserSession.set()
-      .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN)
-      .setLogin("me");
-
     // Template rule
     RuleDto templateRule = ruleDao.insert(session, RuleTesting.newTemplateRule(RuleKey.of("java", "S001")));
 
index f08ad8f41d3cabd4af935c13a5c376674e44741e..fa621d6a04ddf9ae0251114b23c98d0c631dccdf 100644 (file)
 package org.sonar.server.search;
 
 import com.google.common.collect.ImmutableList;
+import java.util.Arrays;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
-import org.sonar.server.user.MockUserSession;
-
-import java.util.Arrays;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.fail;
 
 public class QueryContextTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone().logon("john").setUserGroups("sonar-users");
 
   QueryContext options;
 
   @Before
   public void setUp() {
-    MockUserSession.set().setLogin("john").setUserGroups("sonar-users");
-    options = new QueryContext();
+    options = new QueryContext(userSessionRule);
   }
 
   @Test
index 6682c53e32105be530a6937ccbd7bbb5ffd70f31..9661a4b6ed2496929ef770aad5a25f4278afd991 100644 (file)
@@ -22,8 +22,10 @@ package org.sonar.server.search;
 
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.server.tester.ServerTester;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.fail;
@@ -32,6 +34,8 @@ public class SearchClientMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   SearchClient searchClient;
 
index c869d8b07884c2eb0f464ca0401513cb494a1e96..e25e14ddf964233e7aabbb67190f238fa0014852 100644 (file)
@@ -19,6 +19,7 @@
  */
 package org.sonar.server.source.ws;
 
+import org.junit.Rule;
 import org.sonar.server.source.db.FileSourceDao;
 
 import org.junit.After;
@@ -35,7 +36,7 @@ import org.sonar.server.component.db.ComponentDao;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.exceptions.NotFoundException;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 import org.sonar.test.DbTests;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -50,6 +51,8 @@ public class HashActionTest {
 
   @ClassRule
   public static DbTester db = new DbTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   DbSession session;
 
@@ -62,7 +65,7 @@ public class HashActionTest {
 
     DbClient dbClient = new DbClient(db.database(), db.myBatis(), new FileSourceDao(db.myBatis()), new ComponentDao());
 
-    tester = new WsTester(new SourcesWs(new HashAction(dbClient)));
+    tester = new WsTester(new SourcesWs(new HashAction(dbClient, userSessionRule)));
   }
 
   @After
@@ -73,7 +76,7 @@ public class HashActionTest {
   @Test
   public void show_hashes() throws Exception {
     db.prepareDbUnit(getClass(), "shared.xml");
-    MockUserSession.set().setLogin("polop").addProjectUuidPermissions(UserRole.USER, PROJECT_UUID);
+    userSessionRule.logon("polop").addProjectUuidPermissions(UserRole.USER, PROJECT_UUID);
 
     WsTester.TestRequest request = tester.newGetRequest("api/sources", "hash").setParam("key", COMPONENT_KEY);
     assertThat(request.execute().outputAsString()).isEqualTo("987654");
@@ -82,7 +85,7 @@ public class HashActionTest {
   @Test
   public void hashes_empty_if_no_source() throws Exception {
     db.prepareDbUnit(getClass(), "no_source.xml");
-    MockUserSession.set().setLogin("polop").addProjectUuidPermissions(UserRole.USER, PROJECT_UUID);
+    userSessionRule.logon("polop").addProjectUuidPermissions(UserRole.USER, PROJECT_UUID);
 
     WsTester.TestRequest request = tester.newGetRequest("api/sources", "hash").setParam("key", COMPONENT_KEY);
     request.execute().assertNoContent();
@@ -90,7 +93,7 @@ public class HashActionTest {
 
   @Test
   public void fail_to_show_hashes_if_file_does_not_exist() {
-    MockUserSession.set().setLogin("polop").addProjectUuidPermissions(UserRole.USER, PROJECT_UUID);
+    userSessionRule.logon("polop").addProjectUuidPermissions(UserRole.USER, PROJECT_UUID);
     try {
       WsTester.TestRequest request = tester.newGetRequest("api/sources", "hash").setParam("key", COMPONENT_KEY);
       request.execute();
@@ -104,7 +107,7 @@ public class HashActionTest {
   public void fail_on_missing_permission() throws Exception {
     db.prepareDbUnit(getClass(), "shared.xml");
 
-    MockUserSession.set().setLogin("polop");
+    userSessionRule.logon("polop");
     tester.newGetRequest("api/sources", "hash").setParam("key", COMPONENT_KEY).execute();
   }
 }
index 32dc4aa4b04faf5642e84ac772b736a1e6175bb3..e73ffc217cc064d4a372df5cd22ca243869d428a 100644 (file)
@@ -21,6 +21,7 @@
 package org.sonar.server.source.ws;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -34,7 +35,7 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.source.SourceService;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static com.google.common.collect.Lists.newArrayList;
@@ -43,6 +44,8 @@ import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class IndexActionTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   @Mock
   DbClient dbClient;
@@ -65,13 +68,13 @@ public class IndexActionTest {
   public void setUp() {
     when(dbClient.componentDao()).thenReturn(componentDao);
     when(dbClient.openSession(false)).thenReturn(session);
-    tester = new WsTester(new SourcesWs(new IndexAction(dbClient, sourceService)));
+    tester = new WsTester(new SourcesWs(new IndexAction(dbClient, sourceService, userSessionRule)));
   }
 
   @Test
   public void get_json() throws Exception {
     String fileKey = "src/Foo.java";
-    MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, "polop", fileKey);
+    userSessionRule.addComponentPermission(UserRole.CODEVIEWER, "polop", fileKey);
     when(componentDao.getByKey(session, fileKey)).thenReturn(file);
 
     when(sourceService.getLinesAsTxt(file.uuid(), 1, null)).thenReturn(newArrayList(
@@ -86,7 +89,7 @@ public class IndexActionTest {
   @Test
   public void limit_range() throws Exception {
     String fileKey = "src/Foo.java";
-    MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, "polop", fileKey);
+    userSessionRule.addComponentPermission(UserRole.CODEVIEWER, "polop", fileKey);
     when(componentDao.getByKey(session, fileKey)).thenReturn(file);
 
     when(sourceService.getLinesAsTxt(file.uuid(), 1, 2)).thenReturn(newArrayList(
@@ -101,14 +104,13 @@ public class IndexActionTest {
 
   @Test(expected = ForbiddenException.class)
   public void requires_code_viewer_permission() throws Exception {
-    MockUserSession.set();
     tester.newGetRequest("api/sources", "index").setParam("resource", "any").execute();
   }
 
   @Test
   public void close_db_session() throws Exception {
     String fileKey = "src/Foo.java";
-    MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, "polop", fileKey);
+    userSessionRule.addComponentPermission(UserRole.CODEVIEWER, "polop", fileKey);
     when(componentDao.getByKey(session, fileKey)).thenThrow(new NotFoundException());
 
     WsTester.TestRequest request = tester.newGetRequest("api/sources", "index").setParam("resource", fileKey);
index c1da0aca749950df5a39681ab29763091ce01ec0..e838bbd5233d822625e16158a06536e3f437353f 100644 (file)
 package org.sonar.server.source.ws;
 
 import com.google.common.collect.ImmutableList;
+import java.util.Date;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.config.Settings;
 import org.sonar.api.web.UserRole;
@@ -40,11 +42,9 @@ import org.sonar.server.source.HtmlSourceDecorator;
 import org.sonar.server.source.index.SourceLineDoc;
 import org.sonar.server.source.index.SourceLineIndex;
 import org.sonar.server.source.index.SourceLineIndexDefinition;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
-import java.util.Date;
-
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown;
 import static org.junit.Assert.fail;
@@ -57,9 +57,10 @@ public class LinesActionTest {
 
   @ClassRule
   public static EsTester esTester = new EsTester().addDefinitions(new SourceLineIndexDefinition(new Settings()));
-
   @ClassRule
   public static DbTester dbTester = new DbTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   SourceLineIndex sourceLineIndex;
 
@@ -81,9 +82,7 @@ public class LinesActionTest {
     componentDao = new ComponentDao();
     DbClient dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), componentDao);
     session = dbClient.openSession(false);
-    wsTester = new WsTester(new SourcesWs(new LinesAction(dbClient, sourceLineIndex, htmlSourceDecorator)));
-
-    MockUserSession.set();
+    wsTester = new WsTester(new SourcesWs(new LinesAction(dbClient, sourceLineIndex, htmlSourceDecorator, userSessionRule)));
   }
 
   @After
@@ -156,7 +155,7 @@ public class LinesActionTest {
 
     esTester.putDocuments(SourceLineIndexDefinition.INDEX, SourceLineIndexDefinition.TYPE, line1, line2, line3);
 
-    MockUserSession.set().setLogin("login").addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
+    userSessionRule.logon("login").addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
 
     WsTester.TestRequest request = wsTester.newGetRequest("api/sources", "lines").setParam("uuid", FILE_UUID);
     request.execute().assertJson(getClass(), "show_source.json");
@@ -166,7 +165,7 @@ public class LinesActionTest {
   public void fail_to_show_source_if_no_source_found() {
     newFile();
 
-    MockUserSession.set().setLogin("login").addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
+    userSessionRule.logon("login").addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
 
     try {
       WsTester.TestRequest request = wsTester.newGetRequest("api/sources", "lines").setParam("uuid", FILE_UUID);
@@ -181,7 +180,7 @@ public class LinesActionTest {
   public void show_source_with_from_and_to_params() throws Exception {
     newFile();
 
-    MockUserSession.set().setLogin("login").addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
+    userSessionRule.logon("login").addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
 
     esTester.putDocuments(SourceLineIndexDefinition.INDEX, SourceLineIndexDefinition.TYPE,
       new SourceLineDoc()
@@ -237,7 +236,7 @@ public class LinesActionTest {
         .setUpdateDate(new Date())
     );
 
-    MockUserSession.set().setLogin("login").addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
+    userSessionRule.logon("login").addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
 
     WsTester.TestRequest request = wsTester.newGetRequest("api/sources", "lines").setParam("key", FILE_KEY);
     request.execute().assertJson(getClass(), "show_source_by_file_key.json");
@@ -246,7 +245,7 @@ public class LinesActionTest {
   @Test
   public void fail_when_no_uuid_or_key_param() throws Exception {
     newFile();
-    MockUserSession.set().setLogin("login").addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
+    userSessionRule.logon("login").addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
     WsTester.TestRequest request = wsTester.newGetRequest("api/sources", "lines");
 
     try {
@@ -261,7 +260,7 @@ public class LinesActionTest {
   public void should_check_permission() throws Exception {
     newFile();
 
-    MockUserSession.set().setLogin("login");
+    userSessionRule.logon("login");
 
     wsTester.newGetRequest("api/sources", "lines")
       .setParam("uuid", FILE_UUID)
index 2f4c27d729624ec2c8426053792751b86cb57f6e..6b53c32faa4557770c74df8324e84d0fb2761d3e 100644 (file)
@@ -21,6 +21,7 @@
 package org.sonar.server.source.ws;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -33,7 +34,7 @@ import org.sonar.server.component.db.ComponentDao;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.source.SourceService;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static com.google.common.collect.Lists.newArrayList;
@@ -42,6 +43,8 @@ import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class RawActionTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   @Mock
   DbClient dbClient;
@@ -64,13 +67,13 @@ public class RawActionTest {
   public void setUp() {
     when(dbClient.componentDao()).thenReturn(componentDao);
     when(dbClient.openSession(false)).thenReturn(session);
-    tester = new WsTester(new SourcesWs(new RawAction(dbClient, sourceService)));
+    tester = new WsTester(new SourcesWs(new RawAction(dbClient, sourceService, userSessionRule)));
   }
 
   @Test
   public void get_txt() throws Exception {
     String fileKey = "src/Foo.java";
-    MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, "polop", fileKey);
+    userSessionRule.addComponentPermission(UserRole.CODEVIEWER, "polop", fileKey);
     when(componentDao.getByKey(session, fileKey)).thenReturn(file);
 
     when(sourceService.getLinesAsTxt(file.uuid(), null, null)).thenReturn(newArrayList(
@@ -85,7 +88,6 @@ public class RawActionTest {
 
   @Test(expected = ForbiddenException.class)
   public void requires_code_viewer_permission() throws Exception {
-    MockUserSession.set();
     tester.newGetRequest("api/sources", "raw").setParam("key", "any").execute();
   }
 }
index 83d87337034dc5f6ff149c6e04adba94824c2460..25de3e5c916688044880cafc379706b532efd573 100644 (file)
 
 package org.sonar.server.source.ws;
 
+import java.util.Date;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.config.Settings;
 import org.sonar.api.utils.DateUtils;
@@ -38,11 +40,9 @@ import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.source.index.SourceLineDoc;
 import org.sonar.server.source.index.SourceLineIndex;
 import org.sonar.server.source.index.SourceLineIndexDefinition;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
-import java.util.Date;
-
 public class ScmActionTest {
 
   private static final String FILE_KEY = "FILE_KEY";
@@ -51,9 +51,10 @@ public class ScmActionTest {
 
   @ClassRule
   public static DbTester dbTester = new DbTester();
-
   @ClassRule
   public static EsTester esTester = new EsTester().addDefinitions(new SourceLineIndexDefinition(new Settings()));
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   WsTester tester;
 
@@ -68,7 +69,7 @@ public class ScmActionTest {
     dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), new ComponentDao());
     session = dbClient.openSession(false);
 
-    tester = new WsTester(new SourcesWs(new ScmAction(dbClient, new SourceLineIndex(esTester.client()))));
+    tester = new WsTester(new SourcesWs(new ScmAction(dbClient, new SourceLineIndex(esTester.client()), userSessionRule)));
   }
 
   @After
@@ -79,7 +80,7 @@ public class ScmActionTest {
   @Test
   public void show_scm() throws Exception {
     initFile();
-    MockUserSession.set().addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
+    userSessionRule.addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
 
     esTester.putDocuments(SourceLineIndexDefinition.INDEX, SourceLineIndexDefinition.TYPE,
       newSourceLine("julien", "123-456-789", DateUtils.parseDateTime("2015-03-30T12:34:56+0000"), 1)
@@ -92,7 +93,7 @@ public class ScmActionTest {
   @Test
   public void show_scm_from_given_range_lines() throws Exception {
     initFile();
-    MockUserSession.set().addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
+    userSessionRule.addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
 
     esTester.putDocuments(SourceLineIndexDefinition.INDEX, SourceLineIndexDefinition.TYPE,
       newSourceLine("julien", "123-456-789", DateUtils.parseDateTime("2015-03-30T12:34:56+0000"), 1),
@@ -108,7 +109,7 @@ public class ScmActionTest {
   @Test
   public void not_group_lines_by_commit() throws Exception {
     initFile();
-    MockUserSession.set().addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
+    userSessionRule.addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
 
     // lines 1 and 2 are the same commit, but not 3 (different date)
     esTester.putDocuments(SourceLineIndexDefinition.INDEX, SourceLineIndexDefinition.TYPE,
@@ -125,7 +126,7 @@ public class ScmActionTest {
   @Test
   public void group_lines_by_commit() throws Exception {
     initFile();
-    MockUserSession.set().addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
+    userSessionRule.addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
 
     // lines 1 and 2 are the same commit, but not 3 (different date)
     esTester.putDocuments(SourceLineIndexDefinition.INDEX, SourceLineIndexDefinition.TYPE,
@@ -142,7 +143,7 @@ public class ScmActionTest {
   @Test
   public void accept_negative_value_in_from_parameter() throws Exception {
     initFile();
-    MockUserSession.set().addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
+    userSessionRule.addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
 
     esTester.putDocuments(SourceLineIndexDefinition.INDEX, SourceLineIndexDefinition.TYPE,
       newSourceLine("julien", "123-456-789", DateUtils.parseDateTime("2015-03-30T12:34:56+0000"), 1),
@@ -158,7 +159,7 @@ public class ScmActionTest {
   @Test
   public void return_empty_value_when_no_scm() throws Exception {
     initFile();
-    MockUserSession.set().addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
+    userSessionRule.addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
 
     esTester.putDocuments(SourceLineIndexDefinition.INDEX, SourceLineIndexDefinition.TYPE,
       newSourceLine(null, null, null, 1)
@@ -171,7 +172,7 @@ public class ScmActionTest {
   @Test(expected = ForbiddenException.class)
   public void fail_without_code_viewer_permission() throws Exception {
     initFile();
-    MockUserSession.set().addProjectUuidPermissions(UserRole.USER, PROJECT_UUID);
+    userSessionRule.addProjectUuidPermissions(UserRole.USER, PROJECT_UUID);
 
     WsTester.TestRequest request = tester.newGetRequest("api/sources", "scm").setParam("key", FILE_KEY);
     request.execute();
index 3600020ac85a297d34e1dcbae7e6a8e517eaab2d..f8647337c6073348e605818d6e6734567ff337ba 100644 (file)
@@ -20,6 +20,7 @@
 package org.sonar.server.source.ws;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -32,14 +33,20 @@ import org.sonar.server.component.db.ComponentDao;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.source.SourceService;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static com.google.common.collect.Lists.newArrayList;
-import static org.mockito.Mockito.*;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class ShowActionTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   SourceService sourceService = mock(SourceService.class);
 
@@ -61,13 +68,13 @@ public class ShowActionTest {
   public void setUp() {
     when(dbClient.componentDao()).thenReturn(componentDao);
     when(dbClient.openSession(false)).thenReturn(session);
-    tester = new WsTester(new SourcesWs(new ShowAction(sourceService, dbClient)));
+    tester = new WsTester(new SourcesWs(new ShowAction(sourceService, dbClient, userSessionRule)));
   }
 
   @Test
   public void show_source() throws Exception {
     String fileKey = "src/Foo.java";
-    MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, "polop", fileKey);
+    userSessionRule.addComponentPermission(UserRole.CODEVIEWER, "polop", fileKey);
     when(componentDao.getByKey(session, fileKey)).thenReturn(file);
     when(sourceService.getLinesAsHtml(eq(file.uuid()), anyInt(), anyInt())).thenReturn(newArrayList(
       "/*",
@@ -85,7 +92,7 @@ public class ShowActionTest {
   @Test
   public void show_source_with_from_and_to_params() throws Exception {
     String fileKey = "src/Foo.java";
-    MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, "polop", fileKey);
+    userSessionRule.addComponentPermission(UserRole.CODEVIEWER, "polop", fileKey);
     when(componentDao.getByKey(session, fileKey)).thenReturn(file);
     when(sourceService.getLinesAsHtml(file.uuid(), 3, 5)).thenReturn(newArrayList(
       " */",
@@ -103,7 +110,7 @@ public class ShowActionTest {
   @Test
   public void show_source_accept_from_less_than_one() throws Exception {
     String fileKey = "src/Foo.java";
-    MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, "polop", fileKey);
+    userSessionRule.addComponentPermission(UserRole.CODEVIEWER, "polop", fileKey);
     when(componentDao.getByKey(session, fileKey)).thenReturn(file);
     when(sourceService.getLinesAsHtml(file.uuid(), 1, 5)).thenReturn(newArrayList(
       " */",
@@ -122,7 +129,6 @@ public class ShowActionTest {
   @Test(expected = ForbiddenException.class)
   public void require_code_viewer() throws Exception {
     String fileKey = "src/Foo.java";
-    MockUserSession.set();
     tester.newGetRequest("api/sources", "show").setParam("key", fileKey).execute();
   }
 }
index dc7022937cc342b79b007cbb0fd5fc6213a7d535..4db59860efeb90237b5173df1f8bf1fc4a47f2a8 100644 (file)
 
 package org.sonar.server.source.ws;
 
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.server.ws.WebService;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.source.HtmlSourceDecorator;
 import org.sonar.server.source.SourceService;
 import org.sonar.server.source.index.SourceLineIndex;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 public class SourcesWsTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
-  ShowAction showAction = new ShowAction(mock(SourceService.class), mock(DbClient.class));
-  RawAction rawAction = new RawAction(mock(DbClient.class), mock(SourceService.class));
-  LinesAction linesAction = new LinesAction(mock(DbClient.class), mock(SourceLineIndex.class), mock(HtmlSourceDecorator.class));
-  HashAction hashAction = new HashAction(mock(DbClient.class));
-  IndexAction indexAction = new IndexAction(mock(DbClient.class), mock(SourceService.class));
+  ShowAction showAction = new ShowAction(mock(SourceService.class), mock(DbClient.class), userSessionRule);
+  RawAction rawAction = new RawAction(mock(DbClient.class), mock(SourceService.class), userSessionRule);
+  LinesAction linesAction = new LinesAction(mock(DbClient.class), mock(SourceLineIndex.class), mock(HtmlSourceDecorator.class), userSessionRule);
+  HashAction hashAction = new HashAction(mock(DbClient.class), userSessionRule);
+  IndexAction indexAction = new IndexAction(mock(DbClient.class), mock(SourceService.class), userSessionRule);
   WsTester tester = new WsTester(new SourcesWs(showAction, rawAction, linesAction, hashAction, indexAction));
 
   @Test
index abefeed4382c2dece69aa919ee0078506b871d90..f018335a00ea382a34875ea3b7afad96ad62d8a3 100644 (file)
@@ -20,7 +20,9 @@
 
 package org.sonar.server.test;
 
+import java.util.Collections;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.junit.runner.RunWith;
@@ -33,18 +35,23 @@ import org.sonar.core.component.SnapshotPerspectives;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.core.persistence.MyBatis;
 import org.sonar.server.measure.persistence.MeasureDao;
-import org.sonar.server.user.MockUserSession;
-
-import java.util.Collections;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.*;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class CoverageServiceTest {
 
   static final String COMPONENT_KEY = "org.sonar.sample:Sample";
-  @org.junit.Rule
+
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
+  @Rule
   public ExpectedException thrown = ExpectedException.none();
   @Mock
   DbSession session;
@@ -58,13 +65,13 @@ public class CoverageServiceTest {
   public void setUp() {
     MyBatis myBatis = mock(MyBatis.class);
     when(myBatis.openSession(false)).thenReturn(session);
-    service = new CoverageService(myBatis, measureDao, snapshotPerspectives);
+    service = new CoverageService(myBatis, measureDao, snapshotPerspectives, userSessionRule);
   }
 
   @Test
   public void check_permission() {
     String projectKey = "org.sonar.sample";
-    MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, projectKey, COMPONENT_KEY);
+    userSessionRule.addComponentPermission(UserRole.CODEVIEWER, projectKey, COMPONENT_KEY);
 
     service.checkPermission(COMPONENT_KEY);
   }
index 65aa8094bb948d3b5aa2d1a860098e4711c9ea65..635b215edf2d6232fed0e64872410124e6347c57 100644 (file)
 
 package org.sonar.server.test.ws;
 
+import java.util.Arrays;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.web.UserRole;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.test.index.CoveredFileDoc;
 import org.sonar.server.test.index.TestIndex;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
-import java.util.Arrays;
-
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyList;
 import static org.mockito.Matchers.anyString;
@@ -43,6 +43,8 @@ import static org.sonar.server.component.ComponentTesting.newProjectDto;
 import static org.sonar.server.test.ws.TestsCoveredFilesAction.TEST_UUID;
 
 public class TestsCoveredFilesActionTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   WsTester ws;
   private DbClient dbClient;
@@ -52,12 +54,12 @@ public class TestsCoveredFilesActionTest {
   public void setUp() {
     dbClient = mock(DbClient.class, RETURNS_DEEP_STUBS);
     testIndex = mock(TestIndex.class, RETURNS_DEEP_STUBS);
-    ws = new WsTester(new TestsWs(new TestsCoveredFilesAction(dbClient, testIndex)));
+    ws = new WsTester(new TestsWs(new TestsCoveredFilesAction(dbClient, testIndex, userSessionRule)));
   }
 
   @Test
   public void covered_files() throws Exception {
-    MockUserSession.set().addComponentUuidPermission(UserRole.CODEVIEWER, "SonarQube", "test-file-uuid");
+    userSessionRule.addComponentUuidPermission(UserRole.CODEVIEWER, "SonarQube", "test-file-uuid");
 
     when(testIndex.searchByTestUuid(anyString()).fileUuid()).thenReturn("test-file-uuid");
     when(testIndex.coveredFiles("test-uuid")).thenReturn(Arrays.asList(
index 6a33608844eedad3240e22d56a67d3e1c58add35..27862aeb2b7409e0ce1cbcaad531f48f7770174b 100644 (file)
 
 package org.sonar.server.test.ws;
 
+import java.util.Arrays;
+import java.util.List;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.config.Settings;
 import org.sonar.api.web.UserRole;
@@ -37,12 +40,9 @@ import org.sonar.server.test.index.CoveredFileDoc;
 import org.sonar.server.test.index.TestDoc;
 import org.sonar.server.test.index.TestIndex;
 import org.sonar.server.test.index.TestIndexDefinition;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
-import java.util.Arrays;
-import java.util.List;
-
 public class TestsListActionTest {
   DbClient dbClient;
   DbSession dbSession;
@@ -54,6 +54,8 @@ public class TestsListActionTest {
   public static DbTester db = new DbTester();
   @ClassRule
   public static EsTester es = new EsTester().addDefinitions(new TestIndexDefinition(new Settings()));
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   @Before
   public void setUp() {
@@ -63,7 +65,7 @@ public class TestsListActionTest {
     es.truncateIndices();
     testIndex = new TestIndex(es.client());
 
-    ws = new WsTester(new TestsWs(new TestsListAction(dbClient, testIndex)));
+    ws = new WsTester(new TestsWs(new TestsListAction(dbClient, testIndex, userSessionRule)));
   }
 
   @After
@@ -73,7 +75,7 @@ public class TestsListActionTest {
 
   @Test
   public void list_based_on_test_uuid() throws Exception {
-    MockUserSession.set().addProjectUuidPermissions(UserRole.CODEVIEWER, TestFile1.PROJECT_UUID);
+    userSessionRule.addProjectUuidPermissions(UserRole.CODEVIEWER, TestFile1.PROJECT_UUID);
 
     dbClient.componentDao().insert(dbSession, TestFile1.newDto());
     dbSession.commit();
@@ -97,7 +99,7 @@ public class TestsListActionTest {
 
   @Test
   public void list_based_on_test_file_uuid() throws Exception {
-    MockUserSession.set().addProjectUuidPermissions(UserRole.CODEVIEWER, TestFile1.PROJECT_UUID);
+    userSessionRule.addProjectUuidPermissions(UserRole.CODEVIEWER, TestFile1.PROJECT_UUID);
     dbClient.componentDao().insert(dbSession, TestFile1.newDto());
     dbSession.commit();
 
@@ -119,7 +121,7 @@ public class TestsListActionTest {
 
   @Test
   public void list_based_on_test_file_key() throws Exception {
-    MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, TestFile1.PROJECT_UUID, TestFile1.KEY);
+    userSessionRule.addComponentPermission(UserRole.CODEVIEWER, TestFile1.PROJECT_UUID, TestFile1.KEY);
     dbClient.componentDao().insert(dbSession, TestFile1.newDto());
     dbSession.commit();
 
@@ -143,7 +145,7 @@ public class TestsListActionTest {
   @Test
   public void list_based_on_main_file_and_line_number() throws Exception {
     String mainFileUuid = "MAIN-FILE-UUID";
-    MockUserSession.set().addProjectUuidPermissions(UserRole.CODEVIEWER, TestFile1.PROJECT_UUID);
+    userSessionRule.addProjectUuidPermissions(UserRole.CODEVIEWER, TestFile1.PROJECT_UUID);
     dbClient.componentDao().insert(dbSession,
       new ComponentDto()
         .setUuid(TestFile1.FILE_UUID)
@@ -201,7 +203,7 @@ public class TestsListActionTest {
 
   @Test(expected = ForbiddenException.class)
   public void fail_when_no_sufficent_privilege_on_file_uuid() throws Exception {
-    MockUserSession.set().addProjectUuidPermissions(UserRole.USER, TestFile1.PROJECT_UUID);
+    userSessionRule.addProjectUuidPermissions(UserRole.USER, TestFile1.PROJECT_UUID);
     dbClient.componentDao().insert(dbSession, TestFile1.newDto());
     dbSession.commit();
     ws.newGetRequest("api/tests", "list").setParam(TestsListAction.TEST_FILE_UUID, TestFile1.FILE_UUID).execute();
@@ -209,7 +211,7 @@ public class TestsListActionTest {
 
   @Test(expected = ForbiddenException.class)
   public void fail_when_no_sufficent_privilege_on_test_uuid() throws Exception {
-    MockUserSession.set().addProjectUuidPermissions(UserRole.USER, TestFile1.PROJECT_UUID);
+    userSessionRule.addProjectUuidPermissions(UserRole.USER, TestFile1.PROJECT_UUID);
     dbClient.componentDao().insert(dbSession, TestFile1.newDto());
     dbSession.commit();
     ws.newGetRequest("api/tests", "list").setParam(TestsListAction.TEST_FILE_UUID, TestFile1.FILE_UUID).execute();
@@ -217,7 +219,7 @@ public class TestsListActionTest {
 
   @Test(expected = ForbiddenException.class)
   public void fail_when_no_sufficent_privilege_on_file_key() throws Exception {
-    MockUserSession.set().addProjectUuidPermissions(UserRole.USER, TestFile1.PROJECT_UUID);
+    userSessionRule.addProjectUuidPermissions(UserRole.USER, TestFile1.PROJECT_UUID);
     dbClient.componentDao().insert(dbSession, TestFile1.newDto());
     dbSession.commit();
     ws.newGetRequest("api/tests", "list").setParam(TestsListAction.TEST_FILE_KEY, TestFile1.KEY).execute();
@@ -225,7 +227,7 @@ public class TestsListActionTest {
 
   @Test(expected = ForbiddenException.class)
   public void fail_when_no_sufficient_privilege_on_main_file_uuid() throws Exception {
-    MockUserSession.set().addProjectUuidPermissions(UserRole.USER, TestFile1.PROJECT_UUID);
+    userSessionRule.addProjectUuidPermissions(UserRole.USER, TestFile1.PROJECT_UUID);
     String mainFileUuid = "MAIN-FILE-UUID";
     dbClient.componentDao().insert(dbSession, new ComponentDto().setUuid(mainFileUuid).setProjectUuid(TestFile1.PROJECT_UUID));
     dbSession.commit();
index b854c9cd419ab06a2844a76d97c1a87add1e1edb..c052d9c03bd886ceb97d15532194092aef3a31f8 100644 (file)
 package org.sonar.server.test.ws;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.server.ws.WebService;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.test.index.TestIndex;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 public class TestsWsTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   WebService.Controller controller;
 
   @Before
   public void setUp() {
     WsTester tester = new WsTester(new TestsWs(
-      new TestsListAction(mock(DbClient.class), mock(TestIndex.class)),
-      new TestsCoveredFilesAction(mock(DbClient.class), mock(TestIndex.class))));
+      new TestsListAction(mock(DbClient.class), mock(TestIndex.class), userSessionRule),
+      new TestsCoveredFilesAction(mock(DbClient.class), mock(TestIndex.class), userSessionRule)));
     controller = tester.controller("api/tests");
   }
 
diff --git a/server/sonar-server/src/test/java/org/sonar/server/tester/AnonymousMockUserSession.java b/server/sonar-server/src/test/java/org/sonar/server/tester/AnonymousMockUserSession.java
new file mode 100644 (file)
index 0000000..799c425
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.tester;
+
+import org.sonar.server.exceptions.UnauthorizedException;
+import org.sonar.server.user.UserSession;
+
+public class AnonymousMockUserSession extends MockUserSession {
+  public AnonymousMockUserSession() {
+    super();
+  }
+
+  @Override
+  public boolean isLoggedIn() {
+    return false;
+  }
+
+  @Override
+  public UserSession checkLoggedIn() {
+    throw new UnauthorizedException("Authentication is required");
+  }
+
+}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/tester/MockUserSession.java b/server/sonar-server/src/test/java/org/sonar/server/tester/MockUserSession.java
new file mode 100644 (file)
index 0000000..25b5f20
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.tester;
+
+import com.google.common.base.Preconditions;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import javax.annotation.Nullable;
+import org.sonar.server.user.AbstractUserSession;
+import org.sonar.server.user.UserSession;
+
+import static com.google.common.collect.Lists.newArrayList;
+import static com.google.common.collect.Maps.newHashMap;
+
+public class MockUserSession extends AbstractUserSession<MockUserSession> implements UserSession {
+  private Map<String, String> projectKeyByComponentKey = newHashMap();
+
+  protected MockUserSession() {
+    super(MockUserSession.class);
+  }
+
+  public MockUserSession(String login) {
+    this();
+    setLogin(Preconditions.checkNotNull(login));
+  }
+
+  public MockUserSession(MockUserSession ruleUserSession) {
+    this();
+    this.userId = ruleUserSession.userId;
+    this.login = ruleUserSession.login;
+    this.userGroups = ruleUserSession.userGroups;
+    this.globalPermissions = ruleUserSession.globalPermissions;
+    this.projectKeyByPermission = ruleUserSession.projectKeyByPermission;
+    this.projectUuidByPermission = ruleUserSession.projectUuidByPermission;
+    this.projectUuidByComponentUuid = ruleUserSession.projectUuidByComponentUuid;
+    this.projectPermissions = ruleUserSession.projectPermissions;
+    this.name = ruleUserSession.name;
+    this.locale = ruleUserSession.locale;
+  }
+
+  @Override
+  public boolean isLoggedIn() {
+    return true;
+  }
+
+  public MockUserSession setGlobalPermissions(String... globalPermissions) {
+    this.globalPermissions = Arrays.asList(globalPermissions);
+    return this;
+  }
+
+  @Override
+  public MockUserSession setLogin(@Nullable String s) {
+    return super.setLogin(s);
+  }
+
+  @Override
+  public MockUserSession setName(@Nullable String s) {
+    return super.setName(s);
+  }
+
+  @Override
+  public MockUserSession setUserId(@Nullable Integer userId) {
+    return super.setUserId(userId);
+  }
+
+  @Override
+  public MockUserSession setUserGroups(@Nullable String... userGroups) {
+    return super.setUserGroups(userGroups);
+  }
+
+  @Override
+  public MockUserSession setLocale(@Nullable Locale l) {
+    return super.setLocale(l);
+  }
+
+  /**
+   * Deprecated, please use {@link #addProjectUuidPermissions}
+   */
+  @Deprecated
+  public MockUserSession addProjectPermissions(String projectPermission, String... projectKeys) {
+    this.projectPermissions.add(projectPermission);
+    this.projectKeyByPermission.putAll(projectPermission, newArrayList(projectKeys));
+    return this;
+  }
+
+  public MockUserSession addProjectUuidPermissions(String projectPermission, String... projectUuids) {
+    this.projectPermissions.add(projectPermission);
+    this.projectUuidByPermission.putAll(projectPermission, newArrayList(projectUuids));
+    return this;
+  }
+
+  /**
+   * Deprecated, please use {@link #addComponentUuidPermission}
+   */
+  @Deprecated
+  public MockUserSession addComponentPermission(String projectPermission, String projectKey, String componentKey) {
+    this.projectKeyByComponentKey.put(componentKey, projectKey);
+    addProjectPermissions(projectPermission, projectKey);
+    return this;
+  }
+
+  public MockUserSession addComponentUuidPermission(String projectPermission, String projectUuid, String componentUuid) {
+    this.projectUuidByComponentUuid.put(componentUuid, projectUuid);
+    addProjectUuidPermissions(projectPermission, projectUuid);
+    return this;
+  }
+
+  @Override
+  public List<String> globalPermissions() {
+    return globalPermissions;
+  }
+
+  @Override
+  public boolean hasProjectPermission(String permission, String projectKey) {
+    return projectPermissions.contains(permission) && projectKeyByPermission.get(permission).contains(projectKey);
+  }
+
+  @Override
+  public boolean hasProjectPermissionByUuid(String permission, String projectUuid) {
+    return projectPermissions.contains(permission) && projectUuidByPermission.get(permission).contains(projectUuid);
+  }
+
+  @Override
+  public boolean hasComponentPermission(String permission, String componentKey) {
+    String projectKey = projectKeyByComponentKey.get(componentKey);
+    return projectKey != null && hasProjectPermission(permission, projectKey);
+  }
+
+  @Override
+  public boolean hasComponentUuidPermission(String permission, String componentUuid) {
+    String projectUuid = projectUuidByComponentUuid.get(componentUuid);
+    return projectUuid != null && hasProjectPermissionByUuid(permission, projectUuid);
+  }
+}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/tester/MockUserSessionTest.java b/server/sonar-server/src/test/java/org/sonar/server/tester/MockUserSessionTest.java
new file mode 100644 (file)
index 0000000..f324062
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.tester;
+
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class MockUserSessionTest {
+  @Test
+  public void set_mock_session() {
+    MockUserSession mock = new MockUserSession("simon").setUserGroups("sonar-users");
+
+    assertThat(mock.login()).isEqualTo("simon");
+    assertThat(mock.userGroups()).containsOnly("sonar-users", "Anyone");
+    assertThat(mock.globalPermissions()).isEmpty();
+    assertThat(mock.isLoggedIn()).isTrue();
+  }
+}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/tester/UserSessionRule.java b/server/sonar-server/src/test/java/org/sonar/server/tester/UserSessionRule.java
new file mode 100644 (file)
index 0000000..32ab416
--- /dev/null
@@ -0,0 +1,316 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.tester;
+
+import com.google.common.base.Preconditions;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+import org.sonar.server.user.ThreadLocalUserSession;
+import org.sonar.server.user.UserSession;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
+
+/**
+ * {@code UserSessionRule} is intended to be used as a {@link org.junit.Rule} to easily manage {@link UserSession} in
+ * unit tests.
+ * <p>
+ * It can be used as a {@link org.junit.ClassRule} but be careful not to modify its states from inside tests methods
+ * unless you purposely want to have side effects between each tests.
+ * </p>
+ * <p>
+ * {@code UserSessionRule} is intended to be used either standalone (in which case use the static factory method
+ * {@link #standalone()} or with {@link ServerTester} (in which case use static factory method
+ * {@link #forServerTester(ServerTester)}).
+ * </p>
+ * <p>
+ * In both cases, one can define user session behavior which should apply on all tests directly on the property, eg.:
+ * <pre>
+ * {@literal @}Rule
+ * public UserSessionRule userSessionRule = UserSessionRule.standalone().logon("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+ * </pre>
+ * </p>
+ * <p>
+ * Behavior defined at property-level can obviously be override at test method level. For example, one could define
+ * all methods to use an authenticated session such as presented above but can easily overwrite that behavior in a
+ * specific test method as follow:
+ * <pre>
+ * {@literal @}Test
+ * public void test_method() {
+ *   userSessionRule.standalone();
+ *   {@literal [...]}
+ * }
+ * </pre>
+ * </p>
+ * <p>
+ * {@code UserSessionRule}, being standalone or associated to a {@link ServerTester}, emulates by default an anonymous
+ * session. Therefore, call {@code UserSessionRule.standalone()} is equivalent to calling
+ * {@code UserSessionRule.standalone().anonymous()}.
+ * </p>
+ * <p>
+ * To emulate an identified user, either use method {@link #logon(String)} if you want to specify the user's login, or
+ * method {@link #logon()} which will do the same but using the value of {@link #DEFAULT_LOGIN} as the user's login.
+ * </p>
+ */
+public class UserSessionRule implements TestRule, UserSession {
+  public static final String DEFAULT_LOGIN = "default_login";
+
+  @CheckForNull
+  private final ServerTester serverTester;
+  private UserSession currentUserSession;
+
+  private UserSessionRule(@Nullable ServerTester serverTester) {
+    this.serverTester = serverTester;
+    anonymous();
+  }
+
+  public static UserSessionRule standalone() {
+    return new UserSessionRule(null);
+  }
+
+  public static UserSessionRule forServerTester(ServerTester serverTester) {
+    return new UserSessionRule(Preconditions.checkNotNull(serverTester));
+  }
+
+  /**
+   * Log on with the default login {@link #DEFAULT_LOGIN}
+   */
+  public UserSessionRule logon() {
+    return logon(DEFAULT_LOGIN);
+  }
+
+  /**
+   * Log on with the specified login
+   */
+  public UserSessionRule logon(String login) {
+    setCurrentUserSession(new MockUserSession(login));
+    return this;
+  }
+
+  /**
+   * Disconnect/go anonymous
+   */
+  public UserSessionRule anonymous() {
+    setCurrentUserSession(new AnonymousMockUserSession());
+    return this;
+  }
+
+  @Override
+  public Statement apply(Statement statement, Description description) {
+    return this.statement(statement);
+  }
+
+  private Statement statement(final Statement base) {
+    return new Statement() {
+      public void evaluate() throws Throwable {
+        UserSessionRule.this.before();
+
+        try {
+          base.evaluate();
+        } finally {
+          UserSessionRule.this.after();
+        }
+
+      }
+    };
+  }
+
+  protected void before() throws Throwable {
+    setCurrentUserSession(currentUserSession);
+  }
+
+  protected void after() {
+    this.currentUserSession = null;
+    if (serverTester != null) {
+      serverTester.get(ThreadLocalUserSession.class).remove();
+    }
+  }
+
+  public void set(UserSession userSession) {
+    checkState(serverTester == null, "Can set a specific session and use ServerTester at the same time");
+    checkNotNull(userSession);
+    setCurrentUserSession(userSession);
+  }
+
+  public UserSessionRule setGlobalPermissions(String... globalPermissions) {
+    ensureMockUserSession().setGlobalPermissions(globalPermissions);
+    return this;
+  }
+
+  public UserSessionRule addProjectUuidPermissions(String projectPermission, String... projectUuids) {
+    ensureMockUserSession().addProjectUuidPermissions(projectPermission, projectUuids);
+    return this;
+  }
+
+  @Deprecated
+  public UserSessionRule addComponentPermission(String projectPermission, String projectKey, String componentKey) {
+    ensureMockUserSession().addComponentPermission(projectPermission, projectKey, componentKey);
+    return this;
+  }
+
+  @Deprecated
+  public UserSessionRule addProjectPermissions(String projectPermission, String... projectKeys) {
+    ensureMockUserSession().addProjectPermissions(projectPermission, projectKeys);
+    return this;
+  }
+
+  public UserSessionRule setUserId(@Nullable Integer userId) {
+    ensureMockUserSession().setUserId(userId);
+    return this;
+  }
+
+  public UserSessionRule setUserGroups(@Nullable String... userGroups) {
+    ensureMockUserSession().setUserGroups(userGroups);
+    return this;
+  }
+
+  public UserSessionRule setLocale(@Nullable Locale l) {
+    ensureMockUserSession().setLocale(l);
+    return this;
+  }
+
+  public UserSessionRule addComponentUuidPermission(String projectPermission, String projectUuid, String componentUuid) {
+    ensureMockUserSession().addComponentUuidPermission(projectPermission, projectUuid, componentUuid);
+    return this;
+  }
+
+  public UserSessionRule setName(@Nullable String s) {
+    ensureMockUserSession().setName(s);
+    return this;
+  }
+
+  private MockUserSession ensureMockUserSession() {
+    checkState(currentUserSession instanceof MockUserSession, "rule state can not be changed if a UserSession has explicitly been provided");
+    return (MockUserSession) currentUserSession;
+  }
+
+  private void setCurrentUserSession(UserSession userSession) {
+    this.currentUserSession = Preconditions.checkNotNull(userSession);
+    if (serverTester != null) {
+      serverTester.get(ThreadLocalUserSession.class).set(currentUserSession);
+    }
+  }
+
+  @Override
+  public List<String> globalPermissions() {
+    return currentUserSession.globalPermissions();
+  }
+
+  @Override
+  public boolean hasProjectPermission(String permission, String projectKey) {
+    return currentUserSession.hasProjectPermission(permission, projectKey);
+  }
+
+  @Override
+  public boolean hasProjectPermissionByUuid(String permission, String projectUuid) {
+    return currentUserSession.hasProjectPermissionByUuid(permission, projectUuid);
+  }
+
+  @Override
+  public boolean hasComponentPermission(String permission, String componentKey) {
+    return currentUserSession.hasComponentPermission(permission, componentKey);
+  }
+
+  @Override
+  public boolean hasComponentUuidPermission(String permission, String componentUuid) {
+    return currentUserSession.hasComponentUuidPermission(permission, componentUuid);
+  }
+
+  @Override
+  @CheckForNull
+  public String login() {
+    return currentUserSession.login();
+  }
+
+  @Override
+  @CheckForNull
+  public String name() {
+    return currentUserSession.name();
+  }
+
+  @Override
+  @CheckForNull
+  public Integer userId() {
+    return currentUserSession.userId();
+  }
+
+  @Override
+  public Set<String> userGroups() {
+    return currentUserSession.userGroups();
+  }
+
+  @Override
+  public boolean isLoggedIn() {
+    return currentUserSession.isLoggedIn();
+  }
+
+  @Override
+  public Locale locale() {
+    return currentUserSession.locale();
+  }
+
+  @Override
+  public UserSession checkLoggedIn() {
+    return currentUserSession.checkLoggedIn();
+  }
+
+  @Override
+  public UserSession checkGlobalPermission(String globalPermission) {
+    return currentUserSession.checkGlobalPermission(globalPermission);
+  }
+
+  @Override
+  public UserSession checkGlobalPermission(String globalPermission, @Nullable String errorMessage) {
+    return currentUserSession.checkGlobalPermission(globalPermission, errorMessage);
+  }
+
+  @Override
+  public boolean hasGlobalPermission(String globalPermission) {
+    return currentUserSession.hasGlobalPermission(globalPermission);
+  }
+
+  @Override
+  public UserSession checkProjectPermission(String projectPermission, String projectKey) {
+    return currentUserSession.checkProjectPermission(projectPermission, projectKey);
+  }
+
+  @Override
+  public UserSession checkProjectUuidPermission(String projectPermission, String projectUuid) {
+    return currentUserSession.checkProjectUuidPermission(projectPermission, projectUuid);
+  }
+
+  @Override
+  public UserSession checkComponentPermission(String projectPermission, String componentKey) {
+    return currentUserSession.checkComponentPermission(projectPermission, componentKey);
+  }
+
+  @Override
+  public UserSession checkComponentUuidPermission(String permission, String componentUuid) {
+    return currentUserSession.checkComponentUuidPermission(permission, componentUuid);
+  }
+
+
+}
index acda1ad907c06b3dd870407e4f5d4e2595870b76..47be0865a7474ca34bd1ce13a182e447e87b38e2 100644 (file)
  */
 package org.sonar.server.ui;
 
+import java.util.Date;
+import java.util.Locale;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -27,9 +30,7 @@ import org.mockito.runners.MockitoJUnitRunner;
 import org.sonar.api.i18n.I18n;
 import org.sonar.api.utils.Duration;
 import org.sonar.api.utils.Durations;
-
-import java.util.Date;
-import java.util.Locale;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Matchers.any;
@@ -38,6 +39,8 @@ import static org.mockito.Mockito.verify;
 
 @RunWith(MockitoJUnitRunner.class)
 public class JRubyI18nTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   @Mock
   I18n i18n;
@@ -50,7 +53,7 @@ public class JRubyI18nTest {
 
   @Before
   public void setUp() {
-    jRubyI18n = new JRubyI18n(i18n, durations);
+    jRubyI18n = new JRubyI18n(i18n, durations, userSessionRule);
   }
 
   @Test
index db1cf9f28b089cc5cb2374bd3e291f5816d7b6b5..2895462beeda62d4fdc0a37e6ffc245e28d7f352 100644 (file)
@@ -20,6 +20,7 @@
 package org.sonar.server.ui;
 
 import com.google.common.collect.Lists;
+import java.util.List;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -33,9 +34,7 @@ import org.sonar.api.web.WidgetProperties;
 import org.sonar.api.web.WidgetProperty;
 import org.sonar.api.web.WidgetPropertyType;
 import org.sonar.api.web.WidgetScope;
-import org.sonar.server.user.MockUserSession;
-
-import java.util.List;
+import org.sonar.server.tester.UserSessionRule;
 
 import static com.google.common.collect.Iterables.getOnlyElement;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -43,14 +42,16 @@ import static org.sonar.server.component.ComponentTesting.newProjectDto;
 
 public class ViewProxyTest {
 
+  @Rule
+  public UserSessionRule userSession = UserSessionRule.standalone();
   @Rule
   public ExpectedException exception = ExpectedException.none();
 
   @Test
   public void compareTo() {
-    assertThat(new ViewProxy<FakeView>(new FakeView("aaa")).compareTo(new ViewProxy<FakeView>(new FakeView("bbb")))).isLessThan(0);
-    assertThat(new ViewProxy<FakeView>(new FakeView("aaa")).compareTo(new ViewProxy<FakeView>(new FakeView("aaa")))).isZero();
-    assertThat(new ViewProxy<FakeView>(new FakeView("bbb")).compareTo(new ViewProxy<FakeView>(new FakeView("aaa")))).isGreaterThan(0);
+    assertThat(new ViewProxy<>(new FakeView("aaa"), userSession).compareTo(new ViewProxy<>(new FakeView("bbb"), userSession))).isLessThan(0);
+    assertThat(new ViewProxy<>(new FakeView("aaa"), userSession).compareTo(new ViewProxy<>(new FakeView("aaa"), userSession))).isZero();
+    assertThat(new ViewProxy<>(new FakeView("bbb"), userSession).compareTo(new ViewProxy<>(new FakeView("aaa"), userSession))).isGreaterThan(0);
   }
 
   @Test
@@ -65,7 +66,7 @@ public class ViewProxyTest {
     }
 
     View view = new MyView();
-    ViewProxy proxy = new ViewProxy<View>(view);
+    ViewProxy proxy = new ViewProxy<>(view, userSession);
 
     assertThat(proxy.getTarget()).isEqualTo(view);
     assertThat(proxy.getSections()).isEqualTo(new String[] {NavigationSection.RESOURCE});
@@ -81,7 +82,7 @@ public class ViewProxyTest {
       }
     }
     View view = new MyView();
-    ViewProxy proxy = new ViewProxy<View>(view);
+    ViewProxy proxy = new ViewProxy<>(view, userSession);
 
     assertThat(proxy.getTarget()).isEqualTo(view);
     assertThat(proxy.getSections()).isEqualTo(new String[] {NavigationSection.HOME});
@@ -97,7 +98,7 @@ public class ViewProxyTest {
       }
     }
 
-    ViewProxy proxy = new ViewProxy<MyView>(new MyView());
+    ViewProxy proxy = new ViewProxy<>(new MyView(), userSession);
 
     assertThat(proxy.isDefaultTab()).isTrue();
     assertThat(proxy.getDefaultTabForMetrics()).isEmpty();
@@ -110,7 +111,7 @@ public class ViewProxyTest {
         super("fake");
       }
     }
-    ViewProxy proxy = new ViewProxy<MyView>(new MyView());
+    ViewProxy proxy = new ViewProxy<>(new MyView(), userSession);
 
     assertThat(proxy.isDefaultTab()).isFalse();
     assertThat(proxy.getDefaultTabForMetrics()).isEmpty();
@@ -124,7 +125,7 @@ public class ViewProxyTest {
         super("fake");
       }
     }
-    ViewProxy proxy = new ViewProxy<MyView>(new MyView());
+    ViewProxy proxy = new ViewProxy<>(new MyView(), userSession);
 
     assertThat(proxy.isDefaultTab()).isFalse();
     assertThat(proxy.getDefaultTabForMetrics()).isEqualTo(new String[] {"ncloc", "coverage"});
@@ -132,7 +133,7 @@ public class ViewProxyTest {
 
   @Test
   public void widget_should_be_editable() {
-    ViewProxy<Widget> proxy = new ViewProxy<Widget>(new EditableWidget());
+    ViewProxy<Widget> proxy = new ViewProxy<Widget>(new EditableWidget(), userSession);
 
     assertThat(proxy.isEditable()).isTrue();
     assertThat(proxy.getWidgetProperties()).hasSize(3);
@@ -140,7 +141,7 @@ public class ViewProxyTest {
 
   @Test
   public void load_widget_properties_in_the_same_order_than_annotations() {
-    ViewProxy<Widget> proxy = new ViewProxy<Widget>(new EditableWidget());
+    ViewProxy<Widget> proxy = new ViewProxy<Widget>(new EditableWidget(), userSession);
 
     List<WidgetProperty> widgetProperties = Lists.newArrayList(proxy.getWidgetProperties());
     assertThat(widgetProperties).hasSize(3);
@@ -151,21 +152,21 @@ public class ViewProxyTest {
 
   @Test
   public void widget_should_have_text_property() {
-    ViewProxy<Widget> proxy = new ViewProxy<Widget>(new TextWidget());
+    ViewProxy<Widget> proxy = new ViewProxy<Widget>(new TextWidget(), userSession);
 
     assertThat(getOnlyElement(proxy.getWidgetProperties()).type()).isEqualTo(WidgetPropertyType.TEXT);
   }
 
   @Test
   public void widget_should_not_be_global_by_default() {
-    ViewProxy<Widget> proxy = new ViewProxy<Widget>(new EditableWidget());
+    ViewProxy<Widget> proxy = new ViewProxy<Widget>(new EditableWidget(), userSession);
 
     assertThat(proxy.isGlobal()).isFalse();
   }
 
   @Test
   public void widget_should_be_global() {
-    ViewProxy<Widget> proxy = new ViewProxy<Widget>(new GlobalWidget());
+    ViewProxy<Widget> proxy = new ViewProxy<Widget>(new GlobalWidget(), userSession);
 
     assertThat(proxy.isGlobal()).isTrue();
   }
@@ -176,18 +177,18 @@ public class ViewProxyTest {
     exception.expectMessage("INVALID");
     exception.expectMessage("WidgetWithInvalidScope");
 
-    new ViewProxy<Widget>(new WidgetWithInvalidScope());
+    new ViewProxy<Widget>(new WidgetWithInvalidScope(), userSession);
   }
 
   @Test
   public void widgetShouldRequireMandatoryProperties() {
-    ViewProxy<Widget> proxy = new ViewProxy<Widget>(new EditableWidget());
+    ViewProxy<Widget> proxy = new ViewProxy<Widget>(new EditableWidget(), userSession);
     assertThat(proxy.hasRequiredProperties()).isTrue();
   }
 
   @Test
   public void widgetShouldDefineOnlyOptionalProperties() {
-    ViewProxy<Widget> proxy = new ViewProxy<Widget>(new WidgetWithOptionalProperties());
+    ViewProxy<Widget> proxy = new ViewProxy<Widget>(new WidgetWithOptionalProperties(), userSession);
     assertThat(proxy.hasRequiredProperties()).isFalse();
   }
 
@@ -198,7 +199,7 @@ public class ViewProxyTest {
         super("fake");
       }
     }
-    ViewProxy proxy = new ViewProxy<MyView>(new MyView());
+    ViewProxy proxy = new ViewProxy<>(new MyView(), userSession);
 
     assertThat(proxy.acceptsAvailableMeasures(new String[] {"lines", "ncloc", "coverage"})).isTrue();
   }
@@ -211,7 +212,7 @@ public class ViewProxyTest {
         super("fake");
       }
     }
-    ViewProxy proxy = new ViewProxy<MyView>(new MyView());
+    ViewProxy proxy = new ViewProxy<>(new MyView(), userSession);
 
     assertThat(proxy.acceptsAvailableMeasures(new String[] {"lines", "ncloc", "coverage"})).isTrue();
     assertThat(proxy.acceptsAvailableMeasures(new String[] {"lines", "coverage"})).isFalse();
@@ -225,7 +226,7 @@ public class ViewProxyTest {
         super("fake");
       }
     }
-    ViewProxy proxy = new ViewProxy<MyView>(new MyView());
+    ViewProxy proxy = new ViewProxy<>(new MyView(), userSession);
 
     assertThat(proxy.acceptsAvailableMeasures(new String[] {"lines", "coverage"})).isTrue();
     assertThat(proxy.acceptsAvailableMeasures(new String[] {"complexity", "coverage"})).isFalse();
@@ -239,7 +240,7 @@ public class ViewProxyTest {
         super("fake");
       }
     }
-    ViewProxy proxy = new ViewProxy<MyView>(new MyView());
+    ViewProxy proxy = new ViewProxy<>(new MyView(), userSession);
 
     // ok, mandatory measures and 1 needed measure
     assertThat(proxy.acceptsAvailableMeasures(new String[] {"lines", "ncloc", "coverage", "duplications"})).isTrue();
@@ -259,9 +260,8 @@ public class ViewProxyTest {
       }
     }
 
-    ViewProxy proxy = new ViewProxy<View>(new MyView());
+    ViewProxy proxy = new ViewProxy<>(new MyView(), userSession);
 
-    MockUserSession.set();
     assertThat(proxy.isUserAuthorized()).isTrue();
   }
 
@@ -276,9 +276,9 @@ public class ViewProxyTest {
       }
     }
 
-    ViewProxy proxy = new ViewProxy<View>(new MyView());
+    ViewProxy proxy = new ViewProxy<>(new MyView(), userSession);
 
-    MockUserSession.set().setGlobalPermissions("palap");
+    userSession.setGlobalPermissions("palap");
     assertThat(proxy.isUserAuthorized()).isTrue();
   }
 
@@ -293,9 +293,9 @@ public class ViewProxyTest {
       }
     }
 
-    ViewProxy proxy = new ViewProxy<View>(new MyView());
+    ViewProxy proxy = new ViewProxy<>(new MyView(), userSession);
 
-    MockUserSession.set().setGlobalPermissions("pilip");
+    userSession.setGlobalPermissions("pilip");
     assertThat(proxy.isUserAuthorized()).isFalse();
   }
 
@@ -309,9 +309,8 @@ public class ViewProxyTest {
       }
     }
 
-    ViewProxy proxy = new ViewProxy<View>(new MyView());
+    ViewProxy proxy = new ViewProxy<>(new MyView(), userSession);
 
-    MockUserSession.set();
     assertThat(proxy.isUserAuthorized(newProjectDto("abcd"))).isTrue();
   }
 
@@ -326,9 +325,9 @@ public class ViewProxyTest {
       }
     }
 
-    ViewProxy proxy = new ViewProxy<View>(new MyView());
+    ViewProxy proxy = new ViewProxy<>(new MyView(), userSession);
 
-    MockUserSession.set().addProjectUuidPermissions("palap", "abcd");
+    userSession.addProjectUuidPermissions("palap", "abcd");
     assertThat(proxy.isUserAuthorized(newProjectDto("abcd"))).isTrue();
   }
 
@@ -343,9 +342,9 @@ public class ViewProxyTest {
       }
     }
 
-    ViewProxy proxy = new ViewProxy<View>(new MyView());
+    ViewProxy proxy = new ViewProxy<>(new MyView(), userSession);
 
-    MockUserSession.set().addProjectUuidPermissions("pilip", "abcd");
+    userSession.addProjectUuidPermissions("pilip", "abcd");
     assertThat(proxy.isUserAuthorized(newProjectDto("abcd"))).isFalse();
   }
 }
index 7143e4d7b7eaaa79d38354394ee54cac43289626..72904514454dcac24ed08b1e3cc0e631f1ff8eda 100644 (file)
@@ -19,6 +19,8 @@
  */
 package org.sonar.server.ui;
 
+import java.util.List;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.resources.Java;
 import org.sonar.api.resources.Qualifiers;
@@ -27,8 +29,7 @@ import org.sonar.api.web.NavigationSection;
 import org.sonar.api.web.Page;
 import org.sonar.api.web.View;
 import org.sonar.api.web.Widget;
-
-import java.util.List;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
@@ -36,6 +37,9 @@ import static org.mockito.Mockito.when;
 
 public class ViewsTest {
 
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
+
   private static FakeResourceViewer FAKE_TAB = new FakeResourceViewer();
   private static FakeWidget FAKE_WIDGET = new FakeWidget();
   private static FakePage FAKE_PAGE = new FakePage();
@@ -43,7 +47,7 @@ public class ViewsTest {
 
   @Test
   public void should_get_page_by_id() {
-    final Views views = new Views(VIEWS);
+    final Views views = new Views(userSessionRule, VIEWS);
     assertThat(views.getPage("fake-page").getTarget().getClass()).isEqualTo(FakePage.class);
     assertThat(views.getPage("fake-widget")).isNull();
     assertThat(views.getPage("foo")).isNull();
@@ -52,7 +56,7 @@ public class ViewsTest {
 
   @Test
   public void should_get_pages_by_section() {
-    final Views views = new Views(VIEWS);
+    final Views views = new Views(userSessionRule, VIEWS);
 
     List<ViewProxy<Page>> pages = views.getPages(NavigationSection.RESOURCE);
     assertThat(pages.size()).isEqualTo(1);
@@ -64,7 +68,7 @@ public class ViewsTest {
 
   @Test
   public void should_get_widgets() {
-    final Views views = new Views(VIEWS);
+    final Views views = new Views(userSessionRule, VIEWS);
     List<ViewProxy<Widget>> widgets = views.getWidgets(null, null, null, null);
     assertThat(widgets.size()).isEqualTo(1);
     assertThat(widgets.get(0).getTarget().getClass()).isEqualTo(FakeWidget.class);
@@ -72,7 +76,7 @@ public class ViewsTest {
 
   @Test
   public void should_sort_views_by_title() {
-    final Views views = new Views(new View[] {new FakeWidget("ccc", "ccc"), new FakeWidget("aaa", "aaa"), new FakeWidget("bbb", "bbb")});
+    final Views views = new Views(userSessionRule, new View[] {new FakeWidget("ccc", "ccc"), new FakeWidget("aaa", "aaa"), new FakeWidget("bbb", "bbb")});
     List<ViewProxy<Widget>> widgets = views.getWidgets(null, null, null, null);
     assertThat(widgets.size()).isEqualTo(3);
     assertThat(widgets.get(0).getId()).isEqualTo("aaa");
@@ -82,7 +86,7 @@ public class ViewsTest {
 
   @Test
   public void should_prefix_title_by_number_to_display_first() {
-    final Views views = new Views(new View[] {new FakeWidget("other", "Other"), new FakeWidget("1id", "1widget"), new FakeWidget("2id", "2widget")});
+    final Views views = new Views(userSessionRule, new View[] {new FakeWidget("other", "Other"), new FakeWidget("1id", "1widget"), new FakeWidget("2id", "2widget")});
     List<ViewProxy<Widget>> widgets = views.getWidgets(null, null, null, null);
     assertThat(widgets.size()).isEqualTo(3);
     assertThat(widgets.get(0).getId()).isEqualTo("1id");
index fe1bd5d59c9ce6d1bbd76efd9fe0d7f9d820fd6a..497b6b49d012bd69e54044dbed9b311159ab02a2 100644 (file)
  */
 package org.sonar.server.ui.ws;
 
+import java.util.Date;
+import java.util.Locale;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
@@ -56,14 +59,11 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.measure.persistence.MeasureDao;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ui.Views;
-import org.sonar.server.user.MockUserSession;
 import org.sonar.server.user.db.UserDao;
 import org.sonar.server.ws.WsTester;
 
-import java.util.Date;
-import java.util.Locale;
-
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -72,6 +72,8 @@ public class ComponentNavigationActionTest {
 
   @ClassRule
   public static final DbTester dbTester = new DbTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   private DbSession session;
 
@@ -123,14 +125,14 @@ public class ComponentNavigationActionTest {
 
   @Test(expected = IllegalArgumentException.class)
   public void fail_on_missing_parameters() throws Exception {
-    wsTester = new WsTester(new NavigationWs(new ComponentNavigationAction(null, null, null, null, null)));
+    wsTester = new WsTester(new NavigationWs(new ComponentNavigationAction(null, null, null, null, null, userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "component").execute();
   }
 
   @Test(expected = NotFoundException.class)
   public void fail_on_unexistent_key() throws Exception {
-    wsTester = new WsTester(new NavigationWs(new ComponentNavigationAction(dbClient, null, null, null, null)));
+    wsTester = new WsTester(new NavigationWs(new ComponentNavigationAction(dbClient, null, null, null, null, userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "component").setParam("componentKey", "polop").execute();
   }
@@ -140,8 +142,7 @@ public class ComponentNavigationActionTest {
     dbClient.componentDao().insert(session, ComponentTesting.newProjectDto("abcd").setKey("polop"));
     session.commit();
 
-    MockUserSession.set();
-    wsTester = new WsTester(new NavigationWs(new ComponentNavigationAction(dbClient, null, null, null, null)));
+    wsTester = new WsTester(new NavigationWs(new ComponentNavigationAction(dbClient, null, null, null, null, userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "component").setParam("componentKey", "polop").execute();
   }
@@ -152,9 +153,9 @@ public class ComponentNavigationActionTest {
       .setKey("polop").setName("Polop"));
     session.commit();
 
-    MockUserSession.set().addProjectUuidPermissions(UserRole.USER, "abcd");
+    userSessionRule.addProjectUuidPermissions(UserRole.USER, "abcd");
     wsTester = new WsTester(new NavigationWs(new ComponentNavigationAction(dbClient, activeDashboardDao,
-      new Views(), i18n, resourceTypes)));
+      new Views(userSessionRule), i18n, resourceTypes, userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "component").setParam("componentKey", "polop").execute().assertJson(getClass(), "no_snapshot.json");
   }
@@ -167,10 +168,10 @@ public class ComponentNavigationActionTest {
     dbClient.propertiesDao().setProperty(new PropertyDto().setKey("favourite").setResourceId(project.getId()).setUserId((long) userId), session);
     session.commit();
 
-    MockUserSession.set().setLogin("obiwan").setUserId(userId).addProjectUuidPermissions(UserRole.USER, "abcd");
+    userSessionRule.logon("obiwan").setUserId(userId).addProjectUuidPermissions(UserRole.USER, "abcd");
 
     wsTester = new WsTester(new NavigationWs(new ComponentNavigationAction(dbClient, activeDashboardDao,
-      new Views(), i18n, resourceTypes)));
+      new Views(userSessionRule), i18n, resourceTypes, userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "component").setParam("componentKey", "polop").execute().assertJson(getClass(), "no_snapshot_user_favourite.json");
   }
@@ -186,10 +187,10 @@ public class ComponentNavigationActionTest {
       .setLast(true).setQualifier(project.qualifier()).setResourceId(project.getId()).setRootProjectId(project.getId()).setScope(project.scope()));
     session.commit();
 
-    MockUserSession.set().setLogin("obiwan").setUserId(userId).addProjectUuidPermissions(UserRole.USER, "abcd");
+    userSessionRule.logon("obiwan").setUserId(userId).addProjectUuidPermissions(UserRole.USER, "abcd");
 
     wsTester = new WsTester(new NavigationWs(new ComponentNavigationAction(dbClient, activeDashboardDao,
-      new Views(), i18n, resourceTypes)));
+      new Views(userSessionRule), i18n, resourceTypes, userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "component").setParam("componentKey", "polop").execute().assertJson(getClass(), "with_snapshot_and_connected_user.json");
   }
@@ -203,10 +204,10 @@ public class ComponentNavigationActionTest {
     activeDashboardDao.insert(new ActiveDashboardDto().setDashboardId(dashboard.getId()));
     session.commit();
 
-    MockUserSession.set().addProjectUuidPermissions(UserRole.USER, "abcd");
+    userSessionRule.addProjectUuidPermissions(UserRole.USER, "abcd");
 
     wsTester = new WsTester(new NavigationWs(new ComponentNavigationAction(dbClient, activeDashboardDao,
-      new Views(), i18n, resourceTypes)));
+      new Views(userSessionRule), i18n, resourceTypes, userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "component").setParam("componentKey", "polop").execute().assertJson(getClass(), "with_dashboards.json");
   }
@@ -220,10 +221,10 @@ public class ComponentNavigationActionTest {
     activeDashboardDao.insert(new ActiveDashboardDto().setDashboardId(dashboard.getId()));
     session.commit();
 
-    MockUserSession.set().setLogin("obiwan").addProjectUuidPermissions(UserRole.USER, "abcd");
+    userSessionRule.logon("obiwan").addProjectUuidPermissions(UserRole.USER, "abcd");
 
     wsTester = new WsTester(new NavigationWs(new ComponentNavigationAction(dbClient, activeDashboardDao,
-      new Views(), i18n, resourceTypes)));
+      new Views(userSessionRule), i18n, resourceTypes, userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "component").setParam("componentKey", "polop").execute().assertJson(getClass(), "with_default_dashboards.json");
   }
@@ -236,12 +237,12 @@ public class ComponentNavigationActionTest {
       .setLast(true).setQualifier(project.qualifier()).setResourceId(project.getId()).setRootProjectId(project.getId()).setScope(project.scope()));
     session.commit();
 
-    MockUserSession.set().addProjectUuidPermissions(UserRole.USER, "abcd");
+    userSessionRule.addProjectUuidPermissions(UserRole.USER, "abcd");
 
     Views views = createViews();
 
     wsTester = new WsTester(new NavigationWs(new ComponentNavigationAction(dbClient, activeDashboardDao,
-      views, i18n, resourceTypes)));
+      views, i18n, resourceTypes, userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "component").setParam("componentKey", "polop").execute().assertJson(getClass(), "with_extensions.json");
   }
@@ -254,14 +255,14 @@ public class ComponentNavigationActionTest {
       .setLast(true).setQualifier(project.qualifier()).setResourceId(project.getId()).setRootProjectId(project.getId()).setScope(project.scope()));
     session.commit();
 
-    MockUserSession.set()
+    userSessionRule
       .addProjectUuidPermissions(UserRole.USER, "abcd")
       .addProjectUuidPermissions(UserRole.ADMIN, "abcd");
 
     Views views = createViews();
 
     wsTester = new WsTester(new NavigationWs(new ComponentNavigationAction(dbClient, activeDashboardDao,
-      views, i18n, resourceTypes)));
+      views, i18n, resourceTypes, userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "component").setParam("componentKey", "polop").execute().assertJson(getClass(), "admin_with_extensions.json");
   }
@@ -318,7 +319,7 @@ public class ComponentNavigationActionTest {
       }
     }
     Page adminPage = new AdminPage();
-    Views views = new Views(new Page[] {page1, page2, adminPage});
+    Views views = new Views(userSessionRule, new Page[] {page1, page2, adminPage});
     return views;
   }
 
@@ -330,7 +331,7 @@ public class ComponentNavigationActionTest {
       .setKey("polop").setName("Polop").setLanguage(language));
     session.commit();
 
-    MockUserSession.set().setLogin("obiwan").setUserId(userId)
+    userSessionRule.logon("obiwan").setUserId(userId)
       .addProjectUuidPermissions(UserRole.USER, "abcd")
       .addProjectUuidPermissions(UserRole.ADMIN, "abcd");
 
@@ -369,7 +370,7 @@ public class ComponentNavigationActionTest {
     Page page2 = new SecondPage();
 
     wsTester = new WsTester(new NavigationWs(new ComponentNavigationAction(dbClient, activeDashboardDao,
-      new Views(new Page[] {page1, page2}), i18n, resourceTypes)));
+      new Views(userSessionRule, new Page[] {page1, page2}), i18n, resourceTypes, userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "component").setParam("componentKey", "polop").execute().assertJson(getClass(), "with_admin_rights.json");
   }
@@ -382,7 +383,7 @@ public class ComponentNavigationActionTest {
     dbClient.componentDao().insert(session, project);
     session.commit();
 
-    MockUserSession.set().setLogin("obiwan").setUserId(userId)
+    userSessionRule.logon("obiwan").setUserId(userId)
       .addProjectUuidPermissions(UserRole.USER, "abcd")
       .addProjectUuidPermissions(UserRole.ADMIN, "abcd");
 
@@ -398,7 +399,7 @@ public class ComponentNavigationActionTest {
       .thenReturn(projectResourceType);
 
     wsTester = new WsTester(new NavigationWs(new ComponentNavigationAction(dbClient, activeDashboardDao,
-      new Views(), i18n, resourceTypes)));
+      new Views(userSessionRule), i18n, resourceTypes, userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "component").setParam("componentKey", "polop").execute().assertJson(getClass(), "with_all_properties.json");
   }
@@ -413,12 +414,12 @@ public class ComponentNavigationActionTest {
     dbClient.componentDao().insert(session, project, module);
     session.commit();
 
-    MockUserSession.set().setLogin("obiwan").setUserId(userId)
+    userSessionRule.logon("obiwan").setUserId(userId)
       .addProjectUuidPermissions(UserRole.USER, "abcd")
       .addProjectUuidPermissions(UserRole.ADMIN, "abcd");
 
     wsTester = new WsTester(new NavigationWs(new ComponentNavigationAction(dbClient, activeDashboardDao,
-      new Views(), i18n, resourceTypes)));
+      new Views(userSessionRule), i18n, resourceTypes, userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "component").setParam("componentKey", "palap").execute().assertJson(getClass(), "on_module.json");
   }
@@ -431,7 +432,7 @@ public class ComponentNavigationActionTest {
       .setKey("polop").setName("Polop").setLanguage(language));
     session.commit();
 
-    MockUserSession.set().setLogin("obiwan").setUserId(userId)
+    userSessionRule.logon("obiwan").setUserId(userId)
       .addProjectUuidPermissions(UserRole.USER, "abcd")
       .setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
 
@@ -450,7 +451,7 @@ public class ComponentNavigationActionTest {
     Page page = new FirstPage();
 
     wsTester = new WsTester(new NavigationWs(new ComponentNavigationAction(dbClient, activeDashboardDao,
-      new Views(new Page[] {page}), i18n, resourceTypes)));
+      new Views(userSessionRule, new Page[] {page}), i18n, resourceTypes, userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "component").setParam("componentKey", "polop").execute().assertJson(getClass(), "quality_profile_admin.json");
   }
@@ -497,10 +498,10 @@ public class ComponentNavigationActionTest {
 
     session.commit();
 
-    MockUserSession.set().addProjectUuidPermissions(UserRole.USER, "abcd");
+    userSessionRule.addProjectUuidPermissions(UserRole.USER, "abcd");
 
     wsTester = new WsTester(new NavigationWs(new ComponentNavigationAction(dbClient, activeDashboardDao,
-      new Views(), i18n, resourceTypes)));
+      new Views(userSessionRule), i18n, resourceTypes, userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "component").setParam("componentKey", "palap:src/main/xoo/Source.xoo").execute().assertJson(getClass(), "breadcrumbs.json");
   }
index 92adb3f3a38440f9293c930731923eca82bc2316..94fe1731ba6a63d683957a9f734d8d1d1e515d76 100644 (file)
@@ -22,6 +22,7 @@ package org.sonar.server.ui.ws;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.config.Settings;
 import org.sonar.api.resources.ResourceType;
@@ -41,8 +42,8 @@ import org.sonar.core.persistence.DbSession;
 import org.sonar.core.persistence.DbTester;
 import org.sonar.core.user.UserDto;
 import org.sonar.server.db.DbClient;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ui.Views;
-import org.sonar.server.user.MockUserSession;
 import org.sonar.server.user.db.UserDao;
 import org.sonar.server.ws.WsTester;
 
@@ -52,6 +53,8 @@ public class GlobalNavigationActionTest {
 
   @ClassRule
   public static final DbTester dbTester = new DbTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   private DbSession session;
 
@@ -83,9 +86,7 @@ public class GlobalNavigationActionTest {
 
   @Test
   public void empty_call() throws Exception {
-    wsTester = new WsTester(new NavigationWs(new GlobalNavigationAction(activeDashboardDao, new Views(), new Settings(), new ResourceTypes())));
-
-    MockUserSession.set();
+    wsTester = new WsTester(new NavigationWs(new GlobalNavigationAction(activeDashboardDao, new Views(userSessionRule), new Settings(), new ResourceTypes(), userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "global").execute().assertJson(getClass(), "empty.json");
   }
@@ -105,22 +106,18 @@ public class GlobalNavigationActionTest {
           .addRelations("PAL", "LAP")
           .build()
       });
-    wsTester = new WsTester(new NavigationWs(new GlobalNavigationAction(activeDashboardDao, new Views(), new Settings(), resourceTypes)));
-
-    MockUserSession.set();
+    wsTester = new WsTester(new NavigationWs(new GlobalNavigationAction(activeDashboardDao, new Views(userSessionRule), new Settings(), resourceTypes, userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "global").execute().assertJson(getClass(), "with_qualifiers.json");
   }
 
   @Test
   public void only_logo() throws Exception {
-    wsTester = new WsTester(new NavigationWs(new GlobalNavigationAction(activeDashboardDao, new Views(),
+    wsTester = new WsTester(new NavigationWs(new GlobalNavigationAction(activeDashboardDao, new Views(userSessionRule),
       new Settings()
         .setProperty("sonar.lf.logoUrl", "http://some-server.tld/logo.png")
         .setProperty("sonar.lf.logoWidthPx", "123"),
-      new ResourceTypes())));
-
-    MockUserSession.set();
+      new ResourceTypes(), userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "global").execute().assertJson(getClass(), "only_logo.json");
   }
@@ -129,8 +126,6 @@ public class GlobalNavigationActionTest {
   public void nominal_call_for_anonymous() throws Exception {
     nominalSetup();
 
-    MockUserSession.set();
-
     wsTester.newGetRequest("api/navigation", "global").execute().assertJson(getClass(), "anonymous.json");
   }
 
@@ -138,7 +133,7 @@ public class GlobalNavigationActionTest {
   public void nominal_call_for_user() throws Exception {
     nominalSetup();
 
-    MockUserSession.set().setLogin("obiwan");
+    userSessionRule.logon("obiwan");
 
     wsTester.newGetRequest("api/navigation", "global").execute().assertJson(getClass(), "user.json");
   }
@@ -147,7 +142,7 @@ public class GlobalNavigationActionTest {
   public void nominal_call_for_admin() throws Exception {
     nominalSetup();
 
-    MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.logon("obiwan").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
 
     wsTester.newGetRequest("api/navigation", "global").execute().assertJson(getClass(), "admin.json");
   }
@@ -156,7 +151,7 @@ public class GlobalNavigationActionTest {
   public void nominal_call_for_user_without_configured_dashboards() throws Exception {
     nominalSetup();
 
-    MockUserSession.set().setLogin("anakin");
+    userSessionRule.logon("anakin");
 
     wsTester.newGetRequest("api/navigation", "global").execute().assertJson(getClass(), "anonymous.json");
   }
@@ -170,7 +165,7 @@ public class GlobalNavigationActionTest {
     Settings settings = new Settings()
       .setProperty("sonar.lf.logoUrl", "http://some-server.tld/logo.png")
       .setProperty("sonar.lf.logoWidthPx", "123");
-    wsTester = new WsTester(new NavigationWs(new GlobalNavigationAction(activeDashboardDao, createViews(), settings, new ResourceTypes())));
+    wsTester = new WsTester(new NavigationWs(new GlobalNavigationAction(activeDashboardDao, createViews(), settings, new ResourceTypes(), userSessionRule)));
   }
 
   private void createAndConfigureDashboardForUser() {
@@ -245,6 +240,6 @@ public class GlobalNavigationActionTest {
         return "admin_page";
       }
     }
-    return new Views(new View[] {page, controller, new AdminPage()});
+    return new Views(userSessionRule, new View[] {page, controller, new AdminPage()});
   }
 }
index 7be8ff71cf673d0e9a07184a443d1a271c97e0ac..980c7064e9118bd61b7e102837e832b1dbb565dc 100644 (file)
@@ -19,7 +19,9 @@
  */
 package org.sonar.server.ui.ws;
 
+import java.util.Locale;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
@@ -30,18 +32,18 @@ import org.sonar.api.web.Page;
 import org.sonar.api.web.View;
 import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.server.plugins.UpdateCenterClient;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ui.Views;
-import org.sonar.server.user.MockUserSession;
 import org.sonar.server.ws.WsTester;
 
-import java.util.Locale;
-
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 public class SettingsNavigationActionTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   private WsTester wsTester;
 
@@ -64,24 +66,24 @@ public class SettingsNavigationActionTest {
 
   @Test
   public void empty() throws Exception {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
-    wsTester = new WsTester(new NavigationWs(new SettingsNavigationAction(settings, new Views(), i18n)));
+    userSessionRule.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    wsTester = new WsTester(new NavigationWs(new SettingsNavigationAction(settings, new Views(userSessionRule), i18n, userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "settings").execute().assertJson(getClass(), "empty.json");
   }
 
   @Test
   public void with_provisioning() throws Exception {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.PROVISIONING);
-    wsTester = new WsTester(new NavigationWs(new SettingsNavigationAction(settings, new Views(), i18n)));
+    userSessionRule.setGlobalPermissions(GlobalPermissions.PROVISIONING);
+    wsTester = new WsTester(new NavigationWs(new SettingsNavigationAction(settings, new Views(userSessionRule), i18n, userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "settings").execute().assertJson(getClass(), "with_provisioning.json");
   }
 
   @Test
   public void with_views() throws Exception {
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
-    wsTester = new WsTester(new NavigationWs(new SettingsNavigationAction(settings, createViews(), i18n)));
+    userSessionRule.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    wsTester = new WsTester(new NavigationWs(new SettingsNavigationAction(settings, createViews(), i18n, userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "settings").execute().assertJson(getClass(), "with_views.json");
   }
@@ -89,17 +91,16 @@ public class SettingsNavigationActionTest {
   @Test
   public void with_update_center() throws Exception {
     settings.setProperty(UpdateCenterClient.ACTIVATION_PROPERTY, true);
-    MockUserSession.set().setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
-    wsTester = new WsTester(new NavigationWs(new SettingsNavigationAction(settings, new Views(), i18n)));
+    userSessionRule.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    wsTester = new WsTester(new NavigationWs(new SettingsNavigationAction(settings, new Views(userSessionRule), i18n, userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "settings").execute().assertJson(getClass(), "with_update_center.json");
   }
 
   @Test
   public void with_views_and_update_center_but_not_admin() throws Exception {
-    MockUserSession.set();
     settings.setProperty(UpdateCenterClient.ACTIVATION_PROPERTY, true);
-    wsTester = new WsTester(new NavigationWs(new SettingsNavigationAction(settings, createViews(), i18n)));
+    wsTester = new WsTester(new NavigationWs(new SettingsNavigationAction(settings, createViews(), i18n, userSessionRule)));
 
     wsTester.newGetRequest("api/navigation", "settings").execute().assertJson(getClass(), "empty.json");
   }
@@ -135,6 +136,6 @@ public class SettingsNavigationActionTest {
 
     Page page = new FirstPage();
     Page controller = new SecondPage();
-    return new Views(new View[] {page, controller});
+    return new Views(userSessionRule, new View[] {page, controller});
   }
 }
index b2e0de9de51aa31ccf52f93d717dd09db0bdc8e1..c4598b2685c27b88ae664e866b19a332f64485e8 100644 (file)
@@ -21,6 +21,7 @@ package org.sonar.server.user;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
+import java.util.Map;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -33,10 +34,9 @@ import org.sonar.api.user.UserQuery;
 import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.exceptions.ForbiddenException;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.user.index.UserIndex;
 
-import java.util.Map;
-
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Maps.newHashMap;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -49,11 +49,13 @@ import static org.mockito.Mockito.verify;
 
 @RunWith(MockitoJUnitRunner.class)
 public class DefaultUserServiceTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   UserIndex userIndex = mock(UserIndex.class);
   UserFinder finder = mock(UserFinder.class);
   UserUpdater userUpdater = mock(UserUpdater.class);
-  DefaultUserService service = new DefaultUserService(userIndex, userUpdater, finder);
+  DefaultUserService service = new DefaultUserService(userIndex, userUpdater, finder, userSessionRule);
 
   @Rule
   public ExpectedException thrown = ExpectedException.none();
@@ -93,7 +95,7 @@ public class DefaultUserServiceTest {
   @Test
   public void self_deactivation_is_not_possible() {
     try {
-      MockUserSession.set().setLogin("simon").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+      userSessionRule.logon("simon").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
       service.deactivate("simon");
       fail();
     } catch (BadRequestException e) {
@@ -105,7 +107,7 @@ public class DefaultUserServiceTest {
   @Test
   public void user_deactivation_requires_admin_permission() {
     try {
-      MockUserSession.set().setLogin("simon").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+      userSessionRule.logon("simon").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
       service.deactivate("julien");
       fail();
     } catch (ForbiddenException e) {
@@ -115,14 +117,14 @@ public class DefaultUserServiceTest {
 
   @Test
   public void deactivate_user() {
-    MockUserSession.set().setLogin("simon").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.logon("simon").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
     service.deactivate("julien");
     verify(userUpdater).deactivateUserByLogin("julien");
   }
 
   @Test
   public void fail_to_deactivate_when_blank_login() {
-    MockUserSession.set().setLogin("simon").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.logon("simon").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
     try {
       service.deactivate("");
       fail();
index 5fbdf07f4b4e520d2df639d8e958cf0f5a2d1330..9ca8fb4c95aa2a9d198a3cdc531a7dab777ee69e 100644 (file)
@@ -25,28 +25,30 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 public class DoPrivilegedTest {
 
+  ThreadLocalUserSession threadLocalUserSession = new ThreadLocalUserSession();
+
   @Test
   public void should_allow_everything_in_privileged_block_only() {
-    DoPrivileged.execute(new DoPrivileged.Task() {
+    DoPrivileged.execute(new DoPrivileged.Task(threadLocalUserSession) {
       @Override
       protected void doPrivileged() {
-        UserSession userSession = UserSession.get();
+        UserSession userSession = threadLocalUserSession.get();
         assertThat(userSession.isLoggedIn()).isFalse();
         assertThat(userSession.hasGlobalPermission("any permission")).isTrue();
         assertThat(userSession.hasProjectPermission("any permission", "any project")).isTrue();
       }
     });
 
-    assertThat(UserSession.get().isLoggedIn()).isFalse();
+    assertThat(threadLocalUserSession.isLoggedIn()).isFalse();
   }
 
   @Test
   public void should_lose_privileges_on_exception() {
     try {
-      DoPrivileged.execute(new DoPrivileged.Task() {
+      DoPrivileged.execute(new DoPrivileged.Task(threadLocalUserSession) {
         @Override
         protected void doPrivileged() {
-          UserSession userSession = UserSession.get();
+          UserSession userSession = threadLocalUserSession.get();
           assertThat(userSession.isLoggedIn()).isTrue();
           assertThat(userSession.hasGlobalPermission("any permission")).isTrue();
           assertThat(userSession.hasProjectPermission("any permission", "any project")).isTrue();
@@ -55,7 +57,7 @@ public class DoPrivilegedTest {
         }
       });
     } catch(Throwable ignored) {
-      assertThat(UserSession.get().isLoggedIn()).isFalse();
+      assertThat(threadLocalUserSession.isLoggedIn()).isFalse();
     }
   }
 
diff --git a/server/sonar-server/src/test/java/org/sonar/server/user/MockUserSession.java b/server/sonar-server/src/test/java/org/sonar/server/user/MockUserSession.java
deleted file mode 100644 (file)
index 0080d96..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.server.user;
-
-import com.google.common.collect.HashMultimap;
-import org.sonar.core.resource.ResourceDao;
-import org.sonar.core.user.AuthorizationDao;
-
-import javax.annotation.Nullable;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Locale;
-
-import static com.google.common.collect.Lists.newArrayList;
-import static org.mockito.Mockito.mock;
-
-public class MockUserSession extends UserSession {
-
-  private final AuthorizationDao authorizationDao;
-
-  private final ResourceDao resourceDao;
-
-  private MockUserSession() {
-    globalPermissions = Collections.emptyList();
-    projectKeyByPermission = HashMultimap.create();
-    projectUuidByPermission = HashMultimap.create();
-    authorizationDao = mock(AuthorizationDao.class);
-    resourceDao = mock(ResourceDao.class);
-  }
-
-  public static MockUserSession set() {
-    MockUserSession session = create();
-    UserSession.set(session);
-    return session;
-  }
-
-  public static MockUserSession create() {
-    return new MockUserSession();
-  }
-
-  public MockUserSession setLocale(@Nullable Locale locale) {
-    super.setLocale(locale);
-    return this;
-  }
-
-  public MockUserSession setLogin(@Nullable String login) {
-    super.setLogin(login);
-    return this;
-  }
-
-  public MockUserSession setName(@Nullable String name) {
-    super.setName(name);
-    return this;
-  }
-
-  public MockUserSession setUserId(@Nullable Integer userId) {
-    super.setUserId(userId);
-    return this;
-  }
-
-  public MockUserSession setUserGroups(@Nullable String... userGroups) {
-    super.setUserGroups(userGroups);
-    return this;
-  }
-
-  public MockUserSession setGlobalPermissions(String... globalPermissions) {
-    this.globalPermissions = Arrays.asList(globalPermissions);
-    return this;
-  }
-
-  /**
-   * Deprecated, please use {@link #addProjectUuidPermissions}
-   */
-  @Deprecated
-  public MockUserSession addProjectPermissions(String projectPermission, String... projectKeys) {
-    this.projectPermissions.add(projectPermission);
-    this.projectKeyByPermission.putAll(projectPermission, newArrayList(projectKeys));
-    return this;
-  }
-
-  public MockUserSession addProjectUuidPermissions(String projectPermission, String... projectUuids) {
-    this.projectPermissions.add(projectPermission);
-    this.projectUuidByPermission.putAll(projectPermission, newArrayList(projectUuids));
-    return this;
-  }
-
-  /**
-   * Deprecated, please use {@link #addComponentUuidPermission}
-   */
-  @Deprecated
-  public MockUserSession addComponentPermission(String projectPermission, String projectKey, String componentKey) {
-    this.projectKeyByComponentKey.put(componentKey, projectKey);
-    addProjectPermissions(projectPermission, projectKey);
-    return this;
-  }
-
-  public MockUserSession addComponentUuidPermission(String projectPermission, String projectUuid, String componentUuid) {
-    this.projectUuidByComponentUuid.put(componentUuid, projectUuid);
-    addProjectUuidPermissions(projectPermission, projectUuid);
-    return this;
-  }
-
-  @Override
-  AuthorizationDao authorizationDao() {
-    return authorizationDao;
-  }
-
-  @Override
-  ResourceDao resourceDao() {
-    return resourceDao;
-  }
-}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/user/MockUserSessionTest.java b/server/sonar-server/src/test/java/org/sonar/server/user/MockUserSessionTest.java
deleted file mode 100644 (file)
index 8a2b0ac..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.server.user;
-
-import org.junit.Test;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-public class MockUserSessionTest {
-  @Test
-  public void set_mock_session() {
-    MockUserSession.set().setLogin("simon").setUserGroups("sonar-users");
-
-    UserSession mock = UserSession.get();
-    assertThat(mock.login()).isEqualTo("simon");
-    assertThat(mock.userGroups()).containsOnly("sonar-users", "Anyone");
-    assertThat(mock.globalPermissions()).isEmpty();
-    assertThat(mock.isLoggedIn()).isTrue();
-  }
-}
index a435689aa078e364d8c40afef2a77541de58140b..80b6b61e735862fbce78af64f332618f2d04c326 100644 (file)
  */
 package org.sonar.server.user;
 
-import org.junit.Test;
-
 import java.util.Locale;
+import org.junit.Before;
+import org.junit.Test;
+import org.sonar.core.platform.ComponentContainer;
+import org.sonar.server.platform.Platform;
 
 import static com.google.common.collect.Lists.newArrayList;
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 public class RubyUserSessionTest {
+  Platform platform = mock(Platform.class);
+  ComponentContainer componentContainer = mock(ComponentContainer.class);
+  ThreadLocalUserSession threadLocalUserSession = new ThreadLocalUserSession();
+  RubyUserSession underTest = new RubyUserSession(platform);
+
+  @Before
+  public void setUp() throws Exception {
+    when(platform.getContainer()).thenReturn(componentContainer);
+    when(componentContainer.getComponentByType(ThreadLocalUserSession.class)).thenReturn(threadLocalUserSession);
+  }
+
   @Test
   public void should_set_session() {
-    RubyUserSession.setSession(123, "karadoc", "Karadoc", newArrayList("sonar-users"), "fr");
+    underTest.setSessionImpl(123, "karadoc", "Karadoc", newArrayList("sonar-users"), "fr");
 
-    UserSession session = UserSession.get();
+    UserSession session = threadLocalUserSession.get();
 
     assertThat(session).isNotNull();
     assertThat(session.login()).isEqualTo("karadoc");
@@ -44,9 +59,9 @@ public class RubyUserSessionTest {
 
   @Test
   public void should_set_anonymous_session() {
-    RubyUserSession.setSession(null, null, null, null, "fr");
+    underTest.setSessionImpl(null, null, null, null, "fr");
 
-    UserSession session = UserSession.get();
+    UserSession session = threadLocalUserSession.get();
 
     assertThat(session).isNotNull();
     assertThat(session.login()).isNull();
diff --git a/server/sonar-server/src/test/java/org/sonar/server/user/ServerUserSessionTest.java b/server/sonar-server/src/test/java/org/sonar/server/user/ServerUserSessionTest.java
new file mode 100644 (file)
index 0000000..d9c6ba1
--- /dev/null
@@ -0,0 +1,214 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.user;
+
+import java.util.Arrays;
+import org.junit.Test;
+import org.sonar.api.web.UserRole;
+import org.sonar.core.component.ComponentDto;
+import org.sonar.core.permission.GlobalPermissions;
+import org.sonar.core.resource.ResourceDao;
+import org.sonar.core.resource.ResourceDto;
+import org.sonar.core.user.AuthorizationDao;
+import org.sonar.server.component.ComponentTesting;
+import org.sonar.server.exceptions.ForbiddenException;
+
+import static com.google.common.collect.Lists.newArrayList;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class ServerUserSessionTest {
+  AuthorizationDao authorizationDao = mock(AuthorizationDao.class);
+  ResourceDao resourceDao = mock(ResourceDao.class);
+
+  @Test
+  public void login_should_not_be_empty() {
+    UserSession session = newServerUserSession().setLogin("");
+    assertThat(session.login()).isNull();
+    assertThat(session.isLoggedIn()).isFalse();
+  }
+
+  @Test
+  public void has_global_permission() {
+    UserSession session = newServerUserSession().setLogin("marius");
+
+    when(authorizationDao.selectGlobalPermissions("marius")).thenReturn(Arrays.asList("profileadmin", "admin"));
+
+    assertThat(session.hasGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN)).isTrue();
+    assertThat(session.hasGlobalPermission(GlobalPermissions.SYSTEM_ADMIN)).isTrue();
+    assertThat(session.hasGlobalPermission(GlobalPermissions.DASHBOARD_SHARING)).isFalse();
+  }
+
+  @Test
+  public void check_global_Permission_ok() {
+    UserSession session = newServerUserSession().setLogin("marius");
+
+    when(authorizationDao.selectGlobalPermissions("marius")).thenReturn(Arrays.asList("profileadmin", "admin"));
+
+    session.checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+  }
+
+  @Test(expected = ForbiddenException.class)
+  public void check_global_Permission_ko() {
+    UserSession session = newServerUserSession().setLogin("marius");
+
+    when(authorizationDao.selectGlobalPermissions("marius")).thenReturn(Arrays.asList("profileadmin", "admin"));
+
+    session.checkGlobalPermission(GlobalPermissions.DASHBOARD_SHARING);
+  }
+
+  @Test
+  public void has_project_permission() {
+    UserSession session = newServerUserSession().setLogin("marius").setUserId(1);
+    when(authorizationDao.selectAuthorizedRootProjectsKeys(1, UserRole.USER)).thenReturn(newArrayList("com.foo:Bar"));
+
+    assertThat(session.hasProjectPermission(UserRole.USER, "com.foo:Bar")).isTrue();
+    assertThat(session.hasProjectPermission(UserRole.CODEVIEWER, "com.foo:Bar")).isFalse();
+    assertThat(session.hasProjectPermission(UserRole.ADMIN, "com.foo:Bar")).isFalse();
+  }
+
+  @Test
+  public void has_project_permission_by_uuid() {
+    UserSession session = newServerUserSession().setLogin("marius").setUserId(1);
+    when(authorizationDao.selectAuthorizedRootProjectsUuids(1, UserRole.USER)).thenReturn(newArrayList("ABCD"));
+
+    assertThat(session.hasProjectPermissionByUuid(UserRole.USER, "ABCD")).isTrue();
+    assertThat(session.hasProjectPermissionByUuid(UserRole.CODEVIEWER, "ABCD")).isFalse();
+    assertThat(session.hasProjectPermissionByUuid(UserRole.ADMIN, "ABCD")).isFalse();
+  }
+
+  @Test
+  public void check_project_permission_ok() {
+    UserSession session = newServerUserSession().setLogin("marius").setUserId(1);
+    when(authorizationDao.selectAuthorizedRootProjectsKeys(1, UserRole.USER)).thenReturn(newArrayList("com.foo:Bar"));
+
+    session.checkProjectPermission(UserRole.USER, "com.foo:Bar");
+  }
+
+  @Test(expected = ForbiddenException.class)
+  public void check_project_permission_ko() {
+    UserSession session = newServerUserSession().setLogin("marius").setUserId(1);
+    when(authorizationDao.selectAuthorizedRootProjectsKeys(1, UserRole.USER)).thenReturn(newArrayList("com.foo:Bar2"));
+
+    session.checkProjectPermission(UserRole.USER, "com.foo:Bar");
+  }
+
+  @Test
+  public void check_project_uuid_permission_ok() {
+    UserSession session = newServerUserSession().setLogin("marius").setUserId(1);
+
+    ComponentDto project = ComponentTesting.newProjectDto();
+    when(authorizationDao.selectAuthorizedRootProjectsUuids(1, UserRole.USER)).thenReturn(newArrayList(project.uuid()));
+
+    session.checkProjectUuidPermission(UserRole.USER, project.uuid());
+  }
+
+  @Test(expected = ForbiddenException.class)
+  public void check_project_uuid_permission_ko() {
+    UserSession session = newServerUserSession().setLogin("marius").setUserId(1);
+
+    ComponentDto project = ComponentTesting.newProjectDto();
+    when(authorizationDao.selectAuthorizedRootProjectsUuids(1, UserRole.USER)).thenReturn(newArrayList(project.uuid()));
+
+    session.checkProjectUuidPermission(UserRole.USER, "another project");
+  }
+
+  @Test
+  public void has_component_permission() {
+    UserSession session = newServerUserSession().setLogin("marius").setUserId(1);
+
+    String componentKey = "com.foo:Bar:BarFile.xoo";
+    when(resourceDao.getRootProjectByComponentKey(componentKey)).thenReturn(new ResourceDto().setKey(componentKey));
+    when(authorizationDao.selectAuthorizedRootProjectsKeys(1, UserRole.USER)).thenReturn(newArrayList(componentKey));
+
+    assertThat(session.hasComponentPermission(UserRole.USER, componentKey)).isTrue();
+    assertThat(session.hasComponentPermission(UserRole.CODEVIEWER, componentKey)).isFalse();
+    assertThat(session.hasComponentPermission(UserRole.ADMIN, componentKey)).isFalse();
+  }
+
+  @Test
+  public void check_component_key_permission_ok() {
+    UserSession session = newServerUserSession().setLogin("marius").setUserId(1);
+
+    when(resourceDao.getRootProjectByComponentKey("com.foo:Bar:BarFile.xoo")).thenReturn(new ResourceDto().setKey("com.foo:Bar"));
+    when(authorizationDao.selectAuthorizedRootProjectsKeys(1, UserRole.USER)).thenReturn(newArrayList("com.foo:Bar"));
+
+    session.checkComponentPermission(UserRole.USER, "com.foo:Bar:BarFile.xoo");
+  }
+
+  @Test(expected = ForbiddenException.class)
+  public void check_component_key_permission_ko() {
+    UserSession session = newServerUserSession().setLogin("marius").setUserId(1);
+
+    when(resourceDao.getRootProjectByComponentKey("com.foo:Bar:BarFile.xoo")).thenReturn(new ResourceDto().setKey("com.foo:Bar2"));
+    when(authorizationDao.selectAuthorizedRootProjectsKeys(1, UserRole.USER)).thenReturn(newArrayList("com.foo:Bar"));
+
+    session.checkComponentPermission(UserRole.USER, "com.foo:Bar:BarFile.xoo");
+  }
+
+  @Test
+  public void check_component_uuid_permission_ok() {
+    UserSession session = newServerUserSession().setLogin("marius").setUserId(1);
+
+    ComponentDto project = ComponentTesting.newProjectDto();
+    ComponentDto file = ComponentTesting.newFileDto(project, "file-uuid");
+    when(resourceDao.getResource("file-uuid")).thenReturn(new ResourceDto().setProjectUuid(project.uuid()));
+    when(authorizationDao.selectAuthorizedRootProjectsUuids(1, UserRole.USER)).thenReturn(newArrayList(project.uuid()));
+
+    session.checkComponentUuidPermission(UserRole.USER, file.uuid());
+  }
+
+  @Test(expected = ForbiddenException.class)
+  public void check_component_uuid_permission_ko() {
+    UserSession session = newServerUserSession().setLogin("marius").setUserId(1);
+
+    ComponentDto project = ComponentTesting.newProjectDto();
+    ComponentDto file = ComponentTesting.newFileDto(project, "file-uuid");
+    when(resourceDao.getResource("file-uuid")).thenReturn(new ResourceDto().setProjectUuid(project.uuid()));
+    when(authorizationDao.selectAuthorizedRootProjectsUuids(1, UserRole.USER)).thenReturn(newArrayList(project.uuid()));
+
+    session.checkComponentUuidPermission(UserRole.USER, "another-uuid");
+  }
+
+  @Test(expected = ForbiddenException.class)
+  public void check_component_key_permission_when_project_not_found() {
+    UserSession session = newServerUserSession().setLogin("marius").setUserId(1);
+
+    when(resourceDao.getRootProjectByComponentKey("com.foo:Bar:BarFile.xoo")).thenReturn(null);
+
+    session.checkComponentPermission(UserRole.USER, "com.foo:Bar:BarFile.xoo");
+  }
+
+  @Test(expected = ForbiddenException.class)
+  public void check_component_dto_permission_ko() {
+    UserSession session = newServerUserSession().setLogin("marius").setUserId(1);
+
+    ComponentDto project = ComponentTesting.newProjectDto();
+    when(authorizationDao.selectAuthorizedRootProjectsKeys(1, UserRole.USER)).thenReturn(newArrayList(project.uuid()));
+
+    session.checkComponentPermission(UserRole.USER, "another");
+  }
+
+  private ServerUserSession newServerUserSession() {
+    return new ServerUserSession(authorizationDao, resourceDao);
+  }
+
+}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/user/ThreadLocalUserSessionTest.java b/server/sonar-server/src/test/java/org/sonar/server/user/ThreadLocalUserSessionTest.java
new file mode 100644 (file)
index 0000000..69de8cc
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.user;
+
+import java.util.Locale;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.sonar.server.tester.MockUserSession;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ThreadLocalUserSessionTest {
+
+  ThreadLocalUserSession threadLocalUserSession = new ThreadLocalUserSession();
+  @org.junit.Rule
+  public ExpectedException thrown = ExpectedException.none();
+
+  @Before
+  public void setUp() throws Exception {
+    threadLocalUserSession.remove();
+  }
+
+  @Test
+  public void getSession_get_anonymous_by_default() throws Exception {
+    UserSession session = threadLocalUserSession.get();
+
+    assertThat(session).isNotNull();
+    assertThat(session.login()).isNull();
+    assertThat(session.userId()).isNull();
+    assertThat(session.isLoggedIn()).isFalse();
+    // default locale
+    assertThat(session.locale()).isEqualTo(Locale.ENGLISH);
+  }
+
+  @Test
+  public void get_session() throws Exception {
+    threadLocalUserSession.set(new MockUserSession("karadoc").setUserId(123).setLocale(Locale.FRENCH));
+
+    UserSession session = threadLocalUserSession.get();
+    assertThat(session).isNotNull();
+    assertThat(session.userId()).isEqualTo(123);
+    assertThat(session.login()).isEqualTo("karadoc");
+    assertThat(session.isLoggedIn()).isTrue();
+    assertThat(session.locale()).isEqualTo(Locale.FRENCH);
+  }
+
+}
index 0e8e466a575ed47b3eac216db009dadfc84b16be..2b2f7c545eaadc19340cd208975d2eaf83d52ae4 100644 (file)
  */
 package org.sonar.server.user;
 
-import org.junit.Before;
-import org.junit.Test;
-
+import java.io.IOException;
 import javax.servlet.FilterChain;
 import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.sonar.core.platform.ComponentContainer;
+import org.sonar.server.platform.Platform;
+import org.sonar.server.tester.MockUserSession;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 public class UserSessionFilterTest {
+  private ThreadLocalUserSession threadLocalUserSession = new ThreadLocalUserSession();
+  private Platform platform = mock(Platform.class);
+  private ComponentContainer componentContainer = mock(ComponentContainer.class);
 
   @Before
   public void setUp() {
+    when(platform.getContainer()).thenReturn(componentContainer);
+    when(componentContainer.getComponentByType(ThreadLocalUserSession.class)).thenReturn(threadLocalUserSession);
     // for test isolation
-    UserSession.remove();
+    threadLocalUserSession.remove();
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    threadLocalUserSession.remove();
   }
 
   @Test
-  public void should_cleanup_user_session_after_request_handling() throws Exception {
+  public void should_cleanup_user_session_after_request_handling() throws IOException, ServletException {
     HttpServletRequest httpRequest = mock(HttpServletRequest.class);
     ServletResponse httpResponse = mock(ServletResponse.class);
     FilterChain chain = mock(FilterChain.class);
 
-    MockUserSession.set().setUserId(123).setLogin("karadoc");
-    assertThat(UserSession.hasSession()).isTrue();
-    UserSessionFilter filter = new UserSessionFilter();
+    threadLocalUserSession.set(new MockUserSession("karadoc").setUserId(123));
+    assertThat(threadLocalUserSession.hasSession()).isTrue();
+    UserSessionFilter filter = new UserSessionFilter(platform);
     filter.doFilter(httpRequest, httpResponse, chain);
 
     verify(chain).doFilter(httpRequest, httpResponse);
-    assertThat(UserSession.hasSession()).isFalse();
+    assertThat(threadLocalUserSession.hasSession()).isFalse();
   }
 
   @Test
-  public void just_for_fun_and_coverage() throws Exception {
-    UserSessionFilter filter = new UserSessionFilter();
+  public void just_for_fun_and_coverage() throws ServletException {
+    UserSessionFilter filter = new UserSessionFilter(platform);
     filter.init(mock(FilterConfig.class));
     filter.destroy();
     // do not fail
diff --git a/server/sonar-server/src/test/java/org/sonar/server/user/UserSessionTest.java b/server/sonar-server/src/test/java/org/sonar/server/user/UserSessionTest.java
deleted file mode 100644 (file)
index ec16375..0000000
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.server.user;
-
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.sonar.api.web.UserRole;
-import org.sonar.core.component.ComponentDto;
-import org.sonar.core.permission.GlobalPermissions;
-import org.sonar.core.resource.ResourceDao;
-import org.sonar.core.resource.ResourceDto;
-import org.sonar.core.user.AuthorizationDao;
-import org.sonar.server.component.ComponentTesting;
-import org.sonar.server.exceptions.ForbiddenException;
-
-import javax.annotation.Nullable;
-import java.util.Arrays;
-import java.util.Locale;
-
-import static com.google.common.collect.Lists.newArrayList;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class UserSessionTest {
-
-  @org.junit.Rule
-  public ExpectedException thrown = ExpectedException.none();
-
-  @Test
-  public void getSession_get_anonymous_by_default() {
-    UserSession.remove();
-
-    UserSession session = UserSession.get();
-
-    assertThat(session).isNotNull();
-    assertThat(session.login()).isNull();
-    assertThat(session.userId()).isNull();
-    assertThat(session.isLoggedIn()).isFalse();
-    // default locale
-    assertThat(session.locale()).isEqualTo(Locale.ENGLISH);
-  }
-
-  @Test
-  public void get_session() {
-    UserSession.set(new UserSession().setUserId(123).setLogin("karadoc").setLocale(Locale.FRENCH));
-
-    UserSession session = UserSession.get();
-    assertThat(session).isNotNull();
-    assertThat(session.userId()).isEqualTo(123);
-    assertThat(session.login()).isEqualTo("karadoc");
-    assertThat(session.isLoggedIn()).isTrue();
-    assertThat(session.locale()).isEqualTo(Locale.FRENCH);
-  }
-
-  @Test
-  public void login_should_not_be_empty() {
-    UserSession session = new UserSession().setLogin("");
-    assertThat(session.login()).isNull();
-    assertThat(session.isLoggedIn()).isFalse();
-  }
-
-  @Test
-  public void has_global_permission() {
-    AuthorizationDao authorizationDao = mock(AuthorizationDao.class);
-    UserSession session = new SpyUserSession("marius", authorizationDao);
-
-    when(authorizationDao.selectGlobalPermissions("marius")).thenReturn(Arrays.asList("profileadmin", "admin"));
-
-    assertThat(session.hasGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN)).isTrue();
-    assertThat(session.hasGlobalPermission(GlobalPermissions.SYSTEM_ADMIN)).isTrue();
-    assertThat(session.hasGlobalPermission(GlobalPermissions.DASHBOARD_SHARING)).isFalse();
-  }
-
-  @Test
-  public void check_global_Permission_ok() {
-    AuthorizationDao authorizationDao = mock(AuthorizationDao.class);
-    UserSession session = new SpyUserSession("marius", authorizationDao);
-
-    when(authorizationDao.selectGlobalPermissions("marius")).thenReturn(Arrays.asList("profileadmin", "admin"));
-
-    session.checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
-  }
-
-  @Test(expected = ForbiddenException.class)
-  public void check_global_Permission_ko() {
-    AuthorizationDao authorizationDao = mock(AuthorizationDao.class);
-    UserSession session = new SpyUserSession("marius", authorizationDao);
-
-    when(authorizationDao.selectGlobalPermissions("marius")).thenReturn(Arrays.asList("profileadmin", "admin"));
-
-    session.checkGlobalPermission(GlobalPermissions.DASHBOARD_SHARING);
-  }
-
-  @Test
-  public void has_project_permission() {
-    AuthorizationDao authorizationDao = mock(AuthorizationDao.class);
-    UserSession session = new SpyUserSession("marius", authorizationDao).setUserId(1);
-    when(authorizationDao.selectAuthorizedRootProjectsKeys(1, UserRole.USER)).thenReturn(newArrayList("com.foo:Bar"));
-
-    assertThat(session.hasProjectPermission(UserRole.USER, "com.foo:Bar")).isTrue();
-    assertThat(session.hasProjectPermission(UserRole.CODEVIEWER, "com.foo:Bar")).isFalse();
-    assertThat(session.hasProjectPermission(UserRole.ADMIN, "com.foo:Bar")).isFalse();
-  }
-
-  @Test
-  public void has_project_permission_by_uuid() {
-    AuthorizationDao authorizationDao = mock(AuthorizationDao.class);
-    UserSession session = new SpyUserSession("marius", authorizationDao).setUserId(1);
-    when(authorizationDao.selectAuthorizedRootProjectsUuids(1, UserRole.USER)).thenReturn(newArrayList("ABCD"));
-
-    assertThat(session.hasProjectPermissionByUuid(UserRole.USER, "ABCD")).isTrue();
-    assertThat(session.hasProjectPermissionByUuid(UserRole.CODEVIEWER, "ABCD")).isFalse();
-    assertThat(session.hasProjectPermissionByUuid(UserRole.ADMIN, "ABCD")).isFalse();
-  }
-
-  @Test
-  public void check_project_permission_ok() {
-    AuthorizationDao authorizationDao = mock(AuthorizationDao.class);
-    UserSession session = new SpyUserSession("marius", authorizationDao).setUserId(1);
-    when(authorizationDao.selectAuthorizedRootProjectsKeys(1, UserRole.USER)).thenReturn(newArrayList("com.foo:Bar"));
-
-    session.checkProjectPermission(UserRole.USER, "com.foo:Bar");
-  }
-
-  @Test(expected = ForbiddenException.class)
-  public void check_project_permission_ko() {
-    AuthorizationDao authorizationDao = mock(AuthorizationDao.class);
-    UserSession session = new SpyUserSession("marius", authorizationDao).setUserId(1);
-    when(authorizationDao.selectAuthorizedRootProjectsKeys(1, UserRole.USER)).thenReturn(newArrayList("com.foo:Bar2"));
-
-    session.checkProjectPermission(UserRole.USER, "com.foo:Bar");
-  }
-
-  @Test
-  public void check_project_uuid_permission_ok() {
-    AuthorizationDao authorizationDao = mock(AuthorizationDao.class);
-    UserSession session = new SpyUserSession("marius", authorizationDao).setUserId(1);
-
-    ComponentDto project = ComponentTesting.newProjectDto();
-    when(authorizationDao.selectAuthorizedRootProjectsUuids(1, UserRole.USER)).thenReturn(newArrayList(project.uuid()));
-
-    session.checkProjectUuidPermission(UserRole.USER, project.uuid());
-  }
-
-  @Test(expected = ForbiddenException.class)
-  public void check_project_uuid_permission_ko() {
-    AuthorizationDao authorizationDao = mock(AuthorizationDao.class);
-    UserSession session = new SpyUserSession("marius", authorizationDao).setUserId(1);
-
-    ComponentDto project = ComponentTesting.newProjectDto();
-    when(authorizationDao.selectAuthorizedRootProjectsUuids(1, UserRole.USER)).thenReturn(newArrayList(project.uuid()));
-
-    session.checkProjectUuidPermission(UserRole.USER, "another project");
-  }
-
-  @Test
-  public void has_component_permission() {
-    AuthorizationDao authorizationDao = mock(AuthorizationDao.class);
-    ResourceDao resourceDao = mock(ResourceDao.class);
-    UserSession session = new SpyUserSession("marius", authorizationDao, resourceDao).setUserId(1);
-
-    String componentKey = "com.foo:Bar:BarFile.xoo";
-    when(resourceDao.getRootProjectByComponentKey(componentKey)).thenReturn(new ResourceDto().setKey(componentKey));
-    when(authorizationDao.selectAuthorizedRootProjectsKeys(1, UserRole.USER)).thenReturn(newArrayList(componentKey));
-
-    assertThat(session.hasComponentPermission(UserRole.USER, componentKey)).isTrue();
-    assertThat(session.hasComponentPermission(UserRole.CODEVIEWER, componentKey)).isFalse();
-    assertThat(session.hasComponentPermission(UserRole.ADMIN, componentKey)).isFalse();
-  }
-
-  @Test
-  public void check_component_key_permission_ok() {
-    AuthorizationDao authorizationDao = mock(AuthorizationDao.class);
-    ResourceDao resourceDao = mock(ResourceDao.class);
-    UserSession session = new SpyUserSession("marius", authorizationDao, resourceDao).setUserId(1);
-
-    when(resourceDao.getRootProjectByComponentKey("com.foo:Bar:BarFile.xoo")).thenReturn(new ResourceDto().setKey("com.foo:Bar"));
-    when(authorizationDao.selectAuthorizedRootProjectsKeys(1, UserRole.USER)).thenReturn(newArrayList("com.foo:Bar"));
-
-    session.checkComponentPermission(UserRole.USER, "com.foo:Bar:BarFile.xoo");
-  }
-
-  @Test(expected = ForbiddenException.class)
-  public void check_component_key_permission_ko() {
-    AuthorizationDao authorizationDao = mock(AuthorizationDao.class);
-    ResourceDao resourceDao = mock(ResourceDao.class);
-    UserSession session = new SpyUserSession("marius", authorizationDao, resourceDao).setUserId(1);
-
-    when(resourceDao.getRootProjectByComponentKey("com.foo:Bar:BarFile.xoo")).thenReturn(new ResourceDto().setKey("com.foo:Bar2"));
-    when(authorizationDao.selectAuthorizedRootProjectsKeys(1, UserRole.USER)).thenReturn(newArrayList("com.foo:Bar"));
-
-    session.checkComponentPermission(UserRole.USER, "com.foo:Bar:BarFile.xoo");
-  }
-
-  @Test
-  public void check_component_uuid_permission_ok() {
-    AuthorizationDao authorizationDao = mock(AuthorizationDao.class);
-    ResourceDao resourceDao = mock(ResourceDao.class);
-    UserSession session = new SpyUserSession("marius", authorizationDao,resourceDao).setUserId(1);
-
-    ComponentDto project = ComponentTesting.newProjectDto();
-    ComponentDto file = ComponentTesting.newFileDto(project, "file-uuid");
-    when(resourceDao.getResource("file-uuid")).thenReturn(new ResourceDto().setProjectUuid(project.uuid()));
-    when(authorizationDao.selectAuthorizedRootProjectsUuids(1, UserRole.USER)).thenReturn(newArrayList(project.uuid()));
-
-    session.checkComponentUuidPermission(UserRole.USER, file.uuid());
-  }
-
-  @Test(expected = ForbiddenException.class)
-  public void check_component_uuid_permission_ko() {
-    AuthorizationDao authorizationDao = mock(AuthorizationDao.class);
-    ResourceDao resourceDao = mock(ResourceDao.class);
-    UserSession session = new SpyUserSession("marius", authorizationDao,resourceDao).setUserId(1);
-
-    ComponentDto project = ComponentTesting.newProjectDto();
-    ComponentDto file = ComponentTesting.newFileDto(project, "file-uuid");
-    when(resourceDao.getResource("file-uuid")).thenReturn(new ResourceDto().setProjectUuid(project.uuid()));
-    when(authorizationDao.selectAuthorizedRootProjectsUuids(1, UserRole.USER)).thenReturn(newArrayList(project.uuid()));
-
-    session.checkComponentUuidPermission(UserRole.USER, "another-uuid");
-  }
-
-  @Test(expected = ForbiddenException.class)
-  public void check_component_key_permission_when_project_not_found() {
-    AuthorizationDao authorizationDao = mock(AuthorizationDao.class);
-    ResourceDao resourceDao = mock(ResourceDao.class);
-    UserSession session = new SpyUserSession("marius", authorizationDao, resourceDao).setUserId(1);
-
-    when(resourceDao.getRootProjectByComponentKey("com.foo:Bar:BarFile.xoo")).thenReturn(null);
-
-    session.checkComponentPermission(UserRole.USER, "com.foo:Bar:BarFile.xoo");
-  }
-
-  @Test(expected = ForbiddenException.class)
-  public void check_component_dto_permission_ko() {
-    AuthorizationDao authorizationDao = mock(AuthorizationDao.class);
-    ResourceDao resourceDao = mock(ResourceDao.class);
-    UserSession session = new SpyUserSession("marius", authorizationDao, resourceDao).setUserId(1);
-
-    ComponentDto project = ComponentTesting.newProjectDto();
-    when(authorizationDao.selectAuthorizedRootProjectsKeys(1, UserRole.USER)).thenReturn(newArrayList(project.uuid()));
-
-    session.checkComponentPermission(UserRole.USER, "another");
-  }
-
-  static class SpyUserSession extends UserSession {
-    private AuthorizationDao authorizationDao;
-    private ResourceDao resourceDao;
-
-    SpyUserSession(String login, AuthorizationDao authorizationDao) {
-      this(login, authorizationDao, null);
-    }
-
-    SpyUserSession(String login, AuthorizationDao authorizationDao, @Nullable ResourceDao resourceDao) {
-      this.authorizationDao = authorizationDao;
-      this.resourceDao = resourceDao;
-      setLogin(login);
-    }
-
-    @Override
-    AuthorizationDao authorizationDao() {
-      return authorizationDao;
-    }
-
-    @Override
-    ResourceDao resourceDao() {
-      return resourceDao;
-    }
-
-  }
-}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/user/UserSessionTestUtils.java b/server/sonar-server/src/test/java/org/sonar/server/user/UserSessionTestUtils.java
deleted file mode 100644 (file)
index 9b80ce0..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.server.user;
-
-public class UserSessionTestUtils {
-
-  private UserSessionTestUtils() {
-    // Utility class
-  }
-
-  public static void setUserSession(UserSession session) {
-    UserSession.set(session);
-  }
-}
index 885117eca6f3e321ccd1e5af81a08ceedd0b3db9..bf11bb03311e6d0e4cd76938f4d3401dc068dfdc 100644 (file)
@@ -23,6 +23,7 @@ package org.sonar.server.user.ws;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.config.Settings;
 import org.sonar.api.server.ws.WebService;
@@ -36,7 +37,7 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.es.EsTester;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.exceptions.NotFoundException;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.user.NewUserNotifier;
 import org.sonar.server.user.UserUpdater;
 import org.sonar.server.user.db.GroupDao;
@@ -60,6 +61,8 @@ public class ChangePasswordActionTest {
 
   @ClassRule
   public static final EsTester esTester = new EsTester().addDefinitions(new UserIndexDefinition(settings));
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone().logon("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
 
   WebService.Controller controller;
 
@@ -89,10 +92,8 @@ public class ChangePasswordActionTest {
 
     userIndexer = (UserIndexer) new UserIndexer(dbClient, esTester.client()).setEnabled(true);
     index = new UserIndex(esTester.client());
-    tester = new WsTester(new UsersWs(new ChangePasswordAction(new UserUpdater(mock(NewUserNotifier.class), settings, dbClient, userIndexer, system2))));
+    tester = new WsTester(new UsersWs(new ChangePasswordAction(new UserUpdater(mock(NewUserNotifier.class), settings, dbClient, userIndexer, system2), userSessionRule)));
     controller = tester.controller("api/users");
-
-    MockUserSession.set().setLogin("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
   }
 
   @After
@@ -104,7 +105,7 @@ public class ChangePasswordActionTest {
   public void fail_on_missing_permission() throws Exception {
     createUser();
 
-    MockUserSession.set().setLogin("polop");
+    userSessionRule.logon("polop");
     tester.newPostRequest("api/users", "change_password")
       .setParam("login", "john")
       .execute();
index db4e2b278210a8277d92c025f25944a04bded936..3ef6f083c88d5c95bc037d6a6e40470c7890aacd 100644 (file)
@@ -23,6 +23,7 @@ package org.sonar.server.user.ws;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -39,7 +40,7 @@ import org.sonar.core.user.UserDto;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.es.EsTester;
 import org.sonar.server.exceptions.ForbiddenException;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.user.NewUserNotifier;
 import org.sonar.server.user.UserUpdater;
 import org.sonar.server.user.db.GroupDao;
@@ -67,6 +68,8 @@ public class CreateActionTest {
 
   @ClassRule
   public static final EsTester esTester = new EsTester().addDefinitions(new UserIndexDefinition(settings));
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   WebService.Controller controller;
 
@@ -101,7 +104,7 @@ public class CreateActionTest {
     index = new UserIndex(esTester.client());
     tester = new WsTester(new UsersWs(new CreateAction(index,
       new UserUpdater(mock(NewUserNotifier.class), settings, dbClient, userIndexer, system2),
-      i18n)));
+      i18n, userSessionRule)));
     controller = tester.controller("api/users");
 
   }
@@ -113,7 +116,7 @@ public class CreateActionTest {
 
   @Test
   public void create_user() throws Exception {
-    MockUserSession.set().setLogin("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.logon("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
 
     tester.newPostRequest("api/users", "create")
       .setParam("login", "john")
@@ -133,7 +136,7 @@ public class CreateActionTest {
 
   @Test
   public void reactivate_user() throws Exception {
-    MockUserSession.set().setLogin("admin").setLocale(Locale.FRENCH).setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.logon("admin").setLocale(Locale.FRENCH).setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
 
     dbClient.userDao().insert(session, new UserDto()
       .setEmail("john@email.com")
@@ -160,7 +163,7 @@ public class CreateActionTest {
 
   @Test(expected = ForbiddenException.class)
   public void fail_on_missing_permission() throws Exception {
-    MockUserSession.set().setLogin("not_admin");
+    userSessionRule.logon("not_admin");
 
     tester.newPostRequest("api/users", "create")
       .setParam("login", "john")
index 82b91f197adc803d3d6c1f99f2cb911b0c26ea65..2a6d65028960c3cf09ff8ad9f25936d56e324929 100644 (file)
 package org.sonar.server.user.ws;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.core.permission.GlobalPermissions;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
 public class CurrentUserActionTest {
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   private WsTester tester;
 
   @Before
   public void before() {
-    tester = new WsTester(new UsersWs(new CurrentUserAction()));
+    tester = new WsTester(new UsersWs(new CurrentUserAction(userSessionRule)));
   }
 
   @Test
   public void anonymous() throws Exception {
-    MockUserSession.set();
     tester.newGetRequest("api/users", "current").execute().assertJson(getClass(), "anonymous.json");
   }
 
   @Test
   public void authenticated() throws Exception {
-    MockUserSession.set().setLogin("obiwan.kenobi").setName("Obiwan Kenobi")
+    userSessionRule.logon("obiwan.kenobi").setName("Obiwan Kenobi")
       .setGlobalPermissions(GlobalPermissions.ALL.toArray(new String[0]));
     tester.newGetRequest("api/users", "current").execute().assertJson(getClass(), "authenticated.json");
   }
index d7edbbc6b7899c4f7eac66f1e8c9e5926f216a15..005ec57c260d61b49b32026fff955a7961df96ff 100644 (file)
@@ -23,6 +23,7 @@ package org.sonar.server.user.ws;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -39,7 +40,7 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.es.EsTester;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.exceptions.NotFoundException;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.user.NewUserNotifier;
 import org.sonar.server.user.UserUpdater;
 import org.sonar.server.user.db.UserDao;
@@ -59,9 +60,10 @@ public class DeactivateActionTest {
 
   @ClassRule
   public static final DbTester dbTester = new DbTester();
-
   @ClassRule
   public static final EsTester esTester = new EsTester().addDefinitions(new UserIndexDefinition(settings));
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
 
   WebService.Controller controller;
 
@@ -92,7 +94,7 @@ public class DeactivateActionTest {
     userIndexer = (UserIndexer) new UserIndexer(dbClient, esTester.client()).setEnabled(true);
     index = new UserIndex(esTester.client());
     tester = new WsTester(new UsersWs(new DeactivateAction(index,
-      new UserUpdater(mock(NewUserNotifier.class), settings, dbClient, userIndexer, system2))));
+      new UserUpdater(mock(NewUserNotifier.class), settings, dbClient, userIndexer, system2), userSessionRule)));
     controller = tester.controller("api/users");
 
   }
@@ -106,7 +108,7 @@ public class DeactivateActionTest {
   public void deactivate_user() throws Exception {
     createUser();
 
-    MockUserSession.set().setLogin("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.logon("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
     tester.newPostRequest("api/users", "deactivate")
       .setParam("login", "john")
       .execute()
@@ -120,14 +122,14 @@ public class DeactivateActionTest {
   public void fail_on_missing_permission() throws Exception {
     createUser();
 
-    MockUserSession.set().setLogin("not_admin");
+    userSessionRule.logon("not_admin");
     tester.newPostRequest("api/users", "deactivate")
       .setParam("login", "john").execute();
   }
 
   @Test(expected = NotFoundException.class)
   public void fail_on_unknown_user() throws Exception {
-    MockUserSession.set().setLogin("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.logon("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
     tester.newPostRequest("api/users", "deactivate")
       .setParam("login", "john").execute();
   }
index a5e893e4a1ff07652aaae02a0c9858f357cb17d9..42c31591d839b73c3d14aa2d71afb2ea1152d967 100644 (file)
@@ -23,6 +23,7 @@ package org.sonar.server.user.ws;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.config.Settings;
 import org.sonar.api.server.ws.WebService;
@@ -35,7 +36,7 @@ import org.sonar.core.user.UserDto;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.es.EsTester;
 import org.sonar.server.exceptions.ForbiddenException;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.user.NewUserNotifier;
 import org.sonar.server.user.UserUpdater;
 import org.sonar.server.user.db.GroupDao;
@@ -55,9 +56,11 @@ public class UpdateActionTest {
 
   @ClassRule
   public static final DbTester dbTester = new DbTester();
-
   @ClassRule
   public static final EsTester esTester = new EsTester().addDefinitions(new UserIndexDefinition(settings));
+  @Rule
+  public final UserSessionRule userSessionRule = UserSessionRule.standalone().logon("admin")
+      .setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
 
   WebService.Controller controller;
 
@@ -88,10 +91,8 @@ public class UpdateActionTest {
     userIndexer = (UserIndexer) new UserIndexer(dbClient, esTester.client()).setEnabled(true);
     index = new UserIndex(esTester.client());
     tester = new WsTester(new UsersWs(new UpdateAction(index,
-      new UserUpdater(mock(NewUserNotifier.class), settings, dbClient, userIndexer, system2))));
+        new UserUpdater(mock(NewUserNotifier.class), settings, dbClient, userIndexer, system2), userSessionRule)));
     controller = tester.controller("api/users");
-
-    MockUserSession.set().setLogin("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
   }
 
   @After
@@ -103,7 +104,7 @@ public class UpdateActionTest {
   public void fail_on_missing_permission() throws Exception {
     createUser();
 
-    MockUserSession.set().setLogin("polop");
+    userSessionRule.logon("polop");
     tester.newPostRequest("api/users", "update")
       .setParam("login", "john")
       .execute();
index 78270a6904b2fa293c054b6919bc77806d96753f..62dd223058eee9be2b9f0ea10966f0c6eaf9247e 100644 (file)
 package org.sonar.server.user.ws;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.i18n.I18n;
 import org.sonar.api.server.ws.RailsHandler;
 import org.sonar.api.server.ws.WebService;
+import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.user.UserUpdater;
 import org.sonar.server.user.index.UserIndex;
 import org.sonar.server.ws.WsTester;
@@ -33,17 +35,18 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 public class UsersWsTest {
-
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
   WebService.Controller controller;
 
   @Before
   public void setUp() {
     WsTester tester = new WsTester(new UsersWs(
-      new CreateAction(mock(UserIndex.class), mock(UserUpdater.class), mock(I18n.class)),
-      new UpdateAction(mock(UserIndex.class), mock(UserUpdater.class)),
-      new CurrentUserAction(),
-      new DeactivateAction(mock(UserIndex.class), mock(UserUpdater.class)),
-      new ChangePasswordAction(mock(UserUpdater.class))));
+      new CreateAction(mock(UserIndex.class), mock(UserUpdater.class), mock(I18n.class), userSessionRule),
+      new UpdateAction(mock(UserIndex.class), mock(UserUpdater.class), userSessionRule),
+      new CurrentUserAction(userSessionRule),
+      new DeactivateAction(mock(UserIndex.class), mock(UserUpdater.class), userSessionRule),
+    new ChangePasswordAction(mock(UserUpdater.class), userSessionRule)));
     controller = tester.controller("api/users");
   }
 
index 2fa57a53d62a0e88d887ca8bcddf6d48de67e313..0493cc734efd9a7bebe07ade0fc1df13d3ffb9ae 100644 (file)
@@ -23,6 +23,7 @@ package org.sonar.server.view.index;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.security.DefaultGroups;
 import org.sonar.api.web.UserRole;
@@ -47,7 +48,7 @@ import org.sonar.server.permission.PermissionChange;
 import org.sonar.server.rule.RuleTesting;
 import org.sonar.server.rule.db.RuleDao;
 import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
+import org.sonar.server.tester.UserSessionRule;
 
 import static com.google.common.collect.Lists.newArrayList;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -62,6 +63,8 @@ public class ViewIndexerMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester();
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester);
 
   DbSession dbSession;
 
@@ -99,7 +102,7 @@ public class ViewIndexerMediumTest {
     indexer.index(viewUuid);
 
     // Execute issue query on view -> 1 issue on view
-    SearchResult<IssueDoc> docs = tester.get(IssueIndex.class).search(IssueQuery.builder().viewUuids(newArrayList(viewUuid)).build(),
+    SearchResult<IssueDoc> docs = tester.get(IssueIndex.class).search(IssueQuery.builder(userSessionRule).viewUuids(newArrayList(viewUuid)).build(),
       new SearchOptions());
     assertThat(docs.getDocs()).hasSize(1);
 
@@ -111,7 +114,7 @@ public class ViewIndexerMediumTest {
     indexer.index(viewUuid);
 
     // Execute issue query on view -> issue of project2 are well taken into account : the cache has been cleared
-    assertThat(tester.get(IssueIndex.class).search(IssueQuery.builder().viewUuids(newArrayList(viewUuid)).build(), new SearchOptions()).getDocs()).hasSize(2);
+    assertThat(tester.get(IssueIndex.class).search(IssueQuery.builder(userSessionRule).viewUuids(newArrayList(viewUuid)).build(), new SearchOptions()).getDocs()).hasSize(2);
   }
 
   private ComponentDto addProjectWithIssue(RuleDto rule) {
@@ -131,9 +134,8 @@ public class ViewIndexerMediumTest {
 
   private void setDefaultProjectPermission(ComponentDto project) {
     // project can be seen by anyone and by code viewer
-    MockUserSession.set().setLogin("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    userSessionRule.logon("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
     tester.get(InternalPermissionService.class).addPermission(new PermissionChange().setComponentKey(project.getKey()).setGroup(DefaultGroups.ANYONE).setPermission(UserRole.USER));
-    MockUserSession.set();
   }
 
 }
index 3441a74bf735429f3dcf427251d5377196ae06da..19ea3af700a936b496eb41ce0ce6b528944402a4 100644 (file)
 package org.sonar.server.ws;
 
 import com.google.common.collect.Maps;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Locale;
+import java.util.Map;
+import javax.annotation.Nullable;
 import org.apache.commons.io.IOUtils;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.i18n.I18n;
 import org.sonar.api.server.ws.Request;
@@ -34,14 +40,7 @@ import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.exceptions.Errors;
 import org.sonar.server.exceptions.Message;
 import org.sonar.server.plugins.MimeTypes;
-import org.sonar.server.user.MockUserSession;
-
-import javax.annotation.Nullable;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Locale;
-import java.util.Map;
+import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
@@ -93,8 +92,10 @@ public class WebServiceEngineTest {
 
   }
 
+  @Rule
+  public UserSessionRule userSessionRule = UserSessionRule.standalone();
   I18n i18n = mock(I18n.class);
-  WebServiceEngine engine = new WebServiceEngine(new WebService[] {new SystemWebService()}, i18n);
+  WebServiceEngine engine = new WebServiceEngine(new WebService[] {new SystemWebService()}, i18n, userSessionRule);
 
   @Before
   public void start() {
@@ -239,7 +240,7 @@ public class WebServiceEngineTest {
 
   @Test
   public void bad_request_with_i18n_message() {
-    MockUserSession.set().setLocale(Locale.ENGLISH);
+    userSessionRule.setLocale(Locale.ENGLISH);
     ValidatingRequest request = new SimpleRequest("GET").setParam("count", "3");
     ServletResponse response = new ServletResponse();
     when(i18n.message(Locale.ENGLISH, "bad.request.reason", "bad.request.reason", 0)).thenReturn("reason #0");
@@ -271,7 +272,7 @@ public class WebServiceEngineTest {
 
   @Test
   public void bad_request_with_multiple_i18n_messages() {
-    MockUserSession.set().setLocale(Locale.ENGLISH);
+    userSessionRule.setLocale(Locale.ENGLISH);
 
     ValidatingRequest request = new SimpleRequest("GET").setParam("count", "3");
     ServletResponse response = new ServletResponse();