From dcbf9b7557230ceaeda72522da3b724c7f04cf31 Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Wed, 23 Oct 2024 10:21:25 -0600
Subject: [PATCH 01/26] test web results

---
 .../usgs/earthquake/nshmp/model/NshmTestUtils.java   | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
index 8b32caf6..9c75eb89 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
@@ -16,6 +16,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.Set;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.logging.Logger;
@@ -37,6 +38,7 @@ import gov.usgs.earthquake.nshmp.calc.Site;
 import gov.usgs.earthquake.nshmp.data.XySequence;
 import gov.usgs.earthquake.nshmp.geo.Location;
 import gov.usgs.earthquake.nshmp.gmm.Imt;
+import gov.usgs.earthquake.nshmp.www.hazard.HazardServiceUtils;
 
 import io.swagger.v3.core.util.Yaml;
 
@@ -83,8 +85,11 @@ class NshmTestUtils {
    * Test a NSHM.
    *
    * @param nshm The NSHM to test
+   * @throws ExecutionException
+   * @throws InterruptedException
    */
-  static void testNshm(Nshm nshm, Optional<Path> dataPath) {
+  static void testNshm(Nshm nshm, Optional<Path> dataPath)
+      throws InterruptedException, ExecutionException {
     NshmModel nshmModel = loadModel(nshm);
 
     for (NamedLocation location : nshm.locations()) {
@@ -138,13 +143,16 @@ class NshmTestUtils {
   }
 
   private static void compareCurves(NshmModel nshmModel, NamedLocation location,
-      Optional<Path> dataPath) {
+      Optional<Path> dataPath) throws InterruptedException, ExecutionException {
     Map<String, XySequence> actual = dataPath.isPresent()
         ? readExpected(nshmModel, location, dataPath) : generateActual(nshmModel, location);
+    Map<String, XySequence> webActual =
+        HazardServiceUtils.generateActual(location, nshmModel.nshm.imts());
     Map<String, XySequence> expected = readExpected(nshmModel, location, Optional.empty());
 
     for (String key : actual.keySet()) {
       assertCurveEquals(expected.get(key), actual.get(key), TOLERANCE);
+      assertCurveEquals(expected.get(key), webActual.get(key), TOLERANCE);
     }
   }
 
-- 
GitLab


From 7c2b1dc7a1ab123b6e80860262c0b39a45737102 Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Wed, 23 Oct 2024 10:21:34 -0600
Subject: [PATCH 02/26] test util to generate web results

---
 .../nshmp/www/hazard/HazardServiceUtils.java  | 42 +++++++++++++++++++
 1 file changed, 42 insertions(+)
 create mode 100644 src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java

diff --git a/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java b/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java
new file mode 100644
index 00000000..51256e41
--- /dev/null
+++ b/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java
@@ -0,0 +1,42 @@
+package gov.usgs.earthquake.nshmp.www.hazard;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.stream.Collectors;
+
+import gov.usgs.earthquake.nshmp.NamedLocation;
+import gov.usgs.earthquake.nshmp.calc.Hazard;
+import gov.usgs.earthquake.nshmp.data.XySequence;
+import gov.usgs.earthquake.nshmp.gmm.Imt;
+import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Request;
+
+import io.micronaut.http.HttpRequest;
+
+public class HazardServiceUtils {
+
+  public static Map<String, XySequence> generateActual(NamedLocation loc, Set<Imt> imts)
+      throws InterruptedException, ExecutionException {
+    Request request = new Request(
+        HttpRequest.GET(""),
+        loc.location().longitude,
+        loc.location().latitude,
+        760,
+        imts,
+        false,
+        false);
+
+    Hazard hazard = HazardService.calcHazard(request);
+
+    Map<String, XySequence> xyMap = hazard.curves().entrySet().stream()
+        .collect(Collectors.toMap(
+            e -> e.getKey().name(),
+            Entry::getValue,
+            (o1, o2) -> o1,
+            LinkedHashMap::new)); // preserve IMT enum order
+
+    return xyMap;
+  }
+}
-- 
GitLab


From c02b5e932469d2f7e01915864d461bc3d38375b5 Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Wed, 23 Oct 2024 10:22:22 -0600
Subject: [PATCH 03/26] add throws

---
 .../earthquake/nshmp/model/NshmTests.java     | 21 ++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTests.java b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTests.java
index 0c24c00c..14948d77 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTests.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTests.java
@@ -11,6 +11,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
+import java.util.concurrent.ExecutionException;
 
 import org.junit.jupiter.api.Test;
 
@@ -126,9 +127,11 @@ class NshmTests {
    * Test Alaska 2007 NSHM
    *
    * To run test: ./gradlew testAlaska2007
+   * @throws ExecutionException
+   * @throws InterruptedException
    */
   @Test
-  final void testAlaska2007() throws IOException {
+  final void testAlaska2007() throws IOException, InterruptedException, ExecutionException {
     Nshm nshm = NSHMS.get("nshm-alaska-2007");
     NshmTestUtils.testNshm(nshm, getDataPath(nshm));
   }
@@ -137,9 +140,11 @@ class NshmTests {
    * Test Alaska 2023 NSHM
    *
    * To run test: ./gradlew testAlaska2023
+   * @throws ExecutionException
+   * @throws InterruptedException
    */
   @Test
-  final void testAlaska2023() throws IOException {
+  final void testAlaska2023() throws IOException, InterruptedException, ExecutionException {
     Nshm nshm = NSHMS.get("nshm-alaska-2023");
     NshmTestUtils.testNshm(nshm, getDataPath(nshm));
   }
@@ -148,9 +153,11 @@ class NshmTests {
    * Test CONUS 2018 NSHM
    *
    * To run test: ./gradlew testConus2018
+   * @throws ExecutionException
+   * @throws InterruptedException
    */
   @Test
-  final void testConus2018() throws IOException {
+  final void testConus2018() throws IOException, InterruptedException, ExecutionException {
     Nshm nshm = NSHMS.get("nshm-conus-2018");
     NshmTestUtils.testNshm(nshm, getDataPath(nshm));
   }
@@ -159,9 +166,11 @@ class NshmTests {
    * Test CONUS 2023 NSHM
    *
    * To run test: ./gradlew testConus2023
+   * @throws ExecutionException
+   * @throws InterruptedException
    */
   @Test
-  final void testConus2023() throws IOException {
+  final void testConus2023() throws IOException, InterruptedException, ExecutionException {
     Nshm nshm = NSHMS.get("nshm-conus-2023");
     NshmTestUtils.testNshm(nshm, getDataPath(nshm));
   }
@@ -170,9 +179,11 @@ class NshmTests {
    * Test Hawaii 2021 NSHM
    *
    * To run test: ./gradlew testHawaii2021
+   * @throws ExecutionException
+   * @throws InterruptedException
    */
   @Test
-  final void testHawaii2021() throws IOException {
+  final void testHawaii2021() throws IOException, InterruptedException, ExecutionException {
     Nshm nshm = NSHMS.get("nshm-hawaii-2021");
     NshmTestUtils.testNshm(nshm, getDataPath(nshm));
   }
-- 
GitLab


From d14f91317afc32dead9895a3ec383e21eb383495 Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Wed, 23 Oct 2024 12:27:21 -0600
Subject: [PATCH 04/26] generate actual

---
 .../java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java  | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
index 9c75eb89..887e82d9 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
@@ -147,7 +147,10 @@ class NshmTestUtils {
     Map<String, XySequence> actual = dataPath.isPresent()
         ? readExpected(nshmModel, location, dataPath) : generateActual(nshmModel, location);
     Map<String, XySequence> webActual =
-        HazardServiceUtils.generateActual(location, nshmModel.nshm.imts());
+        HazardServiceUtils.generateActual(
+            location,
+            nshmModel.nshm.imts(),
+            nshmModel.nshm.nshmInfo.repo);
     Map<String, XySequence> expected = readExpected(nshmModel, location, Optional.empty());
 
     for (String key : actual.keySet()) {
-- 
GitLab


From 70b7752df6096692186496c453c61442d6224db4 Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Wed, 23 Oct 2024 12:27:51 -0600
Subject: [PATCH 05/26] generate

---
 .../nshmp/www/hazard/HazardServiceUtils.java    | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java b/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java
index 51256e41..0a9d4540 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java
@@ -11,14 +11,25 @@ import gov.usgs.earthquake.nshmp.NamedLocation;
 import gov.usgs.earthquake.nshmp.calc.Hazard;
 import gov.usgs.earthquake.nshmp.data.XySequence;
 import gov.usgs.earthquake.nshmp.gmm.Imt;
+import gov.usgs.earthquake.nshmp.www.Application;
 import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Request;
-
+import io.micronaut.context.ApplicationContext;
 import io.micronaut.http.HttpRequest;
+import io.micronaut.runtime.Micronaut;
+import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
 
+@MicronautTest
 public class HazardServiceUtils {
 
-  public static Map<String, XySequence> generateActual(NamedLocation loc, Set<Imt> imts)
+  public static Map<String, XySequence> generateActual(
+      NamedLocation loc,
+      Set<Imt> imts,
+      String model)
       throws InterruptedException, ExecutionException {
+    ApplicationContext context = Micronaut.build("--model=nshms/nshm-" + model)
+        .mainClass(Application.class)
+        .start();
+
     Request request = new Request(
         HttpRequest.GET(""),
         loc.location().longitude,
@@ -30,6 +41,8 @@ public class HazardServiceUtils {
 
     Hazard hazard = HazardService.calcHazard(request);
 
+    context.stop();
+
     Map<String, XySequence> xyMap = hazard.curves().entrySet().stream()
         .collect(Collectors.toMap(
             e -> e.getKey().name(),
-- 
GitLab


From 30679376476317cad0fa702c28b74303c948d30b Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Wed, 23 Oct 2024 12:29:30 -0600
Subject: [PATCH 06/26] clean

---
 .../gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java b/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java
index 0a9d4540..00a108df 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java
@@ -13,6 +13,7 @@ import gov.usgs.earthquake.nshmp.data.XySequence;
 import gov.usgs.earthquake.nshmp.gmm.Imt;
 import gov.usgs.earthquake.nshmp.www.Application;
 import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Request;
+
 import io.micronaut.context.ApplicationContext;
 import io.micronaut.http.HttpRequest;
 import io.micronaut.runtime.Micronaut;
-- 
GitLab


From 22d9308cff54a26f63f7c2452ac4c3104746fbd6 Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Wed, 23 Oct 2024 12:37:23 -0600
Subject: [PATCH 07/26] test

---
 .gitlab-ci.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 024d9215..9cd26692 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -238,7 +238,7 @@ NSHM Tests:
   script:
     - CI_RUNNER_MEMORY="$(awk '/MemTotal/ {printf( "%d\n", $2 / 1024 / 1024 * .90 )}' /proc/meminfo)g"
     - export CI_RUNNER_MEMORY
-    - ./gradlew generate${NSHM} --info
+    # - ./gradlew generate${NSHM} --info
     - ./gradlew test${NSHM} --info
     - cat ${JACOCO_HTML_DIR}/index.html
   stage: test
-- 
GitLab


From 414e0f7a4ff7ac8131b29cd4e889fa0fa00efab5 Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Wed, 23 Oct 2024 12:42:05 -0600
Subject: [PATCH 08/26] add path

---
 .../usgs/earthquake/nshmp/model/NshmTestUtils.java   | 12 +++++++++---
 .../nshmp/www/hazard/HazardServiceUtils.java         |  2 +-
 2 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
index 887e82d9..afb20de1 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
@@ -142,15 +142,21 @@ class NshmTestUtils {
         Double.valueOf(expected).equals(Double.valueOf(actual));
   }
 
-  private static void compareCurves(NshmModel nshmModel, NamedLocation location,
+  private static void compareCurves(
+      NshmModel nshmModel,
+      NamedLocation location,
       Optional<Path> dataPath) throws InterruptedException, ExecutionException {
+    Nshm nshm = nshmModel.nshm;
+
     Map<String, XySequence> actual = dataPath.isPresent()
         ? readExpected(nshmModel, location, dataPath) : generateActual(nshmModel, location);
+
     Map<String, XySequence> webActual =
         HazardServiceUtils.generateActual(
             location,
-            nshmModel.nshm.imts(),
-            nshmModel.nshm.nshmInfo.repo);
+            nshm.imts(),
+            nshm.nshmInfo.repo + nshm.nshmInfo.year);
+
     Map<String, XySequence> expected = readExpected(nshmModel, location, Optional.empty());
 
     for (String key : actual.keySet()) {
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java b/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java
index 00a108df..98d30ffc 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java
@@ -27,7 +27,7 @@ public class HazardServiceUtils {
       Set<Imt> imts,
       String model)
       throws InterruptedException, ExecutionException {
-    ApplicationContext context = Micronaut.build("--model=nshms/nshm-" + model)
+    ApplicationContext context = Micronaut.build("--model=nshms/" + model)
         .mainClass(Application.class)
         .start();
 
-- 
GitLab


From 0269a3999312d2f7852b2c4759568ee33f9f4b38 Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Wed, 23 Oct 2024 12:45:11 -0600
Subject: [PATCH 09/26] add formating

---
 .../java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
index afb20de1..bbbc9fba 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
@@ -155,7 +155,7 @@ class NshmTestUtils {
         HazardServiceUtils.generateActual(
             location,
             nshm.imts(),
-            nshm.nshmInfo.repo + nshm.nshmInfo.year);
+            String.format("%s-%s", nshm.nshmInfo.repo ,nshm.nshmInfo.year));
 
     Map<String, XySequence> expected = readExpected(nshmModel, location, Optional.empty());
 
-- 
GitLab


From 072365a6b4ef544c6a0996c6f62122d483e4b2e2 Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Wed, 23 Oct 2024 12:46:11 -0600
Subject: [PATCH 10/26] clean

---
 .../java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
index bbbc9fba..f5722837 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
@@ -155,7 +155,7 @@ class NshmTestUtils {
         HazardServiceUtils.generateActual(
             location,
             nshm.imts(),
-            String.format("%s-%s", nshm.nshmInfo.repo ,nshm.nshmInfo.year));
+            String.format("%s-%s", nshm.nshmInfo.repo, nshm.nshmInfo.year));
 
     Map<String, XySequence> expected = readExpected(nshmModel, location, Optional.empty());
 
-- 
GitLab


From ca795e3f19cd72d0cbf12585635ab5999b76b592 Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Wed, 23 Oct 2024 12:55:20 -0600
Subject: [PATCH 11/26] Remove context

---
 .../earthquake/nshmp/www/hazard/HazardServiceUtils.java    | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java b/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java
index 98d30ffc..23970fa9 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java
@@ -14,12 +14,9 @@ import gov.usgs.earthquake.nshmp.gmm.Imt;
 import gov.usgs.earthquake.nshmp.www.Application;
 import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Request;
 
-import io.micronaut.context.ApplicationContext;
 import io.micronaut.http.HttpRequest;
 import io.micronaut.runtime.Micronaut;
-import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
 
-@MicronautTest
 public class HazardServiceUtils {
 
   public static Map<String, XySequence> generateActual(
@@ -27,7 +24,7 @@ public class HazardServiceUtils {
       Set<Imt> imts,
       String model)
       throws InterruptedException, ExecutionException {
-    ApplicationContext context = Micronaut.build("--model=nshms/" + model)
+    Micronaut.build("--model=nshms/" + model)
         .mainClass(Application.class)
         .start();
 
@@ -42,8 +39,6 @@ public class HazardServiceUtils {
 
     Hazard hazard = HazardService.calcHazard(request);
 
-    context.stop();
-
     Map<String, XySequence> xyMap = hazard.curves().entrySet().stream()
         .collect(Collectors.toMap(
             e -> e.getKey().name(),
-- 
GitLab


From 1433ae8af9999b8527c378890506d6e340424af7 Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Wed, 23 Oct 2024 13:09:45 -0600
Subject: [PATCH 12/26] start service on test

---
 .../earthquake/nshmp/model/NshmTestUtils.java    | 16 ++++++++--------
 .../nshmp/www/hazard/HazardServiceUtils.java     |  9 +--------
 2 files changed, 9 insertions(+), 16 deletions(-)

diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
index f5722837..0b4ddb12 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
@@ -38,8 +38,10 @@ import gov.usgs.earthquake.nshmp.calc.Site;
 import gov.usgs.earthquake.nshmp.data.XySequence;
 import gov.usgs.earthquake.nshmp.geo.Location;
 import gov.usgs.earthquake.nshmp.gmm.Imt;
+import gov.usgs.earthquake.nshmp.www.Application;
 import gov.usgs.earthquake.nshmp.www.hazard.HazardServiceUtils;
 
+import io.micronaut.runtime.Micronaut;
 import io.swagger.v3.core.util.Yaml;
 
 /**
@@ -91,6 +93,10 @@ class NshmTestUtils {
   static void testNshm(Nshm nshm, Optional<Path> dataPath)
       throws InterruptedException, ExecutionException {
     NshmModel nshmModel = loadModel(nshm);
+    var context = Micronaut
+        .build("--model=nshms/" + String.format("%s-%s", nshm.nshmInfo.repo, nshm.nshmInfo.year))
+        .mainClass(Application.class)
+        .start();
 
     for (NamedLocation location : nshm.locations()) {
       LOGGER.info("Location: " + location.toString());
@@ -98,6 +104,7 @@ class NshmTestUtils {
     }
 
     nshmModel.exec.shutdown();
+    context.close();
   }
 
   /**
@@ -146,17 +153,10 @@ class NshmTestUtils {
       NshmModel nshmModel,
       NamedLocation location,
       Optional<Path> dataPath) throws InterruptedException, ExecutionException {
-    Nshm nshm = nshmModel.nshm;
-
     Map<String, XySequence> actual = dataPath.isPresent()
         ? readExpected(nshmModel, location, dataPath) : generateActual(nshmModel, location);
-
     Map<String, XySequence> webActual =
-        HazardServiceUtils.generateActual(
-            location,
-            nshm.imts(),
-            String.format("%s-%s", nshm.nshmInfo.repo, nshm.nshmInfo.year));
-
+        HazardServiceUtils.generateActual(location, nshmModel.nshm.imts());
     Map<String, XySequence> expected = readExpected(nshmModel, location, Optional.empty());
 
     for (String key : actual.keySet()) {
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java b/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java
index 23970fa9..d7649d09 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/www/hazard/HazardServiceUtils.java
@@ -11,23 +11,16 @@ import gov.usgs.earthquake.nshmp.NamedLocation;
 import gov.usgs.earthquake.nshmp.calc.Hazard;
 import gov.usgs.earthquake.nshmp.data.XySequence;
 import gov.usgs.earthquake.nshmp.gmm.Imt;
-import gov.usgs.earthquake.nshmp.www.Application;
 import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Request;
 
 import io.micronaut.http.HttpRequest;
-import io.micronaut.runtime.Micronaut;
 
 public class HazardServiceUtils {
 
   public static Map<String, XySequence> generateActual(
       NamedLocation loc,
-      Set<Imt> imts,
-      String model)
+      Set<Imt> imts)
       throws InterruptedException, ExecutionException {
-    Micronaut.build("--model=nshms/" + model)
-        .mainClass(Application.class)
-        .start();
-
     Request request = new Request(
         HttpRequest.GET(""),
         loc.location().longitude,
-- 
GitLab


From 716ffc684c8adaebb8d883534f5aef9cea3e3174 Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Wed, 23 Oct 2024 13:53:56 -0600
Subject: [PATCH 13/26] test

---
 .../earthquake/nshmp/www/ServletUtil.java     |  1 +
 .../earthquake/nshmp/model/NshmTestUtils.java | 41 ++++++++++++++-----
 2 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/ServletUtil.java b/src/main/java/gov/usgs/earthquake/nshmp/www/ServletUtil.java
index 23f3917b..d9bf18cf 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/ServletUtil.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/ServletUtil.java
@@ -15,6 +15,7 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
 import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Stopwatch;
 import com.google.common.util.concurrent.ListeningExecutorService;
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
index 0b4ddb12..f64c4cae 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
@@ -93,6 +93,15 @@ class NshmTestUtils {
   static void testNshm(Nshm nshm, Optional<Path> dataPath)
       throws InterruptedException, ExecutionException {
     NshmModel nshmModel = loadModel(nshm);
+
+    for (NamedLocation location : nshm.locations()) {
+      LOGGER.info("Location: " + location.toString());
+      compareCurves(nshmModel, location, dataPath);
+    }
+
+    nshmModel.exec.shutdown();
+
+
     var context = Micronaut
         .build("--model=nshms/" + String.format("%s-%s", nshm.nshmInfo.repo, nshm.nshmInfo.year))
         .mainClass(Application.class)
@@ -100,10 +109,9 @@ class NshmTestUtils {
 
     for (NamedLocation location : nshm.locations()) {
       LOGGER.info("Location: " + location.toString());
-      compareCurves(nshmModel, location, dataPath);
+      compareWebCurves(nshm, location, dataPath);
     }
 
-    nshmModel.exec.shutdown();
     context.close();
   }
 
@@ -152,16 +160,27 @@ class NshmTestUtils {
   private static void compareCurves(
       NshmModel nshmModel,
       NamedLocation location,
-      Optional<Path> dataPath) throws InterruptedException, ExecutionException {
+      Optional<Path> dataPath
+      ) throws ExecutionException {
     Map<String, XySequence> actual = dataPath.isPresent()
-        ? readExpected(nshmModel, location, dataPath) : generateActual(nshmModel, location);
-    Map<String, XySequence> webActual =
-        HazardServiceUtils.generateActual(location, nshmModel.nshm.imts());
-    Map<String, XySequence> expected = readExpected(nshmModel, location, Optional.empty());
+        ? readExpected(nshmModel.nshm, location, dataPath) : generateActual(nshmModel, location);
+    Map<String, XySequence> expected = readExpected(nshmModel.nshm, location, Optional.empty());
+
+    for (String key : actual.keySet()) {
+      assertCurveEquals(expected.get(key), actual.get(key), TOLERANCE);
+    }
+  }
+
+  private static void compareWebCurves(
+      Nshm nshm,
+      NamedLocation location,
+      Optional<Path> dataPath) throws InterruptedException, ExecutionException {
+    Map<String, XySequence> actual =
+        HazardServiceUtils.generateActual(location, nshm.imts());
+    Map<String, XySequence> expected = readExpected(nshm, location, Optional.empty());
 
     for (String key : actual.keySet()) {
       assertCurveEquals(expected.get(key), actual.get(key), TOLERANCE);
-      assertCurveEquals(expected.get(key), webActual.get(key), TOLERANCE);
     }
   }
 
@@ -193,11 +212,11 @@ class NshmTestUtils {
     return xyMap;
   }
 
-  private static Map<String, XySequence> readExpected(NshmModel nshmModel, NamedLocation loc,
+  private static Map<String, XySequence> readExpected(Nshm nshm, NamedLocation loc,
       Optional<Path> dataPath) {
     Path resultPath = dataPath.orElse(DATA_PATH)
-        .resolve(nshmModel.nshm.modelName())
-        .resolve(nshmModel.nshm.resultFilename(loc));
+        .resolve(nshm.modelName())
+        .resolve(nshm.resultFilename(loc));
 
     JsonObject obj = null;
     try (BufferedReader br = Files.newBufferedReader(resultPath)) {
-- 
GitLab


From a865650112b208816343e59997f5c759d89f4624 Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Wed, 23 Oct 2024 13:55:53 -0600
Subject: [PATCH 14/26] clean

---
 src/main/java/gov/usgs/earthquake/nshmp/www/ServletUtil.java  | 1 -
 .../java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java   | 4 +---
 2 files changed, 1 insertion(+), 4 deletions(-)

diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/ServletUtil.java b/src/main/java/gov/usgs/earthquake/nshmp/www/ServletUtil.java
index d9bf18cf..23f3917b 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/www/ServletUtil.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/www/ServletUtil.java
@@ -15,7 +15,6 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Stopwatch;
 import com.google.common.util.concurrent.ListeningExecutorService;
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
index f64c4cae..ce86c0db 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
@@ -101,7 +101,6 @@ class NshmTestUtils {
 
     nshmModel.exec.shutdown();
 
-
     var context = Micronaut
         .build("--model=nshms/" + String.format("%s-%s", nshm.nshmInfo.repo, nshm.nshmInfo.year))
         .mainClass(Application.class)
@@ -160,8 +159,7 @@ class NshmTestUtils {
   private static void compareCurves(
       NshmModel nshmModel,
       NamedLocation location,
-      Optional<Path> dataPath
-      ) throws ExecutionException {
+      Optional<Path> dataPath) throws ExecutionException {
     Map<String, XySequence> actual = dataPath.isPresent()
         ? readExpected(nshmModel.nshm, location, dataPath) : generateActual(nshmModel, location);
     Map<String, XySequence> expected = readExpected(nshmModel.nshm, location, Optional.empty());
-- 
GitLab


From 39f62effa47663dfe4f09fd4d9a2285b4224787a Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Wed, 23 Oct 2024 13:58:34 -0600
Subject: [PATCH 15/26] test

---
 .gitlab-ci.yml                                |  1 +
 .../earthquake/nshmp/model/NshmTestUtils.java | 22 +++++++++++++++++++
 .../earthquake/nshmp/model/NshmTests.java     | 13 +++++++++++
 3 files changed, 36 insertions(+)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 9cd26692..1670e7a0 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -232,6 +232,7 @@ NSHM Tests:
     matrix:
       - NSHM: Alaska2007
       - NSHM: Alaska2023
+      - NSHM: WebAlaska2023
       - NSHM: Conus2018
       - NSHM: Conus2023
       - NSHM: Hawaii2021
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
index ce86c0db..2304709e 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
@@ -114,6 +114,28 @@ class NshmTestUtils {
     context.close();
   }
 
+  /**
+   * Test a NSHM.
+   *
+   * @param nshm The NSHM to test
+   * @throws ExecutionException
+   * @throws InterruptedException
+   */
+  static void testWebNshm(Nshm nshm, Optional<Path> dataPath)
+      throws InterruptedException, ExecutionException {
+    var context = Micronaut
+        .build("--model=nshms/" + String.format("%s-%s", nshm.nshmInfo.repo, nshm.nshmInfo.year))
+        .mainClass(Application.class)
+        .start();
+
+    for (NamedLocation location : nshm.locations()) {
+      LOGGER.info("Location: " + location.toString());
+      compareWebCurves(nshm, location, dataPath);
+    }
+
+    context.close();
+  }
+
   /**
    * Write expected values
    *
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTests.java b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTests.java
index 14948d77..928bf90d 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTests.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTests.java
@@ -149,6 +149,19 @@ class NshmTests {
     NshmTestUtils.testNshm(nshm, getDataPath(nshm));
   }
 
+  /**
+   * Test Alaska 2023 NSHM
+   *
+   * To run test: ./gradlew testWebAlaska2023
+   * @throws ExecutionException
+   * @throws InterruptedException
+   */
+  @Test
+  final void testWebAlaska2023() throws IOException, InterruptedException, ExecutionException {
+    Nshm nshm = NSHMS.get("nshm-alaska-2023");
+    NshmTestUtils.testWebNshm(nshm, getDataPath(nshm));
+  }
+
   /**
    * Test CONUS 2018 NSHM
    *
-- 
GitLab


From 7610e8d9e613eecfe3ed521d3f8ab078562e2ee4 Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Wed, 23 Oct 2024 14:53:59 -0600
Subject: [PATCH 16/26] add web test

---
 gradle/nshm.gradle | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/gradle/nshm.gradle b/gradle/nshm.gradle
index c125f642..2d4bb044 100644
--- a/gradle/nshm.gradle
+++ b/gradle/nshm.gradle
@@ -208,6 +208,32 @@ task testAlaska2023(type: Test) {
   }
 }
 
+// Test Alaska 2023 NSHM
+task testWebAlaska2023(type: Test) {
+  description = "Test Alaska 2023 NSHM"
+  group = "verification"
+
+  doFirst {
+    downloadNshm(findNshm("nshm-alaska", 2023))
+  }
+
+  testLogging {
+    exceptionFormat "full"
+  }
+
+  systemProperties(System.getProperties())
+
+  useJUnitPlatform()
+  jvmArgs(
+      "-Xms2g",
+      "-Xmx${xmx}",
+      )
+
+  filter {
+    includeTestsMatching "gov.usgs.earthquake.nshmp.model.NshmTests.testWebAlaska2023"
+  }
+}
+
 // Test CONUS 2018 NSHM
 task testConus2018(type: Test) {
   description = "Test CONUS 2018 NSHM"
-- 
GitLab


From 7c2c58b30338ad0a7c107e51749c7c1f1d4e3c48 Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Wed, 23 Oct 2024 15:04:11 -0600
Subject: [PATCH 17/26] remove web

---
 .../usgs/earthquake/nshmp/model/NshmTestUtils.java   | 12 ------------
 1 file changed, 12 deletions(-)

diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
index 2304709e..d786a262 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
@@ -100,18 +100,6 @@ class NshmTestUtils {
     }
 
     nshmModel.exec.shutdown();
-
-    var context = Micronaut
-        .build("--model=nshms/" + String.format("%s-%s", nshm.nshmInfo.repo, nshm.nshmInfo.year))
-        .mainClass(Application.class)
-        .start();
-
-    for (NamedLocation location : nshm.locations()) {
-      LOGGER.info("Location: " + location.toString());
-      compareWebCurves(nshm, location, dataPath);
-    }
-
-    context.close();
   }
 
   /**
-- 
GitLab


From 2ed36d9ba4d5c78881f31b00137df14ef049c3cf Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Wed, 23 Oct 2024 15:36:24 -0600
Subject: [PATCH 18/26] add web tests

---
 .gitlab-ci.yml | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1670e7a0..5dc44d4b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -239,7 +239,31 @@ NSHM Tests:
   script:
     - CI_RUNNER_MEMORY="$(awk '/MemTotal/ {printf( "%d\n", $2 / 1024 / 1024 * .90 )}' /proc/meminfo)g"
     - export CI_RUNNER_MEMORY
-    # - ./gradlew generate${NSHM} --info
+    - ./gradlew generate${NSHM} --info
+    - ./gradlew test${NSHM} --info
+    - cat ${JACOCO_HTML_DIR}/index.html
+  stage: test
+  tags:
+    - nshmp
+
+NSHM Web Tests:
+  artifacts:
+    paths:
+      - ${JACOCO_HTML_DIR}
+    reports:
+      junit: ${JUNIT_FILES}
+  coverage: '/Total.*?([0-9]{1,3})%/'
+  needs: []
+  parallel:
+    matrix:
+      # - NSHM: Alaska2007
+      - NSHM: WebAlaska2023
+      # - NSHM: Conus2018
+      # - NSHM: Conus2023
+      # - NSHM: Hawaii2021
+  script:
+    - CI_RUNNER_MEMORY="$(awk '/MemTotal/ {printf( "%d\n", $2 / 1024 / 1024 * .90 )}' /proc/meminfo)g"
+    - export CI_RUNNER_MEMORY
     - ./gradlew test${NSHM} --info
     - cat ${JACOCO_HTML_DIR}/index.html
   stage: test
-- 
GitLab


From 81b2960bb39923fb211aca2bd40adf947eee3ade Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Wed, 23 Oct 2024 15:38:03 -0600
Subject: [PATCH 19/26] remove web

---
 .gitlab-ci.yml | 1 -
 1 file changed, 1 deletion(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 5dc44d4b..218e7df5 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -232,7 +232,6 @@ NSHM Tests:
     matrix:
       - NSHM: Alaska2007
       - NSHM: Alaska2023
-      - NSHM: WebAlaska2023
       - NSHM: Conus2018
       - NSHM: Conus2023
       - NSHM: Hawaii2021
-- 
GitLab


From c6df64bf0f98bc296262c9f4dc4199969cd5eaef Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Thu, 24 Oct 2024 09:37:20 -0600
Subject: [PATCH 20/26] generate

---
 .gitlab-ci.yml                                |  1 +
 gradle/nshm.gradle                            | 14 +++++++++++++
 .../nshmp/model/GenerateWebActual.java        | 21 +++++++++++++++++++
 .../earthquake/nshmp/model/NshmTestUtils.java | 12 +++++++++++
 4 files changed, 48 insertions(+)
 create mode 100644 src/test/java/gov/usgs/earthquake/nshmp/model/GenerateWebActual.java

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 218e7df5..9b24982b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -263,6 +263,7 @@ NSHM Web Tests:
   script:
     - CI_RUNNER_MEMORY="$(awk '/MemTotal/ {printf( "%d\n", $2 / 1024 / 1024 * .90 )}' /proc/meminfo)g"
     - export CI_RUNNER_MEMORY
+    - ./gradlew generate${NSHM} --info
     - ./gradlew test${NSHM} --info
     - cat ${JACOCO_HTML_DIR}/index.html
   stage: test
diff --git a/gradle/nshm.gradle b/gradle/nshm.gradle
index 2d4bb044..d4bce26c 100644
--- a/gradle/nshm.gradle
+++ b/gradle/nshm.gradle
@@ -100,6 +100,20 @@ task generateAlaska2023(type: JavaExec) {
   main = "gov.usgs.earthquake.nshmp.model.GenerateActual"
 }
 
+// Generate Alaska 2023 for CI
+task generateWebAlaska2023(type: JavaExec) {
+  description = "Generate alaska-2023 acutal for CI/CD"
+  classpath = sourceSets.test.runtimeClasspath
+
+  doFirst {
+    downloadNshm(findNshm("nshm-alaska", 2023))
+  }
+
+  jvmArgs("-DNSHM=nshm-alaska-2023")
+
+  main = "gov.usgs.earthquake.nshmp.model.GenerateWebActual"
+}
+
 
 // Generate CONUS 2018 for CI
 task generateConus2018(type: JavaExec) {
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateWebActual.java b/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateWebActual.java
new file mode 100644
index 00000000..8c3bd048
--- /dev/null
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateWebActual.java
@@ -0,0 +1,21 @@
+package gov.usgs.earthquake.nshmp.model;
+
+import java.util.Optional;
+
+import gov.usgs.earthquake.nshmp.model.NshmTestUtils.Nshm;
+import gov.usgs.earthquake.nshmp.www.Application;
+import io.micronaut.runtime.Micronaut;
+
+public class GenerateWebActual {
+
+  public static void main(String[] args) {
+    Nshm nshm = NshmTests.NSHMS.get(System.getProperty("NSHM"));
+    var context = Micronaut
+        .build("--model=" + nshm.modelPath())
+        .mainClass(Application.class)
+        .start();
+    NshmTestUtils.writeWebExpecteds(nshm, Optional.of(NshmTests.DATA_PATH));
+    context.close();
+  }
+
+}
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
index d786a262..e356db56 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
@@ -139,6 +139,18 @@ class NshmTestUtils {
     }
   }
 
+  static void writeWebExpecteds(
+      Nshm nshm,
+      Optional<Path> dataPath) throws InterruptedException, ExecutionException, IOException {
+    for (NamedLocation location: nshm.locations()) {
+      Map<String, XySequence> xyMap = HazardServiceUtils.generateActual(location, nshm.imts());
+      String json = new StringBuilder(GSON.toJson(xyMap))
+          .append(Text.NEWLINE)
+          .toString();
+      writeExpected(nshm, location, json, dataPath);
+    }
+  }
+
   private static void assertCurveEquals(XySequence expected, XySequence actual, double tol) {
     // IMLs close but not exact due to exp() transform
     assertArrayEquals(
-- 
GitLab


From d0ec42f0ec4d577dcbc512ae3ad5cfb59fd2ee37 Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Thu, 24 Oct 2024 09:37:55 -0600
Subject: [PATCH 21/26] spotless

---
 .../java/gov/usgs/earthquake/nshmp/model/GenerateWebActual.java | 1 +
 .../java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java     | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateWebActual.java b/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateWebActual.java
index 8c3bd048..185b21be 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateWebActual.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateWebActual.java
@@ -4,6 +4,7 @@ import java.util.Optional;
 
 import gov.usgs.earthquake.nshmp.model.NshmTestUtils.Nshm;
 import gov.usgs.earthquake.nshmp.www.Application;
+
 import io.micronaut.runtime.Micronaut;
 
 public class GenerateWebActual {
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
index e356db56..39ac655b 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
@@ -142,7 +142,7 @@ class NshmTestUtils {
   static void writeWebExpecteds(
       Nshm nshm,
       Optional<Path> dataPath) throws InterruptedException, ExecutionException, IOException {
-    for (NamedLocation location: nshm.locations()) {
+    for (NamedLocation location : nshm.locations()) {
       Map<String, XySequence> xyMap = HazardServiceUtils.generateActual(location, nshm.imts());
       String json = new StringBuilder(GSON.toJson(xyMap))
           .append(Text.NEWLINE)
-- 
GitLab


From 9138ef3ddd49e89efac44a116b92098307f13bdb Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Thu, 24 Oct 2024 09:38:20 -0600
Subject: [PATCH 22/26] add throws

---
 .../gov/usgs/earthquake/nshmp/model/GenerateWebActual.java   | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateWebActual.java b/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateWebActual.java
index 185b21be..20072a35 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateWebActual.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateWebActual.java
@@ -1,6 +1,8 @@
 package gov.usgs.earthquake.nshmp.model;
 
+import java.io.IOException;
 import java.util.Optional;
+import java.util.concurrent.ExecutionException;
 
 import gov.usgs.earthquake.nshmp.model.NshmTestUtils.Nshm;
 import gov.usgs.earthquake.nshmp.www.Application;
@@ -9,7 +11,8 @@ import io.micronaut.runtime.Micronaut;
 
 public class GenerateWebActual {
 
-  public static void main(String[] args) {
+  public static void main(String[] args)
+      throws InterruptedException, ExecutionException, IOException {
     Nshm nshm = NshmTests.NSHMS.get(System.getProperty("NSHM"));
     var context = Micronaut
         .build("--model=" + nshm.modelPath())
-- 
GitLab


From dd91b2fd07673f3a19e76d362feecd6bc2ab7413 Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Thu, 24 Oct 2024 09:46:38 -0600
Subject: [PATCH 23/26] add check

---
 .../java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java  | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
index 39ac655b..9204d8f5 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
@@ -195,8 +195,9 @@ class NshmTestUtils {
       Nshm nshm,
       NamedLocation location,
       Optional<Path> dataPath) throws InterruptedException, ExecutionException {
-    Map<String, XySequence> actual =
-        HazardServiceUtils.generateActual(location, nshm.imts());
+    Map<String, XySequence> actual = dataPath.isPresent()
+        ? readExpected(nshm, location, dataPath)
+        : HazardServiceUtils.generateActual(location, nshm.imts());
     Map<String, XySequence> expected = readExpected(nshm, location, Optional.empty());
 
     for (String key : actual.keySet()) {
-- 
GitLab


From d55e838334ff45ed29fac7cae58635a6606c4be9 Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Thu, 24 Oct 2024 09:56:55 -0600
Subject: [PATCH 24/26] Test web

---
 .gitlab-ci.yml                                | 25 -----------
 gradle/nshm.gradle                            | 41 -------------------
 .../nshmp/model/GenerateActual.java           | 15 ++++++-
 .../nshmp/model/GenerateWebActual.java        | 25 -----------
 .../earthquake/nshmp/model/NshmTests.java     | 23 +++++------
 5 files changed, 25 insertions(+), 104 deletions(-)
 delete mode 100644 src/test/java/gov/usgs/earthquake/nshmp/model/GenerateWebActual.java

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 9b24982b..024d9215 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -245,31 +245,6 @@ NSHM Tests:
   tags:
     - nshmp
 
-NSHM Web Tests:
-  artifacts:
-    paths:
-      - ${JACOCO_HTML_DIR}
-    reports:
-      junit: ${JUNIT_FILES}
-  coverage: '/Total.*?([0-9]{1,3})%/'
-  needs: []
-  parallel:
-    matrix:
-      # - NSHM: Alaska2007
-      - NSHM: WebAlaska2023
-      # - NSHM: Conus2018
-      # - NSHM: Conus2023
-      # - NSHM: Hawaii2021
-  script:
-    - CI_RUNNER_MEMORY="$(awk '/MemTotal/ {printf( "%d\n", $2 / 1024 / 1024 * .90 )}' /proc/meminfo)g"
-    - export CI_RUNNER_MEMORY
-    - ./gradlew generate${NSHM} --info
-    - ./gradlew test${NSHM} --info
-    - cat ${JACOCO_HTML_DIR}/index.html
-  stage: test
-  tags:
-    - nshmp
-
 YAML Lint:
   allow_failure: true
   needs: []
diff --git a/gradle/nshm.gradle b/gradle/nshm.gradle
index d4bce26c..2bcfe083 100644
--- a/gradle/nshm.gradle
+++ b/gradle/nshm.gradle
@@ -100,21 +100,6 @@ task generateAlaska2023(type: JavaExec) {
   main = "gov.usgs.earthquake.nshmp.model.GenerateActual"
 }
 
-// Generate Alaska 2023 for CI
-task generateWebAlaska2023(type: JavaExec) {
-  description = "Generate alaska-2023 acutal for CI/CD"
-  classpath = sourceSets.test.runtimeClasspath
-
-  doFirst {
-    downloadNshm(findNshm("nshm-alaska", 2023))
-  }
-
-  jvmArgs("-DNSHM=nshm-alaska-2023")
-
-  main = "gov.usgs.earthquake.nshmp.model.GenerateWebActual"
-}
-
-
 // Generate CONUS 2018 for CI
 task generateConus2018(type: JavaExec) {
   description = "Generate conus-2018 acutal for CI/CD"
@@ -222,32 +207,6 @@ task testAlaska2023(type: Test) {
   }
 }
 
-// Test Alaska 2023 NSHM
-task testWebAlaska2023(type: Test) {
-  description = "Test Alaska 2023 NSHM"
-  group = "verification"
-
-  doFirst {
-    downloadNshm(findNshm("nshm-alaska", 2023))
-  }
-
-  testLogging {
-    exceptionFormat "full"
-  }
-
-  systemProperties(System.getProperties())
-
-  useJUnitPlatform()
-  jvmArgs(
-      "-Xms2g",
-      "-Xmx${xmx}",
-      )
-
-  filter {
-    includeTestsMatching "gov.usgs.earthquake.nshmp.model.NshmTests.testWebAlaska2023"
-  }
-}
-
 // Test CONUS 2018 NSHM
 task testConus2018(type: Test) {
   description = "Test CONUS 2018 NSHM"
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateActual.java b/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateActual.java
index 4a9c54d1..1f868a19 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateActual.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateActual.java
@@ -2,9 +2,12 @@ package gov.usgs.earthquake.nshmp.model;
 
 import java.io.IOException;
 import java.util.Optional;
+import java.util.concurrent.ExecutionException;
 
 import gov.usgs.earthquake.nshmp.model.NshmTestUtils.Nshm;
 import gov.usgs.earthquake.nshmp.model.NshmTestUtils.NshmModel;
+import gov.usgs.earthquake.nshmp.www.Application;
+import io.micronaut.runtime.Micronaut;
 
 /**
  * Generate actual results to compare to expected results.
@@ -15,10 +18,20 @@ import gov.usgs.earthquake.nshmp.model.NshmTestUtils.NshmModel;
  */
 class GenerateActual {
 
-  public static void main(String[] args) throws IOException {
+  public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
     Nshm nshm = NshmTests.NSHMS.get(System.getProperty("NSHM"));
+
+    // Generate command line
     NshmModel nshmModel = NshmTestUtils.loadModel(nshm);
     NshmTestUtils.writeExpecteds(nshmModel, Optional.of(NshmTests.DATA_PATH));
     nshmModel.exec.shutdown();
+
+    // Generate web
+    var context = Micronaut
+        .build("--model=" + nshm.modelPath())
+        .mainClass(Application.class)
+        .start();
+    NshmTestUtils.writeWebExpecteds(nshm, Optional.of(NshmTests.WEB_DATA_PATH));
+    context.close();
   }
 }
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateWebActual.java b/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateWebActual.java
deleted file mode 100644
index 20072a35..00000000
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateWebActual.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package gov.usgs.earthquake.nshmp.model;
-
-import java.io.IOException;
-import java.util.Optional;
-import java.util.concurrent.ExecutionException;
-
-import gov.usgs.earthquake.nshmp.model.NshmTestUtils.Nshm;
-import gov.usgs.earthquake.nshmp.www.Application;
-
-import io.micronaut.runtime.Micronaut;
-
-public class GenerateWebActual {
-
-  public static void main(String[] args)
-      throws InterruptedException, ExecutionException, IOException {
-    Nshm nshm = NshmTests.NSHMS.get(System.getProperty("NSHM"));
-    var context = Micronaut
-        .build("--model=" + nshm.modelPath())
-        .mainClass(Application.class)
-        .start();
-    NshmTestUtils.writeWebExpecteds(nshm, Optional.of(NshmTests.DATA_PATH));
-    context.close();
-  }
-
-}
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTests.java b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTests.java
index 928bf90d..3545c1f9 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTests.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTests.java
@@ -27,6 +27,7 @@ import gov.usgs.earthquake.nshmp.site.NshmpSite;
  */
 class NshmTests {
   static Path DATA_PATH = Paths.get("src/test/resources/e2e/actual");
+  static Path WEB_DATA_PATH = Paths.get("src/test/resources/e2e/actual/web");
 
   /* Alaska test sites */
   private static final List<NamedLocation> ALASKA_LOCATIONS = List.of(
@@ -134,6 +135,7 @@ class NshmTests {
   final void testAlaska2007() throws IOException, InterruptedException, ExecutionException {
     Nshm nshm = NSHMS.get("nshm-alaska-2007");
     NshmTestUtils.testNshm(nshm, getDataPath(nshm));
+    NshmTestUtils.testWebNshm(nshm, getWebDataPath(nshm));
   }
 
   /**
@@ -147,20 +149,9 @@ class NshmTests {
   final void testAlaska2023() throws IOException, InterruptedException, ExecutionException {
     Nshm nshm = NSHMS.get("nshm-alaska-2023");
     NshmTestUtils.testNshm(nshm, getDataPath(nshm));
+    NshmTestUtils.testWebNshm(nshm, getWebDataPath(nshm));
   }
 
-  /**
-   * Test Alaska 2023 NSHM
-   *
-   * To run test: ./gradlew testWebAlaska2023
-   * @throws ExecutionException
-   * @throws InterruptedException
-   */
-  @Test
-  final void testWebAlaska2023() throws IOException, InterruptedException, ExecutionException {
-    Nshm nshm = NSHMS.get("nshm-alaska-2023");
-    NshmTestUtils.testWebNshm(nshm, getDataPath(nshm));
-  }
 
   /**
    * Test CONUS 2018 NSHM
@@ -173,6 +164,7 @@ class NshmTests {
   final void testConus2018() throws IOException, InterruptedException, ExecutionException {
     Nshm nshm = NSHMS.get("nshm-conus-2018");
     NshmTestUtils.testNshm(nshm, getDataPath(nshm));
+    NshmTestUtils.testWebNshm(nshm, getWebDataPath(nshm));
   }
 
   /**
@@ -186,6 +178,7 @@ class NshmTests {
   final void testConus2023() throws IOException, InterruptedException, ExecutionException {
     Nshm nshm = NSHMS.get("nshm-conus-2023");
     NshmTestUtils.testNshm(nshm, getDataPath(nshm));
+    NshmTestUtils.testWebNshm(nshm, getWebDataPath(nshm));
   }
 
   /**
@@ -199,6 +192,7 @@ class NshmTests {
   final void testHawaii2021() throws IOException, InterruptedException, ExecutionException {
     Nshm nshm = NSHMS.get("nshm-hawaii-2021");
     NshmTestUtils.testNshm(nshm, getDataPath(nshm));
+    NshmTestUtils.testWebNshm(nshm, getWebDataPath(nshm));
   }
 
   /**
@@ -216,4 +210,9 @@ class NshmTests {
     return Files.exists(DATA_PATH.resolve(nshm.modelName())) ? Optional.of(DATA_PATH)
         : Optional.empty();
   }
+
+  private static Optional<Path> getWebDataPath(Nshm nshm) {
+    return Files.exists(DATA_PATH.resolve(nshm.modelName())) ? Optional.of(DATA_PATH)
+        : Optional.empty();
+  }
 }
-- 
GitLab


From 978309feab4f857f4053559881c9469624990554 Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Thu, 24 Oct 2024 09:57:19 -0600
Subject: [PATCH 25/26] spotless

---
 .../java/gov/usgs/earthquake/nshmp/model/GenerateActual.java  | 4 +++-
 src/test/java/gov/usgs/earthquake/nshmp/model/NshmTests.java  | 1 -
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateActual.java b/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateActual.java
index 1f868a19..4e3c292a 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateActual.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateActual.java
@@ -7,6 +7,7 @@ import java.util.concurrent.ExecutionException;
 import gov.usgs.earthquake.nshmp.model.NshmTestUtils.Nshm;
 import gov.usgs.earthquake.nshmp.model.NshmTestUtils.NshmModel;
 import gov.usgs.earthquake.nshmp.www.Application;
+
 import io.micronaut.runtime.Micronaut;
 
 /**
@@ -18,7 +19,8 @@ import io.micronaut.runtime.Micronaut;
  */
 class GenerateActual {
 
-  public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
+  public static void main(String[] args)
+      throws IOException, InterruptedException, ExecutionException {
     Nshm nshm = NshmTests.NSHMS.get(System.getProperty("NSHM"));
 
     // Generate command line
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTests.java b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTests.java
index 3545c1f9..38f8f37d 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTests.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTests.java
@@ -152,7 +152,6 @@ class NshmTests {
     NshmTestUtils.testWebNshm(nshm, getWebDataPath(nshm));
   }
 
-
   /**
    * Test CONUS 2018 NSHM
    *
-- 
GitLab


From a33125188250976264a2f90df8fa7953f4a48612 Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Thu, 24 Oct 2024 10:21:35 -0600
Subject: [PATCH 26/26] optional

---
 .../nshmp/model/GenerateActual.java           |  3 +-
 .../earthquake/nshmp/model/NshmTestUtils.java | 35 ++++++++++++-------
 2 files changed, 25 insertions(+), 13 deletions(-)

diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateActual.java b/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateActual.java
index 4e3c292a..8996fb07 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateActual.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/GenerateActual.java
@@ -8,6 +8,7 @@ import gov.usgs.earthquake.nshmp.model.NshmTestUtils.Nshm;
 import gov.usgs.earthquake.nshmp.model.NshmTestUtils.NshmModel;
 import gov.usgs.earthquake.nshmp.www.Application;
 
+import io.micronaut.context.ApplicationContext;
 import io.micronaut.runtime.Micronaut;
 
 /**
@@ -29,7 +30,7 @@ class GenerateActual {
     nshmModel.exec.shutdown();
 
     // Generate web
-    var context = Micronaut
+    ApplicationContext context = Micronaut
         .build("--model=" + nshm.modelPath())
         .mainClass(Application.class)
         .start();
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
index 9204d8f5..89852afa 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/model/NshmTestUtils.java
@@ -41,6 +41,7 @@ import gov.usgs.earthquake.nshmp.gmm.Imt;
 import gov.usgs.earthquake.nshmp.www.Application;
 import gov.usgs.earthquake.nshmp.www.hazard.HazardServiceUtils;
 
+import io.micronaut.context.ApplicationContext;
 import io.micronaut.runtime.Micronaut;
 import io.swagger.v3.core.util.Yaml;
 
@@ -92,14 +93,18 @@ class NshmTestUtils {
    */
   static void testNshm(Nshm nshm, Optional<Path> dataPath)
       throws InterruptedException, ExecutionException {
-    NshmModel nshmModel = loadModel(nshm);
+    Optional<NshmModel> nshmModel = Optional.empty();
+
+    if (dataPath.isEmpty()) {
+      nshmModel = Optional.of(loadModel(nshm));
+    }
 
     for (NamedLocation location : nshm.locations()) {
       LOGGER.info("Location: " + location.toString());
-      compareCurves(nshmModel, location, dataPath);
+      compareCurves(nshm, location, nshmModel, dataPath);
     }
 
-    nshmModel.exec.shutdown();
+    nshmModel.ifPresent(model -> model.exec.shutdown());
   }
 
   /**
@@ -111,17 +116,22 @@ class NshmTestUtils {
    */
   static void testWebNshm(Nshm nshm, Optional<Path> dataPath)
       throws InterruptedException, ExecutionException {
-    var context = Micronaut
-        .build("--model=nshms/" + String.format("%s-%s", nshm.nshmInfo.repo, nshm.nshmInfo.year))
-        .mainClass(Application.class)
-        .start();
+
+    Optional<ApplicationContext> context = Optional.empty();
+
+    if (dataPath.isEmpty()) {
+      context = Optional.of(Micronaut
+          .build("--model=" + nshm.modelPath())
+          .mainClass(Application.class)
+          .start());
+    }
 
     for (NamedLocation location : nshm.locations()) {
       LOGGER.info("Location: " + location.toString());
       compareWebCurves(nshm, location, dataPath);
     }
 
-    context.close();
+    context.ifPresent(ApplicationContext::close);
   }
 
   /**
@@ -179,12 +189,13 @@ class NshmTestUtils {
   }
 
   private static void compareCurves(
-      NshmModel nshmModel,
+      Nshm nshm,
       NamedLocation location,
+      Optional<NshmModel> nshmModel,
       Optional<Path> dataPath) throws ExecutionException {
-    Map<String, XySequence> actual = dataPath.isPresent()
-        ? readExpected(nshmModel.nshm, location, dataPath) : generateActual(nshmModel, location);
-    Map<String, XySequence> expected = readExpected(nshmModel.nshm, location, Optional.empty());
+    Map<String, XySequence> actual = dataPath.isPresent() && nshmModel.isEmpty()
+        ? readExpected(nshm, location, dataPath) : generateActual(nshmModel.get(), location);
+    Map<String, XySequence> expected = readExpected(nshm, location, Optional.empty());
 
     for (String key : actual.keySet()) {
       assertCurveEquals(expected.get(key), actual.get(key), TOLERANCE);
-- 
GitLab