diff options
author | Sébastien Lesaint <sebastien.lesaint@sonarsource.com> | 2016-10-18 15:49:26 +0200 |
---|---|---|
committer | Sébastien Lesaint <sebastien.lesaint@sonarsource.com> | 2016-10-19 14:45:13 +0200 |
commit | 98142b6ae35f142a8532de04b01bdaedecbdc870 (patch) | |
tree | 961a9d5a176f6bb1dab480f3f38e1991888d08cc /sonar-plugin-api | |
parent | e89995f6c2780fe5107f753c2ffa550ad2716cb9 (diff) | |
download | sonarqube-98142b6ae35f142a8532de04b01bdaedecbdc870.tar.gz sonarqube-98142b6ae35f142a8532de04b01bdaedecbdc870.zip |
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
Diffstat (limited to 'sonar-plugin-api')
-rw-r--r-- | sonar-plugin-api/src/main/java/org/sonar/api/utils/internal/AlwaysIncreasingSystem2.java | 72 |
1 files changed, 72 insertions, 0 deletions
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. + * <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)); + } +} |