| // 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. |
| |
| package com.google.gerrit.testing; |
| |
| import static com.google.common.base.Preconditions.checkArgument; |
| import static java.util.stream.Collectors.toMap; |
| |
| import com.google.common.annotations.VisibleForTesting; |
| import com.google.common.base.Splitter; |
| import com.google.common.base.Strings; |
| import com.google.common.collect.ImmutableList; |
| import com.google.common.primitives.Ints; |
| import com.google.gerrit.index.Schema; |
| import com.google.gerrit.index.SchemaDefinitions; |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.Locale; |
| import java.util.Map; |
| import java.util.NavigableMap; |
| import org.eclipse.jgit.lib.Config; |
| |
| public class IndexVersions { |
| static final String ALL = "all"; |
| static final String CURRENT = "current"; |
| static final String PREVIOUS = "previous"; |
| |
| /** |
| * Returns the index versions from {@link IndexVersions#get(SchemaDefinitions)} without the latest |
| * schema version. |
| * |
| * @param schemaDef the schema definition |
| * @return the index versions from {@link IndexVersions#get(SchemaDefinitions)} without the latest |
| * schema version |
| */ |
| public static <V> ImmutableList<Integer> getWithoutLatest(SchemaDefinitions<V> schemaDef) { |
| List<Integer> schemaVersions = new ArrayList<>(get(schemaDef)); |
| schemaVersions.remove(Integer.valueOf(schemaDef.getLatest().getVersion())); |
| return ImmutableList.copyOf(schemaVersions); |
| } |
| |
| /** |
| * Returns the schema versions against which the query tests should be executed. |
| * |
| * <p>The schema versions are read from the '<schema-name>_INDEX_VERSIONS' env var if it is set, |
| * e.g. 'ACCOUNTS_INDEX_VERSIONS', 'CHANGES_INDEX_VERSIONS', 'GROUPS_INDEX_VERSIONS'. |
| * |
| * <p>If schema versions were not specified by an env var, they are read from the |
| * 'gerrit.index.<schema-name>.versions' system property, e.g. 'gerrit.index.accounts.version', |
| * 'gerrit.index.changes.version', 'gerrit.index.groups.version'. |
| * |
| * <p>As value a comma-separated list of schema versions is expected. {@code current} can be used |
| * for the latest schema version and {@code previous} is resolved to the second last schema |
| * version. Alternatively the value can also be {@code all} for all schema versions. |
| * |
| * <p>If schema versions were neither specified by an env var nor by a system property, the |
| * current and the second last schema versions are returned. If there is no other schema version |
| * than the current schema version, only the current schema version is returned. |
| * |
| * @param schemaDef the schema definition |
| * @return the schema versions against which the query tests should be executed |
| * @throws IllegalArgumentException if the value of the env var or system property is invalid or |
| * if any of the specified schema versions doesn't exist |
| */ |
| public static <V> ImmutableList<Integer> get(SchemaDefinitions<V> schemaDef) { |
| String envVar = schemaDef.getName().toUpperCase(Locale.US) + "_INDEX_VERSIONS"; |
| String value = System.getenv(envVar); |
| if (!Strings.isNullOrEmpty(value)) { |
| return get(schemaDef, "env variable " + envVar, value); |
| } |
| |
| String systemProperty = |
| "gerrit.index." + schemaDef.getName().toLowerCase(Locale.US) + ".versions"; |
| value = System.getProperty(systemProperty); |
| return get(schemaDef, "system property " + systemProperty, value); |
| } |
| |
| @VisibleForTesting |
| static <V> ImmutableList<Integer> get(SchemaDefinitions<V> schemaDef, String name, String value) { |
| if (value != null) { |
| value = value.trim(); |
| } |
| |
| NavigableMap<Integer, Schema<V>> schemas = schemaDef.getSchemas(); |
| if (!Strings.isNullOrEmpty(value)) { |
| if (ALL.equals(value)) { |
| return ImmutableList.copyOf(schemas.keySet()); |
| } |
| |
| ImmutableList.Builder<Integer> versions = ImmutableList.builder(); |
| for (String s : Splitter.on(',').trimResults().split(value)) { |
| if (CURRENT.equals(s)) { |
| versions.add(schemaDef.getLatest().getVersion()); |
| } else if (PREVIOUS.equals(s)) { |
| checkArgument(schemaDef.getPrevious() != null, "previous version does not exist"); |
| versions.add(schemaDef.getPrevious().getVersion()); |
| } else { |
| Integer version = Ints.tryParse(s); |
| checkArgument(version != null, "Invalid value for %s: %s", name, s); |
| checkArgument( |
| schemas.containsKey(version), |
| "Index version %s that was specified by %s not found." + " Possible versions are: %s", |
| version, |
| name, |
| schemas.keySet()); |
| versions.add(version); |
| } |
| } |
| return versions.build(); |
| } |
| |
| ImmutableList.Builder<Integer> schemaVersions = ImmutableList.builderWithExpectedSize(2); |
| if (schemaDef.getPrevious() != null) { |
| schemaVersions.add(schemaDef.getPrevious().getVersion()); |
| } |
| schemaVersions.add(schemaDef.getLatest().getVersion()); |
| return schemaVersions.build(); |
| } |
| |
| public static <V> Map<String, Config> asConfigMap( |
| SchemaDefinitions<V> schemaDef, |
| List<Integer> schemaVersions, |
| String testSuiteNamePrefix, |
| Config baseConfig) { |
| return schemaVersions.stream() |
| .collect( |
| toMap( |
| i -> testSuiteNamePrefix + i, |
| i -> { |
| Config cfg = baseConfig; |
| cfg.setInt( |
| "index", |
| "lucene", |
| schemaDef.getName().toLowerCase(Locale.US) + "TestVersion", |
| i); |
| return cfg; |
| })); |
| } |
| } |