Merge branch 'stable-2.14' into stable-2.15

* stable-2.14:
  Upgrade bazlets to latest stable-2.14
  Fix typo in CachePatte{r}nMatcherTest name
  Do not propagate ldap_groups cache evictions

Change-Id: I0a9ed91c98164e55da2abb34209d07972fee5611
diff --git a/.bazelversion b/.bazelversion
new file mode 100644
index 0000000..09d1d01
--- /dev/null
+++ b/.bazelversion
@@ -0,0 +1,2 @@
+0.29.0
+
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/cache/CachePatternMatcher.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/cache/CachePatternMatcher.java
index 41a2b13..cab8f58 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/cache/CachePatternMatcher.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/cache/CachePatternMatcher.java
@@ -27,13 +27,7 @@
 class CachePatternMatcher {
   private static final List<String> DEFAULT_PATTERNS =
       ImmutableList.of(
-          "^accounts.*",
-          "^groups.*",
-          "ldap_groups",
-          "ldap_usernames",
-          "projects",
-          "sshkeys",
-          "web_sessions");
+          "^accounts.*", "^groups.*", "ldap_usernames", "projects", "sshkeys", "web_sessions");
 
   private final Pattern pattern;
 
diff --git a/src/test/java/com/ericsson/gerrit/plugins/highavailability/cache/CacheEvictionIT.java b/src/test/java/com/ericsson/gerrit/plugins/highavailability/cache/CacheEvictionIT.java
index af2d685..7299238 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/highavailability/cache/CacheEvictionIT.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/highavailability/cache/CacheEvictionIT.java
@@ -25,12 +25,19 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.github.tomakehurst.wiremock.junit.WireMockRule;
+import com.google.common.cache.LoadingCache;
+import com.google.gerrit.acceptance.GerritConfig;
 import com.google.gerrit.acceptance.GlobalPluginConfig;
 import com.google.gerrit.acceptance.LightweightPluginDaemonTest;
 import com.google.gerrit.acceptance.NoHttpd;
 import com.google.gerrit.acceptance.TestPlugin;
 import com.google.gerrit.acceptance.UseLocalDisk;
 import com.google.gerrit.acceptance.UseSsh;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import java.util.Collections;
+import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import org.apache.http.HttpStatus;
@@ -46,9 +53,16 @@
 public class CacheEvictionIT extends LightweightPluginDaemonTest {
   private static final int PORT = 18888;
   private static final String URL = "http://localhost:" + PORT;
+  private static final String GROUP_CACHE = "ldap_groups";
 
   @Rule public WireMockRule wireMockRule = new WireMockRule(options().port(PORT));
 
+  @Inject
+  @Named(GROUP_CACHE)
+  private LoadingCache<String, Set<AccountGroup.UUID>> membershipCache;
+
+  private final CountDownLatch expectedRequestLatch = new CountDownLatch(1);
+
   @Override
   public void setUp() throws Exception {
     givenThat(any(anyUrl()).willReturn(aResponse().withStatus(HttpStatus.SC_NO_CONTENT)));
@@ -59,18 +73,49 @@
   @UseLocalDisk
   @GlobalPluginConfig(pluginName = "high-availability", name = "peerInfo.static.url", value = URL)
   @GlobalPluginConfig(pluginName = "high-availability", name = "http.retryInterval", value = "100")
+  @GerritConfig(name = "auth.type", value = "ldap")
   public void flushProjectsCacheShouldSendPostForEvictingRemoteCache() throws Exception {
     final String flushRequest = "/plugins/high-availability/cache/" + Constants.PROJECTS;
-    final CountDownLatch expectedRequestLatch = new CountDownLatch(1);
+
+    expectRestApiCall(flushRequest);
+
+    adminSshSession.exec("gerrit flush-caches --cache " + Constants.PROJECTS);
+    assertThat(waitForEvictionEvents()).isTrue();
+    verify(postRequestedFor(urlEqualTo(flushRequest)));
+  }
+
+  @Test
+  @UseLocalDisk
+  @GlobalPluginConfig(pluginName = "high-availability", name = "peerInfo.static.url", value = URL)
+  @GlobalPluginConfig(pluginName = "high-availability", name = "http.retryInterval", value = "100")
+  @GerritConfig(name = "auth.type", value = "ldap")
+  public void ldapCacheLoadShouldNotSendAnyPostEvictionForLdapGroups() throws Exception {
+    final String flushRequest = "/plugins/high-availability/cache/" + GROUP_CACHE;
+    String username = "username";
+    Set<AccountGroup.UUID> groups = Collections.emptySet();
+
+    expectRestApiCall(flushRequest);
+
+    loadLdapGroupMembers(username, groups);
+    loadLdapGroupMembers(username, groups); // For triggering an eviction
+    assertThat(waitForEvictionEvents()).isFalse();
+    verify(0, postRequestedFor(urlEqualTo(flushRequest)));
+  }
+
+  private void expectRestApiCall(final String flushRequest) {
     wireMockRule.addMockServiceRequestListener(
         (request, response) -> {
           if (request.getAbsoluteUrl().contains(flushRequest)) {
             expectedRequestLatch.countDown();
           }
         });
+  }
 
-    adminSshSession.exec("gerrit flush-caches --cache " + Constants.PROJECTS);
-    assertThat(expectedRequestLatch.await(5, TimeUnit.SECONDS)).isTrue();
-    verify(postRequestedFor(urlEqualTo(flushRequest)));
+  private boolean waitForEvictionEvents() throws InterruptedException {
+    return expectedRequestLatch.await(5, TimeUnit.SECONDS);
+  }
+
+  private void loadLdapGroupMembers(String username, Set<AccountGroup.UUID> groups) {
+    membershipCache.put(username, groups);
   }
 }
diff --git a/src/test/java/com/ericsson/gerrit/plugins/highavailability/cache/CachePattenMatcherTest.java b/src/test/java/com/ericsson/gerrit/plugins/highavailability/cache/CachePatternMatcherTest.java
similarity index 98%
rename from src/test/java/com/ericsson/gerrit/plugins/highavailability/cache/CachePattenMatcherTest.java
rename to src/test/java/com/ericsson/gerrit/plugins/highavailability/cache/CachePatternMatcherTest.java
index 35a6ba3..9093238 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/highavailability/cache/CachePattenMatcherTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/highavailability/cache/CachePatternMatcherTest.java
@@ -26,7 +26,7 @@
 import org.mockito.junit.MockitoJUnitRunner;
 
 @RunWith(MockitoJUnitRunner.class)
-public class CachePattenMatcherTest {
+public class CachePatternMatcherTest {
 
   @Mock(answer = RETURNS_DEEP_STUBS)
   private Configuration configurationMock;
@@ -46,7 +46,6 @@
             "groups_byuuid",
             "groups_external",
             "groups_members",
-            "ldap_groups",
             "ldap_usernames",
             "projects",
             "sshkeys",
@@ -67,6 +66,7 @@
             "diff_summary",
             "git_tags",
             "ldap_group_existence",
+            "ldap_groups",
             "ldap_groups_byinclude",
             "mergeability",
             "oauth_tokens",