Merge "Propagate PermissionBackendException in DefaultRefFilter"
diff --git a/Documentation/dev-bazel.txt b/Documentation/dev-bazel.txt
index 8b4bece..979d021 100644
--- a/Documentation/dev-bazel.txt
+++ b/Documentation/dev-bazel.txt
@@ -41,8 +41,7 @@
=== Gerrit Development WAR File
-To build the Gerrit web application that includes the GWT UI and the
-PolyGerrit UI:
+To build the Gerrit web application that includes the PolyGerrit UI:
----
bazel build gerrit
@@ -76,7 +75,8 @@
=== Headless Mode
-To build Gerrit in headless mode, i.e. without the GWT Web UI:
+To build Gerrit in headless mode, i.e. without the PolyGerrit and GWT
+Web UI:
----
bazel build headless
diff --git a/Documentation/json.txt b/Documentation/json.txt
index 3b8a8cb..dc82ad1 100644
--- a/Documentation/json.txt
+++ b/Documentation/json.txt
@@ -29,6 +29,8 @@
commitMessage:: The full commit message for the change's current patch
set.
+hashtags:: List of hashtags associated with this change.
+
createdOn:: Time in seconds since the UNIX epoch when this change
was created.
diff --git a/java/com/google/gerrit/acceptance/RestSession.java b/java/com/google/gerrit/acceptance/RestSession.java
index 300e75f..ae921a5 100644
--- a/java/com/google/gerrit/acceptance/RestSession.java
+++ b/java/com/google/gerrit/acceptance/RestSession.java
@@ -116,10 +116,10 @@
}
public RestResponse post(String endPoint, Object content) throws IOException {
- return postWithHeader(endPoint, content, null);
+ return postWithHeader(endPoint, null, content);
}
- public RestResponse postWithHeader(String endPoint, Object content, Header header)
+ public RestResponse postWithHeader(String endPoint, Header header, Object content)
throws IOException {
Request post = Request.Post(getUrl(endPoint));
if (header != null) {
diff --git a/java/com/google/gerrit/pgm/BUILD b/java/com/google/gerrit/pgm/BUILD
index 64dd1d8..ba27991 100644
--- a/java/com/google/gerrit/pgm/BUILD
+++ b/java/com/google/gerrit/pgm/BUILD
@@ -40,6 +40,7 @@
"//java/com/google/gerrit/server/cache/h2",
"//java/com/google/gerrit/server/cache/mem",
"//java/com/google/gerrit/server/git/receive",
+ "//java/com/google/gerrit/server/ioutil",
"//java/com/google/gerrit/server/restapi",
"//java/com/google/gerrit/server/schema",
"//java/com/google/gerrit/sshd",
diff --git a/java/com/google/gerrit/pgm/Init.java b/java/com/google/gerrit/pgm/Init.java
index b9c7068..a93e64c 100644
--- a/java/com/google/gerrit/pgm/Init.java
+++ b/java/com/google/gerrit/pgm/Init.java
@@ -26,8 +26,8 @@
import com.google.gerrit.pgm.util.ErrorLogFile;
import com.google.gerrit.server.config.GerritServerConfigModule;
import com.google.gerrit.server.config.SitePath;
+import com.google.gerrit.server.ioutil.HostPlatform;
import com.google.gerrit.server.securestore.SecureStoreClassName;
-import com.google.gerrit.server.util.HostPlatform;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
diff --git a/java/com/google/gerrit/pgm/init/BUILD b/java/com/google/gerrit/pgm/init/BUILD
index c781a60..8a1c08b 100644
--- a/java/com/google/gerrit/pgm/init/BUILD
+++ b/java/com/google/gerrit/pgm/init/BUILD
@@ -17,6 +17,7 @@
"//java/com/google/gerrit/pgm/util",
"//java/com/google/gerrit/reviewdb:server",
"//java/com/google/gerrit/server",
+ "//java/com/google/gerrit/server/ioutil",
"//java/com/google/gerrit/server/schema",
"//lib:guava",
"//lib:gwtjsonrpc",
diff --git a/java/com/google/gerrit/pgm/init/InitSshd.java b/java/com/google/gerrit/pgm/init/InitSshd.java
index d2e280d..0cc30f8 100644
--- a/java/com/google/gerrit/pgm/init/InitSshd.java
+++ b/java/com/google/gerrit/pgm/init/InitSshd.java
@@ -21,7 +21,7 @@
import com.google.gerrit.pgm.init.api.InitStep;
import com.google.gerrit.pgm.init.api.Section;
import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.util.HostPlatform;
+import com.google.gerrit.server.ioutil.HostPlatform;
import com.google.gerrit.server.util.SocketUtil;
import com.google.inject.Inject;
import com.google.inject.Singleton;
diff --git a/java/com/google/gerrit/server/data/ChangeAttribute.java b/java/com/google/gerrit/server/data/ChangeAttribute.java
index ec76f50..fde5922 100644
--- a/java/com/google/gerrit/server/data/ChangeAttribute.java
+++ b/java/com/google/gerrit/server/data/ChangeAttribute.java
@@ -30,6 +30,7 @@
public AccountAttribute assignee;
public String url;
public String commitMessage;
+ public List<String> hashtags;
public Long createdOn;
public Long lastUpdated;
diff --git a/java/com/google/gerrit/server/events/EventFactory.java b/java/com/google/gerrit/server/events/EventFactory.java
index f675dd5..75a08bd 100644
--- a/java/com/google/gerrit/server/events/EventFactory.java
+++ b/java/com/google/gerrit/server/events/EventFactory.java
@@ -130,9 +130,9 @@
* @param change
* @return object suitable for serialization to JSON
*/
- public ChangeAttribute asChangeAttribute(Change change) {
+ public ChangeAttribute asChangeAttribute(Change change, ChangeNotes notes) {
try (ReviewDb db = schema.open()) {
- return asChangeAttribute(db, change);
+ return asChangeAttribute(db, change, notes);
} catch (OrmException e) {
logger.atSevere().withCause(e).log("Cannot open database connection");
return new ChangeAttribute();
@@ -171,6 +171,24 @@
}
/**
+ * Create a ChangeAttribute for the given change suitable for serialization to JSON.
+ *
+ * @param db Review database
+ * @param change
+ * @param notes
+ * @return object suitable for serialization to JSON
+ */
+ public ChangeAttribute asChangeAttribute(ReviewDb db, Change change, ChangeNotes notes)
+ throws OrmException {
+ ChangeAttribute a = asChangeAttribute(db, change);
+ Set<String> hashtags = notes.load().getHashtags();
+ if (!hashtags.isEmpty()) {
+ a.hashtags = new ArrayList<String>(hashtags.size());
+ a.hashtags.addAll(hashtags);
+ }
+ return a;
+ }
+ /**
* Create a RefUpdateAttribute for the given old ObjectId, new ObjectId, and branch that is
* suitable for serialization to JSON.
*
diff --git a/java/com/google/gerrit/server/events/StreamEventsApiListener.java b/java/com/google/gerrit/server/events/StreamEventsApiListener.java
index 9592238..7a78055 100644
--- a/java/com/google/gerrit/server/events/StreamEventsApiListener.java
+++ b/java/com/google/gerrit/server/events/StreamEventsApiListener.java
@@ -156,12 +156,12 @@
return psUtil.get(db.get(), notes, PatchSet.Id.fromRef(info.ref));
}
- private Supplier<ChangeAttribute> changeAttributeSupplier(Change change) {
+ private Supplier<ChangeAttribute> changeAttributeSupplier(Change change, ChangeNotes notes) {
return Suppliers.memoize(
new Supplier<ChangeAttribute>() {
@Override
public ChangeAttribute get() {
- return eventFactory.asChangeAttribute(change);
+ return eventFactory.asChangeAttribute(change, notes);
}
});
}
@@ -257,10 +257,11 @@
@Override
public void onAssigneeChanged(AssigneeChangedListener.Event ev) {
try {
- Change change = getChange(ev.getChange());
+ ChangeNotes notes = getNotes(ev.getChange());
+ Change change = notes.getChange();
AssigneeChangedEvent event = new AssigneeChangedEvent(change);
- event.change = changeAttributeSupplier(change);
+ event.change = changeAttributeSupplier(change, notes);
event.changer = accountAttributeSupplier(ev.getWho());
event.oldAssignee = accountAttributeSupplier(ev.getOldAssignee());
@@ -273,10 +274,11 @@
@Override
public void onTopicEdited(TopicEditedListener.Event ev) {
try {
- Change change = getChange(ev.getChange());
+ ChangeNotes notes = getNotes(ev.getChange());
+ Change change = notes.getChange();
TopicChangedEvent event = new TopicChangedEvent(change);
- event.change = changeAttributeSupplier(change);
+ event.change = changeAttributeSupplier(change, notes);
event.changer = accountAttributeSupplier(ev.getWho());
event.oldTopic = ev.getOldTopic();
@@ -294,7 +296,7 @@
PatchSet patchSet = getPatchSet(notes, ev.getRevision());
PatchSetCreatedEvent event = new PatchSetCreatedEvent(change);
- event.change = changeAttributeSupplier(change);
+ event.change = changeAttributeSupplier(change, notes);
event.patchSet = patchSetAttributeSupplier(change, patchSet);
event.uploader = accountAttributeSupplier(ev.getWho());
@@ -310,7 +312,7 @@
ChangeNotes notes = getNotes(ev.getChange());
Change change = notes.getChange();
ReviewerDeletedEvent event = new ReviewerDeletedEvent(change);
- event.change = changeAttributeSupplier(change);
+ event.change = changeAttributeSupplier(change, notes);
event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes));
event.reviewer = accountAttributeSupplier(ev.getReviewer());
event.remover = accountAttributeSupplier(ev.getWho());
@@ -331,7 +333,7 @@
Change change = notes.getChange();
ReviewerAddedEvent event = new ReviewerAddedEvent(change);
- event.change = changeAttributeSupplier(change);
+ event.change = changeAttributeSupplier(change, notes);
event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes));
for (AccountInfo reviewer : ev.getReviewers()) {
event.reviewer = accountAttributeSupplier(reviewer);
@@ -354,10 +356,11 @@
@Override
public void onHashtagsEdited(HashtagsEditedListener.Event ev) {
try {
- Change change = getChange(ev.getChange());
+ ChangeNotes notes = getNotes(ev.getChange());
+ Change change = notes.getChange();
HashtagsChangedEvent event = new HashtagsChangedEvent(change);
- event.change = changeAttributeSupplier(change);
+ event.change = changeAttributeSupplier(change, notes);
event.editor = accountAttributeSupplier(ev.getWho());
event.hashtags = hashtagArray(ev.getHashtags());
event.added = hashtagArray(ev.getAddedHashtags());
@@ -402,7 +405,7 @@
PatchSet ps = getPatchSet(notes, ev.getRevision());
CommentAddedEvent event = new CommentAddedEvent(change);
- event.change = changeAttributeSupplier(change);
+ event.change = changeAttributeSupplier(change, notes);
event.author = accountAttributeSupplier(ev.getWho());
event.patchSet = patchSetAttributeSupplier(change, ps);
event.comment = ev.getComment();
@@ -421,7 +424,7 @@
Change change = notes.getChange();
ChangeRestoredEvent event = new ChangeRestoredEvent(change);
- event.change = changeAttributeSupplier(change);
+ event.change = changeAttributeSupplier(change, notes);
event.restorer = accountAttributeSupplier(ev.getWho());
event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes));
event.reason = ev.getReason();
@@ -439,7 +442,7 @@
Change change = notes.getChange();
ChangeMergedEvent event = new ChangeMergedEvent(change);
- event.change = changeAttributeSupplier(change);
+ event.change = changeAttributeSupplier(change, notes);
event.submitter = accountAttributeSupplier(ev.getWho());
event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes));
event.newRev = ev.getNewRevisionId();
@@ -457,7 +460,7 @@
Change change = notes.getChange();
ChangeAbandonedEvent event = new ChangeAbandonedEvent(change);
- event.change = changeAttributeSupplier(change);
+ event.change = changeAttributeSupplier(change, notes);
event.abandoner = accountAttributeSupplier(ev.getWho());
event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes));
event.reason = ev.getReason();
@@ -471,10 +474,11 @@
@Override
public void onWorkInProgressStateChanged(WorkInProgressStateChangedListener.Event ev) {
try {
- Change change = getChange(ev.getChange());
+ ChangeNotes notes = getNotes(ev.getChange());
+ Change change = notes.getChange();
WorkInProgressStateChangedEvent event = new WorkInProgressStateChangedEvent(change);
- event.change = changeAttributeSupplier(change);
+ event.change = changeAttributeSupplier(change, notes);
event.changer = accountAttributeSupplier(ev.getWho());
dispatcher.get().postEvent(change, event);
@@ -486,10 +490,11 @@
@Override
public void onPrivateStateChanged(PrivateStateChangedListener.Event ev) {
try {
- Change change = getChange(ev.getChange());
+ ChangeNotes notes = getNotes(ev.getChange());
+ Change change = notes.getChange();
PrivateStateChangedEvent event = new PrivateStateChangedEvent(change);
- event.change = changeAttributeSupplier(change);
+ event.change = changeAttributeSupplier(change, notes);
event.changer = accountAttributeSupplier(ev.getWho());
dispatcher.get().postEvent(change, event);
@@ -505,7 +510,7 @@
Change change = notes.getChange();
VoteDeletedEvent event = new VoteDeletedEvent(change);
- event.change = changeAttributeSupplier(change);
+ event.change = changeAttributeSupplier(change, notes);
event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes));
event.comment = ev.getMessage();
event.reviewer = accountAttributeSupplier(ev.getReviewer());
diff --git a/java/com/google/gerrit/server/util/HostPlatform.java b/java/com/google/gerrit/server/ioutil/HostPlatform.java
similarity index 96%
rename from java/com/google/gerrit/server/util/HostPlatform.java
rename to java/com/google/gerrit/server/ioutil/HostPlatform.java
index 066bd4b..5afda3c 100644
--- a/java/com/google/gerrit/server/util/HostPlatform.java
+++ b/java/com/google/gerrit/server/ioutil/HostPlatform.java
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.server.util;
+package com.google.gerrit.server.ioutil;
import java.security.AccessController;
import java.security.PrivilegedAction;
diff --git a/java/com/google/gerrit/server/mime/MimeUtil2Module.java b/java/com/google/gerrit/server/mime/MimeUtil2Module.java
index 387482a..7fdc4fb 100644
--- a/java/com/google/gerrit/server/mime/MimeUtil2Module.java
+++ b/java/com/google/gerrit/server/mime/MimeUtil2Module.java
@@ -14,7 +14,7 @@
package com.google.gerrit.server.mime;
-import com.google.gerrit.server.util.HostPlatform;
+import com.google.gerrit.server.ioutil.HostPlatform;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.Singleton;
diff --git a/java/com/google/gerrit/server/query/change/OutputStreamQuery.java b/java/com/google/gerrit/server/query/change/OutputStreamQuery.java
index dc57a9b..dbbf367 100644
--- a/java/com/google/gerrit/server/query/change/OutputStreamQuery.java
+++ b/java/com/google/gerrit/server/query/change/OutputStreamQuery.java
@@ -237,7 +237,7 @@
ChangeData d, Map<Project.NameKey, Repository> repos, Map<Project.NameKey, RevWalk> revWalks)
throws OrmException, IOException {
LabelTypes labelTypes = d.getLabelTypes();
- ChangeAttribute c = eventFactory.asChangeAttribute(db, d.change());
+ ChangeAttribute c = eventFactory.asChangeAttribute(db, d.change(), d.notes());
eventFactory.extend(c, d.change());
if (!trackingFooters.isEmpty()) {
diff --git a/javatests/com/google/gerrit/acceptance/pgm/AbstractReindexTests.java b/javatests/com/google/gerrit/acceptance/pgm/AbstractReindexTests.java
index 0d24a5d..c166acfb 100644
--- a/javatests/com/google/gerrit/acceptance/pgm/AbstractReindexTests.java
+++ b/javatests/com/google/gerrit/acceptance/pgm/AbstractReindexTests.java
@@ -35,6 +35,7 @@
import com.google.gerrit.server.index.change.ChangeIndexCollection;
import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.inject.Injector;
import com.google.inject.Provider;
import java.nio.file.Files;
import java.util.Set;
@@ -46,6 +47,9 @@
@NoHttpd
public abstract class AbstractReindexTests extends StandaloneSiteTest {
+ /** @param injector injector */
+ public abstract void configureIndex(Injector injector) throws Exception;
+
private static final String CHANGES = ChangeSchemaDefinitions.NAME;
private Project.NameKey project;
@@ -225,6 +229,7 @@
private void setUpChange() throws Exception {
project = new Project.NameKey("reindex-project-test");
try (ServerContext ctx = startServer()) {
+ configureIndex(ctx.getInjector());
GerritApi gApi = ctx.getInjector().getInstance(GerritApi.class);
gApi.projects().create(project.get());
diff --git a/javatests/com/google/gerrit/acceptance/pgm/BUILD b/javatests/com/google/gerrit/acceptance/pgm/BUILD
index ea4c87d..a91b815 100644
--- a/javatests/com/google/gerrit/acceptance/pgm/BUILD
+++ b/javatests/com/google/gerrit/acceptance/pgm/BUILD
@@ -21,6 +21,7 @@
srcs = ["ElasticReindexIT.java"],
group = "elastic",
labels = [
+ "docker",
"elastic",
"exclusive",
"flaky",
@@ -30,7 +31,9 @@
vm_args = ["-Xmx512m"],
deps = [
":util",
+ "//java/com/google/gerrit/elasticsearch",
"//java/com/google/gerrit/server/schema",
+ "//javatests/com/google/gerrit/elasticsearch:elasticsearch_test_utils",
],
)
diff --git a/javatests/com/google/gerrit/acceptance/pgm/ElasticReindexIT.java b/javatests/com/google/gerrit/acceptance/pgm/ElasticReindexIT.java
index 1aa8d54..c90b3d3 100644
--- a/javatests/com/google/gerrit/acceptance/pgm/ElasticReindexIT.java
+++ b/javatests/com/google/gerrit/acceptance/pgm/ElasticReindexIT.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2014 The Android Open Source Project
+// Copyright (C) 2018 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.
@@ -14,7 +14,56 @@
package com.google.gerrit.acceptance.pgm;
-import org.junit.Ignore;
+import com.google.gerrit.elasticsearch.ElasticContainer;
+import com.google.gerrit.elasticsearch.ElasticTestUtils;
+import com.google.gerrit.elasticsearch.ElasticTestUtils.ElasticNodeInfo;
+import com.google.gerrit.elasticsearch.ElasticVersion;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.inject.Injector;
+import java.util.UUID;
+import org.eclipse.jgit.lib.Config;
+import org.junit.Before;
-@Ignore
-public class ElasticReindexIT extends AbstractReindexTests {}
+public class ElasticReindexIT extends AbstractReindexTests {
+
+ private static Config getConfig(ElasticVersion version) {
+ ElasticNodeInfo elasticNodeInfo;
+ ElasticContainer<?> container = ElasticContainer.createAndStart(version);
+ elasticNodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
+ String indicesPrefix = UUID.randomUUID().toString();
+ Config cfg = new Config();
+ ElasticTestUtils.configure(cfg, elasticNodeInfo.port, indicesPrefix, version);
+ return cfg;
+ }
+
+ @ConfigSuite.Default
+ public static Config elasticsearchV2() {
+ return getConfig(ElasticVersion.V2_4);
+ }
+
+ @ConfigSuite.Config
+ public static Config elasticsearchV5() {
+ return getConfig(ElasticVersion.V5_6);
+ }
+
+ @ConfigSuite.Config
+ public static Config elasticsearchV6_2() {
+ return getConfig(ElasticVersion.V6_2);
+ }
+
+ @ConfigSuite.Config
+ public static Config elasticsearchV6_3() {
+ return getConfig(ElasticVersion.V6_3);
+ }
+
+ @Override
+ public void configureIndex(Injector injector) throws Exception {
+ ElasticTestUtils.createAllIndexes(injector);
+ }
+
+ @Before
+ public void reindexFirstSinceElastic() throws Exception {
+ assertServerStartupFails();
+ runGerrit("reindex", "-d", sitePaths.site_path.toString(), "--show-stack-trace");
+ }
+}
diff --git a/javatests/com/google/gerrit/acceptance/pgm/ReindexIT.java b/javatests/com/google/gerrit/acceptance/pgm/ReindexIT.java
index 18d2628..223851e 100644
--- a/javatests/com/google/gerrit/acceptance/pgm/ReindexIT.java
+++ b/javatests/com/google/gerrit/acceptance/pgm/ReindexIT.java
@@ -14,4 +14,9 @@
package com.google.gerrit.acceptance.pgm;
-public class ReindexIT extends AbstractReindexTests {}
+import com.google.inject.Injector;
+
+public class ReindexIT extends AbstractReindexTests {
+ @Override
+ public void configureIndex(Injector injector) {}
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/account/ImpersonationIT.java b/javatests/com/google/gerrit/acceptance/rest/account/ImpersonationIT.java
index eb80092..65c95f8 100644
--- a/javatests/com/google/gerrit/acceptance/rest/account/ImpersonationIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/account/ImpersonationIT.java
@@ -472,7 +472,7 @@
in.drafts = DraftHandling.PUBLISH;
RestResponse res =
adminRestSession.postWithHeader(
- "/changes/" + r.getChangeId() + "/revisions/current/review", in, runAsHeader(user.id));
+ "/changes/" + r.getChangeId() + "/revisions/current/review", runAsHeader(user.id), in);
res.assertOK();
ChangeMessageInfo m = Iterables.getLast(gApi.changes().id(r.getChangeId()).get().messages);
@@ -504,13 +504,13 @@
in.message = "Message on behalf of";
String endpoint = "/changes/" + r.getChangeId() + "/revisions/current/review";
- RestResponse res = adminRestSession.postWithHeader(endpoint, in, runAsHeader(user2.id));
+ RestResponse res = adminRestSession.postWithHeader(endpoint, runAsHeader(user2.id), in);
res.assertForbidden();
assertThat(res.getEntityContent())
.isEqualTo("label required to post review on behalf of \"" + in.onBehalfOf + '"');
in.label("Code-Review", 1);
- adminRestSession.postWithHeader(endpoint, in, runAsHeader(user2.id)).assertOK();
+ adminRestSession.postWithHeader(endpoint, runAsHeader(user2.id), in).assertOK();
PatchSetApproval psa = Iterables.getOnlyElement(r.getChange().approvals().values());
assertThat(psa.getPatchSetId().get()).isEqualTo(1);
diff --git a/javatests/com/google/gerrit/acceptance/server/notedb/ChangeRebuilderIT.java b/javatests/com/google/gerrit/acceptance/server/notedb/ChangeRebuilderIT.java
index ffff121..1ab0407 100644
--- a/javatests/com/google/gerrit/acceptance/server/notedb/ChangeRebuilderIT.java
+++ b/javatests/com/google/gerrit/acceptance/server/notedb/ChangeRebuilderIT.java
@@ -1097,7 +1097,7 @@
ci.message = "comment with impersonation";
ri.message = "message with impersonation";
ri.label("Code-Review", 1);
- adminRestSession.postWithHeader(prefix + "review", ri, runAs).assertOK();
+ adminRestSession.postWithHeader(prefix + "review", runAs, ri).assertOK();
di.message = "draft with impersonation";
adminRestSession.putWithHeader(prefix + "drafts", runAs, di).assertCreated();
diff --git a/javatests/com/google/gerrit/server/BUILD b/javatests/com/google/gerrit/server/BUILD
index 569b0b9..18d9c71 100644
--- a/javatests/com/google/gerrit/server/BUILD
+++ b/javatests/com/google/gerrit/server/BUILD
@@ -47,6 +47,7 @@
"//java/com/google/gerrit/server",
"//java/com/google/gerrit/server/cache/testing",
"//java/com/google/gerrit/server/group/testing",
+ "//java/com/google/gerrit/server/ioutil",
"//java/com/google/gerrit/server/project/testing:project-test-util",
"//java/com/google/gerrit/server/restapi",
"//java/com/google/gerrit/server/schema",
diff --git a/javatests/com/google/gerrit/server/config/SitePathsTest.java b/javatests/com/google/gerrit/server/config/SitePathsTest.java
index 853db27..b4cde14 100644
--- a/javatests/com/google/gerrit/server/config/SitePathsTest.java
+++ b/javatests/com/google/gerrit/server/config/SitePathsTest.java
@@ -17,7 +17,7 @@
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth8.assertThat;
-import com.google.gerrit.server.util.HostPlatform;
+import com.google.gerrit.server.ioutil.HostPlatform;
import com.google.gerrit.testing.GerritBaseTests;
import java.io.IOException;
import java.nio.file.Files;
diff --git a/javatests/com/google/gerrit/server/git/LocalDiskRepositoryManagerTest.java b/javatests/com/google/gerrit/server/git/LocalDiskRepositoryManagerTest.java
index aaad2a6..4e0cb0c 100644
--- a/javatests/com/google/gerrit/server/git/LocalDiskRepositoryManagerTest.java
+++ b/javatests/com/google/gerrit/server/git/LocalDiskRepositoryManagerTest.java
@@ -19,7 +19,7 @@
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.util.HostPlatform;
+import com.google.gerrit.server.ioutil.HostPlatform;
import com.google.gerrit.testing.TempFileUtil;
import com.google.gwtorm.client.KeyUtil;
import com.google.gwtorm.server.StandardKeyEncoder;
diff --git a/javatests/com/google/gerrit/server/tools/hooks/CommitMsgHookTest.java b/javatests/com/google/gerrit/server/tools/hooks/CommitMsgHookTest.java
index bd54ddc..339a46d 100644
--- a/javatests/com/google/gerrit/server/tools/hooks/CommitMsgHookTest.java
+++ b/javatests/com/google/gerrit/server/tools/hooks/CommitMsgHookTest.java
@@ -19,7 +19,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
-import com.google.gerrit.server.util.HostPlatform;
+import com.google.gerrit.server.ioutil.HostPlatform;
import java.io.File;
import java.io.IOException;
import java.util.Date;