From: Sébastien Lesaint Date: Tue, 18 Oct 2016 13:49:26 +0000 (+0200) Subject: SONAR-8192 use a System2 impl always returning a bigger number X-Git-Tag: 6.2-RC1~360 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=98142b6ae35f142a8532de04b01bdaedecbdc870;p=sonarqube.git SONAR-8192 use a System2 impl always returning a bigger number provides bullet proof reliability to unit tests checking updates actually occured by checking the value of the update_at column --- diff --git a/server/sonar-server/src/test/java/org/sonar/server/authentication/UserIdentityAuthenticatorTest.java b/server/sonar-server/src/test/java/org/sonar/server/authentication/UserIdentityAuthenticatorTest.java index fb612c5bf71..e65a5a631b0 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/authentication/UserIdentityAuthenticatorTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/authentication/UserIdentityAuthenticatorTest.java @@ -30,6 +30,7 @@ import org.sonar.api.config.Settings; import org.sonar.api.server.authentication.UnauthorizedException; import org.sonar.api.server.authentication.UserIdentity; import org.sonar.api.utils.System2; +import org.sonar.api.utils.internal.AlwaysIncreasingSystem2; import org.sonar.core.util.stream.Collectors; import org.sonar.db.DbTester; import org.sonar.db.organization.OrganizationDto; @@ -66,7 +67,7 @@ public class UserIdentityAuthenticatorTest { public ExpectedException thrown = ExpectedException.none(); @Rule - public DbTester db = DbTester.create(System2.INSTANCE); + public DbTester db = DbTester.create(new AlwaysIncreasingSystem2()); private Settings settings = new MapSettings(); private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(db); diff --git a/server/sonar-server/src/test/java/org/sonar/server/permission/ws/BasePermissionWsTest.java b/server/sonar-server/src/test/java/org/sonar/server/permission/ws/BasePermissionWsTest.java index a1060ed43fa..9e66249f11f 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/permission/ws/BasePermissionWsTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/permission/ws/BasePermissionWsTest.java @@ -23,7 +23,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.rules.ExpectedException; import org.sonar.api.resources.Qualifiers; -import org.sonar.api.utils.System2; +import org.sonar.api.utils.internal.AlwaysIncreasingSystem2; import org.sonar.db.DbClient; import org.sonar.db.DbTester; import org.sonar.db.component.ResourceTypesRule; @@ -47,7 +47,7 @@ import static org.sonar.db.permission.template.PermissionTemplateTesting.newPerm public abstract class BasePermissionWsTest { @Rule - public DbTester db = DbTester.create(System2.INSTANCE); + public DbTester db = DbTester.create(new AlwaysIncreasingSystem2()); @Rule public ExpectedException expectedException = ExpectedException.none(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/usergroups/ws/AddUserActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/usergroups/ws/AddUserActionTest.java index a41172ebf18..d46871959bf 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/usergroups/ws/AddUserActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/usergroups/ws/AddUserActionTest.java @@ -24,7 +24,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.sonar.api.utils.System2; +import org.sonar.api.utils.internal.AlwaysIncreasingSystem2; import org.sonar.db.DbTester; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.user.GroupDto; @@ -47,7 +47,7 @@ import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_ORGANIZATION_K public class AddUserActionTest { @Rule - public DbTester db = DbTester.create(System2.INSTANCE); + public DbTester db = DbTester.create(new AlwaysIncreasingSystem2()); @Rule public UserSessionRule userSession = UserSessionRule.standalone(); @Rule diff --git a/server/sonar-server/src/test/java/org/sonar/server/usergroups/ws/RemoveUserActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/usergroups/ws/RemoveUserActionTest.java index 47b73fac509..63c0ff47fe9 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/usergroups/ws/RemoveUserActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/usergroups/ws/RemoveUserActionTest.java @@ -24,7 +24,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.sonar.api.utils.System2; +import org.sonar.api.utils.internal.AlwaysIncreasingSystem2; import org.sonar.core.permission.GlobalPermissions; import org.sonar.db.DbTester; import org.sonar.db.organization.OrganizationDto; @@ -45,7 +45,7 @@ import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_ORGANIZATION_K public class RemoveUserActionTest { @Rule - public DbTester db = DbTester.create(System2.INSTANCE); + public DbTester db = DbTester.create(new AlwaysIncreasingSystem2()); @Rule public UserSessionRule userSession = UserSessionRule.standalone(); @Rule @@ -173,8 +173,8 @@ public class RemoveUserActionTest { @Test public void sets_root_flag_to_false_when_removing_user_from_group_of_default_organization_with_admin_permission() throws Exception { GroupDto adminGroup = db.users().insertAdminGroup(); - UserDto user1 = db.users().insertRootByGroupPermission(adminGroup); - UserDto user2 = db.users().insertRootByGroupPermission(adminGroup); + UserDto user1 = db.users().insertRootByGroupPermission("user1", adminGroup); + UserDto user2 = db.users().insertRootByGroupPermission("user2", adminGroup); loginAsAdmin(); executeRequest(adminGroup, user1); diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/internal/AlwaysIncreasingSystem2.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/internal/AlwaysIncreasingSystem2.java new file mode 100644 index 00000000000..628c608a1ec --- /dev/null +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/internal/AlwaysIncreasingSystem2.java @@ -0,0 +1,72 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program 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. + * + * This program 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.api.utils.internal; + +import com.google.common.base.Preconditions; +import java.util.Random; +import java.util.concurrent.atomic.AtomicLong; +import java.util.function.Supplier; +import org.sonar.api.utils.System2; + +import static com.google.common.base.Preconditions.checkArgument; + +/** + * A subclass of {@link System2} which implementation of {@link System2#now()} always return a bigger value than the + * previous returned value. + *

+ * This class is intended to be used in Unit tests. + *

+ */ +public class AlwaysIncreasingSystem2 extends System2 { + private final AtomicLong now; + private final long increment; + + private AlwaysIncreasingSystem2(Supplier initialValueSupplier, long increment) { + checkArgument(increment > 0, "increment must be > 0"); + long initialValue = initialValueSupplier.get(); + Preconditions.checkArgument(initialValue >= 0, "Initial value must be >= 0"); + this.now = new AtomicLong(); + this.increment = increment; + } + + public AlwaysIncreasingSystem2(long increment) { + this(AlwaysIncreasingSystem2::randomInitialValue, increment); + } + + public AlwaysIncreasingSystem2(long initialValue, int increment) { + this(() -> initialValue, increment); + } + + /** + * Values returned by {@link #now()} will start with a random value and increment by 100. + */ + public AlwaysIncreasingSystem2() { + this(AlwaysIncreasingSystem2::randomInitialValue, 100); + } + + @Override + public long now() { + return now.addAndGet(increment); + } + + private static long randomInitialValue() { + return (long) Math.abs(new Random().nextInt(2_000_000)); + } +}