Merge branch 'stable-2.14'
* stable-2.14:
Remove redundant type definition
Fix documentation
Fix broken default configuration
Remove buck build
Stand-alone bazel build for events-log plugin
Attach sources of byte-buddy and objenesis in eclipse
Fix in-tree Eclipse project generation
Remove dependency already packaged in gerrit-plugin-api
Use double quotes in external_plugin_deps.bzl
Format build file with buildifier
Test plan:
- bazel clean --expunge
- bazel build events-log
- bazel test --nocache_test_results //...
- Deploy plugin to gerrit master site
- Verify plugin loads without errors
- Do some change operations: create change, review, rebase, etc...
- Query REST endpoint
- Verify events for above operations are present
Just checking that a plugin builds is not enough to vote Verified
Change-Id: Ib735d186965fc645fddf242ed4c15a574e5d4444
diff --git a/.buckconfig b/.buckconfig
deleted file mode 100644
index 97c50e0..0000000
--- a/.buckconfig
+++ /dev/null
@@ -1,17 +0,0 @@
-[alias]
- events-log = //:events-log
- plugin = //:events-log
- src = //:events-log-sources
-
-[java]
- src_roots = java, resources
- source_level = 8
- target_level = 8
-
-[project]
- ignore = .git, eclipse-out
-
-[cache]
- mode = dir
- dir = buck-out/cache
-
diff --git a/.gitignore b/.gitignore
index 50ce7fd..0da307d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,13 +2,8 @@
.project
.settings
bin
-/.buckconfig.local
-/.buckd
-/buck-cache
-/buck-out
/local.properties
*.pyc
-.buckversion
-.watchmanconfig
-/bucklets
/eclipse-out
+/.primary_build_tool
+/bazel-*
diff --git a/BUCK b/BUCK
deleted file mode 100644
index cfd0836..0000000
--- a/BUCK
+++ /dev/null
@@ -1,98 +0,0 @@
-include_defs('//bucklets/gerrit_plugin.bucklet')
-include_defs('//bucklets/java_sources.bucklet')
-include_defs('//bucklets/maven_jar.bucklet')
-
-SOURCES = glob(['src/main/java/**/*.java'])
-RESOURCES = glob(['src/main/resources/**/*'])
-DEPS = [
- '//lib:gson',
- '//lib/commons:dbcp',
-]
-TEST_DEPS = GERRIT_PLUGIN_API + DEPS + GERRIT_TESTS + [
- ':events-log__plugin',
- ':mockito',
-# bazlets include those 3 bouncycastle jars in plugin API so this is temporary
-# until this plugin is built with bazel.
-# see https://gerrit-review.googlesource.com/#/c/102670/ for more info.
- ':bouncycastle_bcprov',
- ':bouncycastle_bcpg',
- ':bouncycastle_bcpkix',
-]
-
-gerrit_plugin(
- name = 'events-log',
- srcs = SOURCES,
- resources = RESOURCES,
- manifest_entries = [
- 'Gerrit-PluginName: events-log',
- 'Implementation-Vendor: Ericsson',
- 'Implementation-URL: https://gerrit-review.googlesource.com/#/admin/projects/plugins/events-log',
- 'Gerrit-Module: com.ericsson.gerrit.plugins.eventslog.sql.SQLModule',
- 'Gerrit-HttpModule: com.ericsson.gerrit.plugins.eventslog.HttpModule',
- ],
- provided_deps = DEPS,
-)
-
-java_library(
- name = 'classpath',
- deps = TEST_DEPS,
-)
-
-java_test(
- name = 'events-log_tests',
- srcs = glob(['src/test/java/**/*.java']),
- labels = ['events-log'],
- deps = TEST_DEPS,
-)
-
-java_sources(
- name = 'events-log-sources',
- srcs = SOURCES + RESOURCES,
-)
-
-maven_jar(
- name = 'mockito',
- id = 'org.mockito:mockito-core:2.5.0',
- sha1 = 'be28d46a52c7f2563580adeca350145e9ce916f8',
- license = 'MIT',
- deps = [
- ':byte-buddy',
- ':objenesis',
- ],
-)
-
-maven_jar(
- name = 'byte-buddy',
- id = 'net.bytebuddy:byte-buddy:1.5.12',
- sha1 = 'b1ba1d15f102b36ed43b826488114678d6d413da',
- license = 'DO_NOT_DISTRIBUTE',
- attach_source = False,
-)
-
-maven_jar(
- name = 'objenesis',
- id = 'org.objenesis:objenesis:2.4',
- sha1 = '2916b6c96b50c5b3ec4452ed99401db745aabb27',
- license = 'DO_NOT_DISTRIBUTE',
- attach_source = False,
-)
-
-BC_VERS = '1.56'
-
-maven_jar(
- name = 'bouncycastle_bcprov',
- id = 'org.bouncycastle:bcprov-jdk15on:' + BC_VERS,
- sha1 = 'a153c6f9744a3e9dd6feab5e210e1c9861362ec7',
-)
-
-maven_jar(
- name = 'bouncycastle_bcpg',
- id = 'org.bouncycastle:bcpg-jdk15on:' + BC_VERS,
- sha1 = '9c3f2e7072c8cc1152079b5c25291a9f462631f1',
-)
-
-maven_jar(
- name = 'bouncycastle_bcpkix',
- id = 'org.bouncycastle:bcpkix-jdk15on:' + BC_VERS,
- sha1 = '4648af70268b6fdb24674fb1fd7c1fcc73db1231',
-)
diff --git a/BUILD b/BUILD
index 8ac7c99..da14708 100644
--- a/BUILD
+++ b/BUILD
@@ -9,34 +9,32 @@
gerrit_plugin(
name = "events-log",
srcs = glob(["src/main/java/**/*.java"]),
- resources = glob(["src/main/resources/**/*"]),
manifest_entries = [
"Gerrit-PluginName: events-log",
"Implementation-URL: https://gerrit-review.googlesource.com/#/admin/projects/plugins/events-log",
+ "Implementation-Title: events-log plugin",
"Gerrit-Module: com.ericsson.gerrit.plugins.eventslog.sql.SQLModule",
"Gerrit-HttpModule: com.ericsson.gerrit.plugins.eventslog.HttpModule",
],
+ resources = glob(["src/main/resources/**/*"]),
+)
+
+junit_tests(
+ name = "events_log_tests",
+ testonly = 1,
+ srcs = glob(["src/test/java/**/*.java"]),
+ tags = ["events-log"],
deps = [
- "@gson//jar:neverlink",
- "@commons_dbcp//jar:neverlink",
+ ":events-log__plugin_test_deps",
],
)
java_library(
name = "events-log__plugin_test_deps",
+ testonly = 1,
visibility = ["//visibility:public"],
- exports = [
+ exports = PLUGIN_DEPS + PLUGIN_TEST_DEPS + [
+ ":events-log__plugin",
"@mockito//jar",
],
)
-
-junit_tests(
- name = "events_log_tests",
- srcs = glob(["src/test/java/**/*.java"]),
- tags = ["events-log"],
- deps = PLUGIN_DEPS + PLUGIN_TEST_DEPS + [
- ":events-log__plugin",
- ":events-log__plugin_test_deps",
- ],
- testonly = 1,
-)
diff --git a/WORKSPACE b/WORKSPACE
new file mode 100644
index 0000000..91147b7
--- /dev/null
+++ b/WORKSPACE
@@ -0,0 +1,30 @@
+workspace(name = "events_log")
+
+load("//:bazlets.bzl", "load_bazlets")
+
+load_bazlets(
+ commit = "b7514d03a7798905ff1513295b46620e57b8f386",
+ # local_path = "/home/<user>/projects/bazlets",
+)
+
+#Snapshot Plugin API
+load(
+ "@com_googlesource_gerrit_bazlets//:gerrit_api_maven_local.bzl",
+ "gerrit_api_maven_local",
+)
+
+# Load snapshot Plugin API
+gerrit_api_maven_local()
+
+# Release Plugin API
+#load(
+# "@com_googlesource_gerrit_bazlets//:gerrit_api.bzl",
+# "gerrit_api",
+#)
+
+# Load release Plugin API
+#gerrit_api()
+
+load("//:external_plugin_deps.bzl", "external_plugin_deps")
+
+external_plugin_deps()
diff --git a/bazlets.bzl b/bazlets.bzl
new file mode 100644
index 0000000..e14e488
--- /dev/null
+++ b/bazlets.bzl
@@ -0,0 +1,17 @@
+NAME = "com_googlesource_gerrit_bazlets"
+
+def load_bazlets(
+ commit,
+ local_path = None
+ ):
+ if not local_path:
+ native.git_repository(
+ name = NAME,
+ remote = "https://gerrit.googlesource.com/bazlets",
+ commit = commit,
+ )
+ else:
+ native.local_repository(
+ name = NAME,
+ path = local_path,
+ )
diff --git a/external_plugin_deps.bzl b/external_plugin_deps.bzl
index 53284f7..135e5f6 100644
--- a/external_plugin_deps.bzl
+++ b/external_plugin_deps.bzl
@@ -2,25 +2,23 @@
def external_plugin_deps():
maven_jar(
- name = 'mockito',
- artifact = 'org.mockito:mockito-core:2.5.0',
- sha1 = 'be28d46a52c7f2563580adeca350145e9ce916f8',
+ name = "mockito",
+ artifact = "org.mockito:mockito-core:2.5.0",
+ sha1 = "be28d46a52c7f2563580adeca350145e9ce916f8",
deps = [
- '@byte_buddy//jar',
- '@objenesis//jar',
+ "@byte_buddy//jar",
+ "@objenesis//jar",
],
)
maven_jar(
- name = 'byte_buddy',
- artifact = 'net.bytebuddy:byte-buddy:1.5.12',
- sha1 = 'b1ba1d15f102b36ed43b826488114678d6d413da',
- attach_source = False,
+ name = "byte_buddy",
+ artifact = "net.bytebuddy:byte-buddy:1.5.12",
+ sha1 = "b1ba1d15f102b36ed43b826488114678d6d413da",
)
maven_jar(
- name = 'objenesis',
- artifact = 'org.objenesis:objenesis:2.4',
- sha1 = '2916b6c96b50c5b3ec4452ed99401db745aabb27',
- attach_source = False,
+ name = "objenesis",
+ artifact = "org.objenesis:objenesis:2.4",
+ sha1 = "2916b6c96b50c5b3ec4452ed99401db745aabb27",
)
diff --git a/lib/BUCK b/lib/BUCK
deleted file mode 100644
index 06f7c02..0000000
--- a/lib/BUCK
+++ /dev/null
@@ -1,8 +0,0 @@
-include_defs('//bucklets/maven_jar.bucklet')
-
-maven_jar(
- name = 'gson',
- id = 'com.google.code.gson:gson:2.3.1',
- sha1 = 'ecb6e1f8e4b0e84c4b886c2f14a1500caf309757',
- license = 'Apache2.0',
-)
diff --git a/lib/commons/BUCK b/lib/commons/BUCK
deleted file mode 100644
index ee87715..0000000
--- a/lib/commons/BUCK
+++ /dev/null
@@ -1,23 +0,0 @@
-include_defs('//bucklets/maven_jar.bucklet')
-
-maven_jar(
- name = 'dbcp',
- id = 'commons-dbcp:commons-dbcp:1.4',
- sha1 = '30be73c965cc990b153a100aaaaafcf239f82d39',
- license = 'Apache2.0',
- deps = [':pool'],
- exclude = [
- 'META-INF/LICENSE.txt',
- 'META-INF/NOTICE.txt',
- 'testpool.jocl'
- ],
-)
-
-maven_jar(
- name = 'pool',
- id = 'commons-pool:commons-pool:1.5.5',
- sha1 = '7d8ffbdc47aa0c5a8afe5dc2aaf512f369f1d19b',
- license = 'Apache2.0',
- attach_source = False,
- exclude = ['META-INF/LICENSE.txt', 'META-INF/NOTICE.txt'],
-)
diff --git a/lib/gerrit/BUCK b/lib/gerrit/BUCK
deleted file mode 100644
index 8d5f0e9..0000000
--- a/lib/gerrit/BUCK
+++ /dev/null
@@ -1,20 +0,0 @@
-include_defs('//bucklets/maven_jar.bucklet')
-
-VER = '2.14-SNAPSHOT'
-REPO = MAVEN_LOCAL
-
-maven_jar(
- name = 'acceptance-framework',
- id = 'com.google.gerrit:gerrit-acceptance-framework:' + VER,
- license = 'Apache2.0',
- attach_source = False,
- repository = REPO,
-)
-
-maven_jar(
- name = 'plugin-api',
- id = 'com.google.gerrit:gerrit-plugin-api:' + VER,
- license = 'Apache2.0',
- attach_source = False,
- repository = REPO,
-)
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfig.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfig.java
index 997f86d..6105be6 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfig.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfig.java
@@ -49,7 +49,6 @@
static final int DEFAULT_WAIT_TIME = 1000;
static final int DEFAULT_CONN_TIME = 1000;
static final String DEFAULT_DRIVER = "org.h2.Driver";
- static final String DEFAULT_URL = "jdbc:h2:~/db/";
static final int DEFAULT_EVICT_IDLE_TIME = 1000 * 60;
private boolean copyLocal;
@@ -65,6 +64,7 @@
private String storeUsername;
private String storePassword;
private int evictIdleTime;
+ private String defaultUrl;
@Inject
EventsLogConfig(PluginConfigFactory cfgFactory,
@@ -79,7 +79,8 @@
waitTime = cfg.getInt(CONFIG_WAIT_TIME, DEFAULT_WAIT_TIME);
connectTime = cfg.getInt(CONFIG_CONN_TIME, DEFAULT_CONN_TIME);
storeDriver = cfg.getString(CONFIG_DRIVER, DEFAULT_DRIVER);
- storeUrl = cfg.getString(CONFIG_URL, DEFAULT_URL);
+ defaultUrl = "jdbc:h2:" + site.data_dir.toString() + "/db";
+ storeUrl = cfg.getString(CONFIG_URL, defaultUrl);
localStorePath = Paths.get(cfg.getString(CONFIG_LOCAL_PATH,
defaultLocalPath));
urlOptions = concatenate(cfg.getStringList(CONFIG_URL_OPTIONS));
diff --git a/src/main/resources/Documentation/build.md b/src/main/resources/Documentation/build.md
index 6c1ba49..41a69ca 100644
--- a/src/main/resources/Documentation/build.md
+++ b/src/main/resources/Documentation/build.md
@@ -1,7 +1,45 @@
Build
=====
-This plugin is built with Bazel.
+This plugin is built with Bazel. Two build modes are supported:
+ * Standalone
+ * In Gerrit tree.
+
+Standalone build mode is recommended, as this mode doesn't require local Gerrit
+tree to exist. Moreover, there are some limitations and additional manual steps
+required when building in Gerrit tree mode (see corresponding sections).
+
+## Build standalone
+
+### Bazel
+
+To build the plugin, issue the following command:
+
+```
+ bazel build @PLUGIN@
+```
+
+The output is created in
+
+```
+ bazel-genfiles/@PLUGIN@.jar
+```
+
+To execute the tests run:
+
+```
+ bazel test //...
+```
+
+This project can be imported into the Eclipse IDE:
+
+```
+ ./tools/eclipse/project.sh
+```
+
+## Build in Gerrit tree
+
+### Bazel
Clone (or link) this plugin to the `plugins` directory of Gerrit's source tree.
@@ -29,8 +67,9 @@
```
This project can be imported into the Eclipse IDE.
-Add the plugin name to the `CUSTOM_PLUGINS` set in
-Gerrit core in `tools/bzl/plugins.bzl`, and execute:
+Add the plugin name to the `CUSTOM_PLUGINS` and to the
+`CUSTOM_PLUGINS_TEST_DEPS` set in Gerrit core in
+`tools/bzl/plugins.bzl`, and execute:
```
./tools/eclipse/project.py
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index 749c600..4e29811 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -8,7 +8,7 @@
[plugin "@PLUGIN@"]
maxAge = 20
returnLimit = 10000
- storeUrl = jdbc:h2:~/gerrit/db/
+ storeUrl = jdbc:h2:<gerrit_site>/data/db
urlOptions = loglevel=INFO
urlOptions = logUnclosedConnections=true
copyLocal = true
@@ -29,11 +29,11 @@
plugin.@PLUGIN@.storeUrl
: Specify the path to the directory in which to keep the database. When not
- specified, the default path is jdbc:h2:~/db/.
+ specified, the default path is jdbc:h2:\<gerrit_site>/data/db.
plugin.@PLUGIN@.localStorePath
: Specify the path to the directory in which to keep the back up database.
- When not specified, the default path is <gerrit_site>/events-db/.
+ When not specified, the default path is \<gerrit_site>/events-db/.
plugin.@PLUGIN@.storeUsername
: Username to connect to the database, not defined by default. This value can
diff --git a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventHandlerTest.java b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventHandlerTest.java
index 2a82b5a..af1cfa8 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventHandlerTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventHandlerTest.java
@@ -29,6 +29,7 @@
import org.mockito.junit.MockitoJUnitRunner;
import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
@RunWith(MockitoJUnitRunner.class)
public class EventHandlerTest {
@@ -56,7 +57,7 @@
verifyZeroInteractions(storeMock);
}
- class PoolMock extends ScheduledExecutorService {
+ class PoolMock extends ScheduledThreadPoolExecutor {
PoolMock() {
super(1);
}
diff --git a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfigTest.java b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfigTest.java
index a767793..f1f6a07 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfigTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfigTest.java
@@ -34,7 +34,6 @@
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_MAX_AGE;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_MAX_TRIES;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_RETURN_LIMIT;
-import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_URL;
import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_WAIT_TIME;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
@@ -63,6 +62,7 @@
private SitePaths site;
private EventsLogConfig config;
private String defaultLocalStorePath;
+ private String defaultUrl;
private String localStorePath;
private String[] urlOptions = new String[] {"DB_CLOSE_DELAY=10"};
@@ -79,6 +79,7 @@
site = new SitePaths(gerrit_site.getRoot().toPath());
Files.createDirectories(site.etc_dir);
defaultLocalStorePath = site.site_path.toString() + "/events-db/";
+ defaultUrl = "jdbc:h2:" + site.data_dir.toString() + "/db";
when(cfgFactoryMock.getFromGerritConfig(PLUGIN_NAME, true))
.thenReturn(configMock);
}
@@ -98,7 +99,7 @@
.thenReturn(DEFAULT_WAIT_TIME);
when(configMock.getString(CONFIG_DRIVER, DEFAULT_DRIVER))
.thenReturn(DEFAULT_DRIVER);
- when(configMock.getString(CONFIG_URL, DEFAULT_URL)).thenReturn(DEFAULT_URL);
+ when(configMock.getString(CONFIG_URL, defaultUrl)).thenReturn(defaultUrl);
when(configMock.getString(CONFIG_LOCAL_PATH, defaultLocalStorePath))
.thenReturn(defaultLocalStorePath);
when(configMock.getStringList(CONFIG_URL_OPTIONS))
@@ -123,7 +124,7 @@
.thenReturn(5000);
when(configMock.getString(CONFIG_DRIVER, DEFAULT_DRIVER))
.thenReturn("org.h2.Driver2");
- when(configMock.getString(CONFIG_URL, DEFAULT_URL))
+ when(configMock.getString(CONFIG_URL, defaultUrl))
.thenReturn("jdbc:h2:~/gerrit/db");
when(configMock.getString(CONFIG_LOCAL_PATH, defaultLocalStorePath))
.thenReturn(localStorePath);
@@ -149,7 +150,7 @@
assertThat(config.getLocalStorePath().toString() + "/")
.isEqualTo(defaultLocalStorePath);
assertThat(config.getStoreDriver()).isEqualTo(DEFAULT_DRIVER);
- assertThat(config.getStoreUrl()).isEqualTo(DEFAULT_URL);
+ assertThat(config.getStoreUrl()).isEqualTo(defaultUrl);
assertThat(config.getUrlOptions()).isEmpty();
assertThat(config.getStoreUsername()).isNull();
assertThat(config.getStorePassword()).isNull();
diff --git a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServletTest.java b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServletTest.java
index 1dcb53a..e06f199 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServletTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServletTest.java
@@ -76,7 +76,7 @@
when(queryMakerMock.formQueryFromRequestParameters(captor.capture()))
.thenReturn(RANDOM_QUERY);
when(storeMock.queryChangeEvents(RANDOM_QUERY))
- .thenReturn(new ArrayList<String>());
+ .thenReturn(new ArrayList<>());
eventServlet.doGet(reqMock, rspMock);
assertThat(ImmutableMap.of("a", "1", "b", "2"))
.isEqualTo(captor.getValue());
@@ -88,7 +88,7 @@
when(queryMakerMock.formQueryFromRequestParameters(captor.capture()))
.thenReturn(RANDOM_QUERY);
when(storeMock.queryChangeEvents(RANDOM_QUERY))
- .thenReturn(new ArrayList<String>());
+ .thenReturn(new ArrayList<>());
eventServlet.doGet(reqMock, rspMock);
assertThat(captor.getValue()).isEmpty();
}
diff --git a/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/QueryMakerTest.java b/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/QueryMakerTest.java
index 4094b23..fd735be 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/QueryMakerTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/QueryMakerTest.java
@@ -80,7 +80,7 @@
@Test(expected = MalformedQueryException.class)
public void noDate() throws Exception {
queryMaker
- .formQueryFromRequestParameters(ImmutableMap.<String, String> of());
+ .formQueryFromRequestParameters(ImmutableMap.of());
}
@Test
diff --git a/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLStoreTest.java b/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLStoreTest.java
index f429e39..8a95c9a 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLStoreTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLStoreTest.java
@@ -17,6 +17,7 @@
import static com.ericsson.gerrit.plugins.eventslog.sql.SQLTable.TABLE_NAME;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
@@ -25,11 +26,11 @@
import com.google.common.collect.ImmutableList;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.NameKey;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.events.ProjectEvent;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectControl;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
import com.google.gson.Gson;
import com.google.inject.Provider;
@@ -47,7 +48,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.IOException;
import java.net.ConnectException;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -57,6 +57,7 @@
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@@ -71,21 +72,24 @@
private static final String TERM_CONN_MSG = "terminating connection";
private static final String MSG = "message";
private static final String GENERIC_QUERY = "SELECT * FROM " + TABLE_NAME;
- private static final boolean PROJECT_VISIBLE_TO_USER = true;
- private static final boolean PROJECT_NOT_VISIBLE_TO_USER = false;
@Mock
- private ProjectControl.GenericFactory pcFactoryMock;
- @Mock
private Provider<CurrentUser> userProviderMock;
@Mock
private EventsLogConfig cfgMock;
+ @Mock
+ private PermissionBackend permissionBackendMock;
+ @Mock
+ private PermissionBackend.ForProject forProjectMock;
+ @Mock
+ private PermissionBackend.WithUser withUserMock;
+
private SQLClient eventsDb;
private SQLClient localEventsDb;
private SQLStore store;
private ScheduledExecutorService poolMock;
-
private Statement stat;
+ private MockEvent mockEvent;
@Rule
public TemporaryFolder testFolder = new TemporaryFolder();
@@ -94,6 +98,7 @@
public void setUp() throws SQLException {
Connection conn =
DriverManager.getConnection(TEST_URL + ";" + TEST_OPTIONS);
+ mockEvent = new MockEvent();
stat = conn.createStatement();
poolMock = new PoolMock();
when(cfgMock.getMaxAge()).thenReturn(5);
@@ -105,23 +110,13 @@
store.stop();
}
- private void setUpClient() {
- eventsDb = new SQLClient(TEST_DRIVER, TEST_URL, TEST_OPTIONS);
- localEventsDb = new SQLClient(TEST_DRIVER, TEST_LOCAL_URL, TEST_OPTIONS);
- store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
- localEventsDb, poolMock);
- store.start();
- }
-
- private void setUpClientMock() throws SQLException {
- eventsDb = mock(SQLClient.class);
- localEventsDb = mock(SQLClient.class);
- when(localEventsDb.dbExists()).thenReturn(true);
- }
-
@Test
public void storeThenQueryVisible() throws Exception {
- MockEvent mockEvent = setUpMocks(PROJECT_VISIBLE_TO_USER);
+ when(permissionBackendMock.user(userProviderMock)).thenReturn(withUserMock);
+ when(withUserMock.project(any(Project.NameKey.class)))
+ .thenReturn(forProjectMock);
+ doNothing().when(forProjectMock).check(ProjectPermission.ACCESS);
+ setUpClient();
store.storeEvent(mockEvent);
List<String> events = store.queryChangeEvents(GENERIC_QUERY);
String json = new Gson().toJson(mockEvent);
@@ -131,26 +126,18 @@
@Test
public void storeThenQueryNotVisible() throws Exception {
- MockEvent mockEvent = setUpMocks(PROJECT_NOT_VISIBLE_TO_USER);
+ when(permissionBackendMock.user(userProviderMock)).thenReturn(withUserMock);
+ when(withUserMock.project(any(Project.NameKey.class)))
+ .thenReturn(forProjectMock);
+ doThrow(new PermissionBackendException("")).when(forProjectMock)
+ .check(ProjectPermission.ACCESS);
+ setUpClient();
store.storeEvent(mockEvent);
List<String> events = store.queryChangeEvents(GENERIC_QUERY);
assertThat(events).isEmpty();
tearDown();
}
- private MockEvent setUpMocks(boolean isVisible)
- throws NoSuchProjectException, IOException {
- MockEvent mockEvent = new MockEvent();
- ProjectControl pcMock = mock(ProjectControl.class);
- CurrentUser userMock = mock(CurrentUser.class);
- when(userProviderMock.get()).thenReturn(userMock);
- when(pcFactoryMock.controlFor(mockEvent.getProjectNameKey(), userMock))
- .thenReturn(pcMock);
- when(pcMock.isVisible()).thenReturn(isVisible);
- setUpClient();
- return mockEvent;
- }
-
@Test(expected = MalformedQueryException.class)
public void throwBadRequestTriggerOnBadQuery() throws Exception {
setUpClient();
@@ -159,29 +146,12 @@
}
@Test
- public void notReturnEventOfNonExistingProject() throws Exception {
- MockEvent mockEvent = new MockEvent();
- Project.NameKey projectMock = mock(Project.NameKey.class);
- CurrentUser userMock = mock(CurrentUser.class);
- when(userProviderMock.get()).thenReturn(userMock);
- NameKey projectNameKey = mockEvent.getProjectNameKey();
- doThrow(new NoSuchProjectException(projectMock)).when(pcFactoryMock)
- .controlFor(projectNameKey, userMock);
- setUpClient();
- store.storeEvent(mockEvent);
- List<String> events = store.queryChangeEvents(GENERIC_QUERY);
- assertThat(events).isEmpty();
- tearDown();
- }
-
- @Test
public void notReturnEventWithNoVisibilityInfo() throws Exception {
- MockEvent mockEvent = new MockEvent();
- CurrentUser userMock = mock(CurrentUser.class);
- when(userProviderMock.get()).thenReturn(userMock);
- NameKey projectNameKey = mockEvent.getProjectNameKey();
- doThrow(new IOException()).when(pcFactoryMock).controlFor(projectNameKey,
- userMock);
+ when(permissionBackendMock.user(userProviderMock)).thenReturn(withUserMock);
+ when(withUserMock.project(any(Project.NameKey.class)))
+ .thenReturn(forProjectMock);
+ doThrow(new PermissionBackendException("")).when(forProjectMock)
+ .check(ProjectPermission.ACCESS);
setUpClient();
store.storeEvent(mockEvent);
List<String> events = store.queryChangeEvents(GENERIC_QUERY);
@@ -191,15 +161,14 @@
@Test
public void retryOnConnectException() throws Exception {
- MockEvent mockEvent = new MockEvent();
when(cfgMock.getMaxTries()).thenReturn(3);
Throwable[] exceptions = new Throwable[3];
Arrays.fill(exceptions, new SQLException(new ConnectException()));
setUpClientMock();
doThrow(exceptions).doNothing().when(eventsDb).storeEvent(mockEvent);
doThrow(exceptions).doNothing().when(eventsDb).queryOne();
- store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
- localEventsDb, poolMock);
+ store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+ localEventsDb, poolMock, permissionBackendMock);
store.start();
store.storeEvent(mockEvent);
verify(eventsDb, times(3)).storeEvent(mockEvent);
@@ -208,15 +177,14 @@
@Test
public void retryOnMessage() throws Exception {
- MockEvent mockEvent = new MockEvent();
when(cfgMock.getMaxTries()).thenReturn(3);
Throwable[] exceptions = new Throwable[3];
Arrays.fill(exceptions, new SQLException(TERM_CONN_MSG));
setUpClientMock();
doThrow(exceptions).doNothing().when(eventsDb).storeEvent(mockEvent);
doThrow(exceptions).doNothing().when(eventsDb).queryOne();
- store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
- localEventsDb, poolMock);
+ store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+ localEventsDb, poolMock, permissionBackendMock);
store.start();
store.storeEvent(mockEvent);
verify(eventsDb, times(3)).storeEvent(mockEvent);
@@ -225,12 +193,11 @@
@Test
public void noRetryOnMessage() throws Exception {
- MockEvent mockEvent = new MockEvent();
when(cfgMock.getMaxTries()).thenReturn(3);
setUpClientMock();
doThrow(new SQLException(MSG)).when(eventsDb).storeEvent(mockEvent);
- store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
- localEventsDb, poolMock);
+ store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+ localEventsDb, poolMock, permissionBackendMock);
store.start();
store.storeEvent(mockEvent);
verify(eventsDb, times(1)).storeEvent(mockEvent);
@@ -238,15 +205,14 @@
@Test
public void noRetryOnZeroMaxTries() throws Exception {
- MockEvent mockEvent = new MockEvent();
when(cfgMock.getMaxTries()).thenReturn(0);
Throwable[] exceptions = new Throwable[3];
Arrays.fill(exceptions, new SQLException(new ConnectException()));
setUpClientMock();
doThrow(exceptions).doNothing().when(eventsDb).storeEvent(mockEvent);
doThrow(exceptions).doNothing().when(eventsDb).queryOne();
- store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
- localEventsDb, poolMock);
+ store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+ localEventsDb, poolMock, permissionBackendMock);
store.start();
store.storeEvent(mockEvent);
verify(eventsDb, times(1)).storeEvent(mockEvent);
@@ -254,46 +220,36 @@
@Test(expected = ServiceUnavailableException.class)
public void throwSQLExceptionIfNotOnline() throws Exception {
- MockEvent mockEvent = new MockEvent();
setUpClientMock();
doThrow(new SQLException(new ConnectException())).when(eventsDb)
.createDBIfNotCreated();
doThrow(new SQLException()).when(eventsDb).queryOne();
- store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
- localEventsDb, poolMock);
+ store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+ localEventsDb, poolMock, permissionBackendMock);
store.start();
store.storeEvent(mockEvent);
store.queryChangeEvents(GENERIC_QUERY);
}
@Test
- public void restoreFromLocalAndRemoveUnfoundProjectEvents() throws Exception {
+ public void restoreEventsFromLocalDb() throws Exception {
MockEvent mockEvent = new MockEvent();
MockEvent mockEvent2 = new MockEvent("proj");
- MockEvent mockEvent3 = new MockEvent("unfound");
-
- ProjectControl pc = mock(ProjectControl.class);
- NoSuchProjectException e = mock(NoSuchProjectException.class);
- CurrentUser userMock = mock(CurrentUser.class);
- when(userProviderMock.get()).thenReturn(userMock);
- when(pcFactoryMock.controlFor((mockEvent.getProjectNameKey()), userMock))
- .thenReturn(pc);
- when(pcFactoryMock.controlFor((mockEvent2.getProjectNameKey()), userMock))
- .thenReturn(pc);
- when(pc.isVisible()).thenReturn(true);
- doThrow(e).when(pcFactoryMock).controlFor((mockEvent3.getProjectNameKey()),
- userMock);
+ when(permissionBackendMock.user(userProviderMock)).thenReturn(withUserMock);
+ when(withUserMock.project(any(Project.NameKey.class)))
+ .thenReturn(forProjectMock);
+ doNothing().when(forProjectMock).check(ProjectPermission.ACCESS);
eventsDb = new SQLClient(TEST_DRIVER, TEST_URL, TEST_OPTIONS);
localEventsDb = new SQLClient(TEST_DRIVER, TEST_LOCAL_URL, TEST_OPTIONS);
- store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
- localEventsDb, poolMock);
+ store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+ localEventsDb, poolMock, permissionBackendMock);
localEventsDb.createDBIfNotCreated();
localEventsDb.storeEvent(mockEvent);
localEventsDb.storeEvent(mockEvent2);
- localEventsDb.storeEvent(mockEvent3);
store.start();
+
List<String> events = store.queryChangeEvents(GENERIC_QUERY);
Gson gson = new Gson();
String json = gson.toJson(mockEvent);
@@ -308,21 +264,20 @@
doThrow(new SQLException(new ConnectException())).when(eventsDb)
.createDBIfNotCreated();
doThrow(new SQLException()).when(eventsDb).queryOne();
- store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
- localEventsDb, poolMock);
+ store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+ localEventsDb, poolMock, permissionBackendMock);
store.start();
verify(localEventsDb).createDBIfNotCreated();
}
@Test
public void storeLocalOffline() throws Exception {
- MockEvent mockEvent = new MockEvent();
setUpClientMock();
doThrow(new SQLException(new ConnectException())).when(eventsDb)
.createDBIfNotCreated();
doThrow(new SQLException()).when(eventsDb).queryOne();
- store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
- localEventsDb, poolMock);
+ store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+ localEventsDb, poolMock, permissionBackendMock);
store.start();
store.storeEvent(mockEvent);
verify(localEventsDb).storeEvent(mockEvent);
@@ -330,19 +285,32 @@
@Test
public void storeLocalOfflineAfterNoRetry() throws Exception {
- MockEvent mockEvent = new MockEvent();
setUpClientMock();
when(cfgMock.getMaxTries()).thenReturn(0);
doThrow(new SQLException(new ConnectException())).when(eventsDb)
.createDBIfNotCreated();
doThrow(new SQLException()).when(eventsDb).queryOne();
- store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
- localEventsDb, poolMock);
+ store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+ localEventsDb, poolMock, permissionBackendMock);
store.start();
store.storeEvent(mockEvent);
verify(localEventsDb).storeEvent(mockEvent);
}
+ private void setUpClient() {
+ eventsDb = new SQLClient(TEST_DRIVER, TEST_URL, TEST_OPTIONS);
+ localEventsDb = new SQLClient(TEST_DRIVER, TEST_LOCAL_URL, TEST_OPTIONS);
+ store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+ localEventsDb, poolMock, permissionBackendMock);
+ store.start();
+ }
+
+ private void setUpClientMock() throws SQLException {
+ eventsDb = mock(SQLClient.class);
+ localEventsDb = mock(SQLClient.class);
+ when(localEventsDb.dbExists()).thenReturn(true);
+ }
+
/**
* For this test we expect that if we can connect to main database, then we
* should come back online and try setting up again. We just want to make sure
@@ -356,8 +324,8 @@
when(localEventsDb.dbExists()).thenReturn(true);
when(localEventsDb.getAll())
.thenReturn(ImmutableList.of(mock(SQLEntry.class)));
- store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
- localEventsDb, poolMock);
+ store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+ localEventsDb, poolMock, permissionBackendMock);
store.start();
poolMock.scheduleWithFixedDelay(store.new CheckConnectionTask(), 0, 0,
TimeUnit.MILLISECONDS);
@@ -375,7 +343,6 @@
}
private void checkConnectionAndRestore(boolean copy) throws Exception {
- MockEvent mockEvent = new MockEvent();
eventsDb = mock(SQLClient.class);
localEventsDb = new SQLClient(TEST_DRIVER, TEST_LOCAL_URL, TEST_OPTIONS);
localEventsDb.createDBIfNotCreated();
@@ -387,8 +354,8 @@
when(cfgMock.getCopyLocal()).thenReturn(true);
}
- store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
- localEventsDb, poolMock);
+ store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+ localEventsDb, poolMock, permissionBackendMock);
store.start();
verify(eventsDb).queryOne();
verify(eventsDb).storeEvent(any(String.class), any(Timestamp.class),
@@ -415,7 +382,7 @@
}
}
- class PoolMock extends ScheduledExecutorService {
+ class PoolMock extends ScheduledThreadPoolExecutor {
PoolMock() {
super(1);
}
diff --git a/tools/bazel.rc b/tools/bazel.rc
new file mode 100644
index 0000000..4ed16cf
--- /dev/null
+++ b/tools/bazel.rc
@@ -0,0 +1,2 @@
+build --workspace_status_command=./tools/workspace-status.sh
+test --build_tests_only
diff --git a/tools/bzl/BUILD b/tools/bzl/BUILD
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/bzl/BUILD
diff --git a/tools/bzl/classpath.bzl b/tools/bzl/classpath.bzl
new file mode 100644
index 0000000..d5764f7
--- /dev/null
+++ b/tools/bzl/classpath.bzl
@@ -0,0 +1,4 @@
+load(
+ "@com_googlesource_gerrit_bazlets//tools:classpath.bzl",
+ "classpath_collector",
+)
diff --git a/tools/bzl/junit.bzl b/tools/bzl/junit.bzl
new file mode 100644
index 0000000..3af7e58
--- /dev/null
+++ b/tools/bzl/junit.bzl
@@ -0,0 +1,4 @@
+load(
+ "@com_googlesource_gerrit_bazlets//tools:junit.bzl",
+ "junit_tests",
+)
diff --git a/tools/bzl/maven_jar.bzl b/tools/bzl/maven_jar.bzl
new file mode 100644
index 0000000..2eabedb
--- /dev/null
+++ b/tools/bzl/maven_jar.bzl
@@ -0,0 +1 @@
+load("@com_googlesource_gerrit_bazlets//tools:maven_jar.bzl", "maven_jar")
diff --git a/tools/bzl/plugin.bzl b/tools/bzl/plugin.bzl
new file mode 100644
index 0000000..a2e438f
--- /dev/null
+++ b/tools/bzl/plugin.bzl
@@ -0,0 +1,6 @@
+load(
+ "@com_googlesource_gerrit_bazlets//:gerrit_plugin.bzl",
+ "gerrit_plugin",
+ "PLUGIN_DEPS",
+ "PLUGIN_TEST_DEPS",
+)
diff --git a/tools/eclipse/BUILD b/tools/eclipse/BUILD
new file mode 100644
index 0000000..c2fa474
--- /dev/null
+++ b/tools/eclipse/BUILD
@@ -0,0 +1,9 @@
+load("//tools/bzl:classpath.bzl", "classpath_collector")
+
+classpath_collector(
+ name = "main_classpath_collect",
+ testonly = 1,
+ deps = [
+ "//:events-log__plugin_test_deps",
+ ],
+)
diff --git a/tools/eclipse/project.sh b/tools/eclipse/project.sh
new file mode 100755
index 0000000..d8a854d
--- /dev/null
+++ b/tools/eclipse/project.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+#Copyright (C) 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+`bazel query @com_googlesource_gerrit_bazlets//tools/eclipse:project --output location | sed s/BUILD:.*//`project.py -n events-log -r .
+
+
diff --git a/tools/workspace-status.sh b/tools/workspace-status.sh
new file mode 100755
index 0000000..4e63364
--- /dev/null
+++ b/tools/workspace-status.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+#This script will be run by bazel when the build process starts to
+# generate key-value information that represents the status of the
+# workspace. The output should be like
+#
+# KEY1 VALUE1
+# KEY2 VALUE2
+#
+# If the script exits with non-zero code, it's considered as a failure
+# and the output will be discarded.
+
+function rev() {
+ cd $1; git describe --always --match "v[0-9].*" --dirty
+}
+
+echo STABLE_BUILD_EVENTS-LOG_LABEL $(rev .)