diff options
30 files changed, 793 insertions, 1084 deletions
diff --git a/client/js/app/yarn.lock b/client/js/app/yarn.lock index 192f246f2d9..aa0d5f40b8d 100644 --- a/client/js/app/yarn.lock +++ b/client/js/app/yarn.lock @@ -1320,70 +1320,70 @@ resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.15.3.tgz#d2509048d69dbb72d5389a14945339f1430b2d3c" integrity sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w== -"@rollup/rollup-android-arm-eabi@4.12.0": - version "4.12.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz#38c3abd1955a3c21d492af6b1a1dca4bb1d894d6" - integrity sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w== - -"@rollup/rollup-android-arm64@4.12.0": - version "4.12.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz#3822e929f415627609e53b11cec9a4be806de0e2" - integrity sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ== - -"@rollup/rollup-darwin-arm64@4.12.0": - version "4.12.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz#6c082de71f481f57df6cfa3701ab2a7afde96f69" - integrity sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ== - -"@rollup/rollup-darwin-x64@4.12.0": - version "4.12.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz#c34ca0d31f3c46a22c9afa0e944403eea0edcfd8" - integrity sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg== - -"@rollup/rollup-linux-arm-gnueabihf@4.12.0": - version "4.12.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz#48e899c1e438629c072889b824a98787a7c2362d" - integrity sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA== - -"@rollup/rollup-linux-arm64-gnu@4.12.0": - version "4.12.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz#788c2698a119dc229062d40da6ada8a090a73a68" - integrity sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA== - -"@rollup/rollup-linux-arm64-musl@4.12.0": - version "4.12.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz#3882a4e3a564af9e55804beeb67076857b035ab7" - integrity sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ== - -"@rollup/rollup-linux-riscv64-gnu@4.12.0": - version "4.12.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz#0c6ad792e1195c12bfae634425a3d2aa0fe93ab7" - integrity sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw== - -"@rollup/rollup-linux-x64-gnu@4.12.0": - version "4.12.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz#9d62485ea0f18d8674033b57aa14fb758f6ec6e3" - integrity sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA== - -"@rollup/rollup-linux-x64-musl@4.12.0": - version "4.12.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz#50e8167e28b33c977c1f813def2b2074d1435e05" - integrity sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw== - -"@rollup/rollup-win32-arm64-msvc@4.12.0": - version "4.12.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz#68d233272a2004429124494121a42c4aebdc5b8e" - integrity sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw== - -"@rollup/rollup-win32-ia32-msvc@4.12.0": - version "4.12.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz#366ca62221d1689e3b55a03f4ae12ae9ba595d40" - integrity sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA== - -"@rollup/rollup-win32-x64-msvc@4.12.0": - version "4.12.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz#9ffdf9ed133a7464f4ae187eb9e1294413fab235" - integrity sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg== +"@rollup/rollup-android-arm-eabi@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz#b98786c1304b4ff8db3a873180b778649b5dff2b" + integrity sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg== + +"@rollup/rollup-android-arm64@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz#8833679af11172b1bf1ab7cb3bad84df4caf0c9e" + integrity sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q== + +"@rollup/rollup-darwin-arm64@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz#ef02d73e0a95d406e0eb4fd61a53d5d17775659b" + integrity sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g== + +"@rollup/rollup-darwin-x64@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz#3ce5b9bcf92b3341a5c1c58a3e6bcce0ea9e7455" + integrity sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg== + +"@rollup/rollup-linux-arm-gnueabihf@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz#3d3d2c018bdd8e037c6bfedd52acfff1c97e4be4" + integrity sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ== + +"@rollup/rollup-linux-arm64-gnu@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz#5fc8cc978ff396eaa136d7bfe05b5b9138064143" + integrity sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w== + +"@rollup/rollup-linux-arm64-musl@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz#f2ae7d7bed416ffa26d6b948ac5772b520700eef" + integrity sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw== + +"@rollup/rollup-linux-riscv64-gnu@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz#303d57a328ee9a50c85385936f31cf62306d30b6" + integrity sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA== + +"@rollup/rollup-linux-x64-gnu@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz#f672f6508f090fc73f08ba40ff76c20b57424778" + integrity sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA== + +"@rollup/rollup-linux-x64-musl@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz#d2f34b1b157f3e7f13925bca3288192a66755a89" + integrity sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw== + +"@rollup/rollup-win32-arm64-msvc@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz#8ffecc980ae4d9899eb2f9c4ae471a8d58d2da6b" + integrity sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA== + +"@rollup/rollup-win32-ia32-msvc@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz#a7505884f415662e088365b9218b2b03a88fc6f2" + integrity sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw== + +"@rollup/rollup-win32-x64-msvc@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz#6abd79db7ff8d01a58865ba20a63cfd23d9e2a10" + integrity sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw== "@sinclair/typebox@^0.27.8": version "0.27.8" @@ -4813,25 +4813,25 @@ rimraf@^3.0.2: glob "^7.1.3" rollup@^4.2.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.12.0.tgz#0b6d1e5f3d46bbcf244deec41a7421dc54cc45b5" - integrity sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q== + version "4.13.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.13.0.tgz#dd2ae144b4cdc2ea25420477f68d4937a721237a" + integrity sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg== dependencies: "@types/estree" "1.0.5" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.12.0" - "@rollup/rollup-android-arm64" "4.12.0" - "@rollup/rollup-darwin-arm64" "4.12.0" - "@rollup/rollup-darwin-x64" "4.12.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.12.0" - "@rollup/rollup-linux-arm64-gnu" "4.12.0" - "@rollup/rollup-linux-arm64-musl" "4.12.0" - "@rollup/rollup-linux-riscv64-gnu" "4.12.0" - "@rollup/rollup-linux-x64-gnu" "4.12.0" - "@rollup/rollup-linux-x64-musl" "4.12.0" - "@rollup/rollup-win32-arm64-msvc" "4.12.0" - "@rollup/rollup-win32-ia32-msvc" "4.12.0" - "@rollup/rollup-win32-x64-msvc" "4.12.0" + "@rollup/rollup-android-arm-eabi" "4.13.0" + "@rollup/rollup-android-arm64" "4.13.0" + "@rollup/rollup-darwin-arm64" "4.13.0" + "@rollup/rollup-darwin-x64" "4.13.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.13.0" + "@rollup/rollup-linux-arm64-gnu" "4.13.0" + "@rollup/rollup-linux-arm64-musl" "4.13.0" + "@rollup/rollup-linux-riscv64-gnu" "4.13.0" + "@rollup/rollup-linux-x64-gnu" "4.13.0" + "@rollup/rollup-linux-x64-musl" "4.13.0" + "@rollup/rollup-win32-arm64-msvc" "4.13.0" + "@rollup/rollup-win32-ia32-msvc" "4.13.0" + "@rollup/rollup-win32-x64-msvc" "4.13.0" fsevents "~2.3.2" rsvp@^4.8.4: @@ -5452,9 +5452,9 @@ v8-to-istanbul@^9.0.1: convert-source-map "^1.6.0" vite@^5.0.5: - version "5.1.5" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.1.5.tgz#bdbc2b15e8000d9cc5172f059201178f9c9de5fb" - integrity sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q== + version "5.1.6" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.1.6.tgz#706dae5fab9e97f57578469eef1405fc483943e4" + integrity sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA== dependencies: esbuild "^0.19.3" postcss "^8.4.35" diff --git a/container-core/src/main/java/com/yahoo/restapi/RestApi.java b/container-core/src/main/java/com/yahoo/restapi/RestApi.java index ee5628988c9..69cbf48cb1b 100644 --- a/container-core/src/main/java/com/yahoo/restapi/RestApi.java +++ b/container-core/src/main/java/com/yahoo/restapi/RestApi.java @@ -15,12 +15,11 @@ import com.yahoo.security.tls.ConnectionAuthContext; import javax.net.ssl.SSLSession; import java.io.InputStream; +import java.math.BigDecimal; import java.net.InetSocketAddress; import java.security.Principal; import java.util.List; import java.util.Optional; -import java.util.OptionalDouble; -import java.util.OptionalLong; /** * Rest API routing and response serialization @@ -149,6 +148,8 @@ public interface RestApi { /** Scheme, domain and port, for the original request. <em>Use this only for generating resources links, not for custom routing!</em> */ // TODO: this needs to include path and query as well, to be useful for generating resource links that need not be rewritten. HttpURL baseRequestURL(); + /** Full URL of the request */ + HttpURL url(); AclMapping.Action aclAction(); Optional<Principal> userPrincipal(); Principal userPrincipalOrThrow(); @@ -161,14 +162,14 @@ public interface RestApi { String getStringOrThrow(String name); default Optional<Boolean> getBoolean(String name) { return getString(name).map(Boolean::valueOf);} default boolean getBooleanOrThrow(String name) { return Boolean.parseBoolean(getStringOrThrow(name)); } - default OptionalLong getLong(String name) { - return getString(name).map(Long::parseLong).map(OptionalLong::of).orElseGet(OptionalLong::empty); - } + default Optional<Long> getLong(String name) { return getString(name).map(Long::parseLong); } default long getLongOrThrow(String name) { return Long.parseLong(getStringOrThrow(name)); } - default OptionalDouble getDouble(String name) { - return getString(name).map(Double::parseDouble).map(OptionalDouble::of).orElseGet(OptionalDouble::empty); - } + default Optional<Double> getDouble(String name) { return getString(name).map(Double::parseDouble); } + default int getIntegerOrThrow(String name) { return Integer.parseInt(getStringOrThrow(name)); } + default Optional<Integer> getInteger(String name) { return getString(name).map(Integer::parseInt); } default double getDoubleOrThrow(String name) { return Double.parseDouble(getStringOrThrow(name)); } + default BigDecimal getBigDecimalOrThrow(String name) { return new BigDecimal(getStringOrThrow(name)); } + default Optional<BigDecimal> getBigDecimal(String name) { return getString(name).map(BigDecimal::new); } } interface PathParameters extends Parameters { diff --git a/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java b/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java index a381fd3c9a6..56e7f4e3098 100644 --- a/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java +++ b/container-core/src/main/java/com/yahoo/restapi/RestApiImpl.java @@ -479,6 +479,7 @@ class RestApiImpl implements RestApi { } return HttpURL.from(URI.create(sb.toString())); } + @Override public HttpURL url() { return HttpURL.from(request.getUri()); } @Override public AclMapping.Action aclAction() { return aclAction; } @Override public Optional<Principal> userPrincipal() { return Optional.ofNullable(request.getJDiscRequest().getUserPrincipal()); diff --git a/dependency-versions/pom.xml b/dependency-versions/pom.xml index c0dcfde9f10..ea055e97476 100644 --- a/dependency-versions/pom.xml +++ b/dependency-versions/pom.xml @@ -33,7 +33,7 @@ <!-- DO NOT UPGRADE THESE TO A NEW MAJOR VERSION WITHOUT CHECKING FOR BINARY COMPATIBILITY --> <aopalliance.vespa.version>1.0</aopalliance.vespa.version> - <error-prone-annotations.vespa.version>2.25.0</error-prone-annotations.vespa.version> + <error-prone-annotations.vespa.version>2.26.0</error-prone-annotations.vespa.version> <guava.vespa.version>33.0.0-jre</guava.vespa.version> <guice.vespa.version>6.0.0</guice.vespa.version> <jackson2.vespa.version>2.16.2</jackson2.vespa.version> @@ -65,7 +65,7 @@ <assertj.vespa.version>3.25.3</assertj.vespa.version> <!-- Athenz dependencies. Make sure these dependencies match those in Vespa's internal repositories --> - <aws-sdk.vespa.version>1.12.676</aws-sdk.vespa.version> + <aws-sdk.vespa.version>1.12.677</aws-sdk.vespa.version> <athenz.vespa.version>1.11.53</athenz.vespa.version> <!-- Athenz END --> @@ -166,7 +166,7 @@ <maven-deploy-plugin.vespa.version>3.1.1</maven-deploy-plugin.vespa.version> <maven-enforcer-plugin.vespa.version>3.4.1</maven-enforcer-plugin.vespa.version> <maven-failsafe-plugin.vespa.version>3.2.5</maven-failsafe-plugin.vespa.version> - <maven-gpg-plugin.vespa.version>3.1.0</maven-gpg-plugin.vespa.version> + <maven-gpg-plugin.vespa.version>3.2.0</maven-gpg-plugin.vespa.version> <maven-install-plugin.vespa.version>3.1.1</maven-install-plugin.vespa.version> <maven-jar-plugin.vespa.version>3.3.0</maven-jar-plugin.vespa.version> <maven-javadoc-plugin.vespa.version>3.6.3</maven-javadoc-plugin.vespa.version> diff --git a/messagebus/src/tests/routing/CMakeLists.txt b/messagebus/src/tests/routing/CMakeLists.txt index 68e466ceff6..6b013f7b9cc 100644 --- a/messagebus/src/tests/routing/CMakeLists.txt +++ b/messagebus/src/tests/routing/CMakeLists.txt @@ -5,5 +5,6 @@ vespa_add_executable(messagebus_routing_test_app TEST DEPENDS messagebus_messagebus-test messagebus + GTest::gtest ) vespa_add_test(NAME messagebus_routing_test_app COMMAND messagebus_routing_test_app) diff --git a/messagebus/src/tests/routing/routing.cpp b/messagebus/src/tests/routing/routing.cpp index b459f093e4c..f37032e18e7 100644 --- a/messagebus/src/tests/routing/routing.cpp +++ b/messagebus/src/tests/routing/routing.cpp @@ -11,7 +11,7 @@ #include <vespa/messagebus/testlib/slobrok.h> #include <vespa/messagebus/testlib/testserver.h> #include <vespa/vespalib/component/vtag.h> -#include <vespa/vespalib/testkit/testapp.h> +#include <vespa/vespalib/gtest/gtest.h> #include <vespa/log/log.h> @@ -330,59 +330,59 @@ public: mergeFromChild, mergeError, mergeException); } - static MyPolicyFactory::SP - newSelectAndMerge(const string &select) + static MyPolicyFactory::SP + newSelectAndMerge(const string &select) { return newInstance(select, ErrorCode::NONE, false, true, ErrorCode::NONE, false); } - static MyPolicyFactory::SP - newEmptySelection() + static MyPolicyFactory::SP + newEmptySelection() { return newInstance("", ErrorCode::NONE, false, false, ErrorCode::NONE, false); } - static MyPolicyFactory::SP + static MyPolicyFactory::SP newSelectError(uint32_t errCode) { return newInstance("", errCode, false, false, ErrorCode::NONE, false); } - static MyPolicyFactory::SP - newSelectException() + static MyPolicyFactory::SP + newSelectException() { return newInstance("", ErrorCode::NONE, true, false, ErrorCode::NONE, false); } - static MyPolicyFactory::SP - newSelectAndThrow(const string &select) + static MyPolicyFactory::SP + newSelectAndThrow(const string &select) { return newInstance(select, ErrorCode::NONE, true, false, ErrorCode::NONE, false); } - static MyPolicyFactory::SP - newEmptyMerge(const string &select) + static MyPolicyFactory::SP + newEmptyMerge(const string &select) { return newInstance(select, ErrorCode::NONE, false, false, ErrorCode::NONE, false); } - static MyPolicyFactory::SP - newMergeError(const string &select, int errCode) + static MyPolicyFactory::SP + newMergeError(const string &select, int errCode) { return newInstance(select, ErrorCode::NONE, false, false, errCode, false); } - static MyPolicyFactory::SP - newMergeException(const string &select) + static MyPolicyFactory::SP + newMergeException(const string &select) { return newInstance(select, ErrorCode::NONE, false, false, ErrorCode::NONE, true); } - static MyPolicyFactory::SP + static MyPolicyFactory::SP newMergeAndThrow(const string &select) { return newInstance(select, ErrorCode::NONE, false, true, ErrorCode::NONE, true); - } + } }; MyPolicyFactory::MyPolicyFactory(const string &selectRoute, uint32_t &selectError, bool selectException, @@ -400,7 +400,7 @@ MyPolicyFactory::~MyPolicyFactory() = default; class MyPolicy : public IRoutingPolicy { private: const MyPolicyFactory &_parent; - + public: explicit MyPolicy(const MyPolicyFactory &parent) : _parent(parent) @@ -465,76 +465,6 @@ public: bool start(); }; -class Test : public vespalib::TestApp { -private: - Message::UP createMessage(const string &msg, uint32_t level = 9); - void setupRouting(TestData &data, RoutingTableSpec && spec); - void setupPolicy(TestData &data, const string &policyName, - SimpleProtocol::IPolicyFactory::SP policy); - static bool testAcknowledge(TestData &data); - bool testSend(TestData &data, const string &route, uint32_t level = 9); - bool testTrace(TestData &data, const std::vector<string> &expected); - bool testTrace(const std::vector<string> &expected, const Trace &trace); - - static const duration RECEPTOR_TIMEOUT; - -public: - int Main() override; - void testNoRoutingTable(TestData &data); - void testUnknownRoute(TestData &data); - void testNoRoute(TestData &data); - void testRecognizeHopName(TestData &data); - void testRecognizeRouteDirective(TestData &data); - void testRecognizeRouteName(TestData &data); - void testHopResolutionOverflow(TestData &data); - void testRouteResolutionOverflow(TestData &data); - void testInsertRoute(TestData &data); - void testErrorDirective(TestData &data); - void testSelectError(TestData &data); - void testSelectNone(TestData &data); - void testSelectOne(TestData &data); - void testResend1(TestData &data); - void testResend2(TestData &data); - void testNoResend(TestData &data); - void testSelectOnResend(TestData &data); - void testNoSelectOnResend(TestData &data); - void testCanConsumeError(TestData &data); - void testCantConsumeError(TestData &data); - void testNestedPolicies(TestData &data); - void testRemoveReply(TestData &data); - void testSetReply(TestData &data); - void testResendSetAndReuseReply(TestData &data); - void testResendSetAndRemoveReply(TestData &data); - void testHopIgnoresReply(TestData &data); - void testHopBlueprintIgnoresReply(TestData &data); - void testAcceptEmptyRoute(TestData &data); - void testAbortOnlyActiveNodes(TestData &data); - void testTimeout(TestData &data); - void testUnknownPolicy(TestData &data); - void testSelectException(TestData &data); - void testMergeException(TestData &data); - - void requireThatIgnoreFlagPersistsThroughHopLookup(TestData &data); - void requireThatIgnoreFlagPersistsThroughRouteLookup(TestData &data); - void requireThatIgnoreFlagPersistsThroughPolicySelect(TestData &data); - void requireThatIgnoreFlagIsSerializedWithMessage(TestData &data); - void requireThatIgnoreFlagDoesNotInterfere(TestData &data); - void requireThatEmptySelectionCanBeIgnored(TestData &data); - void requireThatSelectErrorCanBeIgnored(TestData &data); - void requireThatSelectExceptionCanBeIgnored(TestData &data); - void requireThatSelectAndThrowCanBeIgnored(TestData &data); - void requireThatEmptyMergeCanBeIgnored(TestData &data); - void requireThatMergeErrorCanBeIgnored(TestData &data); - void requireThatMergeExceptionCanBeIgnored(TestData &data); - void requireThatMergeAndThrowCanBeIgnored(TestData &data); - void requireThatAllocServiceCanBeIgnored(TestData &data); - void requireThatDepthLimitCanBeIgnored(TestData &data); -}; - -const duration Test::RECEPTOR_TIMEOUT = 120s; - -TEST_APPHOOK(Test); - TestData::TestData() : _slobrok(), _retryPolicy(std::make_shared<RetryTransientErrorsPolicy>()), @@ -577,22 +507,81 @@ TestData::start() return true; } +class RoutingTest : public testing::Test { +protected: + static const duration RECEPTOR_TIMEOUT; + static std::shared_ptr<TestData> _data; + static bool _force_teardown; + RoutingTest(); + ~RoutingTest() override; + static void SetUpTestSuite(); + static void TearDownTestSuite(); + void SetUp() override; + void TearDown() override; + static Message::UP createMessage(const string &msg, uint32_t level = 9); + static void setupRouting(TestData &data, RoutingTableSpec && spec); + static void setupPolicy(TestData &data, const string &policyName, + SimpleProtocol::IPolicyFactory::SP policy); + static bool testAcknowledge(TestData &data); + static bool testSend(TestData &data, const string &route, uint32_t level = 9); + static bool testTrace(TestData &data, const std::vector<string> &expected); + static bool testTrace(const std::vector<string> &expected, const Trace &trace); +}; + +const duration RoutingTest::RECEPTOR_TIMEOUT = 120s; +std::shared_ptr<TestData> RoutingTest::_data; +bool RoutingTest::_force_teardown = false; + +RoutingTest::RoutingTest() = default; +RoutingTest::~RoutingTest() = default; + +void +RoutingTest::SetUpTestSuite() +{ + _data = std::make_shared<TestData>(); + ASSERT_TRUE(_data->start()); +} + +void +RoutingTest::TearDownTestSuite() +{ + _data.reset(); +} + +void +RoutingTest::SetUp() +{ + if (!_data) { + _data = std::make_shared<TestData>(); + ASSERT_TRUE(_data->start()); + } +} + +void +RoutingTest::TearDown() +{ + if (_force_teardown) { + _force_teardown = false; + _data.reset(); + } +} + Message::UP -Test::createMessage(const string &msg, uint32_t level) +RoutingTest::createMessage(const string &msg, uint32_t level) { auto ret = std::make_unique<SimpleMessage>(msg); ret->getTrace().setLevel(level); return ret; } -void -Test::setupRouting(TestData &data, RoutingTableSpec && spec) +void +RoutingTest::setupRouting(TestData &data, RoutingTableSpec && spec) { data._srcServer.mb.setupRouting(RoutingSpec().addTable(std::move(spec))); } -void -Test::setupPolicy(TestData &data, const string &policyName, +void +RoutingTest::setupPolicy(TestData &data, const string &policyName, SimpleProtocol::IPolicyFactory::SP policy) { auto protocol = std::make_shared<SimpleProtocol>(); @@ -600,40 +589,45 @@ Test::setupPolicy(TestData &data, const string &policyName, data._srcServer.mb.putProtocol(protocol); } -bool -Test::testAcknowledge(TestData &data) +bool +RoutingTest::testAcknowledge(TestData &data) { Message::UP msg = data._dstHandler.getMessage(RECEPTOR_TIMEOUT); - if (!EXPECT_TRUE(msg)) { + bool failed = false; + EXPECT_TRUE(msg) << (failed = true, ""); + if (failed) { return false; } data._dstSession->acknowledge(std::move(msg)); return true; } - -bool -Test::testSend(TestData &data, const string &route, uint32_t level) + +bool +RoutingTest::testSend(TestData &data, const string &route, uint32_t level) { Message::UP msg = createMessage("msg", level); msg->setRoute(Route::parse(route)); return data._srcSession->send(std::move(msg)).isAccepted(); } -bool -Test::testTrace(TestData &data, const std::vector<string> &expected) +bool +RoutingTest::testTrace(TestData &data, const std::vector<string> &expected) { Reply::UP reply = data._srcHandler.getReply(RECEPTOR_TIMEOUT); - if (!EXPECT_TRUE(reply)) { + bool failed = false; + EXPECT_TRUE(reply) << (failed = true, ""); + if (failed) { return false; } - if (!EXPECT_FALSE(reply->hasErrors())) { + EXPECT_FALSE(reply->hasErrors()) << (failed = true, ""); + if (failed) { return false; } return testTrace(expected, reply->getTrace()); } bool -Test::testTrace(const std::vector<string> &expected, const Trace &trace) +RoutingTest::testTrace(const std::vector<string> &expected, const Trace &trace) { const string& version = vespalib::Vtag::currentVersion.toString(); string actual = trace.toString(); @@ -646,13 +640,17 @@ Test::testTrace(const std::vector<string> &expected, const Trace &trace) } if (line[0] == '-') { string str = line.substr(1); - if (!EXPECT_TRUE(actual.find(str, pos) == string::npos)) { + bool failed = false; + EXPECT_TRUE(actual.find(str, pos) == string::npos) << (failed = true, ""); + if (failed) { LOG(error, "Line %d '%s' not expected.", i, str.c_str()); return false; } } else { pos = actual.find(line, pos); - if (!EXPECT_TRUE(pos != string::npos)) { + bool failed = false; + EXPECT_TRUE(pos != string::npos) << (failed = true, ""); + if (failed) { LOG(error, "Line %d '%s' missing.", i, line.c_str()); return false; } @@ -662,110 +660,47 @@ Test::testTrace(const std::vector<string> &expected, const Trace &trace) return true; } -int -Test::Main() -{ - TEST_INIT("routing_test"); - - TestData data; - ASSERT_TRUE(data.start()); - - testNoRoutingTable(data); TEST_FLUSH(); - testUnknownRoute(data); TEST_FLUSH(); - testNoRoute(data); TEST_FLUSH(); - testRecognizeHopName(data); TEST_FLUSH(); - testRecognizeRouteDirective(data); TEST_FLUSH(); - testRecognizeRouteName(data); TEST_FLUSH(); - testHopResolutionOverflow(data); TEST_FLUSH(); - testRouteResolutionOverflow(data); TEST_FLUSH(); - testInsertRoute(data); TEST_FLUSH(); - testErrorDirective(data); TEST_FLUSH(); - testSelectError(data); TEST_FLUSH(); - testSelectNone(data); TEST_FLUSH(); - testSelectOne(data); TEST_FLUSH(); - testResend1(data); TEST_FLUSH(); - testResend2(data); TEST_FLUSH(); - testNoResend(data); TEST_FLUSH(); - testSelectOnResend(data); TEST_FLUSH(); - testNoSelectOnResend(data); TEST_FLUSH(); - testCanConsumeError(data); TEST_FLUSH(); - testCantConsumeError(data); TEST_FLUSH(); - testNestedPolicies(data); TEST_FLUSH(); - testRemoveReply(data); TEST_FLUSH(); - testSetReply(data); TEST_FLUSH(); - testResendSetAndReuseReply(data); TEST_FLUSH(); - testResendSetAndRemoveReply(data); TEST_FLUSH(); - testHopIgnoresReply(data); TEST_FLUSH(); - testHopBlueprintIgnoresReply(data); TEST_FLUSH(); - testAcceptEmptyRoute(data); TEST_FLUSH(); - testAbortOnlyActiveNodes(data); TEST_FLUSH(); - testUnknownPolicy(data); TEST_FLUSH(); - testSelectException(data); TEST_FLUSH(); - testMergeException(data); TEST_FLUSH(); - - requireThatIgnoreFlagPersistsThroughHopLookup(data); TEST_FLUSH(); - requireThatIgnoreFlagPersistsThroughRouteLookup(data); TEST_FLUSH(); - requireThatIgnoreFlagPersistsThroughPolicySelect(data); TEST_FLUSH(); - requireThatIgnoreFlagIsSerializedWithMessage(data); TEST_FLUSH(); - requireThatIgnoreFlagDoesNotInterfere(data); TEST_FLUSH(); - requireThatEmptySelectionCanBeIgnored(data); TEST_FLUSH(); - requireThatSelectErrorCanBeIgnored(data); TEST_FLUSH(); - requireThatSelectExceptionCanBeIgnored(data); TEST_FLUSH(); - requireThatSelectAndThrowCanBeIgnored(data); TEST_FLUSH(); - requireThatEmptyMergeCanBeIgnored(data); TEST_FLUSH(); - requireThatMergeErrorCanBeIgnored(data); TEST_FLUSH(); - requireThatMergeExceptionCanBeIgnored(data); TEST_FLUSH(); - requireThatMergeAndThrowCanBeIgnored(data); TEST_FLUSH(); - requireThatAllocServiceCanBeIgnored(data); TEST_FLUSH(); - requireThatDepthLimitCanBeIgnored(data); TEST_FLUSH(); - - // This needs to be last because it changes timeouts: - testTimeout(data); TEST_FLUSH(); - - TEST_DONE(); -} - //////////////////////////////////////////////////////////////////////////////// // // Tests // //////////////////////////////////////////////////////////////////////////////// -void -Test::testNoRoutingTable(TestData &data) +TEST_F(RoutingTest, test_no_routing_table) { + auto& data = *_data; Result res = data._srcSession->send(createMessage("msg"), "foo"); EXPECT_FALSE(res.isAccepted()); - EXPECT_EQUAL((uint32_t)ErrorCode::ILLEGAL_ROUTE, res.getError().getCode()); + EXPECT_EQ((uint32_t)ErrorCode::ILLEGAL_ROUTE, res.getError().getCode()); Message::UP msg = res.getMessage(); EXPECT_TRUE(msg); } -void -Test::testUnknownRoute(TestData &data) +TEST_F(RoutingTest, test_unknown_route) { + auto& data = *_data; data._srcServer.mb.setupRouting(RoutingSpec().addTable(RoutingTableSpec(SimpleProtocol::NAME) .addHop(HopSpec("foo", "bar")))); Result res = data._srcSession->send(createMessage("msg"), "baz"); EXPECT_FALSE(res.isAccepted()); - EXPECT_EQUAL((uint32_t)ErrorCode::ILLEGAL_ROUTE, res.getError().getCode()); + EXPECT_EQ((uint32_t)ErrorCode::ILLEGAL_ROUTE, res.getError().getCode()); Message::UP msg = res.getMessage(); EXPECT_TRUE(msg); } -void -Test::testNoRoute(TestData &data) +TEST_F(RoutingTest, test_no_route) { + auto& data = *_data; EXPECT_TRUE(data._srcSession->send(createMessage("msg"), Route()).isAccepted()); Reply::UP reply = data._srcHandler.getReply(RECEPTOR_TIMEOUT); ASSERT_TRUE(reply); - EXPECT_EQUAL(1u, reply->getNumErrors()); - EXPECT_EQUAL((uint32_t)ErrorCode::ILLEGAL_ROUTE, reply->getError(0).getCode()); + EXPECT_EQ(1u, reply->getNumErrors()); + EXPECT_EQ((uint32_t)ErrorCode::ILLEGAL_ROUTE, reply->getError(0).getCode()); } -void -Test::testRecognizeHopName(TestData &data) +TEST_F(RoutingTest, test_recognize_hop_name) { + auto& data = *_data; data._srcServer.mb.setupRouting(RoutingSpec().addTable(RoutingTableSpec(SimpleProtocol::NAME) .addHop(HopSpec("dst", "dst/session")))); EXPECT_TRUE(data._srcSession->send(createMessage("msg"), Route::parse("dst")).isAccepted()); @@ -777,9 +712,9 @@ Test::testRecognizeHopName(TestData &data) EXPECT_FALSE(reply->hasErrors()); } -void -Test::testRecognizeRouteDirective(TestData &data) +TEST_F(RoutingTest, test_recognize_route_directive) { + auto& data = *_data; data._srcServer.mb.setupRouting(RoutingSpec().addTable(RoutingTableSpec(SimpleProtocol::NAME) .addRoute(RouteSpec("dst").addHop("dst/session")) .addHop(HopSpec("dir", "route:dst")))); @@ -792,9 +727,9 @@ Test::testRecognizeRouteDirective(TestData &data) EXPECT_FALSE(reply->hasErrors()); } -void -Test::testRecognizeRouteName(TestData &data) +TEST_F(RoutingTest, test_recognize_route_name) { + auto& data = *_data; data._srcServer.mb.setupRouting(RoutingSpec().addTable(RoutingTableSpec(SimpleProtocol::NAME) .addRoute(RouteSpec("dst").addHop("dst/session")))); EXPECT_TRUE(data._srcSession->send(createMessage("msg"), Route::parse("dst")).isAccepted()); @@ -806,64 +741,64 @@ Test::testRecognizeRouteName(TestData &data) EXPECT_FALSE(reply->hasErrors()); } -void -Test::testHopResolutionOverflow(TestData &data) +TEST_F(RoutingTest, test_hop_resolution_overflow) { + auto& data = *_data; data._srcServer.mb.setupRouting(RoutingSpec().addTable(RoutingTableSpec(SimpleProtocol::NAME) .addHop(HopSpec("foo", "bar")) .addHop(HopSpec("bar", "foo")))); EXPECT_TRUE(data._srcSession->send(createMessage("msg"), Route::parse("foo")).isAccepted()); Reply::UP reply = data._srcHandler.getReply(RECEPTOR_TIMEOUT); ASSERT_TRUE(reply); - EXPECT_EQUAL(1u, reply->getNumErrors()); - EXPECT_EQUAL((uint32_t)ErrorCode::ILLEGAL_ROUTE, reply->getError(0).getCode()); + EXPECT_EQ(1u, reply->getNumErrors()); + EXPECT_EQ((uint32_t)ErrorCode::ILLEGAL_ROUTE, reply->getError(0).getCode()); } -void -Test::testRouteResolutionOverflow(TestData &data) +TEST_F(RoutingTest, test_route_resolution_overflow) { + auto& data = *_data; data._srcServer.mb.setupRouting(RoutingSpec().addTable(RoutingTableSpec(SimpleProtocol::NAME) .addRoute(RouteSpec("foo").addHop("route:foo")))); EXPECT_TRUE(data._srcSession->send(createMessage("msg"), "foo").isAccepted()); Reply::UP reply = data._srcHandler.getReply(RECEPTOR_TIMEOUT); ASSERT_TRUE(reply); - EXPECT_EQUAL(1u, reply->getNumErrors()); - EXPECT_EQUAL((uint32_t)ErrorCode::ILLEGAL_ROUTE, reply->getError(0).getCode()); + EXPECT_EQ(1u, reply->getNumErrors()); + EXPECT_EQ((uint32_t)ErrorCode::ILLEGAL_ROUTE, reply->getError(0).getCode()); } -void -Test::testInsertRoute(TestData &data) +TEST_F(RoutingTest, test_insert_route) { + auto& data = *_data; data._srcServer.mb.setupRouting(RoutingSpec().addTable(RoutingTableSpec(SimpleProtocol::NAME) .addRoute(RouteSpec("foo").addHop("dst/session").addHop("bar")))); EXPECT_TRUE(data._srcSession->send(createMessage("msg"), Route::parse("route:foo baz")).isAccepted()); Message::UP msg = data._dstHandler.getMessage(RECEPTOR_TIMEOUT); ASSERT_TRUE(msg); - EXPECT_EQUAL(2u, msg->getRoute().getNumHops()); - EXPECT_EQUAL("bar", msg->getRoute().getHop(0).toString()); - EXPECT_EQUAL("baz", msg->getRoute().getHop(1).toString()); + EXPECT_EQ(2u, msg->getRoute().getNumHops()); + EXPECT_EQ("bar", msg->getRoute().getHop(0).toString()); + EXPECT_EQ("baz", msg->getRoute().getHop(1).toString()); data._dstSession->acknowledge(std::move(msg)); Reply::UP reply = data._srcHandler.getReply(RECEPTOR_TIMEOUT); ASSERT_TRUE(reply); EXPECT_FALSE(reply->hasErrors()); } -void -Test::testErrorDirective(TestData &data) +TEST_F(RoutingTest, test_error_directive) { + auto& data = *_data; Route route = Route::parse("foo/bar/baz"); route.getHop(0).setDirective(1, std::make_shared<ErrorDirective>("err")); EXPECT_TRUE(data._srcSession->send(createMessage("msg"), route).isAccepted()); Reply::UP reply = data._srcHandler.getReply(RECEPTOR_TIMEOUT); ASSERT_TRUE(reply); - EXPECT_EQUAL(1u, reply->getNumErrors()); - EXPECT_EQUAL((uint32_t)ErrorCode::ILLEGAL_ROUTE, reply->getError(0).getCode()); - EXPECT_EQUAL("err", reply->getError(0).getMessage()); + EXPECT_EQ(1u, reply->getNumErrors()); + EXPECT_EQ((uint32_t)ErrorCode::ILLEGAL_ROUTE, reply->getError(0).getCode()); + EXPECT_EQ("err", reply->getError(0).getMessage()); } -void -Test::testSelectError(TestData &data) +TEST_F(RoutingTest, test_select_error) { + auto& data = *_data; auto protocol = std::make_shared<SimpleProtocol>(); protocol->addPolicyFactory("Custom", std::make_shared<CustomPolicyFactory>()); data._srcServer.mb.putProtocol(protocol); @@ -872,26 +807,26 @@ Test::testSelectError(TestData &data) ASSERT_TRUE(reply); LOG(info, "testSelectError trace=%s", reply->getTrace().toString().c_str()); LOG(info, "testSelectError error=%s", reply->getError(0).toString().c_str()); - EXPECT_EQUAL(1u, reply->getNumErrors()); - EXPECT_EQUAL((uint32_t)ErrorCode::ILLEGAL_ROUTE, reply->getError(0).getCode()); + EXPECT_EQ(1u, reply->getNumErrors()); + EXPECT_EQ((uint32_t)ErrorCode::ILLEGAL_ROUTE, reply->getError(0).getCode()); } -void -Test::testSelectNone(TestData &data) +TEST_F(RoutingTest, test_select_none) { + auto& data = *_data; auto protocol = std::make_shared<SimpleProtocol>(); protocol->addPolicyFactory("Custom", std::make_shared<CustomPolicyFactory>()); data._srcServer.mb.putProtocol(protocol); EXPECT_TRUE(data._srcSession->send(createMessage("msg"), Route::parse("[Custom]")).isAccepted()); Reply::UP reply = data._srcHandler.getReply(RECEPTOR_TIMEOUT); ASSERT_TRUE(reply); - EXPECT_EQUAL(1u, reply->getNumErrors()); - EXPECT_EQUAL((uint32_t)ErrorCode::NO_SERVICES_FOR_ROUTE, reply->getError(0).getCode()); + EXPECT_EQ(1u, reply->getNumErrors()); + EXPECT_EQ((uint32_t)ErrorCode::NO_SERVICES_FOR_ROUTE, reply->getError(0).getCode()); } -void -Test::testSelectOne(TestData &data) +TEST_F(RoutingTest, test_select_one) { + auto& data = *_data; auto protocol = std::make_shared<SimpleProtocol>(); protocol->addPolicyFactory("Custom", std::make_shared<CustomPolicyFactory>()); data._srcServer.mb.putProtocol(protocol); @@ -904,9 +839,9 @@ Test::testSelectOne(TestData &data) EXPECT_FALSE(reply->hasErrors()); } -void -Test::testResend1(TestData &data) +TEST_F(RoutingTest, test_resend_1) { + auto& data = *_data; data._retryPolicy->setEnabled(true); EXPECT_TRUE(data._srcSession->send(createMessage("msg"), Route::parse("dst/session")).isAccepted()); Message::UP msg = data._dstHandler.getMessage(RECEPTOR_TIMEOUT); @@ -935,9 +870,9 @@ Test::testResend1(TestData &data) reply->getTrace())); } -void -Test::testResend2(TestData &data) +TEST_F(RoutingTest, test_resend_2) { + auto& data = *_data; auto protocol = std::make_shared<SimpleProtocol>(); protocol->addPolicyFactory("Custom", std::make_shared<CustomPolicyFactory>()); data._srcServer.mb.putProtocol(protocol); @@ -1003,9 +938,9 @@ Test::testResend2(TestData &data) reply->getTrace())); } -void -Test::testNoResend(TestData &data) +TEST_F(RoutingTest, test_no_resend) { + auto& data = *_data; data._retryPolicy->setEnabled(false); EXPECT_TRUE(data._srcSession->send(createMessage("msg"), Route::parse("dst/session")).isAccepted()); Message::UP msg = data._dstHandler.getMessage(RECEPTOR_TIMEOUT); @@ -1016,13 +951,13 @@ Test::testNoResend(TestData &data) data._dstSession->reply(std::move(reply)); reply = data._srcHandler.getReply(RECEPTOR_TIMEOUT); ASSERT_TRUE(reply); - EXPECT_EQUAL(1u, reply->getNumErrors()); - EXPECT_EQUAL((uint32_t)ErrorCode::APP_TRANSIENT_ERROR, reply->getError(0).getCode()); + EXPECT_EQ(1u, reply->getNumErrors()); + EXPECT_EQ((uint32_t)ErrorCode::APP_TRANSIENT_ERROR, reply->getError(0).getCode()); } -void -Test::testSelectOnResend(TestData &data) +TEST_F(RoutingTest, test_select_on_resend) { + auto& data = *_data; auto protocol = std::make_shared<SimpleProtocol>(); protocol->addPolicyFactory("Custom", std::make_shared<CustomPolicyFactory>()); data._srcServer.mb.putProtocol(protocol); @@ -1051,9 +986,9 @@ Test::testSelectOnResend(TestData &data) reply->getTrace())); } -void -Test::testNoSelectOnResend(TestData &data) +TEST_F(RoutingTest, test_no_select_on_resend) { + auto& data = *_data; auto protocol = std::make_shared<SimpleProtocol>(); protocol->addPolicyFactory("Custom", std::make_shared<CustomPolicyFactory>(false)); data._srcServer.mb.putProtocol(protocol); @@ -1082,9 +1017,9 @@ Test::testNoSelectOnResend(TestData &data) reply->getTrace())); } -void -Test::testCanConsumeError(TestData &data) +TEST_F(RoutingTest, test_can_consume_error) { + auto& data = *_data; auto protocol = std::make_shared<SimpleProtocol>(); protocol->addPolicyFactory("Custom", std::make_shared<CustomPolicyFactory>(true, ErrorCode::NO_ADDRESS_FOR_SERVICE)); data._srcServer.mb.putProtocol(protocol); @@ -1095,8 +1030,8 @@ Test::testCanConsumeError(TestData &data) data._dstSession->acknowledge(std::move(msg)); Reply::UP reply = data._srcHandler.getReply(RECEPTOR_TIMEOUT); ASSERT_TRUE(reply); - EXPECT_EQUAL(1u, reply->getNumErrors()); - EXPECT_EQUAL((uint32_t)ErrorCode::NO_ADDRESS_FOR_SERVICE, reply->getError(0).getCode()); + EXPECT_EQ(1u, reply->getNumErrors()); + EXPECT_EQ((uint32_t)ErrorCode::NO_ADDRESS_FOR_SERVICE, reply->getError(0).getCode()); EXPECT_TRUE(testTrace(StringList() .add("Selecting { 'dst/session', 'dst/unknown' }.") .add("[NO_ADDRESS_FOR_SERVICE @ localhost]") @@ -1105,9 +1040,9 @@ Test::testCanConsumeError(TestData &data) reply->getTrace())); } -void -Test::testCantConsumeError(TestData &data) +TEST_F(RoutingTest, test_cant_consume_error) { + auto& data = *_data; auto protocol = std::make_shared<SimpleProtocol>(); protocol->addPolicyFactory("Custom", std::make_shared<CustomPolicyFactory>()); data._srcServer.mb.putProtocol(protocol); @@ -1116,8 +1051,8 @@ Test::testCantConsumeError(TestData &data) Reply::UP reply = data._srcHandler.getReply(RECEPTOR_TIMEOUT); ASSERT_TRUE(reply); printf("%s", reply->getTrace().toString().c_str()); - EXPECT_EQUAL(1u, reply->getNumErrors()); - EXPECT_EQUAL((uint32_t)ErrorCode::NO_ADDRESS_FOR_SERVICE, reply->getError(0).getCode()); + EXPECT_EQ(1u, reply->getNumErrors()); + EXPECT_EQ((uint32_t)ErrorCode::NO_ADDRESS_FOR_SERVICE, reply->getError(0).getCode()); EXPECT_TRUE(testTrace(StringList() .add("Selecting { 'dst/unknown' }.") .add("[NO_ADDRESS_FOR_SERVICE @ localhost]") @@ -1125,9 +1060,9 @@ Test::testCantConsumeError(TestData &data) reply->getTrace())); } -void -Test::testNestedPolicies(TestData &data) +TEST_F(RoutingTest, test_nested_policies) { + auto& data = *_data; auto protocol = std::make_shared<SimpleProtocol>(); protocol->addPolicyFactory("Custom", std::make_shared<CustomPolicyFactory>(true, ErrorCode::NO_ADDRESS_FOR_SERVICE)); data._srcServer.mb.putProtocol(protocol); @@ -1138,13 +1073,13 @@ Test::testNestedPolicies(TestData &data) data._dstSession->acknowledge(std::move(msg)); Reply::UP reply = data._srcHandler.getReply(RECEPTOR_TIMEOUT); ASSERT_TRUE(reply); - EXPECT_EQUAL(1u, reply->getNumErrors()); - EXPECT_EQUAL((uint32_t)ErrorCode::NO_ADDRESS_FOR_SERVICE, reply->getError(0).getCode()); + EXPECT_EQ(1u, reply->getNumErrors()); + EXPECT_EQ((uint32_t)ErrorCode::NO_ADDRESS_FOR_SERVICE, reply->getError(0).getCode()); } -void -Test::testRemoveReply(TestData &data) +TEST_F(RoutingTest, test_remove_reply) { + auto& data = *_data; auto protocol = std::make_shared<SimpleProtocol>(); protocol->addPolicyFactory("Custom", std::make_shared<RemoveReplyPolicyFactory>(true, UIntList().add(ErrorCode::NO_ADDRESS_FOR_SERVICE), 0)); data._srcServer.mb.putProtocol(protocol); @@ -1164,9 +1099,9 @@ Test::testRemoveReply(TestData &data) reply->getTrace())); } -void -Test::testSetReply(TestData &data) +TEST_F(RoutingTest, test_set_reply) { + auto& data = *_data; auto protocol = std::make_shared<SimpleProtocol>(); protocol->addPolicyFactory("Select", std::make_shared<CustomPolicyFactory>(true, ErrorCode::APP_FATAL_ERROR)); protocol->addPolicyFactory("SetReply", std::make_shared<SetReplyPolicyFactory>(true, UIntList().add(ErrorCode::APP_FATAL_ERROR))); @@ -1178,14 +1113,14 @@ Test::testSetReply(TestData &data) data._dstSession->acknowledge(std::move(msg)); Reply::UP reply = data._srcHandler.getReply(RECEPTOR_TIMEOUT); ASSERT_TRUE(reply); - EXPECT_EQUAL(1u, reply->getNumErrors()); - EXPECT_EQUAL((uint32_t)ErrorCode::APP_FATAL_ERROR, reply->getError(0).getCode()); - EXPECT_EQUAL("foo", reply->getError(0).getMessage()); + EXPECT_EQ(1u, reply->getNumErrors()); + EXPECT_EQ((uint32_t)ErrorCode::APP_FATAL_ERROR, reply->getError(0).getCode()); + EXPECT_EQ("foo", reply->getError(0).getMessage()); } -void -Test::testResendSetAndReuseReply(TestData &data) +TEST_F(RoutingTest, test_resend_set_and_reuse_reply) { + auto& data = *_data; auto protocol = std::make_shared<SimpleProtocol>(); protocol->addPolicyFactory("ReuseReply", std::make_shared<ReuseReplyPolicyFactory>(false, UIntList().add(ErrorCode::APP_FATAL_ERROR))); protocol->addPolicyFactory("SetReply", std::make_shared<SetReplyPolicyFactory>(false, UIntList().add(ErrorCode::APP_FATAL_ERROR))); @@ -1206,9 +1141,9 @@ Test::testResendSetAndReuseReply(TestData &data) EXPECT_FALSE(reply->hasErrors()); } -void -Test::testResendSetAndRemoveReply(TestData &data) +TEST_F(RoutingTest, test_resend_set_and_remove_reply) { + auto& data = *_data; auto protocol = std::make_shared<SimpleProtocol>(); protocol->addPolicyFactory("RemoveReply", std::make_shared<RemoveReplyPolicyFactory>(false, UIntList().add(ErrorCode::APP_TRANSIENT_ERROR), 0)); protocol->addPolicyFactory("SetReply", std::make_shared<SetReplyPolicyFactory>(false, UIntList().add(ErrorCode::APP_TRANSIENT_ERROR).add(ErrorCode::APP_FATAL_ERROR))); @@ -1220,9 +1155,9 @@ Test::testResendSetAndRemoveReply(TestData &data) data._dstSession->acknowledge(std::move(msg)); Reply::UP reply = data._srcHandler.getReply(RECEPTOR_TIMEOUT); ASSERT_TRUE(reply); - EXPECT_EQUAL(1u, reply->getNumErrors()); - EXPECT_EQUAL((uint32_t)ErrorCode::APP_FATAL_ERROR, reply->getError(0).getCode()); - EXPECT_EQUAL("foo", reply->getError(0).getMessage()); + EXPECT_EQ(1u, reply->getNumErrors()); + EXPECT_EQ((uint32_t)ErrorCode::APP_FATAL_ERROR, reply->getError(0).getCode()); + EXPECT_EQ("foo", reply->getError(0).getMessage()); EXPECT_TRUE(testTrace(StringList() .add("Resolving '[SetReply:foo]'.") .add("Resolving 'dst/session'.") @@ -1232,9 +1167,9 @@ Test::testResendSetAndRemoveReply(TestData &data) reply->getTrace())); } -void -Test::testHopIgnoresReply(TestData &data) +TEST_F(RoutingTest, test_hop_ignores_reply) { + auto& data = *_data; EXPECT_TRUE(data._srcSession->send(createMessage("msg"), Route::parse("?dst/session")).isAccepted()); Message::UP msg = data._dstHandler.getMessage(RECEPTOR_TIMEOUT); ASSERT_TRUE(msg); @@ -1250,9 +1185,9 @@ Test::testHopIgnoresReply(TestData &data) reply->getTrace())); } -void -Test::testHopBlueprintIgnoresReply(TestData &data) +TEST_F(RoutingTest, test_hop_blueprint_ignores_reply) { + auto& data = *_data; data._srcServer.mb.setupRouting(RoutingSpec().addTable(RoutingTableSpec(SimpleProtocol::NAME) .addHop(std::move(HopSpec("foo", "dst/session").setIgnoreResult(true))))); EXPECT_TRUE(data._srcSession->send(createMessage("msg"), Route::parse("foo")).isAccepted()); @@ -1270,22 +1205,22 @@ Test::testHopBlueprintIgnoresReply(TestData &data) reply->getTrace())); } -void -Test::testAcceptEmptyRoute(TestData &data) +TEST_F(RoutingTest, test_accept_empty_route) { + auto& data = *_data; EXPECT_TRUE(data._srcSession->send(createMessage("msg"), Route::parse("dst/session")).isAccepted()); Message::UP msg = data._dstHandler.getMessage(RECEPTOR_TIMEOUT); ASSERT_TRUE(msg); const Route &route = msg->getRoute(); - EXPECT_EQUAL(0u, route.getNumHops()); + EXPECT_EQ(0u, route.getNumHops()); data._dstSession->acknowledge(std::move(msg)); Reply::UP reply = data._srcHandler.getReply(RECEPTOR_TIMEOUT); ASSERT_TRUE(reply); } -void -Test::testAbortOnlyActiveNodes(TestData &data) +TEST_F(RoutingTest, test_abort_only_active_nodes) { + auto& data = *_data; auto protocol = std::make_shared<SimpleProtocol>(); protocol->addPolicyFactory("Custom", std::make_shared<CustomPolicyFactory>(false)); protocol->addPolicyFactory("SetReply", std::make_shared<SetReplyPolicyFactory>(false, @@ -1297,39 +1232,39 @@ Test::testAbortOnlyActiveNodes(TestData &data) EXPECT_TRUE(data._srcSession->send(createMessage("msg"), Route::parse("[Custom:[SetReply:foo],?bar,dst/session]")).isAccepted()); Reply::UP reply = data._srcHandler.getReply(RECEPTOR_TIMEOUT); ASSERT_TRUE(reply); - EXPECT_EQUAL(2u, reply->getNumErrors()); - EXPECT_EQUAL((uint32_t)ErrorCode::APP_FATAL_ERROR, reply->getError(0).getCode()); - EXPECT_EQUAL((uint32_t)ErrorCode::SEND_ABORTED, reply->getError(1).getCode()); + EXPECT_EQ(2u, reply->getNumErrors()); + EXPECT_EQ((uint32_t)ErrorCode::APP_FATAL_ERROR, reply->getError(0).getCode()); + EXPECT_EQ((uint32_t)ErrorCode::SEND_ABORTED, reply->getError(1).getCode()); } -void -Test::testUnknownPolicy(TestData &data) +TEST_F(RoutingTest, test_unknown_policy) { + auto& data = *_data; EXPECT_TRUE(data._srcSession->send(createMessage("msg"), Route::parse("[Unknown]")).isAccepted()); Reply::UP reply = data._srcHandler.getReply(RECEPTOR_TIMEOUT); ASSERT_TRUE(reply); - EXPECT_EQUAL(1u, reply->getNumErrors()); - EXPECT_EQUAL((uint32_t)ErrorCode::UNKNOWN_POLICY, reply->getError(0).getCode()); + EXPECT_EQ(1u, reply->getNumErrors()); + EXPECT_EQ((uint32_t)ErrorCode::UNKNOWN_POLICY, reply->getError(0).getCode()); } -void -Test::testSelectException(TestData &data) +TEST_F(RoutingTest, test_select_exception) { + auto& data = *_data; auto protocol = std::make_shared<SimpleProtocol>(); protocol->addPolicyFactory("SelectException", std::make_shared<SelectExceptionPolicyFactory>()); data._srcServer.mb.putProtocol(protocol); EXPECT_TRUE(data._srcSession->send(createMessage("msg"), Route::parse("[SelectException]")).isAccepted()); Reply::UP reply = data._srcHandler.getReply(RECEPTOR_TIMEOUT); ASSERT_TRUE(reply); - EXPECT_EQUAL(1u, reply->getNumErrors()); - EXPECT_EQUAL((uint32_t)ErrorCode::POLICY_ERROR, reply->getError(0).getCode()); - EXPECT_EQUAL("Policy 'SelectException' threw an exception; {test exception}", - reply->getError(0).getMessage()); + EXPECT_EQ(1u, reply->getNumErrors()); + EXPECT_EQ((uint32_t)ErrorCode::POLICY_ERROR, reply->getError(0).getCode()); + EXPECT_EQ("Policy 'SelectException' threw an exception; {test exception}", + reply->getError(0).getMessage()); } -void -Test::testMergeException(TestData &data) +TEST_F(RoutingTest, test_merge_exception) { + auto& data = *_data; auto protocol = std::make_shared<SimpleProtocol>(); protocol->addPolicyFactory("MergeException", std::make_shared<MergeExceptionPolicyFactory>()); data._srcServer.mb.putProtocol(protocol); @@ -1340,157 +1275,161 @@ Test::testMergeException(TestData &data) data._dstSession->acknowledge(std::move(msg)); Reply::UP reply = data._srcHandler.getReply(RECEPTOR_TIMEOUT); ASSERT_TRUE(reply); - EXPECT_EQUAL(1u, reply->getNumErrors()); - EXPECT_EQUAL((uint32_t)ErrorCode::POLICY_ERROR, + EXPECT_EQ(1u, reply->getNumErrors()); + EXPECT_EQ((uint32_t)ErrorCode::POLICY_ERROR, reply->getError(0).getCode()); - EXPECT_EQUAL("Policy 'MergeException' threw an exception; {test exception}", - reply->getError(0).getMessage()); + EXPECT_EQ("Policy 'MergeException' threw an exception; {test exception}", + reply->getError(0).getMessage()); } -void -Test::requireThatIgnoreFlagPersistsThroughHopLookup(TestData &data) +TEST_F(RoutingTest, require_that_ignore_flag_persists_through_hop_lookup) { + auto& data = *_data; setupRouting(data, RoutingTableSpec(SimpleProtocol::NAME).addHop(HopSpec("foo", "dst/unknown"))); ASSERT_TRUE(testSend(data, "?foo")); ASSERT_TRUE(testTrace(data, StringList().add("Ignoring errors in reply."))); } -void -Test::requireThatIgnoreFlagPersistsThroughRouteLookup(TestData &data) +TEST_F(RoutingTest, require_that_ignore_flag_persists_through_route_lookup) { + auto& data = *_data; setupRouting(data, RoutingTableSpec(SimpleProtocol::NAME).addRoute(RouteSpec("foo").addHop("dst/unknown"))); ASSERT_TRUE(testSend(data, "?foo")); ASSERT_TRUE(testTrace(data, StringList().add("Ignoring errors in reply."))); } -void -Test::requireThatIgnoreFlagPersistsThroughPolicySelect(TestData &data) +TEST_F(RoutingTest, require_that_ignore_flag_persists_through_policy_select) { + auto& data = *_data; setupPolicy(data, "Custom", MyPolicyFactory::newSelectAndMerge("dst/unknown")); ASSERT_TRUE(testSend(data, "?[Custom]")); ASSERT_TRUE(testTrace(data, StringList().add("Ignoring errors in reply."))); } -void -Test::requireThatIgnoreFlagIsSerializedWithMessage(TestData &data) +TEST_F(RoutingTest, require_that_ignore_flag_is_serialized_with_message) { + auto& data = *_data; ASSERT_TRUE(testSend(data, "dst/session foo ?bar")); Message::UP msg = data._dstHandler.getMessage(RECEPTOR_TIMEOUT); ASSERT_TRUE(msg); Route route = msg->getRoute(); - EXPECT_EQUAL(2u, route.getNumHops()); + EXPECT_EQ(2u, route.getNumHops()); Hop hop = route.getHop(0); - EXPECT_EQUAL("foo", hop.toString()); + EXPECT_EQ("foo", hop.toString()); EXPECT_FALSE(hop.getIgnoreResult()); hop = route.getHop(1); - EXPECT_EQUAL("?bar", hop.toString()); + EXPECT_EQ("?bar", hop.toString()); EXPECT_TRUE(hop.getIgnoreResult()); data._dstSession->acknowledge(std::move(msg)); ASSERT_TRUE(testTrace(data, StringList().add("-Ignoring errors in reply."))); } -void -Test::requireThatIgnoreFlagDoesNotInterfere(TestData &data) +TEST_F(RoutingTest, require_that_ignore_flag_does_not_interfere) { + auto& data = *_data; setupPolicy(data, "Custom", MyPolicyFactory::newSelectAndMerge("dst/session")); ASSERT_TRUE(testSend(data, "?[Custom]")); ASSERT_TRUE(testTrace(data, StringList().add("-Ignoring errors in reply."))); ASSERT_TRUE(testAcknowledge(data)); } - -void -Test::requireThatEmptySelectionCanBeIgnored(TestData &data) + +TEST_F(RoutingTest, require_that_empty_selection_can_be_ignored) { + auto& data = *_data; setupPolicy(data, "Custom", MyPolicyFactory::newEmptySelection()); ASSERT_TRUE(testSend(data, "?[Custom]")); ASSERT_TRUE(testTrace(data, StringList().add("Ignoring errors in reply."))); } -void -Test::requireThatSelectErrorCanBeIgnored(TestData &data) +TEST_F(RoutingTest, require_that_select_error_can_be_ignored) { + auto& data = *_data; setupPolicy(data, "Custom", MyPolicyFactory::newSelectError(ErrorCode::APP_FATAL_ERROR)); ASSERT_TRUE(testSend(data, "?[Custom]")); ASSERT_TRUE(testTrace(data, StringList().add("Ignoring errors in reply."))); } -void -Test::requireThatSelectExceptionCanBeIgnored(TestData &data) +TEST_F(RoutingTest, require_that_select_exception_can_be_ignored) { + auto& data = *_data; setupPolicy(data, "Custom", MyPolicyFactory::newSelectException()); ASSERT_TRUE(testSend(data, "?[Custom]")); ASSERT_TRUE(testTrace(data, StringList().add("Ignoring errors in reply."))); } -void -Test::requireThatSelectAndThrowCanBeIgnored(TestData &data) +TEST_F(RoutingTest, require_that_select_and_throw_can_be_ignored) { + auto& data = *_data; setupPolicy(data, "Custom", MyPolicyFactory::newSelectAndThrow("dst/session")); ASSERT_TRUE(testSend(data, "?[Custom]")); ASSERT_TRUE(testTrace(data, StringList().add("Ignoring errors in reply."))); } -void -Test::requireThatEmptyMergeCanBeIgnored(TestData &data) +TEST_F(RoutingTest, require_that_empty_merge_can_be_ignored) { + auto& data = *_data; setupPolicy(data, "Custom", MyPolicyFactory::newEmptyMerge("dst/session")); ASSERT_TRUE(testSend(data, "?[Custom]")); ASSERT_TRUE(testAcknowledge(data)); ASSERT_TRUE(testTrace(data, StringList().add("Ignoring errors in reply."))); } -void -Test::requireThatMergeErrorCanBeIgnored(TestData &data) +TEST_F(RoutingTest, require_that_merge_error_can_be_ignored) { + auto& data = *_data; setupPolicy(data, "Custom", MyPolicyFactory::newMergeError("dst/session", ErrorCode::APP_FATAL_ERROR)); ASSERT_TRUE(testSend(data, "?[Custom]")); ASSERT_TRUE(testAcknowledge(data)); ASSERT_TRUE(testTrace(data, StringList().add("Ignoring errors in reply."))); } -void -Test::requireThatMergeExceptionCanBeIgnored(TestData &data) +TEST_F(RoutingTest, require_that_merge_exception_can_be_ignored) { + auto& data = *_data; setupPolicy(data, "Custom", MyPolicyFactory::newMergeException("dst/session")); ASSERT_TRUE(testSend(data, "?[Custom]")); ASSERT_TRUE(testAcknowledge(data)); ASSERT_TRUE(testTrace(data, StringList().add("Ignoring errors in reply."))); } - -void -Test::requireThatMergeAndThrowCanBeIgnored(TestData &data) + +TEST_F(RoutingTest, require_that_merge_and_throw_can_be_ignored) { + auto& data = *_data; setupPolicy(data, "Custom", MyPolicyFactory::newMergeAndThrow("dst/session")); ASSERT_TRUE(testSend(data, "?[Custom]")); ASSERT_TRUE(testAcknowledge(data)); ASSERT_TRUE(testTrace(data, StringList().add("Ignoring errors in reply."))); } -void -Test::requireThatAllocServiceCanBeIgnored(TestData &data) +TEST_F(RoutingTest, require_that_alloc_service_can_be_ignored) { + auto& data = *_data; ASSERT_TRUE(testSend(data, "?dst/unknown")); ASSERT_TRUE(testTrace(data, StringList().add("Ignoring errors in reply."))); } -void -Test::requireThatDepthLimitCanBeIgnored(TestData &data) +TEST_F(RoutingTest, require_that_depth_limit_can_be_ignored) { + auto& data = *_data; setupPolicy(data, "Custom", MyPolicyFactory::newSelectAndMerge("[Custom]")); ASSERT_TRUE(testSend(data, "?[Custom]", 0)); ASSERT_TRUE(testTrace(data, StringList())); } -void -Test::testTimeout(TestData &data) +TEST_F(RoutingTest, test_timeout) { + auto& data = *_data; + // Force teardown after this test case since timeouts have been changed. + _force_teardown = true; data._retryPolicy->setEnabled(true); data._retryPolicy->setBaseDelay(0.01); data._srcSession->setTimeout(500ms); EXPECT_TRUE(data._srcSession->send(createMessage("msg"), Route::parse("dst/unknown")).isAccepted()); Reply::UP reply = data._srcHandler.getReply(RECEPTOR_TIMEOUT); ASSERT_TRUE(reply); - EXPECT_EQUAL(2u, reply->getNumErrors()); - EXPECT_EQUAL((uint32_t)ErrorCode::NO_ADDRESS_FOR_SERVICE, reply->getError(0).getCode()); - EXPECT_EQUAL((uint32_t)ErrorCode::TIMEOUT, reply->getError(1).getCode()); + EXPECT_EQ(2u, reply->getNumErrors()); + EXPECT_EQ((uint32_t)ErrorCode::NO_ADDRESS_FOR_SERVICE, reply->getError(0).getCode()); + EXPECT_EQ((uint32_t)ErrorCode::TIMEOUT, reply->getError(1).getCode()); } + +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/messagebus/src/tests/routingcontext/CMakeLists.txt b/messagebus/src/tests/routingcontext/CMakeLists.txt index 96bf6dbe35e..932d0020a3e 100644 --- a/messagebus/src/tests/routingcontext/CMakeLists.txt +++ b/messagebus/src/tests/routingcontext/CMakeLists.txt @@ -5,5 +5,6 @@ vespa_add_executable(messagebus_routingcontext_test_app TEST DEPENDS messagebus_messagebus-test messagebus + GTest::gtest ) vespa_add_test(NAME messagebus_routingcontext_test_app COMMAND messagebus_routingcontext_test_app) diff --git a/messagebus/src/tests/routingcontext/routingcontext.cpp b/messagebus/src/tests/routingcontext/routingcontext.cpp index d81bada2bc6..c8bbc53a0df 100644 --- a/messagebus/src/tests/routingcontext/routingcontext.cpp +++ b/messagebus/src/tests/routingcontext/routingcontext.cpp @@ -9,7 +9,7 @@ #include <vespa/messagebus/testlib/simpleprotocol.h> #include <vespa/messagebus/testlib/slobrok.h> #include <vespa/messagebus/testlib/testserver.h> -#include <vespa/vespalib/testkit/testapp.h> +#include <vespa/vespalib/gtest/gtest.h> #include <vespa/vespalib/util/stringfmt.h> @@ -17,6 +17,8 @@ using namespace mbus; using vespalib::make_string; +namespace { + static const duration TIMEOUT = 120s; class StringList : public std::vector<string> { @@ -192,20 +194,6 @@ public: bool start(); }; -class Test : public vespalib::TestApp { -private: - static Message::UP createMessage(const string &msg); - -public: - int Main() override; - void testSingleDirective(TestData &data); - void testMoreDirectives(TestData &data); - void testRecipientsRemain(TestData &data); - void testConstRoute(TestData &data); -}; - -TEST_APPHOOK(Test); - TestData::TestData() : _slobrok(), _retryPolicy(std::make_shared<RetryTransientErrorsPolicy>()), @@ -240,28 +228,33 @@ TestData::start() return true; } -Message::UP -Test::createMessage(const string &msg) -{ - auto ret = std::make_unique<SimpleMessage>(msg); - ret->getTrace().setLevel(9); - return ret; } -int -Test::Main() -{ - TEST_INIT("routingcontext_test"); +class RoutingContextTest : public testing::Test { +protected: + static std::shared_ptr<TestData> _data; + RoutingContextTest(); + ~RoutingContextTest() override; + static void SetUpTestSuite(); + static void TearDownTestSuite(); +}; - TestData data; - ASSERT_TRUE(data.start()); +std::shared_ptr<TestData> RoutingContextTest::_data; - testSingleDirective(data); TEST_FLUSH(); - testMoreDirectives(data); TEST_FLUSH(); - testRecipientsRemain(data); TEST_FLUSH(); - testConstRoute(data); TEST_FLUSH(); +RoutingContextTest::RoutingContextTest() = default; +RoutingContextTest::~RoutingContextTest() = default; - TEST_DONE(); +void +RoutingContextTest::SetUpTestSuite() +{ + _data = std::make_shared<TestData>(); + ASSERT_TRUE(_data->start()); +} + +void +RoutingContextTest::TearDownTestSuite() +{ + _data.reset(); } //////////////////////////////////////////////////////////////////////////////// @@ -270,9 +263,9 @@ Test::Main() // //////////////////////////////////////////////////////////////////////////////// -void -Test::testSingleDirective(TestData &data) +TEST_F(RoutingContextTest, test_single_directive) { + auto& data = *_data; IProtocol::SP protocol(new SimpleProtocol()); auto &simple = dynamic_cast<SimpleProtocol&>(*protocol); simple.addPolicyFactory("Custom", SimpleProtocol::IPolicyFactory::SP(new CustomPolicyFactory( @@ -295,9 +288,9 @@ Test::testSingleDirective(TestData &data) } } -void -Test::testMoreDirectives(TestData &data) +TEST_F(RoutingContextTest, test_more_directives) { + auto& data = *_data; IProtocol::SP protocol(new SimpleProtocol()); auto &simple = dynamic_cast<SimpleProtocol&>(*protocol); simple.addPolicyFactory("Custom", SimpleProtocol::IPolicyFactory::SP(new CustomPolicyFactory( @@ -322,9 +315,9 @@ Test::testMoreDirectives(TestData &data) } } -void -Test::testRecipientsRemain(TestData &data) +TEST_F(RoutingContextTest, test_recipients_remain) { + auto& data = *_data; auto protocol = std::make_shared<SimpleProtocol>(); auto &simple = dynamic_cast<SimpleProtocol&>(*protocol); simple.addPolicyFactory("First", std::make_shared<CustomPolicyFactory>(true, @@ -347,9 +340,9 @@ Test::testRecipientsRemain(TestData &data) } } -void -Test::testConstRoute(TestData &data) +TEST_F(RoutingContextTest, test_const_route) { + auto& data = *_data; auto protocol = std::make_shared<SimpleProtocol>(); auto &simple = dynamic_cast<SimpleProtocol&>(*protocol); simple.addPolicyFactory("DocumentRouteSelector", @@ -371,3 +364,4 @@ Test::testConstRoute(TestData &data) } } +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/messagebus/src/tests/routingspec/CMakeLists.txt b/messagebus/src/tests/routingspec/CMakeLists.txt index 7a2ba9d8fe4..c7115c16fd9 100644 --- a/messagebus/src/tests/routingspec/CMakeLists.txt +++ b/messagebus/src/tests/routingspec/CMakeLists.txt @@ -5,5 +5,6 @@ vespa_add_executable(messagebus_routingspec_test_app TEST DEPENDS messagebus_messagebus-test messagebus + GTest::gtest ) vespa_add_test(NAME messagebus_routingspec_test_app COMMAND messagebus_routingspec_test_app) diff --git a/messagebus/src/tests/routingspec/routingspec.cpp b/messagebus/src/tests/routingspec/routingspec.cpp index 40f3f293de3..eec19982b8e 100644 --- a/messagebus/src/tests/routingspec/routingspec.cpp +++ b/messagebus/src/tests/routingspec/routingspec.cpp @@ -3,9 +3,9 @@ #include <vespa/messagebus/configagent.h> #include <vespa/messagebus/iconfighandler.h> #include <vespa/messagebus/routing/routingspec.h> -#include <vespa/vespalib/testkit/testapp.h> #include <vespa/messagebus/config-messagebus.h> #include <vespa/config/helper/configgetter.hpp> +#include <vespa/vespalib/gtest/gtest.h> using namespace mbus; @@ -31,32 +31,19 @@ public: } }; -class Test : public vespalib::TestApp { -private: - bool testRouting(const RoutingSpec &spec); - bool testConfig(const RoutingSpec &spec); - -public: - void testConstructors(); - void testConfigGeneration(); - int Main() override; +class RoutingSpecTest : public testing::Test { +protected: + RoutingSpecTest(); + ~RoutingSpecTest() override; + static void test_routing_helper(const RoutingSpec &spec, bool& success); + static bool testRouting(const RoutingSpec &spec); + static bool testConfig(const RoutingSpec &spec); }; -TEST_APPHOOK(Test); - -int -Test::Main() -{ - TEST_INIT("routingspec_test"); - - testConstructors(); TEST_FLUSH(); - testConfigGeneration(); TEST_FLUSH(); - - TEST_DONE(); -} +RoutingSpecTest::RoutingSpecTest() = default; +RoutingSpecTest::~RoutingSpecTest() = default; -void -Test::testConstructors() +TEST_F(RoutingSpecTest, test_constructors) { { RoutingSpec spec; @@ -126,57 +113,64 @@ Test::testConstructors() } } +void +RoutingSpecTest::test_routing_helper(const RoutingSpec &spec, bool& success) +{ + ASSERT_TRUE(spec.getNumTables() == 2); + ASSERT_TRUE(spec.getTable(0).getProtocol() == "foo"); + ASSERT_TRUE(spec.getTable(0).getNumHops() == 2); + ASSERT_TRUE(spec.getTable(0).getHop(0).getName() == "foo-h1"); + ASSERT_TRUE(spec.getTable(0).getHop(0).getSelector() == "foo-h1-sel"); + ASSERT_TRUE(spec.getTable(0).getHop(0).getNumRecipients() == 2); + ASSERT_TRUE(spec.getTable(0).getHop(0).getRecipient(0) == "foo-h1-r1"); + ASSERT_TRUE(spec.getTable(0).getHop(0).getRecipient(1) == "foo-h1-r2"); + ASSERT_TRUE(spec.getTable(0).getHop(1).getName() == "foo-h2"); + ASSERT_TRUE(spec.getTable(0).getHop(1).getSelector() == "foo-h2-sel"); + ASSERT_TRUE(spec.getTable(0).getHop(1).getNumRecipients() == 2); + ASSERT_TRUE(spec.getTable(0).getHop(1).getRecipient(0) == "foo-h2-r1"); + ASSERT_TRUE(spec.getTable(0).getHop(1).getRecipient(1) == "foo-h2-r2"); + ASSERT_TRUE(spec.getTable(0).getNumRoutes() == 2); + ASSERT_TRUE(spec.getTable(0).getRoute(0).getName() == "foo-r1"); + ASSERT_TRUE(spec.getTable(0).getRoute(0).getNumHops() == 2); + ASSERT_TRUE(spec.getTable(0).getRoute(0).getHop(0) == "foo-h1"); + ASSERT_TRUE(spec.getTable(0).getRoute(0).getHop(1) == "foo-h2"); + ASSERT_TRUE(spec.getTable(0).getRoute(1).getName() == "foo-r2"); + ASSERT_TRUE(spec.getTable(0).getRoute(1).getNumHops() == 2); + ASSERT_TRUE(spec.getTable(0).getRoute(1).getHop(0) == "foo-h2"); + ASSERT_TRUE(spec.getTable(0).getRoute(1).getHop(1) == "foo-h1"); + ASSERT_TRUE(spec.getTable(1).getProtocol() == "bar"); + ASSERT_TRUE(spec.getTable(1).getNumHops() == 2); + ASSERT_TRUE(spec.getTable(1).getHop(0).getName() == "bar-h1"); + ASSERT_TRUE(spec.getTable(1).getHop(0).getSelector() == "bar-h1-sel"); + ASSERT_TRUE(spec.getTable(1).getHop(0).getNumRecipients() == 2); + ASSERT_TRUE(spec.getTable(1).getHop(0).getRecipient(0) == "bar-h1-r1"); + ASSERT_TRUE(spec.getTable(1).getHop(0).getRecipient(1) == "bar-h1-r2"); + ASSERT_TRUE(spec.getTable(1).getHop(1).getName() == "bar-h2"); + ASSERT_TRUE(spec.getTable(1).getHop(1).getSelector() == "bar-h2-sel"); + ASSERT_TRUE(spec.getTable(1).getHop(1).getNumRecipients() == 2); + ASSERT_TRUE(spec.getTable(1).getHop(1).getRecipient(0) == "bar-h2-r1"); + ASSERT_TRUE(spec.getTable(1).getHop(1).getRecipient(1) == "bar-h2-r2"); + ASSERT_TRUE(spec.getTable(1).getNumRoutes() == 2); + ASSERT_TRUE(spec.getTable(1).getRoute(0).getName() == "bar-r1"); + ASSERT_TRUE(spec.getTable(1).getRoute(0).getNumHops() == 2); + ASSERT_TRUE(spec.getTable(1).getRoute(0).getHop(0) == "bar-h1"); + ASSERT_TRUE(spec.getTable(1).getRoute(0).getHop(1) == "bar-h2"); + ASSERT_TRUE(spec.getTable(1).getRoute(1).getName() == "bar-r2"); + ASSERT_TRUE(spec.getTable(1).getRoute(1).getNumHops() == 2); + ASSERT_TRUE(spec.getTable(1).getRoute(1).getHop(0) == "bar-h2"); + ASSERT_TRUE(spec.getTable(1).getRoute(1).getHop(1) == "bar-h1"); + success = true; +} + bool -Test::testRouting(const RoutingSpec &spec) +RoutingSpecTest::testRouting(const RoutingSpec &spec) { - if (!ASSERT_TRUE(spec.getNumTables() == 2)) { return false; } - if (!EXPECT_TRUE(spec.getTable(0).getProtocol() == "foo")) { return false; } - if (!ASSERT_TRUE(spec.getTable(0).getNumHops() == 2)) { return false; } - if (!EXPECT_TRUE(spec.getTable(0).getHop(0).getName() == "foo-h1")) { return false; } - if (!EXPECT_TRUE(spec.getTable(0).getHop(0).getSelector() == "foo-h1-sel")) { return false; } - if (!ASSERT_TRUE(spec.getTable(0).getHop(0).getNumRecipients() == 2)) { return false; } - if (!EXPECT_TRUE(spec.getTable(0).getHop(0).getRecipient(0) == "foo-h1-r1")) { return false; } - if (!EXPECT_TRUE(spec.getTable(0).getHop(0).getRecipient(1) == "foo-h1-r2")) { return false; } - if (!EXPECT_TRUE(spec.getTable(0).getHop(1).getName() == "foo-h2")) { return false; } - if (!EXPECT_TRUE(spec.getTable(0).getHop(1).getSelector() == "foo-h2-sel")) { return false; } - if (!ASSERT_TRUE(spec.getTable(0).getHop(1).getNumRecipients() == 2)) { return false; } - if (!EXPECT_TRUE(spec.getTable(0).getHop(1).getRecipient(0) == "foo-h2-r1")) { return false; } - if (!EXPECT_TRUE(spec.getTable(0).getHop(1).getRecipient(1) == "foo-h2-r2")) { return false; } - if (!ASSERT_TRUE(spec.getTable(0).getNumRoutes() == 2)) { return false; } - if (!EXPECT_TRUE(spec.getTable(0).getRoute(0).getName() == "foo-r1")) { return false; } - if (!ASSERT_TRUE(spec.getTable(0).getRoute(0).getNumHops() == 2)) { return false; } - if (!EXPECT_TRUE(spec.getTable(0).getRoute(0).getHop(0) == "foo-h1")) { return false; } - if (!EXPECT_TRUE(spec.getTable(0).getRoute(0).getHop(1) == "foo-h2")) { return false; } - if (!EXPECT_TRUE(spec.getTable(0).getRoute(1).getName() == "foo-r2")) { return false; } - if (!ASSERT_TRUE(spec.getTable(0).getRoute(1).getNumHops() == 2)) { return false; } - if (!EXPECT_TRUE(spec.getTable(0).getRoute(1).getHop(0) == "foo-h2")) { return false; } - if (!EXPECT_TRUE(spec.getTable(0).getRoute(1).getHop(1) == "foo-h1")) { return false; } - if (!EXPECT_TRUE(spec.getTable(1).getProtocol() == "bar")) { return false; } - if (!ASSERT_TRUE(spec.getTable(1).getNumHops() == 2)) { return false; } - if (!EXPECT_TRUE(spec.getTable(1).getHop(0).getName() == "bar-h1")) { return false; } - if (!EXPECT_TRUE(spec.getTable(1).getHop(0).getSelector() == "bar-h1-sel")) { return false; } - if (!ASSERT_TRUE(spec.getTable(1).getHop(0).getNumRecipients() == 2)) { return false; } - if (!EXPECT_TRUE(spec.getTable(1).getHop(0).getRecipient(0) == "bar-h1-r1")) { return false; } - if (!EXPECT_TRUE(spec.getTable(1).getHop(0).getRecipient(1) == "bar-h1-r2")) { return false; } - if (!EXPECT_TRUE(spec.getTable(1).getHop(1).getName() == "bar-h2")) { return false; } - if (!EXPECT_TRUE(spec.getTable(1).getHop(1).getSelector() == "bar-h2-sel")) { return false; } - if (!ASSERT_TRUE(spec.getTable(1).getHop(1).getNumRecipients() == 2)) { return false; } - if (!EXPECT_TRUE(spec.getTable(1).getHop(1).getRecipient(0) == "bar-h2-r1")) { return false; } - if (!EXPECT_TRUE(spec.getTable(1).getHop(1).getRecipient(1) == "bar-h2-r2")) { return false; } - if (!ASSERT_TRUE(spec.getTable(1).getNumRoutes() == 2)) { return false; } - if (!EXPECT_TRUE(spec.getTable(1).getRoute(0).getName() == "bar-r1")) { return false; } - if (!ASSERT_TRUE(spec.getTable(1).getRoute(0).getNumHops() == 2)) { return false; } - if (!EXPECT_TRUE(spec.getTable(1).getRoute(0).getHop(0) == "bar-h1")) { return false; } - if (!EXPECT_TRUE(spec.getTable(1).getRoute(0).getHop(1) == "bar-h2")) { return false; } - if (!EXPECT_TRUE(spec.getTable(1).getRoute(1).getName() == "bar-r2")) { return false; } - if (!ASSERT_TRUE(spec.getTable(1).getRoute(1).getNumHops() == 2)) { return false; } - if (!EXPECT_TRUE(spec.getTable(1).getRoute(1).getHop(0) == "bar-h2")) { return false; } - if (!EXPECT_TRUE(spec.getTable(1).getRoute(1).getHop(1) == "bar-h1")) { return false; } - return true; + bool success = false; + test_routing_helper(spec, success); + return success; } -void -Test::testConfigGeneration() +TEST_F(RoutingSpecTest, test_config_generation) { EXPECT_TRUE(testConfig(RoutingSpec())); EXPECT_TRUE(testConfig(RoutingSpec().addTable(RoutingTableSpec("mytable1")))); @@ -200,50 +194,52 @@ Test::testConfigGeneration() .addRoute(RouteSpec("myroute12").addHop("myhop1").addHop("myhop2"))) .addTable(RoutingTableSpec("mytable2")))); - EXPECT_EQUAL("routingtable[2]\n" - "routingtable[0].protocol \"mytable1\"\n" - "routingtable[1].protocol \"mytable2\"\n" - "routingtable[1].hop[3]\n" - "routingtable[1].hop[0].name \"myhop1\"\n" - "routingtable[1].hop[0].selector \"myselector1\"\n" - "routingtable[1].hop[1].name \"myhop2\"\n" - "routingtable[1].hop[1].selector \"myselector2\"\n" - "routingtable[1].hop[1].ignoreresult true\n" - "routingtable[1].hop[2].name \"myhop1\"\n" - "routingtable[1].hop[2].selector \"myselector3\"\n" - "routingtable[1].hop[2].recipient[2]\n" - "routingtable[1].hop[2].recipient[0] \"myrecipient1\"\n" - "routingtable[1].hop[2].recipient[1] \"myrecipient2\"\n" - "routingtable[1].route[1]\n" - "routingtable[1].route[0].name \"myroute1\"\n" - "routingtable[1].route[0].hop[1]\n" - "routingtable[1].route[0].hop[0] \"myhop1\"\n", - RoutingSpec() - .addTable(RoutingTableSpec("mytable1")) - .addTable(RoutingTableSpec("mytable2") - .addHop(HopSpec("myhop1", "myselector1")) - .addHop(std::move(HopSpec("myhop2", "myselector2").setIgnoreResult(true))) - .addHop(HopSpec("myhop1", "myselector3") - .addRecipient("myrecipient1") - .addRecipient("myrecipient2")) - .addRoute(RouteSpec("myroute1").addHop("myhop1"))).toString()); + EXPECT_EQ("routingtable[2]\n" + "routingtable[0].protocol \"mytable1\"\n" + "routingtable[1].protocol \"mytable2\"\n" + "routingtable[1].hop[3]\n" + "routingtable[1].hop[0].name \"myhop1\"\n" + "routingtable[1].hop[0].selector \"myselector1\"\n" + "routingtable[1].hop[1].name \"myhop2\"\n" + "routingtable[1].hop[1].selector \"myselector2\"\n" + "routingtable[1].hop[1].ignoreresult true\n" + "routingtable[1].hop[2].name \"myhop1\"\n" + "routingtable[1].hop[2].selector \"myselector3\"\n" + "routingtable[1].hop[2].recipient[2]\n" + "routingtable[1].hop[2].recipient[0] \"myrecipient1\"\n" + "routingtable[1].hop[2].recipient[1] \"myrecipient2\"\n" + "routingtable[1].route[1]\n" + "routingtable[1].route[0].name \"myroute1\"\n" + "routingtable[1].route[0].hop[1]\n" + "routingtable[1].route[0].hop[0] \"myhop1\"\n", + RoutingSpec() + .addTable(RoutingTableSpec("mytable1")) + .addTable(RoutingTableSpec("mytable2") + .addHop(HopSpec("myhop1", "myselector1")) + .addHop(std::move(HopSpec("myhop2", "myselector2").setIgnoreResult(true))) + .addHop(HopSpec("myhop1", "myselector3") + .addRecipient("myrecipient1") + .addRecipient("myrecipient2")) + .addRoute(RouteSpec("myroute1").addHop("myhop1"))).toString()); } bool -Test::testConfig(const RoutingSpec &spec) +RoutingSpecTest::testConfig(const RoutingSpec &spec) { - if (!EXPECT_TRUE(spec == spec)) { + bool failure = false; + EXPECT_TRUE(spec == spec) << (failure = true, ""); + if (failure) { return false; } - if (!EXPECT_TRUE(spec == RoutingSpec(spec))) { + EXPECT_TRUE(spec == RoutingSpec(spec)) << (failure = true, ""); + if (failure) { return false; } ConfigStore store; ConfigAgent agent(store); agent.configure(ConfigGetter<MessagebusConfig>().getConfig("", RawSpec(spec.toString()))); - if (!EXPECT_TRUE(store.getRoutingSpec() == spec)) { - return false; - } - return true; + EXPECT_TRUE(store.getRoutingSpec() == spec) << (failure = true, ""); + return !failure; } +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/messagebus/src/tests/sourcesession/CMakeLists.txt b/messagebus/src/tests/sourcesession/CMakeLists.txt index 067b281939a..6f8b14667ee 100644 --- a/messagebus/src/tests/sourcesession/CMakeLists.txt +++ b/messagebus/src/tests/sourcesession/CMakeLists.txt @@ -5,5 +5,6 @@ vespa_add_executable(messagebus_sourcesession_test_app TEST DEPENDS messagebus_messagebus-test messagebus + GTest::gtest ) vespa_add_test(NAME messagebus_sourcesession_test_app COMMAND messagebus_sourcesession_test_app) diff --git a/messagebus/src/tests/sourcesession/sourcesession.cpp b/messagebus/src/tests/sourcesession/sourcesession.cpp index 5d1a8e8ad24..d642209d816 100644 --- a/messagebus/src/tests/sourcesession/sourcesession.cpp +++ b/messagebus/src/tests/sourcesession/sourcesession.cpp @@ -15,7 +15,7 @@ #include <vespa/messagebus/testlib/simpleprotocol.h> #include <vespa/messagebus/testlib/slobrok.h> #include <vespa/messagebus/testlib/testserver.h> -#include <vespa/vespalib/testkit/testapp.h> +#include <vespa/vespalib/gtest/gtest.h> #include <thread> using namespace mbus; @@ -64,21 +64,7 @@ bool waitQueueSize(RoutableQueue &queue, uint32_t size) { return false; } -class Test : public vespalib::TestApp -{ -public: - void testSequencing(); - void testResendError(); - void testResendConnDown(); - void testIllegalRoute(); - void testNoServices(); - void testBlockingClose(); - void testNonBlockingClose(); - int Main() override; -}; - -void -Test::testSequencing() +TEST(SourceSessionTest, test_sequencing) { Slobrok slobrok; TestServer src(Identity(""), getRouting(), slobrok); @@ -111,8 +97,7 @@ Test::testSequencing() ASSERT_TRUE(waitQueueSize(dstQ, 0)); } -void -Test::testResendError() +TEST(SourceSessionTest, test_resend_error) { Slobrok slobrok; auto retryPolicy = std::make_shared<RetryTransientErrorsPolicy>(); @@ -172,8 +157,7 @@ Test::testResendError() } } -void -Test::testResendConnDown() +TEST(SourceSessionTest, test_resend_conn_down) { Slobrok slobrok; auto retryPolicy = std::make_shared<RetryTransientErrorsPolicy>(); @@ -218,8 +202,7 @@ Test::testResendConnDown() fprintf(stderr, "\nTRACE DUMP:\n%s\n\n", trace.c_str()); } -void -Test::testIllegalRoute() +TEST(SourceSessionTest, test_illegal_route) { Slobrok slobrok; TestServer src(MessageBusParams() @@ -243,16 +226,15 @@ Test::testIllegalRoute() Routable::UP routable = srcQ.dequeue(); ASSERT_TRUE(routable->isReply()); Reply::UP r(dynamic_cast<Reply*>(routable.release())); - EXPECT_EQUAL(1u, r->getNumErrors()); - EXPECT_EQUAL((uint32_t)ErrorCode::NO_ADDRESS_FOR_SERVICE, r->getError(0).getCode()); + EXPECT_EQ(1u, r->getNumErrors()); + EXPECT_EQ((uint32_t)ErrorCode::NO_ADDRESS_FOR_SERVICE, r->getError(0).getCode()); string trace = r->getTrace().toString(); fprintf(stderr, "\nTRACE DUMP:\n%s\n\n", trace.c_str()); } } } -void -Test::testNoServices() +TEST(SourceSessionTest, test_no_services) { Slobrok slobrok; TestServer src(MessageBusParams() @@ -283,8 +265,7 @@ Test::testNoServices() } } -void -Test::testBlockingClose() +TEST(SourceSessionTest, test_blocking_close) { Slobrok slobrok; TestServer src(Identity(""), getRouting(), slobrok); @@ -304,8 +285,7 @@ Test::testBlockingClose() EXPECT_TRUE(routable->isReply()); } -void -Test::testNonBlockingClose() +TEST(SourceSessionTest, test_non_blocking_close) { Slobrok slobrok; TestServer src(Identity(""), getRouting(), slobrok); @@ -317,18 +297,4 @@ Test::testNonBlockingClose() ss->close(); // this should not hang } -int -Test::Main() -{ - TEST_INIT("sourcesession_test"); - testSequencing(); TEST_FLUSH(); - testResendError(); TEST_FLUSH(); - testResendConnDown(); TEST_FLUSH(); - testIllegalRoute(); TEST_FLUSH(); - testNoServices(); TEST_FLUSH(); - testBlockingClose(); TEST_FLUSH(); - testNonBlockingClose(); TEST_FLUSH(); - TEST_DONE(); -} - -TEST_APPHOOK(Test); +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/messagebus/src/tests/throttling/CMakeLists.txt b/messagebus/src/tests/throttling/CMakeLists.txt index 95df4c6d873..3ad0662d13b 100644 --- a/messagebus/src/tests/throttling/CMakeLists.txt +++ b/messagebus/src/tests/throttling/CMakeLists.txt @@ -5,5 +5,6 @@ vespa_add_executable(messagebus_throttling_test_app TEST DEPENDS messagebus_messagebus-test messagebus + GTest::gtest ) vespa_add_test(NAME messagebus_throttling_test_app COMMAND messagebus_throttling_test_app) diff --git a/messagebus/src/tests/throttling/throttling.cpp b/messagebus/src/tests/throttling/throttling.cpp index 73f4366e5d7..5b372334dcf 100644 --- a/messagebus/src/tests/throttling/throttling.cpp +++ b/messagebus/src/tests/throttling/throttling.cpp @@ -1,6 +1,5 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/vespalib/testkit/testapp.h> #include <vespa/messagebus/destinationsession.h> #include <vespa/messagebus/dynamicthrottlepolicy.h> #include <vespa/messagebus/routablequeue.h> @@ -12,6 +11,7 @@ #include <vespa/messagebus/testlib/simplemessage.h> #include <vespa/messagebus/testlib/simplereply.h> #include <vespa/messagebus/testlib/testserver.h> +#include <vespa/vespalib/gtest/gtest.h> #include <thread> using namespace mbus; @@ -65,46 +65,31 @@ bool waitPending(SourceSession& session, uint32_t size) return false; } -//////////////////////////////////////////////////////////////////////////////// -// -// Setup -// -//////////////////////////////////////////////////////////////////////////////// - -class Test : public vespalib::TestApp { -private: - uint32_t getWindowSize(DynamicThrottlePolicy &policy, DynamicTimer &timer, uint32_t maxPending); - -protected: - void testMaxPendingCount(); - void testMaxPendingSize(); - void testMinOne(); - void testDynamicWindowSize(); - void testIdleTimePeriod(); - void testMinWindowSize(); - void testMaxWindowSize(); - -public: - int Main() override; -}; - -int -Test::Main() +uint32_t +getWindowSize(DynamicThrottlePolicy &policy, DynamicTimer &timer, uint32_t maxPending) { - TEST_INIT("throttling_test"); + SimpleMessage msg("foo"); + SimpleReply reply("bar"); + reply.setContext(mbus::Context(uint64_t(1))); // To offset pending size bump in static policy - testMaxPendingCount(); TEST_FLUSH(); - testMaxPendingSize(); TEST_FLUSH(); - testMinOne(); TEST_FLUSH(); - testDynamicWindowSize(); TEST_FLUSH(); - testIdleTimePeriod(); TEST_FLUSH(); - testMinWindowSize(); TEST_FLUSH(); - testMaxWindowSize(); TEST_FLUSH(); + for (uint32_t i = 0; i < 999; ++i) { + uint32_t numPending = 0; + while (policy.canSend(msg, numPending)) { + policy.processMessage(msg); + ++numPending; + } - TEST_DONE(); -} + uint64_t tripTime = (numPending < maxPending) ? 1000 : 1000 + (numPending - maxPending) * 1000; + timer._millis += tripTime; -TEST_APPHOOK(Test); + for( ; numPending > 0 ; --numPending) { + policy.processReply(reply); + } + } + uint32_t ret = policy.getMaxPendingCount(); + fprintf(stderr, "getWindowSize() = %u\n", ret); + return ret; +} //////////////////////////////////////////////////////////////////////////////// // @@ -112,8 +97,7 @@ TEST_APPHOOK(Test); // //////////////////////////////////////////////////////////////////////////////// -void -Test::testMaxPendingCount() +TEST(ThrottlingTest, test_max_pending_count) { Slobrok slobrok; TestServer src(Identity(""), getRouting(), slobrok); @@ -165,8 +149,7 @@ Test::testMaxPendingCount() ASSERT_TRUE(waitQueueSize(dstQ, 0)); } -void -Test::testMaxPendingSize() +TEST(ThrottlingTest, test_max_pending_size) { ASSERT_TRUE(SimpleMessage("1234567890").getApproxSize() == 10); ASSERT_TRUE(SimpleMessage("123456").getApproxSize() == 6); @@ -191,8 +174,8 @@ Test::testMaxPendingSize() DestinationSession::UP ds = dst.mb.createDestinationSession("session", true, dstQ); ASSERT_TRUE(src.waitSlobrok("dst/session")); - EXPECT_EQUAL(1u, SimpleMessage("1").getApproxSize()); - EXPECT_EQUAL(2u, SimpleMessage("12").getApproxSize()); + EXPECT_EQ(1u, SimpleMessage("1").getApproxSize()); + EXPECT_EQ(2u, SimpleMessage("12").getApproxSize()); EXPECT_TRUE(ss->send(Message::UP(new SimpleMessage("1")), "dst").isAccepted()); EXPECT_TRUE(waitQueueSize(dstQ, 1)); @@ -214,8 +197,7 @@ Test::testMaxPendingSize() ASSERT_TRUE(waitQueueSize(srcQ, 3)); } -void -Test::testMinOne() +TEST(ThrottlingTest, test_min_one) { ASSERT_TRUE(SimpleMessage("1234567890").getApproxSize() == 10); ASSERT_TRUE(SimpleMessage("").getApproxSize() == 0); @@ -248,8 +230,7 @@ Test::testMinOne() } -void -Test::testDynamicWindowSize() +TEST(ThrottlingTest, test_dynamic_window_size) { auto ptr = std::make_unique<DynamicTimer>(); auto* timer = ptr.get(); @@ -274,8 +255,7 @@ Test::testDynamicWindowSize() ASSERT_TRUE(windowSize >= 90 && windowSize <= 115); } -void -Test::testIdleTimePeriod() +TEST(ThrottlingTest, test_idle_time_period) { auto ptr = std::make_unique<DynamicTimer>(); auto* timer = ptr.get(); @@ -295,15 +275,14 @@ Test::testIdleTimePeriod() timer->_millis += 60001; ASSERT_TRUE(policy.canSend(msg, 50)); - EXPECT_EQUAL(55u, policy.getMaxPendingCount()); + EXPECT_EQ(55u, policy.getMaxPendingCount()); timer->_millis += 60001; ASSERT_TRUE(policy.canSend(msg, 0)); - EXPECT_EQUAL(5u, policy.getMaxPendingCount()); + EXPECT_EQ(5u, policy.getMaxPendingCount()); } -void -Test::testMinWindowSize() +TEST(ThrottlingTest, test_min_window_size) { auto ptr = std::make_unique<DynamicTimer>(); auto* timer = ptr.get(); @@ -317,8 +296,7 @@ Test::testMinWindowSize() ASSERT_TRUE(windowSize >= 150 && windowSize <= 210); } -void -Test::testMaxWindowSize() +TEST(ThrottlingTest, test_max_window_size) { auto ptr = std::make_unique<DynamicTimer>(); auto* timer = ptr.get(); @@ -337,28 +315,4 @@ Test::testMaxWindowSize() } -uint32_t -Test::getWindowSize(DynamicThrottlePolicy &policy, DynamicTimer &timer, uint32_t maxPending) -{ - SimpleMessage msg("foo"); - SimpleReply reply("bar"); - reply.setContext(mbus::Context(uint64_t(1))); // To offset pending size bump in static policy - - for (uint32_t i = 0; i < 999; ++i) { - uint32_t numPending = 0; - while (policy.canSend(msg, numPending)) { - policy.processMessage(msg); - ++numPending; - } - - uint64_t tripTime = (numPending < maxPending) ? 1000 : 1000 + (numPending - maxPending) * 1000; - timer._millis += tripTime; - - for( ; numPending > 0 ; --numPending) { - policy.processReply(reply); - } - } - uint32_t ret = policy.getMaxPendingCount(); - fprintf(stderr, "getWindowSize() = %u\n", ret); - return ret; -} +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/messagebus/src/tests/timeout/CMakeLists.txt b/messagebus/src/tests/timeout/CMakeLists.txt index 2292b6d649f..4aa3458cb14 100644 --- a/messagebus/src/tests/timeout/CMakeLists.txt +++ b/messagebus/src/tests/timeout/CMakeLists.txt @@ -5,5 +5,6 @@ vespa_add_executable(messagebus_timeout_test_app TEST DEPENDS messagebus_messagebus-test messagebus + GTest::gtest ) vespa_add_test(NAME messagebus_timeout_test_app COMMAND messagebus_timeout_test_app) diff --git a/messagebus/src/tests/timeout/timeout.cpp b/messagebus/src/tests/timeout/timeout.cpp index 2ffdab11c40..497af9c5c0e 100644 --- a/messagebus/src/tests/timeout/timeout.cpp +++ b/messagebus/src/tests/timeout/timeout.cpp @@ -1,6 +1,5 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/vespalib/testkit/testapp.h> #include <vespa/messagebus/errorcode.h> #include <vespa/messagebus/emptyreply.h> #include <vespa/messagebus/sourcesession.h> @@ -11,33 +10,13 @@ #include <vespa/messagebus/testlib/simplemessage.h> #include <vespa/messagebus/testlib/slobrok.h> #include <vespa/messagebus/testlib/testserver.h> +#include <vespa/vespalib/gtest/gtest.h> using namespace mbus; using namespace std::chrono_literals; -class Test : public vespalib::TestApp { -public: - int Main() override; - void testZeroTimeout(); - void testMessageExpires(); -}; - -TEST_APPHOOK(Test); - -int -Test::Main() -{ - TEST_INIT("timeout_test"); - - testZeroTimeout(); TEST_FLUSH(); - testMessageExpires(); TEST_FLUSH(); - - TEST_DONE(); -} - -void -Test::testZeroTimeout() +TEST(TimeoutTest, test_zero_timeout) { Slobrok slobrok; TestServer srcServer(Identity("src"), RoutingSpec(), slobrok); @@ -53,12 +32,11 @@ Test::testZeroTimeout() Reply::UP reply = srcHandler.getReply(); ASSERT_TRUE(reply); - EXPECT_EQUAL(1u, reply->getNumErrors()); - EXPECT_EQUAL((uint32_t)ErrorCode::TIMEOUT, reply->getError(0).getCode()); + EXPECT_EQ(1u, reply->getNumErrors()); + EXPECT_EQ((uint32_t)ErrorCode::TIMEOUT, reply->getError(0).getCode()); } -void -Test::testMessageExpires() +TEST(TimeoutTest, test_message_expires) { Slobrok slobrok; TestServer srcServer(Identity("src"), RoutingSpec(), slobrok); @@ -73,11 +51,13 @@ Test::testMessageExpires() Reply::UP reply = srcHandler.getReply(); ASSERT_TRUE(reply); - EXPECT_EQUAL(1u, reply->getNumErrors()); - EXPECT_EQUAL((uint32_t)ErrorCode::TIMEOUT, reply->getError(0).getCode()); + EXPECT_EQ(1u, reply->getNumErrors()); + EXPECT_EQ((uint32_t)ErrorCode::TIMEOUT, reply->getError(0).getCode()); Message::UP msg = dstHandler.getMessage(1s); if (msg) { msg->discard(); } } + +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/metrics/src/main/java/ai/vespa/metrics/set/InfrastructureMetricSet.java b/metrics/src/main/java/ai/vespa/metrics/set/InfrastructureMetricSet.java index 61ab8cea941..38a1b252df9 100644 --- a/metrics/src/main/java/ai/vespa/metrics/set/InfrastructureMetricSet.java +++ b/metrics/src/main/java/ai/vespa/metrics/set/InfrastructureMetricSet.java @@ -68,11 +68,11 @@ public class InfrastructureMetricSet { addMetric(metrics, ConfigServerMetrics.CLUSTER_LOAD_IDEAL_MEMORY.max()); addMetric(metrics, ConfigServerMetrics.CLUSTER_LOAD_IDEAL_DISK.max()); addMetric(metrics, ConfigServerMetrics.NODES_EMPTY_EXCLUSIVE.max()); - addMetric(metrics, ConfigServerMetrics.NODES_EXPIRED_DEPROVISIONED.sum()); - addMetric(metrics, ConfigServerMetrics.NODES_EXPIRED_DIRTY.sum()); - addMetric(metrics, ConfigServerMetrics.NODES_EXPIRED_INACTIVE.sum()); - addMetric(metrics, ConfigServerMetrics.NODES_EXPIRED_PROVISIONED.sum()); - addMetric(metrics, ConfigServerMetrics.NODES_EXPIRED_RESERVED.sum()); + addMetric(metrics, ConfigServerMetrics.NODES_EXPIRED_DEPROVISIONED.count()); + addMetric(metrics, ConfigServerMetrics.NODES_EXPIRED_DIRTY.count()); + addMetric(metrics, ConfigServerMetrics.NODES_EXPIRED_INACTIVE.count()); + addMetric(metrics, ConfigServerMetrics.NODES_EXPIRED_PROVISIONED.count()); + addMetric(metrics, ConfigServerMetrics.NODES_EXPIRED_RESERVED.count()); addMetric(metrics, ConfigServerMetrics.WANT_TO_REBOOT.max()); addMetric(metrics, ConfigServerMetrics.WANT_TO_RESTART.max()); addMetric(metrics, ConfigServerMetrics.WANT_TO_RETIRE.max()); diff --git a/parent/pom.xml b/parent/pom.xml index 780d05241be..cb6e4c1d433 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -317,7 +317,7 @@ --> <groupId>org.openrewrite.maven</groupId> <artifactId>rewrite-maven-plugin</artifactId> - <version>5.23.3</version> + <version>5.24.0</version> <configuration> <activeRecipes> <recipe>org.openrewrite.java.testing.junit5.JUnit5BestPractices</recipe> diff --git a/searchcore/src/tests/proton/attribute/CMakeLists.txt b/searchcore/src/tests/proton/attribute/CMakeLists.txt index 911268bd92a..88b30df608f 100644 --- a/searchcore/src/tests/proton/attribute/CMakeLists.txt +++ b/searchcore/src/tests/proton/attribute/CMakeLists.txt @@ -21,6 +21,7 @@ vespa_add_executable(searchcore_attributeflush_test_app TEST searchcore_attribute searchcore_flushengine searchcore_pcommon + GTest::gtest ) vespa_add_test(NAME searchcore_attributeflush_test_app COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/attributeflush_test.sh DEPENDS searchcore_attributeflush_test_app) diff --git a/searchcore/src/tests/proton/attribute/attributeflush_test.cpp b/searchcore/src/tests/proton/attribute/attributeflush_test.cpp index a621451bf3b..6969032535c 100644 --- a/searchcore/src/tests/proton/attribute/attributeflush_test.cpp +++ b/searchcore/src/tests/proton/attribute/attributeflush_test.cpp @@ -14,7 +14,7 @@ #include <vespa/searchlib/index/dummyfileheadercontext.h> #include <vespa/searchlib/test/directory_handler.h> #include <vespa/searchcommon/attribute/config.h> -#include <vespa/vespalib/testkit/testapp.h> +#include <vespa/vespalib/gtest/gtest.h> #include <vespa/vespalib/util/foreground_thread_executor.h> #include <vespa/vespalib/util/foregroundtaskexecutor.h> #include <vespa/vespalib/util/idestructorcallback.h> @@ -209,46 +209,6 @@ AVConfig getInt32ArrayConfig() return AVConfig(AVBasicType::INT32, AVCollectionType::ARRAY); } -class Test : public vespalib::TestApp -{ -private: - void - requireThatUpdaterAndFlusherCanRunConcurrently(); - - void - requireThatFlushableAttributeReportsMemoryUsage(); - - void - requireThatFlushableAttributeManagesSyncTokenInfo(); - - void - requireThatFlushTargetsCanBeRetrieved(); - - void - requireThatCleanUpIsPerformedAfterFlush(); - - void - requireThatFlushStatsAreUpdated(); - - void - requireThatOnlyOneFlusherCanRunAtTheSameTime(); - - void - requireThatLastFlushTimeIsReported(); - - void - requireThatShrinkWorks(); - - void requireThatFlushedAttributeCanBeLoaded(const HwInfo &hwInfo); - void requireThatFlushedAttributeCanBeLoaded(); - - void requireThatFlushFailurePreventsSyncTokenUpdate(); -public: - int - Main() override; -}; - - const string test_dir = "flush"; struct BaseFixture @@ -325,9 +285,7 @@ struct Fixture : public BaseFixture, public AttributeManagerFixture Fixture::~Fixture() = default; - -void -Test::requireThatUpdaterAndFlusherCanRunConcurrently() +TEST(AttributeFlushTest, require_that_updater_and_flusher_can_run_concurrently) { Fixture f; AttributeManager &am = f._m; @@ -352,14 +310,12 @@ Test::requireThatUpdaterAndFlusherCanRunConcurrently() AttributeFactory::createAttribute(baseFileName, getInt32Config()); EXPECT_TRUE(attr->load()); - EXPECT_EQUAL((uint32_t)snap.syncToken + 1, attr->getNumDocs()); + EXPECT_EQ((uint32_t)snap.syncToken + 1, attr->getNumDocs()); } } } - -void -Test::requireThatFlushableAttributeReportsMemoryUsage() +TEST(AttributeFlushTest, require_that_flushable_attribute_reports_memory_usage) { Fixture f; AttributeManager &am = f._m; @@ -368,16 +324,14 @@ Test::requireThatFlushableAttributeReportsMemoryUsage() av->commit(); IFlushTarget::SP fa = am.getFlushable("a2"); EXPECT_TRUE(av->getStatus().getAllocated() >= 100u * sizeof(int32_t)); - EXPECT_EQUAL(av->getStatus().getUsed(), - fa->getApproxMemoryGain().getBefore()+0lu); + EXPECT_EQ(av->getStatus().getUsed(), + fa->getApproxMemoryGain().getBefore()+0lu); // attributes stay in memory - EXPECT_EQUAL(fa->getApproxMemoryGain().getBefore(), - fa->getApproxMemoryGain().getAfter()); + EXPECT_EQ(fa->getApproxMemoryGain().getBefore(), + fa->getApproxMemoryGain().getAfter()); } - -void -Test::requireThatFlushableAttributeManagesSyncTokenInfo() +TEST(AttributeFlushTest, require_that_flushable_attribute_manages_sync_token_info) { Fixture f; AttributeManager &am = f._m; @@ -386,49 +340,45 @@ Test::requireThatFlushableAttributeManagesSyncTokenInfo() IFlushTarget::SP fa = am.getFlushable("a3"); IndexMetaInfo info("flush/a3"); - EXPECT_EQUAL(0u, fa->getFlushedSerialNum()); + EXPECT_EQ(0u, fa->getFlushedSerialNum()); EXPECT_TRUE(fa->initFlush(0, std::make_shared<search::FlushToken>()).get() == NULL); EXPECT_TRUE(!info.load()); av->commit(CommitParam(10)); // last sync token = 10 - EXPECT_EQUAL(0u, fa->getFlushedSerialNum()); + EXPECT_EQ(0u, fa->getFlushedSerialNum()); EXPECT_TRUE(fa->initFlush(10, std::make_shared<search::FlushToken>()).get() != NULL); fa->initFlush(10, std::make_shared<search::FlushToken>())->run(); - EXPECT_EQUAL(10u, fa->getFlushedSerialNum()); + EXPECT_EQ(10u, fa->getFlushedSerialNum()); EXPECT_TRUE(info.load()); - EXPECT_EQUAL(1u, info.snapshots().size()); + EXPECT_EQ(1u, info.snapshots().size()); EXPECT_TRUE(info.snapshots()[0].valid); - EXPECT_EQUAL(10u, info.snapshots()[0].syncToken); + EXPECT_EQ(10u, info.snapshots()[0].syncToken); av->commit(CommitParam(20)); // last sync token = 20 - EXPECT_EQUAL(10u, fa->getFlushedSerialNum()); + EXPECT_EQ(10u, fa->getFlushedSerialNum()); fa->initFlush(20, std::make_shared<search::FlushToken>())->run(); - EXPECT_EQUAL(20u, fa->getFlushedSerialNum()); + EXPECT_EQ(20u, fa->getFlushedSerialNum()); EXPECT_TRUE(info.load()); - EXPECT_EQUAL(1u, info.snapshots().size()); // snapshot 10 removed + EXPECT_EQ(1u, info.snapshots().size()); // snapshot 10 removed EXPECT_TRUE(info.snapshots()[0].valid); - EXPECT_EQUAL(20u, info.snapshots()[0].syncToken); + EXPECT_EQ(20u, info.snapshots()[0].syncToken); } - -void -Test::requireThatFlushTargetsCanBeRetrieved() +TEST(AttributeFlushTest, require_that_flush_targets_can_be_retrieved) { Fixture f; AttributeManager &am = f._m; f.addAttribute("a4"); f.addAttribute("a5"); std::vector<IFlushTarget::SP> ftl = am.getFlushTargets(); - EXPECT_EQUAL(4u, ftl.size()); - EXPECT_EQUAL(am.getFlushable("a4").get(), ftl[0].get()); - EXPECT_EQUAL(am.getShrinker("a4").get(), ftl[1].get()); - EXPECT_EQUAL(am.getFlushable("a5").get(), ftl[2].get()); - EXPECT_EQUAL(am.getShrinker("a5").get(), ftl[3].get()); + EXPECT_EQ(4u, ftl.size()); + EXPECT_EQ(am.getFlushable("a4").get(), ftl[0].get()); + EXPECT_EQ(am.getShrinker("a4").get(), ftl[1].get()); + EXPECT_EQ(am.getFlushable("a5").get(), ftl[2].get()); + EXPECT_EQ(am.getShrinker("a5").get(), ftl[3].get()); } - -void -Test::requireThatCleanUpIsPerformedAfterFlush() +TEST(AttributeFlushTest, require_that_cleanup_is_performed_after_flush) { Fixture f; AttributeVector::SP av = f.addAttribute("a6"); @@ -454,16 +404,14 @@ Test::requireThatCleanUpIsPerformedAfterFlush() fa.initFlush(30, std::make_shared<search::FlushToken>())->run(); EXPECT_TRUE(info.load()); - EXPECT_EQUAL(1u, info.snapshots().size()); // snapshots 10 & 20 removed + EXPECT_EQ(1u, info.snapshots().size()); // snapshots 10 & 20 removed EXPECT_TRUE(info.snapshots()[0].valid); - EXPECT_EQUAL(30u, info.snapshots()[0].syncToken); + EXPECT_EQ(30u, info.snapshots()[0].syncToken); EXPECT_FALSE(fs::exists(fs::path(snap10))); EXPECT_FALSE(fs::exists(fs::path(snap20))); } - -void -Test::requireThatFlushStatsAreUpdated() +TEST(AttributeFlushTest, require_that_flush_stats_are_updated) { Fixture f; AttributeManager &am = f._m; @@ -473,13 +421,11 @@ Test::requireThatFlushStatsAreUpdated() IFlushTarget::SP ft = am.getFlushable("a7"); ft->initFlush(101, std::make_shared<search::FlushToken>())->run(); FlushStats stats = ft->getLastFlushStats(); - EXPECT_EQUAL("flush/a7/snapshot-101", stats.getPath()); - EXPECT_EQUAL(8u, stats.getPathElementsToLog()); + EXPECT_EQ("flush/a7/snapshot-101", stats.getPath()); + EXPECT_EQ(8u, stats.getPathElementsToLog()); } - -void -Test::requireThatOnlyOneFlusherCanRunAtTheSameTime() +TEST(AttributeFlushTest, require_that_only_one_flusher_can_run_at_the_same_time) { Fixture f; AttributeManager &am = f._m; @@ -504,15 +450,13 @@ Test::requireThatOnlyOneFlusherCanRunAtTheSameTime() ASSERT_TRUE(info.load()); LOG(info, "Found %zu snapshots", info.snapshots().size()); for (size_t i = 0; i < info.snapshots().size(); ++i) { - EXPECT_EQUAL(true, info.snapshots()[i].valid); + EXPECT_EQ(true, info.snapshots()[i].valid); } IndexMetaInfo::Snapshot best = info.getBestSnapshot(); - EXPECT_EQUAL(true, best.valid); + EXPECT_EQ(true, best.valid); } - -void -Test::requireThatLastFlushTimeIsReported() +TEST(AttributeFlushTest, require_that_last_flush_time_is_reported) { using seconds = std::chrono::seconds; BaseFixture f; @@ -521,38 +465,36 @@ Test::requireThatLastFlushTimeIsReported() AttributeManagerFixture amf(f); AttributeManager &am = amf._m; AttributeVector::SP av = amf.addAttribute("a9"); - EXPECT_EQUAL(vespalib::system_time(), am.getFlushable("a9")->getLastFlushTime()); + EXPECT_EQ(vespalib::system_time(), am.getFlushable("a9")->getLastFlushTime()); } { // no snapshot flushed yet AttributeManagerFixture amf(f); AttributeManager &am = amf._m; AttributeVector::SP av = amf.addAttribute("a9"); IFlushTarget::SP ft = am.getFlushable("a9"); - EXPECT_EQUAL(vespalib::system_time(), ft->getLastFlushTime()); + EXPECT_EQ(vespalib::system_time(), ft->getLastFlushTime()); ft->initFlush(200, std::make_shared<search::FlushToken>())->run(); EXPECT_TRUE(FastOS_File::Stat("flush/a9/snapshot-200", &stat)); - EXPECT_EQUAL(stat._modifiedTime, ft->getLastFlushTime()); + EXPECT_EQ(stat._modifiedTime, ft->getLastFlushTime()); } { // snapshot flushed AttributeManagerFixture amf(f); AttributeManager &am = amf._m; amf.addAttribute("a9"); IFlushTarget::SP ft = am.getFlushable("a9"); - EXPECT_EQUAL(stat._modifiedTime, ft->getLastFlushTime()); + EXPECT_EQ(stat._modifiedTime, ft->getLastFlushTime()); { // updated flush time after nothing to flush std::this_thread::sleep_for(1100ms); std::chrono::seconds now = duration_cast<seconds>(vespalib::system_clock::now().time_since_epoch()); Executor::Task::UP task = ft->initFlush(200, std::make_shared<search::FlushToken>()); EXPECT_FALSE(task); - EXPECT_LESS(stat._modifiedTime, ft->getLastFlushTime()); - EXPECT_APPROX(now.count(), duration_cast<seconds>(ft->getLastFlushTime().time_since_epoch()).count(), 3); + EXPECT_LT(stat._modifiedTime, ft->getLastFlushTime()); + EXPECT_NEAR(now.count(), duration_cast<seconds>(ft->getLastFlushTime().time_since_epoch()).count(), 3); } } } - -void -Test::requireThatShrinkWorks() +TEST(AttributeFlushTest, require_that_shrink_works) { Fixture f; AttributeManager &am = f._m; @@ -562,32 +504,32 @@ Test::requireThatShrinkWorks() av->addDocs(1000 - av->getNumDocs()); av->commit(CommitParam(50)); IFlushTarget::SP ft = am.getShrinker("a10"); - EXPECT_EQUAL(ft->getApproxMemoryGain().getBefore(), - ft->getApproxMemoryGain().getAfter()); + EXPECT_EQ(ft->getApproxMemoryGain().getBefore(), + ft->getApproxMemoryGain().getAfter()); AttributeGuard::UP g = am.getAttribute("a10"); EXPECT_FALSE(av->wantShrinkLidSpace()); EXPECT_FALSE(av->canShrinkLidSpace()); - EXPECT_EQUAL(1000u, av->getNumDocs()); - EXPECT_EQUAL(1000u, av->getCommittedDocIdLimit()); + EXPECT_EQ(1000u, av->getNumDocs()); + EXPECT_EQ(1000u, av->getCommittedDocIdLimit()); av->compactLidSpace(100); EXPECT_TRUE(av->wantShrinkLidSpace()); EXPECT_FALSE(av->canShrinkLidSpace()); - EXPECT_EQUAL(1000u, av->getNumDocs()); - EXPECT_EQUAL(100u, av->getCommittedDocIdLimit()); + EXPECT_EQ(1000u, av->getNumDocs()); + EXPECT_EQ(100u, av->getCommittedDocIdLimit()); aw.heartBeat(51, IDestructorCallback::SP()); EXPECT_TRUE(av->wantShrinkLidSpace()); EXPECT_FALSE(av->canShrinkLidSpace()); - EXPECT_EQUAL(ft->getApproxMemoryGain().getBefore(), - ft->getApproxMemoryGain().getAfter()); + EXPECT_EQ(ft->getApproxMemoryGain().getBefore(), + ft->getApproxMemoryGain().getAfter()); g.reset(); aw.heartBeat(52, IDestructorCallback::SP()); EXPECT_TRUE(av->wantShrinkLidSpace()); EXPECT_TRUE(av->canShrinkLidSpace()); EXPECT_TRUE(ft->getApproxMemoryGain().getBefore() > ft->getApproxMemoryGain().getAfter()); - EXPECT_EQUAL(1000u, av->getNumDocs()); - EXPECT_EQUAL(100u, av->getCommittedDocIdLimit()); - EXPECT_EQUAL(createSerialNum - 1, ft->getFlushedSerialNum()); + EXPECT_EQ(1000u, av->getNumDocs()); + EXPECT_EQ(100u, av->getCommittedDocIdLimit()); + EXPECT_EQ(createSerialNum - 1, ft->getFlushedSerialNum()); vespalib::ThreadStackExecutor exec(1); vespalib::Executor::Task::UP task = ft->initFlush(53, std::make_shared<search::FlushToken>()); exec.execute(std::move(task)); @@ -595,15 +537,16 @@ Test::requireThatShrinkWorks() exec.shutdown(); EXPECT_FALSE(av->wantShrinkLidSpace()); EXPECT_FALSE(av->canShrinkLidSpace()); - EXPECT_EQUAL(ft->getApproxMemoryGain().getBefore(), - ft->getApproxMemoryGain().getAfter()); - EXPECT_EQUAL(100u, av->getNumDocs()); - EXPECT_EQUAL(100u, av->getCommittedDocIdLimit()); + EXPECT_EQ(ft->getApproxMemoryGain().getBefore(), + ft->getApproxMemoryGain().getAfter()); + EXPECT_EQ(100u, av->getNumDocs()); + EXPECT_EQ(100u, av->getCommittedDocIdLimit()); } void -Test::requireThatFlushedAttributeCanBeLoaded(const HwInfo &hwInfo) +require_that_flushed_attribute_can_be_loaded(const HwInfo &hwInfo, const vespalib::string& label) { + SCOPED_TRACE(label); constexpr uint32_t numDocs = 100; BaseFixture f(hwInfo); vespalib::string attrName(hwInfo.disk().slow() ? "a11slow" : "a11fast"); @@ -612,9 +555,9 @@ Test::requireThatFlushedAttributeCanBeLoaded(const HwInfo &hwInfo) AttributeManager &am = amf._m; AttributeVector::SP av = amf.addPostingAttribute(attrName); IntegerAttribute & ia = static_cast<IntegerAttribute &>(*av); - EXPECT_EQUAL(1u, av->getNumDocs()); + EXPECT_EQ(1u, av->getNumDocs()); av->addDocs(numDocs); - EXPECT_EQUAL(numDocs + 1, av->getNumDocs()); + EXPECT_EQ(numDocs + 1, av->getNumDocs()); for (uint32_t i = 0; i < numDocs; ++i) { ia.update(i + 1, i + 43); } @@ -625,61 +568,44 @@ Test::requireThatFlushedAttributeCanBeLoaded(const HwInfo &hwInfo) { AttributeManagerFixture amf(f); AttributeVector::SP av = amf.addPostingAttribute(attrName); - EXPECT_EQUAL(numDocs + 1, av->getNumDocs()); + EXPECT_EQ(numDocs + 1, av->getNumDocs()); for (uint32_t i = 0; i < numDocs; ++i) { - EXPECT_EQUAL(i + 43, av->getInt(i + 1)); + EXPECT_EQ(i + 43, av->getInt(i + 1)); } } } -void -Test::requireThatFlushedAttributeCanBeLoaded() +TEST(AttributeFlushTest, require_that_flushed_attribute_can_be_loaded) { - TEST_DO(requireThatFlushedAttributeCanBeLoaded(HwInfo(HwInfo::Disk(0, false, false), HwInfo::Memory(0), HwInfo::Cpu(0)))); - TEST_DO(requireThatFlushedAttributeCanBeLoaded(HwInfo(HwInfo::Disk(0, true, false), HwInfo::Memory(0), HwInfo::Cpu(0)))); + require_that_flushed_attribute_can_be_loaded(HwInfo(HwInfo::Disk(0, false, false), HwInfo::Memory(0), HwInfo::Cpu(0)), "fast-disk"); + require_that_flushed_attribute_can_be_loaded(HwInfo(HwInfo::Disk(0, true, false), HwInfo::Memory(0), HwInfo::Cpu(0)), "slow-disk"); } -void -Test::requireThatFlushFailurePreventsSyncTokenUpdate() +TEST(AttributeFlushTest, require_that_flush_failure_prevents_sync_token_update) { BaseFixture f; AttributeManagerFixture amf(f); auto &am = amf._m; auto av = amf.addIntArrayPostingAttribute("a12"); - EXPECT_EQUAL(1u, av->getNumDocs()); + EXPECT_EQ(1u, av->getNumDocs()); auto flush_target = am.getFlushable("a12"); - EXPECT_EQUAL(0u, flush_target->getFlushedSerialNum()); + EXPECT_EQ(0u, flush_target->getFlushedSerialNum()); auto flush_task = flush_target->initFlush(200, std::make_shared<search::FlushToken>()); // Trigger flush failure av->getEnumStoreBase()->inc_compaction_count(); flush_task->run(); - EXPECT_EQUAL(0u, flush_target->getFlushedSerialNum()); + EXPECT_EQ(0u, flush_target->getFlushedSerialNum()); +} + } int -Test::Main() +main(int argc, char* argv[]) { - TEST_INIT("attributeflush_test"); - - if (_argc > 0) { - DummyFileHeaderContext::setCreator(_argv[0]); + ::testing::InitGoogleTest(&argc, argv); + if (argc > 0) { + DummyFileHeaderContext::setCreator(argv[0]); } - fs::remove_all(fs::path(test_dir)); - TEST_DO(requireThatUpdaterAndFlusherCanRunConcurrently()); - TEST_DO(requireThatFlushableAttributeReportsMemoryUsage()); - TEST_DO(requireThatFlushableAttributeManagesSyncTokenInfo()); - TEST_DO(requireThatFlushTargetsCanBeRetrieved()); - TEST_DO(requireThatCleanUpIsPerformedAfterFlush()); - TEST_DO(requireThatFlushStatsAreUpdated()); - TEST_DO(requireThatOnlyOneFlusherCanRunAtTheSameTime()); - TEST_DO(requireThatLastFlushTimeIsReported()); - TEST_DO(requireThatShrinkWorks()); - TEST_DO(requireThatFlushedAttributeCanBeLoaded()); - TEST_DO(requireThatFlushFailurePreventsSyncTokenUpdate()); - - TEST_DONE(); + fs::remove_all(fs::path(proton::test_dir)); + return RUN_ALL_TESTS(); } - -} - -TEST_APPHOOK(proton::Test); diff --git a/searchcore/src/tests/proton/feed_and_search/feed_and_search_test.cpp b/searchcore/src/tests/proton/feed_and_search/feed_and_search_test.cpp index 0936f05b222..ff740dd8801 100644 --- a/searchcore/src/tests/proton/feed_and_search/feed_and_search_test.cpp +++ b/searchcore/src/tests/proton/feed_and_search/feed_and_search_test.cpp @@ -23,15 +23,12 @@ #include <vespa/searchlib/queryeval/blueprint.h> #include <vespa/searchlib/queryeval/fake_requestcontext.h> #include <vespa/searchlib/queryeval/searchiterator.h> -#include <vespa/vespalib/testkit/testapp.h> +#include <vespa/vespalib/gtest/gtest.h> #include <vespa/vespalib/util/gate.h> #include <vespa/vespalib/util/destructor_callbacks.h> #include <vespa/vespalib/util/threadstackexecutor.h> #include <sstream> -#include <vespa/log/log.h> -LOG_SETUP("feed_and_search_test"); - using document::DataType; using document::Document; using document::FieldValue; @@ -75,38 +72,6 @@ void commit_memory_index_and_wait(MemoryIndex &memory_index) gate.await(); } -class Test : public vespalib::TestApp { - const char *current_state; - void DumpState(bool) { - fprintf(stderr, "%s: ERROR: in %s\n", __FILE__, current_state); - } - - void requireThatMemoryIndexCanBeDumpedAndSearched(); - - void testSearch(Searchable &source, - const string &term, uint32_t doc_id); - -public: - int Main() override; -}; - -#define TEST_CALL(func) \ - current_state = #func; \ - func(); - -int -Test::Main() -{ - TEST_INIT("feed_and_search_test"); - - if (_argc > 0) { - DummyFileHeaderContext::setCreator(_argv[0]); - } - TEST_CALL(requireThatMemoryIndexCanBeDumpedAndSearched); - - TEST_DONE(); -} - const string field_name = "string_field"; const string noise = "noise"; const string word1 = "foo"; @@ -123,7 +88,8 @@ Document::UP buildDocument(DocBuilder & doc_builder, int id, const string &word) } // Performs a search using a Searchable. -void Test::testSearch(Searchable &source, const string &term, uint32_t doc_id) +void +testSearch(Searchable &source, const string &term, uint32_t doc_id) { FakeRequestContext requestContext; uint32_t fieldId = 0; @@ -139,12 +105,12 @@ void Test::testSearch(Searchable &source, const string &term, uint32_t doc_id) search_iterator->initFullRange(); ASSERT_TRUE(search_iterator.get()); ASSERT_TRUE(search_iterator->seek(doc_id)); - EXPECT_EQUAL(doc_id, search_iterator->getDocId()); + EXPECT_EQ(doc_id, search_iterator->getDocId()); search_iterator->unpack(doc_id); FieldPositionsIterator it = match_data->resolveTermField(handle)->getIterator(); ASSERT_TRUE(it.valid()); - EXPECT_EQUAL(1u, it.size()); - EXPECT_EQUAL(1u, it.getPosition()); // All hits are at pos 1 in this index + EXPECT_EQ(1u, it.size()); + EXPECT_EQ(1u, it.getPosition()); // All hits are at pos 1 in this index EXPECT_TRUE(!search_iterator->seek(doc_id + 1)); EXPECT_TRUE(search_iterator->isAtEnd()); @@ -155,7 +121,8 @@ VESPA_THREAD_STACK_TAG(write_executor) // Creates a memory index, inserts documents, performs a few // searches, dumps the index to disk, and performs the searches // again. -void Test::requireThatMemoryIndexCanBeDumpedAndSearched() { +TEST(FeedAndSearchTest, require_that_memory_index_can_be_dumped_and_searched) +{ vespalib::ThreadStackExecutor sharedExecutor(2); auto indexFieldInverter = vespalib::SequencedTaskExecutor::create(invert_executor, 2); auto indexFieldWriter = vespalib::SequencedTaskExecutor::create(write_executor, 2); @@ -239,4 +206,12 @@ void Test::requireThatMemoryIndexCanBeDumpedAndSearched() { } } // namespace -TEST_APPHOOK(Test); +int +main(int argc, char* argv[]) +{ + ::testing::InitGoogleTest(&argc, argv); + if (argc > 0) { + DummyFileHeaderContext::setCreator(argv[0]); + } + return RUN_ALL_TESTS(); +} diff --git a/searchcore/src/tests/proton/feedtoken/CMakeLists.txt b/searchcore/src/tests/proton/feedtoken/CMakeLists.txt index 1a13e46eb41..8ddb3831c97 100644 --- a/searchcore/src/tests/proton/feedtoken/CMakeLists.txt +++ b/searchcore/src/tests/proton/feedtoken/CMakeLists.txt @@ -5,5 +5,6 @@ vespa_add_executable(searchcore_feedtoken_test_app TEST DEPENDS searchcore_pcommon searchcore_proton_metrics + GTest::gtest ) vespa_add_test(NAME searchcore_feedtoken_test_app COMMAND searchcore_feedtoken_test_app) diff --git a/searchcore/src/tests/proton/feedtoken/feedtoken_test.cpp b/searchcore/src/tests/proton/feedtoken/feedtoken_test.cpp index c3c67e74c70..d3eb7d08821 100644 --- a/searchcore/src/tests/proton/feedtoken/feedtoken_test.cpp +++ b/searchcore/src/tests/proton/feedtoken/feedtoken_test.cpp @@ -1,6 +1,6 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/vespalib/testkit/testapp.h> #include <vespa/searchcore/proton/common/feedtoken.h> +#include <vespa/vespalib/gtest/gtest.h> #include <vespa/vespalib/util/exceptions.h> using namespace proton; @@ -21,47 +21,24 @@ public: size_t getReceivedCount() const { return _receivedCount; } }; -class Test : public vespalib::TestApp { -private: - void testAck(); - void testFail(); - void testHandover(); - -public: - int Main() override { - TEST_INIT("feedtoken_test"); - - testAck(); TEST_FLUSH(); - testFail(); TEST_FLUSH(); - testHandover(); TEST_FLUSH(); - - TEST_DONE(); - } -}; - -TEST_APPHOOK(Test); - -void -Test::testAck() +TEST(FeedTokenTest, test_ack) { LocalTransport transport; { FeedToken token = feedtoken::make(transport); } - EXPECT_EQUAL(1u, transport.getReceivedCount()); + EXPECT_EQ(1u, transport.getReceivedCount()); } -void -Test::testFail() +TEST(FeedTokenTest, test_fail) { LocalTransport transport; FeedToken token = feedtoken::make(transport); token->fail(); - EXPECT_EQUAL(1u, transport.getReceivedCount()); + EXPECT_EQ(1u, transport.getReceivedCount()); } -void -Test::testHandover() +TEST(FeedTokenTest, test_handover) { struct MyHandover { static FeedToken handover(FeedToken token) { @@ -75,7 +52,7 @@ Test::testHandover() FeedToken token = feedtoken::make(transport); token = MyHandover::handover(token); } - EXPECT_EQUAL(1u, transport.getReceivedCount()); + EXPECT_EQ(1u, transport.getReceivedCount()); } - +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/searchcore/src/tests/proton/index/CMakeLists.txt b/searchcore/src/tests/proton/index/CMakeLists.txt index 40e3d8e7b79..c1cc6155a52 100644 --- a/searchcore/src/tests/proton/index/CMakeLists.txt +++ b/searchcore/src/tests/proton/index/CMakeLists.txt @@ -22,6 +22,7 @@ vespa_add_executable(searchcore_fusionrunner_test_app TEST searchcore_server searchcore_index searchcore_pcommon + GTest::gtest ) vespa_add_test(NAME searchcore_fusionrunner_test_app @@ -32,6 +33,7 @@ vespa_add_executable(searchcore_diskindexcleaner_test_app TEST diskindexcleaner_test.cpp DEPENDS searchcore_index + GTest::gtest ) vespa_add_test(NAME searchcore_diskindexcleaner_test_app diff --git a/searchcore/src/tests/proton/index/diskindexcleaner_test.cpp b/searchcore/src/tests/proton/index/diskindexcleaner_test.cpp index 745d9c6a983..1aa79e11a57 100644 --- a/searchcore/src/tests/proton/index/diskindexcleaner_test.cpp +++ b/searchcore/src/tests/proton/index/diskindexcleaner_test.cpp @@ -3,53 +3,44 @@ #include <vespa/searchcorespi/index/disk_indexes.h> #include <vespa/searchcorespi/index/diskindexcleaner.h> -#include <vespa/vespalib/testkit/testapp.h> +#include <vespa/vespalib/gtest/gtest.h> #include <vespa/fastos/file.h> #include <algorithm> #include <filesystem> -#include <vespa/log/log.h> -LOG_SETUP("diskindexcleaner_test"); - using std::string; using std::vector; using namespace searchcorespi::index; namespace { -class Test : public vespalib::TestApp { - void requireThatAllIndexesOlderThanLastFusionIsRemoved(); - void requireThatIndexesInUseAreNotRemoved(); - void requireThatInvalidFlushIndexesAreRemoved(); - void requireThatInvalidFusionIndexesAreRemoved(); - void requireThatRemoveDontTouchNewIndexes(); - -public: - int Main() override; -}; - const string index_dir = "diskindexcleaner_test_data"; void removeTestData() { std::filesystem::remove_all(std::filesystem::path(index_dir)); } -int -Test::Main() -{ - TEST_INIT("diskindexcleaner_test"); - - TEST_DO(removeTestData()); +class DiskIndexCleanerTest : public ::testing::Test { +protected: + DiskIndexCleanerTest(); + ~DiskIndexCleanerTest() override; + void SetUp() override; + void TearDown() override; +}; - TEST_DO(requireThatAllIndexesOlderThanLastFusionIsRemoved()); - TEST_DO(requireThatIndexesInUseAreNotRemoved()); - TEST_DO(requireThatInvalidFlushIndexesAreRemoved()); - TEST_DO(requireThatInvalidFusionIndexesAreRemoved()); - TEST_DO(requireThatRemoveDontTouchNewIndexes()); +DiskIndexCleanerTest::DiskIndexCleanerTest() = default; +DiskIndexCleanerTest::~DiskIndexCleanerTest() = default; - TEST_DO(removeTestData()); +void +DiskIndexCleanerTest::SetUp() +{ + removeTestData(); +} - TEST_DONE(); +void +DiskIndexCleanerTest::TearDown() +{ + removeTestData(); } void createIndex(const string &name) { @@ -87,18 +78,20 @@ void createIndexes() { createIndex("index.flush.4"); } -void Test::requireThatAllIndexesOlderThanLastFusionIsRemoved() { +TEST_F(DiskIndexCleanerTest, require_that_all_indexes_older_than_last_fusion_is_removed) +{ createIndexes(); DiskIndexes disk_indexes; DiskIndexCleaner::clean(index_dir, disk_indexes); vector<string> indexes = readIndexes(); - EXPECT_EQUAL(3u, indexes.size()); + EXPECT_EQ(3u, indexes.size()); EXPECT_TRUE(contains(indexes, "index.fusion.2")); EXPECT_TRUE(contains(indexes, "index.flush.3")); EXPECT_TRUE(contains(indexes, "index.flush.4")); } -void Test::requireThatIndexesInUseAreNotRemoved() { +TEST_F(DiskIndexCleanerTest, require_that_indexes_in_use_are_not_removed) +{ createIndexes(); DiskIndexes disk_indexes; disk_indexes.setActive(index_dir + "/index.fusion.1", 0); @@ -116,37 +109,40 @@ void Test::requireThatIndexesInUseAreNotRemoved() { EXPECT_TRUE(!contains(indexes, "index.flush.2")); } -void Test::requireThatInvalidFlushIndexesAreRemoved() { +TEST_F(DiskIndexCleanerTest, require_that_invalid_flush_indexes_are_removed) +{ createIndexes(); std::filesystem::remove(std::filesystem::path(index_dir + "/index.flush.4/serial.dat")); DiskIndexes disk_indexes; DiskIndexCleaner::clean(index_dir, disk_indexes); vector<string> indexes = readIndexes(); - EXPECT_EQUAL(2u, indexes.size()); + EXPECT_EQ(2u, indexes.size()); EXPECT_TRUE(contains(indexes, "index.fusion.2")); EXPECT_TRUE(contains(indexes, "index.flush.3")); } -void Test::requireThatInvalidFusionIndexesAreRemoved() { +TEST_F(DiskIndexCleanerTest, require_that_invalid_fusion_indexes_are_removed) +{ createIndexes(); std::filesystem::remove(std::filesystem::path(index_dir + "/index.fusion.2/serial.dat")); DiskIndexes disk_indexes; DiskIndexCleaner::clean(index_dir, disk_indexes); vector<string> indexes = readIndexes(); - EXPECT_EQUAL(4u, indexes.size()); + EXPECT_EQ(4u, indexes.size()); EXPECT_TRUE(contains(indexes, "index.fusion.1")); EXPECT_TRUE(contains(indexes, "index.flush.2")); EXPECT_TRUE(contains(indexes, "index.flush.3")); EXPECT_TRUE(contains(indexes, "index.flush.4")); } -void Test::requireThatRemoveDontTouchNewIndexes() { +TEST_F(DiskIndexCleanerTest, require_that_remove_doesnt_touch_new_indexes) +{ createIndexes(); std::filesystem::remove(std::filesystem::path(index_dir + "/index.flush.4/serial.dat")); DiskIndexes disk_indexes; DiskIndexCleaner::removeOldIndexes(index_dir, disk_indexes); vector<string> indexes = readIndexes(); - EXPECT_EQUAL(3u, indexes.size()); + EXPECT_EQ(3u, indexes.size()); EXPECT_TRUE(contains(indexes, "index.fusion.2")); EXPECT_TRUE(contains(indexes, "index.flush.3")); EXPECT_TRUE(contains(indexes, "index.flush.4")); @@ -154,4 +150,4 @@ void Test::requireThatRemoveDontTouchNewIndexes() { } // namespace -TEST_APPHOOK(Test); +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/searchcore/src/tests/proton/index/fusionrunner_test.cpp b/searchcore/src/tests/proton/index/fusionrunner_test.cpp index a58d7540d7c..dd6e8fa1c4c 100644 --- a/searchcore/src/tests/proton/index/fusionrunner_test.cpp +++ b/searchcore/src/tests/proton/index/fusionrunner_test.cpp @@ -22,7 +22,7 @@ #include <vespa/searchlib/queryeval/blueprint.h> #include <vespa/vespalib/util/gate.h> #include <vespa/vespalib/util/destructor_callbacks.h> -#include <vespa/vespalib/testkit/testapp.h> +#include <vespa/vespalib/gtest/gtest.h> #include <vespa/vespalib/stllike/asciistream.h> #include <filesystem> #include <set> @@ -66,12 +66,8 @@ using namespace proton; namespace { -#define TEST_CALL(func) \ - setUp(); \ - func; \ - tearDown() - -class Test : public vespalib::TestApp { +class FusionRunnerTest : public ::testing::Test { +protected: std::unique_ptr<FusionRunner> _fusion_runner; FixedSourceSelector::UP _selector; FusionSpec _fusion_spec; @@ -79,8 +75,10 @@ class Test : public vespalib::TestApp { TransportAndExecutorService _service; IndexManager::MaintainerOperations _ops; - void setUp(); - void tearDown(); + FusionRunnerTest(); + ~FusionRunnerTest() override; + void SetUp() override; + void TearDown() override; void createIndex(const string &dir, uint32_t id, bool fusion = false); void checkResults(uint32_t fusion_id, const uint32_t *ids, size_t size); @@ -92,41 +90,19 @@ class Test : public vespalib::TestApp { void requireThatOldFusionIndexCanBePartOfNewFusion(); void requireThatSelectorsCanBeRebased(); void requireThatFusionCanBeStopped(); - -public: - Test(); - ~Test() override; - int Main() override; }; -Test::Test() - : _fusion_runner(), +FusionRunnerTest::FusionRunnerTest() + : ::testing::Test(), + _fusion_runner(), _selector(), _fusion_spec(), _fileHeaderContext(), _service(1), _ops(_fileHeaderContext,TuneFileIndexManager(), 0, _service.write()) { } -Test::~Test() = default; - -int -Test::Main() -{ - TEST_INIT("fusionrunner_test"); - if (_argc > 0) { - DummyFileHeaderContext::setCreator(_argv[0]); - } - TEST_CALL(requireThatNoDiskIndexesGiveId0()); - TEST_CALL(requireThatOneDiskIndexCausesCopy()); - TEST_CALL(requireThatTwoDiskIndexesCauseFusion()); - TEST_CALL(requireThatFusionCanRunOnMultipleDiskIndexes()); - TEST_CALL(requireThatOldFusionIndexCanBePartOfNewFusion()); - TEST_CALL(requireThatSelectorsCanBeRebased()); - TEST_CALL(requireThatFusionCanBeStopped()); - - TEST_DONE(); -} +FusionRunnerTest::~FusionRunnerTest() = default; const string base_dir = "fusion_test_data"; const string field_name = "field_name"; @@ -142,7 +118,9 @@ getSchema() return SchemaBuilder(db).add_all_indexes().build(); } -void Test::setUp() { +void +FusionRunnerTest::SetUp() +{ std::filesystem::remove_all(std::filesystem::path(base_dir)); _fusion_runner = std::make_unique<FusionRunner>(base_dir, getSchema(), TuneFileAttributes(), _fileHeaderContext); const string selector_base = base_dir + "/index.flush.0/selector"; @@ -150,12 +128,16 @@ void Test::setUp() { _fusion_spec = FusionSpec(); } -void Test::tearDown() { +void +FusionRunnerTest::TearDown() +{ std::filesystem::remove_all(std::filesystem::path(base_dir)); - _selector.reset(nullptr); + _selector.reset(); } -Document::UP buildDocument(DocBuilder & doc_builder, int id, const string &word) { +Document::UP +buildDocument(DocBuilder & doc_builder, int id, const string &word) +{ vespalib::asciistream ost; ost << "id:ns:searchdocument::" << id; auto doc = doc_builder.make_document(ost.str()); @@ -163,8 +145,10 @@ Document::UP buildDocument(DocBuilder & doc_builder, int id, const string &word) return doc; } -void addDocument(DocBuilder & doc_builder, MemoryIndex &index, ISourceSelector &selector, - uint8_t index_id, uint32_t docid, const string &word) { +void +addDocument(DocBuilder & doc_builder, MemoryIndex &index, ISourceSelector &selector, + uint8_t index_id, uint32_t docid, const string &word) +{ Document::UP doc = buildDocument(doc_builder, docid, word); index.insertDocument(docid, *doc, {}); vespalib::Gate gate; @@ -173,7 +157,9 @@ void addDocument(DocBuilder & doc_builder, MemoryIndex &index, ISourceSelector & gate.await(); } -void Test::createIndex(const string &dir, uint32_t id, bool fusion) { +void +FusionRunnerTest::createIndex(const string &dir, uint32_t id, bool fusion) +{ std::filesystem::create_directory(std::filesystem::path(dir)); vespalib::asciistream ost; if (fusion) { @@ -209,7 +195,9 @@ void Test::createIndex(const string &dir, uint32_t id, bool fusion) { _selector->extractSaveInfo(index_dir + "/selector")->save(tuneFileAttributes, _fileHeaderContext); } -set<uint32_t> readFusionIds(const string &dir) { +set<uint32_t> +readFusionIds(const string &dir) +{ set<uint32_t> ids; const vespalib::string prefix("index.fusion."); std::filesystem::directory_iterator dir_scan(dir); @@ -225,13 +213,17 @@ set<uint32_t> readFusionIds(const string &dir) { return ids; } -vespalib::string getFusionIndexName(uint32_t fusion_id) { +vespalib::string +getFusionIndexName(uint32_t fusion_id) +{ vespalib::asciistream ost; ost << base_dir << "/index.fusion." << fusion_id; return ost.str(); } -void Test::checkResults(uint32_t fusion_id, const uint32_t *ids, size_t size) { +void +FusionRunnerTest::checkResults(uint32_t fusion_id, const uint32_t *ids, size_t size) +{ FakeRequestContext requestContext; DiskIndex disk_index(getFusionIndexName(fusion_id)); ASSERT_TRUE(disk_index.setup(TuneFileSearch())); @@ -256,66 +248,72 @@ void Test::checkResults(uint32_t fusion_id, const uint32_t *ids, size_t size) { } } -void Test::requireThatNoDiskIndexesGiveId0() { +TEST_F(FusionRunnerTest, require_that_no_disk_indexes_give_id_0) +{ uint32_t fusion_id = _fusion_runner->fuse(_fusion_spec, 0u, _ops, std::make_shared<search::FlushToken>()); - EXPECT_EQUAL(0u, fusion_id); + EXPECT_EQ(0u, fusion_id); } -void Test::requireThatOneDiskIndexCausesCopy() { +TEST_F(FusionRunnerTest, rquire_that_one_disk_index_causes_copy) +{ createIndex(base_dir, disk_id[0]); uint32_t fusion_id = _fusion_runner->fuse(_fusion_spec, 0u, _ops, std::make_shared<search::FlushToken>()); - EXPECT_EQUAL(disk_id[0], fusion_id); + EXPECT_EQ(disk_id[0], fusion_id); set<uint32_t> fusion_ids = readFusionIds(base_dir); ASSERT_TRUE(!fusion_ids.empty()); - EXPECT_EQUAL(1u, fusion_ids.size()); - EXPECT_EQUAL(fusion_id, *fusion_ids.begin()); + EXPECT_EQ(1u, fusion_ids.size()); + EXPECT_EQ(fusion_id, *fusion_ids.begin()); checkResults(fusion_id, disk_id, 1); } -void Test::requireThatTwoDiskIndexesCauseFusion() { +TEST_F(FusionRunnerTest, require_that_two_disk_indexes_cause_fusion) +{ createIndex(base_dir, disk_id[0]); createIndex(base_dir, disk_id[1]); uint32_t fusion_id = _fusion_runner->fuse(_fusion_spec, 0u, _ops, std::make_shared<search::FlushToken>()); - EXPECT_EQUAL(disk_id[1], fusion_id); + EXPECT_EQ(disk_id[1], fusion_id); set<uint32_t> fusion_ids = readFusionIds(base_dir); ASSERT_TRUE(!fusion_ids.empty()); - EXPECT_EQUAL(1u, fusion_ids.size()); - EXPECT_EQUAL(fusion_id, *fusion_ids.begin()); + EXPECT_EQ(1u, fusion_ids.size()); + EXPECT_EQ(fusion_id, *fusion_ids.begin()); checkResults(fusion_id, disk_id, 2); } -void Test::requireThatFusionCanRunOnMultipleDiskIndexes() { +TEST_F(FusionRunnerTest, require_that_fusion_can_run_on_multiple_disk_indexes) +{ createIndex(base_dir, disk_id[0]); createIndex(base_dir, disk_id[1]); createIndex(base_dir, disk_id[2]); createIndex(base_dir, disk_id[3]); uint32_t fusion_id = _fusion_runner->fuse(_fusion_spec, 0u, _ops, std::make_shared<search::FlushToken>()); - EXPECT_EQUAL(disk_id[3], fusion_id); + EXPECT_EQ(disk_id[3], fusion_id); set<uint32_t> fusion_ids = readFusionIds(base_dir); ASSERT_TRUE(!fusion_ids.empty()); - EXPECT_EQUAL(1u, fusion_ids.size()); - EXPECT_EQUAL(fusion_id, *fusion_ids.begin()); + EXPECT_EQ(1u, fusion_ids.size()); + EXPECT_EQ(fusion_id, *fusion_ids.begin()); checkResults(fusion_id, disk_id, 4); } -void Test::requireThatOldFusionIndexCanBePartOfNewFusion() { +TEST_F(FusionRunnerTest, require_that_old_fusion_index_can_be_part_of_new_fusion) +{ createIndex(base_dir, disk_id[0], true); createIndex(base_dir, disk_id[1]); uint32_t fusion_id = _fusion_runner->fuse(_fusion_spec, 0u, _ops, std::make_shared<search::FlushToken>()); - EXPECT_EQUAL(disk_id[1], fusion_id); + EXPECT_EQ(disk_id[1], fusion_id); set<uint32_t> fusion_ids = readFusionIds(base_dir); ASSERT_TRUE(!fusion_ids.empty()); - EXPECT_EQUAL(2u, fusion_ids.size()); - EXPECT_EQUAL(disk_id[0], *fusion_ids.begin()); - EXPECT_EQUAL(fusion_id, *(++fusion_ids.begin())); + EXPECT_EQ(2u, fusion_ids.size()); + EXPECT_EQ(disk_id[0], *fusion_ids.begin()); + EXPECT_EQ(fusion_id, *(++fusion_ids.begin())); checkResults(fusion_id, disk_id, 2); } -void Test::requireThatSelectorsCanBeRebased() { +TEST_F(FusionRunnerTest, require_that_selectors_can_be_rebased) +{ createIndex(base_dir, disk_id[0]); createIndex(base_dir, disk_id[1]); uint32_t fusion_id = _fusion_runner->fuse(_fusion_spec, 0u, _ops, std::make_shared<search::FlushToken>()); @@ -328,17 +326,24 @@ void Test::requireThatSelectorsCanBeRebased() { checkResults(fusion_id, disk_id, 3); } -void -Test::requireThatFusionCanBeStopped() +TEST_F(FusionRunnerTest, require_that_fusion_can_be_stopped) { createIndex(base_dir, disk_id[0]); createIndex(base_dir, disk_id[1]); auto flush_token = std::make_shared<search::FlushToken>(); flush_token->request_stop(); uint32_t fusion_id = _fusion_runner->fuse(_fusion_spec, 0u, _ops, flush_token); - EXPECT_EQUAL(0u, fusion_id); + EXPECT_EQ(0u, fusion_id); } } // namespace -TEST_APPHOOK(Test); +int +main(int argc, char* argv[]) +{ + ::testing::InitGoogleTest(&argc, argv); + if (argc > 0) { + DummyFileHeaderContext::setCreator(argv[0]); + } + return RUN_ALL_TESTS(); +} diff --git a/searchlib/src/tests/attribute/guard/CMakeLists.txt b/searchlib/src/tests/attribute/guard/CMakeLists.txt index a956182e1e1..f5570377814 100644 --- a/searchlib/src/tests/attribute/guard/CMakeLists.txt +++ b/searchlib/src/tests/attribute/guard/CMakeLists.txt @@ -4,6 +4,7 @@ vespa_add_executable(searchlib_attributeguard_test_app TEST attributeguard_test.cpp DEPENDS searchlib + GTest::gtest ) vespa_add_test(NAME searchlib_attributeguard_test_app COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/attributeguard_test.sh DEPENDS searchlib_attributeguard_test_app) diff --git a/searchlib/src/tests/attribute/guard/attributeguard_test.cpp b/searchlib/src/tests/attribute/guard/attributeguard_test.cpp index 47df9d7c320..513fa7406b6 100644 --- a/searchlib/src/tests/attribute/guard/attributeguard_test.cpp +++ b/searchlib/src/tests/attribute/guard/attributeguard_test.cpp @@ -1,31 +1,17 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/log/log.h> -LOG_SETUP("attributeguard_test"); -#include <vespa/vespalib/testkit/testapp.h> #include <vespa/searchlib/attribute/attributeguard.h> #include <vespa/searchlib/attribute/extendableattributes.h> +#include <vespa/vespalib/gtest/gtest.h> namespace search { -class AttributeGuardTest : public vespalib::TestApp +TEST(AttributeGuardTest, test_attribute_guard) { -public: - int Main() override; -}; - -int -AttributeGuardTest::Main() -{ - TEST_INIT("attributeguard_test"); - - AttributeVector::SP ssattr(new SingleStringExtAttribute("ss1")); AttributeGuard guard(ssattr); EXPECT_TRUE(guard.valid()); - - TEST_DONE(); } } -TEST_APPHOOK(search::AttributeGuardTest); +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/vespaclient-java/src/main/java/com/yahoo/vespa/feed/perf/SimpleFeeder.java b/vespaclient-java/src/main/java/com/yahoo/vespa/feed/perf/SimpleFeeder.java index b41bb29376b..3a7fe8f75c6 100644 --- a/vespaclient-java/src/main/java/com/yahoo/vespa/feed/perf/SimpleFeeder.java +++ b/vespaclient-java/src/main/java/com/yahoo/vespa/feed/perf/SimpleFeeder.java @@ -2,7 +2,6 @@ package com.yahoo.vespa.feed.perf; import com.yahoo.concurrent.ThreadFactoryFactory; -import com.yahoo.config.subscription.ConfigSubscriber; import com.yahoo.document.Document; import com.yahoo.document.DocumentId; import com.yahoo.document.DocumentPut; @@ -66,7 +65,6 @@ import java.util.stream.Stream; public class SimpleFeeder implements ReplyHandler { private final DocumentTypeManager docTypeMgr = new DocumentTypeManager(); - private final ConfigSubscriber documentTypeConfigSubscriber; private final List<InputStream> inputStreams; private final PrintStream out; private final RPCMessageBus mbus; @@ -200,16 +198,18 @@ public class SimpleFeeder implements ReplyHandler { } private void addCommaAndNewline() { - if (! isFirst) { - try { + try { + if (isFirst) { + outputStream.write(' '); + outputStream.write(' '); + isFirst = false; + } else { outputStream.write(','); outputStream.write('\n'); - } catch (IOException e) { - failure.set(e); + outputStream.write(' '); } - } - else { - isFirst = false; + } catch (IOException e) { + failure.set(e); } } @@ -391,7 +391,7 @@ public class SimpleFeeder implements ReplyHandler { numMessagesToSend = params.getNumMessagesToSend(); mbus = newMessageBus(docTypeMgr, params); session = newSession(mbus, this, params); - documentTypeConfigSubscriber = DocumentTypeManagerConfigurer.configure(docTypeMgr, params.getConfigId()); + DocumentTypeManagerConfigurer.configure(docTypeMgr, params.getConfigId()); benchmarkMode = params.isBenchmarkMode(); destination = (params.getDumpStream() != null) ? createDumper(params) @@ -482,6 +482,7 @@ public class SimpleFeeder implements ReplyHandler { numReplies.incrementAndGet(); accumulateReplies(now, latency); } + private synchronized void accumulateReplies(long now, long latency) { minLatency = Math.min(minLatency, latency); maxLatency = Math.max(maxLatency, latency); @@ -492,6 +493,7 @@ public class SimpleFeeder implements ReplyHandler { nextReport += REPORT_INTERVAL; } } + private static void printHeader(PrintStream out) { out.println("# Time used, num ok, num error, min latency, max latency, average latency"); } diff --git a/vespaclient-java/src/test/java/com/yahoo/vespa/feed/perf/SimpleFeederTest.java b/vespaclient-java/src/test/java/com/yahoo/vespa/feed/perf/SimpleFeederTest.java index 28859d0e7c4..2810303fad3 100644 --- a/vespaclient-java/src/test/java/com/yahoo/vespa/feed/perf/SimpleFeederTest.java +++ b/vespaclient-java/src/test/java/com/yahoo/vespa/feed/perf/SimpleFeederTest.java @@ -87,11 +87,11 @@ public class SimpleFeederTest { "", "(.+\n)+" + "\\s*\\d+,\\s*3,.+\n"); - assertEquals(93, dump.size()); + assertEquals(96, dump.size()); assertEquals(""" [ - {"id":"id:simple:simple::0","fields":{"my_str":"foo"}}, - {"remove":"id:simple:simple::2"} + {"id":"id:simple:simple::0","fields":{"my_str":"foo"}}, + {"remove":"id:simple:simple::2"} ]""", dump.toString()); } @@ -121,12 +121,12 @@ public class SimpleFeederTest { "", "(.+\n)+" + "\\s*\\d+,\\s*3,.+\n"); - assertEquals(150, dump.size()); + assertEquals(154, dump.size()); assertEquals(""" [ - {"id":"id:simple:simple::0","fields":{"my_str":"foo"}}, - {"id":"id:simple:simple::1","fields":{"my_str":"bar"}}, - {"remove":"id:simple:simple::2"} + {"id":"id:simple:simple::0","fields":{"my_str":"foo"}}, + {"id":"id:simple:simple::1","fields":{"my_str":"bar"}}, + {"remove":"id:simple:simple::2"} ]""", dump.toString()); assertFeed(dump.toString(), |