]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-8192 use a System2 impl always returning a bigger number
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Tue, 18 Oct 2016 13:49:26 +0000 (15:49 +0200)
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Wed, 19 Oct 2016 12:45:13 +0000 (14:45 +0200)
provides bullet proof reliability to unit tests checking updates actually occured by checking the value of the update_at column

server/sonar-server/src/test/java/org/sonar/server/authentication/UserIdentityAuthenticatorTest.java
server/sonar-server/src/test/java/org/sonar/server/permission/ws/BasePermissionWsTest.java
server/sonar-server/src/test/java/org/sonar/server/usergroups/ws/AddUserActionTest.java
server/sonar-server/src/test/java/org/sonar/server/usergroups/ws/RemoveUserActionTest.java
sonar-plugin-api/src/main/java/org/sonar/api/utils/internal/AlwaysIncreasingSystem2.java [new file with mode: 0644]

index fb612c5bf71f393001e784daba88eb70f01f61a0..e65a5a631b0b4816f8154970a4d633832158a745 100644 (file)
@@ -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);
index a1060ed43fa6fa757f68e321820e0c4ef5f0e5bb..9e66249f11fad22b5bbeb2e9b7a54907e92c0214 100644 (file)
@@ -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<A extends PermissionsWsAction> {
 
   @Rule
-  public DbTester db = DbTester.create(System2.INSTANCE);
+  public DbTester db = DbTester.create(new AlwaysIncreasingSystem2());
   @Rule
   public ExpectedException expectedException = ExpectedException.none();
 
index a41172ebf18dcc6d18e4bc7ac0a764570372400f..d46871959bfeddaaca890ea5a57d18bc8d8c1459 100644 (file)
@@ -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
index 47b73fac5096160254b2204ce0f2271334caf4cb..63c0ff47fe9c32031cb50a55fd4d1fc696397f3d 100644 (file)
@@ -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 (file)
index 0000000..628c608
--- /dev/null
@@ -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.
+ * <p>
+ * This class is intended to be used in Unit tests.
+ * </p>
+ */
+public class AlwaysIncreasingSystem2 extends System2 {
+  private final AtomicLong now;
+  private final long increment;
+
+  private AlwaysIncreasingSystem2(Supplier<Long> 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));
+  }
+}