Merge "Acceptance tests framework: Allow tests to change Gerrit configuration"

This commit is contained in:
Edwin Kempin 2013-09-18 08:57:30 +00:00 committed by Gerrit Code Review
commit 448fa86ffd
7 changed files with 264 additions and 12 deletions

View File

@ -14,20 +14,51 @@
package com.google.gerrit.acceptance;
import org.junit.After;
import org.junit.Before;
import org.eclipse.jgit.lib.Config;
import org.junit.Rule;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
public abstract class AbstractDaemonTest {
protected GerritServer server;
@Before
public final void beforeTest() throws Exception {
server = GerritServer.start();
@Rule
public TestRule testRunner = new TestRule() {
@Override
public Statement apply(final Statement base, final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
beforeTest(config(description));
base.evaluate();
afterTest();
}
};
}
};
private static Config config(Description description) {
GerritConfigs cfgs = description.getAnnotation(GerritConfigs.class);
GerritConfig cfg = description.getAnnotation(GerritConfig.class);
if (cfgs != null && cfg != null) {
throw new IllegalStateException("Use either @GerritConfigs or @GerritConfig not both");
}
if (cfgs != null) {
return ConfigAnnotationParser.parse(cfgs);
} else if (cfg != null) {
return ConfigAnnotationParser.parse(cfg);
} else {
return null;
}
}
private void beforeTest(Config cfg) throws Exception {
server = GerritServer.start(cfg);
server.getTestInjector().injectMembers(this);
}
@After
public final void afterTest() throws Exception {
private void afterTest() throws Exception {
server.stop();
}
}

View File

@ -0,0 +1,58 @@
// Copyright (C) 2013 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.
package com.google.gerrit.acceptance;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import org.eclipse.jgit.lib.Config;
import java.util.ArrayList;
class ConfigAnnotationParser {
private static Splitter splitter = Splitter.on(".").trimResults();
static Config parse(GerritConfigs annotation) {
if (annotation == null) {
return null;
}
Config cfg = new Config();
for (GerritConfig c : annotation.value()) {
parse(cfg, c);
}
return cfg;
}
static Config parse(GerritConfig annotation) {
Config cfg = new Config();
parse(cfg, annotation);
return cfg;
}
static private void parse(Config cfg, GerritConfig c) {
ArrayList<String> l = Lists.newArrayList(splitter.split(c.name()));
if (l.size() == 2) {
cfg.setString(l.get(0), null, l.get(1), c.value());
} else if (l.size() == 3) {
cfg.setString(l.get(0), l.get(1), l.get(2), c.value());
} else {
throw new IllegalArgumentException(
"GerritConfig.name must be of the format"
+ " section.subsection.name or section.name");
}
}
}

View File

@ -0,0 +1,28 @@
// Copyright (C) 2013 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.
package com.google.gerrit.acceptance;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@Target({METHOD})
@Retention(RUNTIME)
public @interface GerritConfig {
String name();
String value();
}

View File

@ -0,0 +1,27 @@
// Copyright (C) 2013 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.
package com.google.gerrit.acceptance;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@Target({METHOD})
@Retention(RUNTIME)
public @interface GerritConfigs {
public GerritConfig[] value();
}

View File

@ -23,6 +23,7 @@ import com.google.inject.Injector;
import com.google.inject.Module;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.RepositoryCache;
import org.eclipse.jgit.storage.file.FileBasedConfig;
import org.eclipse.jgit.util.FS;
@ -42,11 +43,11 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
class GerritServer {
public class GerritServer {
/** Returns fully started Gerrit server */
static GerritServer start() throws Exception {
final File site = initSite();
static GerritServer start(Config base) throws Exception {
final File site = initSite(base);
final CyclicBarrier serverStarted = new CyclicBarrier(2);
final Daemon daemon = new Daemon(new Runnable() {
public void run() {
@ -80,7 +81,7 @@ class GerritServer {
return new GerritServer(site, i, daemon, daemonService);
}
private static File initSite() throws Exception {
private static File initSite(Config base) throws Exception {
File tmp = TempFileUtil.createTempDirectory();
Init init = new Init();
int rc = init.main(new String[] {
@ -93,10 +94,11 @@ class GerritServer {
InetSocketAddress http = newPort();
InetSocketAddress sshd = newPort();
String url = "http://" + format(http) + "/";
FileBasedConfig cfg = new FileBasedConfig(
MergeableFileBasedConfig cfg = new MergeableFileBasedConfig(
new File(new File(tmp, "etc"), "gerrit.config"),
FS.DETECTED);
cfg.load();
cfg.merge(base);
cfg.setString("gerrit", null, "canonicalWebUrl", url);
cfg.setString("httpd", null, "listenUrl", url);
cfg.setString("sshd", null, "listenAddress", format(sshd));

View File

@ -0,0 +1,60 @@
// Copyright (C) 2013 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.
package com.google.gerrit.acceptance;
import com.google.common.collect.Lists;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.storage.file.FileBasedConfig;
import org.eclipse.jgit.util.FS;
import java.io.File;
/**
* A file based Config that can merge another Config instance.
*/
public class MergeableFileBasedConfig extends FileBasedConfig {
public MergeableFileBasedConfig(File cfgLocation, FS fs) {
super(cfgLocation, fs);
}
/**
* Merge another Config into this Config.
*
* In case a configuration parameter exists both in this instance and in the
* merged instance then the value in this instance will simply replaced by
* the value from the merged instance.
*
* @param s Config to merge into this instance
*/
public void merge(Config s) {
if (s == null) {
return;
}
for (String section : s.getSections()) {
for (String subsection : s.getSubsections(section)) {
for (String name : s.getNames(section, subsection)) {
setStringList(section, subsection, name, Lists.newArrayList(s
.getStringList(section, subsection, name)));
}
}
for (String name : s.getNames(section)) {
setStringList(section, null, name,
Lists.newArrayList(s.getStringList(section, null, name)));
}
}
}
}

View File

@ -0,0 +1,46 @@
// Copyright (C) 2013 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.
package com.google.gerrit.acceptance;
import static org.junit.Assert.assertEquals;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.inject.Inject;
import org.eclipse.jgit.lib.Config;
import org.junit.Test;
public class UseGerritConfigAnnotationTest extends AbstractDaemonTest {
@Inject
@GerritServerConfig
Config serverConfig;
@Test
@GerritConfig(name="x.y", value="z")
public void testOne() {
assertEquals("z", serverConfig.getString("x", null, "y"));
}
@Test
@GerritConfigs({
@GerritConfig(name="x.y", value="z"),
@GerritConfig(name="a.b", value="c"),
})
public void testMultiple() {
assertEquals("z", serverConfig.getString("x", null, "y"));
assertEquals("c", serverConfig.getString("a", null, "b"));
}
}