diff --git a/scripts/deploy-blue-green.sh b/scripts/deploy-blue-green.sh index 2b59bd5124..aecd5fb90f 100755 --- a/scripts/deploy-blue-green.sh +++ b/scripts/deploy-blue-green.sh @@ -241,6 +241,8 @@ main() { if [ -x "${WARMUP_SCRIPT}" ]; then if ! "${WARMUP_SCRIPT}" "localhost:${staging_port}"; then log_error "Warmup/smoke test failed, aborting deployment" + log_error "Recent eagle-${staging} logs:" + docker logs "eagle-${staging}" --tail 200 2>&1 || true docker compose -f "${COMPOSE_FILE}" stop "eagle-${staging}" cleanup_markers_on_failure "eagle-${active}" exit 1 diff --git a/src/main/scala/net/eagle0/eagle/Main.scala b/src/main/scala/net/eagle0/eagle/Main.scala index f834612fe5..f70f331d62 100644 --- a/src/main/scala/net/eagle0/eagle/Main.scala +++ b/src/main/scala/net/eagle0/eagle/Main.scala @@ -107,6 +107,8 @@ object Main { SimpleTimedLogger.printLogger.logLine("Starting!") + HistoryBackendStartupValidation.validate() + // Register shutdown hook to turn pending SQLite upload requests into bytes before flushing pending S3 saves. Runtime.getRuntime.addShutdownHook(new Thread(new Runnable { override def run(): Unit = { diff --git a/src/main/scala/net/eagle0/eagle/service/BUILD.bazel b/src/main/scala/net/eagle0/eagle/service/BUILD.bazel index 6123afb038..6f184dfc11 100644 --- a/src/main/scala/net/eagle0/eagle/service/BUILD.bazel +++ b/src/main/scala/net/eagle0/eagle/service/BUILD.bazel @@ -636,6 +636,7 @@ scala_library( srcs = [ "GameHistoryFactory.scala", "HistoryBackendConfig.scala", + "HistoryBackendStartupValidation.scala", "PostgresHistory.scala", "SqliteHistory.scala", ], diff --git a/src/main/scala/net/eagle0/eagle/service/HistoryBackendStartupValidation.scala b/src/main/scala/net/eagle0/eagle/service/HistoryBackendStartupValidation.scala new file mode 100644 index 0000000000..483430fd22 --- /dev/null +++ b/src/main/scala/net/eagle0/eagle/service/HistoryBackendStartupValidation.scala @@ -0,0 +1,6 @@ +package net.eagle0.eagle.service + +object HistoryBackendStartupValidation { + def validate(): Unit = + if HistoryBackendConfig.usePostgres then PostgresHistory.requireConfigured() +} diff --git a/src/test/scala/net/eagle0/eagle/service/new_game_creation/BUILD.bazel b/src/test/scala/net/eagle0/eagle/service/new_game_creation/BUILD.bazel index a6931ea6db..382c6e0c8f 100644 --- a/src/test/scala/net/eagle0/eagle/service/new_game_creation/BUILD.bazel +++ b/src/test/scala/net/eagle0/eagle/service/new_game_creation/BUILD.bazel @@ -21,8 +21,13 @@ scala_test( "//src/main/resources/net/eagle0/eagle:game_parameters", "//src/main/resources/net/eagle0/eagle:heroes", "//src/main/resources/net/eagle0/eagle:province_map", + "//src/main/resources/net/eagle0/shardok:battalion_types", ], deps = [ + "//src/main/scala/net/eagle0/eagle/library:engine", + "//src/main/scala/net/eagle0/eagle/library/settings:history_backend", + "//src/main/scala/net/eagle0/eagle/library/settings/loaders:battalion_type_loader", + "//src/main/scala/net/eagle0/eagle/service/new_game_creation", "//src/main/scala/net/eagle0/eagle/service/new_game_creation:game_parameters_utils", "//src/main/scala/net/eagle0/eagle/service/new_game_creation:great_person", "//src/main/scala/net/eagle0/util/hero_generation:loaded_hero", diff --git a/src/test/scala/net/eagle0/eagle/service/new_game_creation/FixedNewGameCreationTest.scala b/src/test/scala/net/eagle0/eagle/service/new_game_creation/FixedNewGameCreationTest.scala index 89fe391e99..d69f634065 100644 --- a/src/test/scala/net/eagle0/eagle/service/new_game_creation/FixedNewGameCreationTest.scala +++ b/src/test/scala/net/eagle0/eagle/service/new_game_creation/FixedNewGameCreationTest.scala @@ -1,9 +1,17 @@ package net.eagle0.eagle.service.new_game_creation +import java.nio.file.Files + +import net.eagle0.eagle.library.settings.loaders.BattalionTypeLoader +import net.eagle0.eagle.library.settings.HistoryBackend import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.matchers.should.Matchers class FixedNewGameCreationTest extends AnyFlatSpec with Matchers { + System.setProperty("eagle.save.dir", Files.createTempDirectory("fixed_new_game_creation_test").toString) + + private lazy val battalionTypes = + BattalionTypeLoader.loadBattalionTypes(getClass.getResource("/net/eagle0/shardok/battalionTypes.tsv")).get "ExpandedGameParameters" should "have no duplicate heroes between setFactionHeads and greatPeople" in { val params = GameParametersUtils.defaultExpandedGameParameters @@ -93,4 +101,23 @@ class FixedNewGameCreationTest extends AnyFlatSpec with Matchers { overlap.shouldBe(empty) } } + + "FixedNewGameCreation" should "create the warmup-sized default game" in { + val params = GameParametersUtils.defaultExpandedGameParameters + + val previousHistoryBackend = HistoryBackend.stringValue + HistoryBackend.setStringValue("sqlite") + try { + val engineAndResults = FixedNewGameCreation.createGame( + expandedGameParameters = params, + gameId = 0xfeedfaceL, + persister = None, + humanPlayerFactionLeaderNameTextIds = Vector(params.greatPeople.head.greatPerson.hero.nameTextId), + playerCount = 2, + allBattalionTypes = battalionTypes + ) + + (engineAndResults.engine.currentState.factions.size >= 2).shouldBe(true) + } finally HistoryBackend.setStringValue(previousHistoryBackend) + } }