diff --git a/.jvmopts b/.jvmopts
index cc1cd1a5f..2794b30ba 100644
--- a/.jvmopts
+++ b/.jvmopts
@@ -1,7 +1,8 @@
-Xms512M
--Xmx2048M
+-Xmx4096M
-Xss2M
--XX:MaxMetaspaceSize=1024M
+-XX:MaxMetaspaceSize=2048M
+-XX:ReservedCodeCacheSize=1024M
-Dsbt.gigahorse=false
-Dhttp.port=9001
-Djava.net.preferIPv4Stack=true
diff --git a/build.sbt b/build.sbt
index 7145ffec7..18eb21a69 100644
--- a/build.sbt
+++ b/build.sbt
@@ -70,7 +70,7 @@ lazy val sharedSettings = Seq(
)
lazy val testSettings = Seq(
- parallelExecution in Test := false,
+ parallelExecution in Test := true,
parallelExecution in IntegrationTest := false,
fork in IntegrationTest := false,
testOptions in Test += Tests.Argument("-oDNCXEHPQRMIK"),
@@ -196,6 +196,7 @@ lazy val api = (project in file("modules/api"))
.settings(inConfig(IntegrationTest)(scalafmtConfigSettings))
.dependsOn(core, dynamodb % "compile->compile;it->it")
+val killDocker = TaskKey[Unit]("killDocker", "Kills all vinyldns docker containers")
lazy val root = (project in file(".")).enablePlugins(AutomateHeaderPlugin)
.configs(IntegrationTest)
.settings(headerSettings(IntegrationTest))
@@ -203,7 +204,11 @@ lazy val root = (project in file(".")).enablePlugins(AutomateHeaderPlugin)
.settings(
inConfig(IntegrationTest)(scalafmtConfigSettings),
(scalastyleConfig in Test) := baseDirectory.value / "scalastyle-test-config.xml",
- (scalastyleConfig in IntegrationTest) := baseDirectory.value / "scalastyle-test-config.xml"
+ (scalastyleConfig in IntegrationTest) := baseDirectory.value / "scalastyle-test-config.xml",
+ killDocker := {
+ import scala.sys.process._
+ "./bin/remove-vinyl-containers.sh" !
+ },
)
.aggregate(core, api, portal, dynamodb)
@@ -271,7 +276,9 @@ lazy val dynamodb = (project in file("modules/dynamodb"))
organization := "io.vinyldns",
coverageMinimum := 85,
coverageFailOnMinimum := true,
- coverageHighlighting := true
+ coverageHighlighting := true,
+ parallelExecution in Test := true,
+ parallelExecution in IntegrationTest := true
).dependsOn(core % "compile->compile;test->test")
val preparePortal = TaskKey[Unit]("preparePortal", "Runs NPM to prepare portal for start")
@@ -427,24 +434,26 @@ releaseProcess :=
sonatypePublishStage ++
finalReleaseStage
-// Validate runs static checks and compile to make sure we can go
-addCommandAlias("validate-api",
- ";project api; clean; headerCheck; test:headerCheck; it:headerCheck; scalastyle; test:scalastyle; " +
- "it:scalastyle; compile; test:compile; it:compile")
-addCommandAlias("validate-dynamodb",
- ";project dynamodb; clean; headerCheck; test:headerCheck; it:headerCheck; scalastyle; test:scalastyle; " +
- "it:scalastyle; compile; test:compile; it:compile")
-addCommandAlias("validate-core",
- ";project core; clean; headerCheck; test:headerCheck; scalastyle; test:scalastyle; compile; test:compile")
-addCommandAlias("validate-portal",
- ";project portal; clean; headerCheck; test:headerCheck; compile; test:compile; createJsHeaders; checkJsHeaders")
-addCommandAlias("validate", ";validate-core;validate-dynamodb;validate-api;validate-portal")
+// Let's do things in parallel!
+addCommandAlias("validate", "; root/clean; " +
+ "all core/headerCheck core/test:headerCheck " +
+ "api/headerCheck api/test:headerCheck api/it:headerCheck " +
+ "dynamodb/headerCheck dynamodb/test:headerCheck dynamodb/it:headerCheck " +
+ "portal/headerCheck portal/test:headerCheck; " +
+ "all core/scalastyle core/test:scalastyle " +
+ "api/scalastyle api/test:scalastyle api/it:scalastyle " +
+ "dynamodb/scalastyle dynamodb/test:scalastyle dynamodb/it:scalastyle" +
+ "portal/scalastyle portal/test:scalastyle;" +
+ "portal/createJsHeaders;portal/checkJsHeaders;" +
+ "root/compile;root/test:compile;root/it:compile"
+)
-// Verify runs all tests and code coverage
-addCommandAlias("dockerComposeUpAll",";project api;dockerComposeUp;project dynamodb;dockerComposeUp;project root")
-addCommandAlias("dockerComposeStopAll",";project api;dockerComposeStop;project dynamodb;dockerComposeStop;project root")
-addCommandAlias("verify",
- ";dockerComposeUpAll;project root;coverage;test;it:test;coverageReport;coverageAggregate;dockerComposeStopAll")
+addCommandAlias("verify", "; project root; killDocker; " +
+ "project api; dockerComposeUp; project dynamodb; dockerComposeUp; " +
+ "project root; coverage; " +
+ "all core/test dynamodb/test api/test dynamodb/it:test api/it:test portal/test; " +
+ "project root; coverageReport; coverageAggregate; killDocker"
+)
// Build the artifacts for release
addCommandAlias("build-api", ";project api;clean;assembly")
diff --git a/modules/api/src/it/resources/logback-test.xml b/modules/api/src/it/resources/logback-test.xml
index 9c9113158..050ac192a 100644
--- a/modules/api/src/it/resources/logback-test.xml
+++ b/modules/api/src/it/resources/logback-test.xml
@@ -4,15 +4,8 @@
%msg%n
-
- target/test/test.log
- true
-
- %-4relative [%thread] %-5level %logger{35} - %msg%n
-
-
-
-
+
+
diff --git a/modules/api/src/test/resources/logback-test.xml b/modules/api/src/test/resources/logback-test.xml
index ea2d9f20f..8ab47c5a2 100644
--- a/modules/api/src/test/resources/logback-test.xml
+++ b/modules/api/src/test/resources/logback-test.xml
@@ -4,16 +4,8 @@
%msg%n
-
- target/test/test.log
- true
-
- %-4relative [%thread] %-5level %logger{35} - %msg%n
-
- 16
-
-
-
+
+
\ No newline at end of file
diff --git a/modules/api/src/test/scala/vinyldns/api/domain/auth/MembershipAuthPrincipalProviderSpec.scala b/modules/api/src/test/scala/vinyldns/api/domain/auth/MembershipAuthPrincipalProviderSpec.scala
index 8545812f5..d95a0a34b 100644
--- a/modules/api/src/test/scala/vinyldns/api/domain/auth/MembershipAuthPrincipalProviderSpec.scala
+++ b/modules/api/src/test/scala/vinyldns/api/domain/auth/MembershipAuthPrincipalProviderSpec.scala
@@ -50,7 +50,7 @@ class MembershipAuthPrincipalProviderSpec
.when(mockMembershipRepo)
.getGroupsForUser(any[String])
- val result = await[Option[AuthPrincipal]](underTest.getAuthPrincipal(accessKey))
+ val result = underTest.getAuthPrincipal(accessKey).unsafeRunSync()
result.map { authPrincipal =>
authPrincipal.signedInUser shouldBe okUser
authPrincipal.memberGroupIds should contain theSameElementsAs Seq(okGroup.id, dummyGroup.id)
diff --git a/modules/api/src/test/scala/vinyldns/api/domain/batch/BatchChangeConverterSpec.scala b/modules/api/src/test/scala/vinyldns/api/domain/batch/BatchChangeConverterSpec.scala
index 94459279a..c2cc6255c 100644
--- a/modules/api/src/test/scala/vinyldns/api/domain/batch/BatchChangeConverterSpec.scala
+++ b/modules/api/src/test/scala/vinyldns/api/domain/batch/BatchChangeConverterSpec.scala
@@ -214,7 +214,8 @@ class BatchChangeConverterSpec
}
}
- private val underTest = new BatchChangeConverter(InMemoryBatchChangeRepository, SqsWithFail)
+ private val batchChangeRepo = new InMemoryBatchChangeRepository
+ private val underTest = new BatchChangeConverter(batchChangeRepo, SqsWithFail)
"convertAndSendBatchForProcessing" should {
"successfully generate add RecordSetChange and map IDs for all adds" in {
@@ -322,7 +323,7 @@ class BatchChangeConverterSpec
// check the batch has been stored in the DB
val savedBatch: Option[BatchChange] =
- await(InMemoryBatchChangeRepository.getBatchChange(batchChange.id))
+ await(batchChangeRepo.getBatchChange(batchChange.id))
savedBatch shouldBe Some(batchChange)
}
@@ -356,7 +357,7 @@ class BatchChangeConverterSpec
// check the update has been made in the DB
val savedBatch: Option[BatchChange] =
- await(InMemoryBatchChangeRepository.getBatchChange(batchChangeWithBadSqs.id))
+ await(batchChangeRepo.getBatchChange(batchChangeWithBadSqs.id))
savedBatch shouldBe Some(returnedBatch)
}
@@ -370,7 +371,7 @@ class BatchChangeConverterSpec
result shouldBe an[BatchConversionError]
val notSaved: Option[BatchChange] =
- await(InMemoryBatchChangeRepository.getBatchChange(batchChangeUnsupported.id))
+ await(batchChangeRepo.getBatchChange(batchChangeUnsupported.id))
notSaved shouldBe None
}
}
diff --git a/modules/api/src/test/scala/vinyldns/api/domain/batch/BatchChangeServiceSpec.scala b/modules/api/src/test/scala/vinyldns/api/domain/batch/BatchChangeServiceSpec.scala
index 346f10261..f85c48f41 100644
--- a/modules/api/src/test/scala/vinyldns/api/domain/batch/BatchChangeServiceSpec.scala
+++ b/modules/api/src/test/scala/vinyldns/api/domain/batch/BatchChangeServiceSpec.scala
@@ -103,7 +103,7 @@ class BatchChangeServiceSpec
None,
None)
- private val batchChangeRepo = InMemoryBatchChangeRepository
+ private val batchChangeRepo = new InMemoryBatchChangeRepository
object EmptyBatchConverter extends BatchChangeConverterAlgebra {
def sendBatchForProcessing(
diff --git a/modules/api/src/test/scala/vinyldns/api/engine/RecordSetChangeHandlerSpec.scala b/modules/api/src/test/scala/vinyldns/api/engine/RecordSetChangeHandlerSpec.scala
index 3bc092c30..513e1c67c 100644
--- a/modules/api/src/test/scala/vinyldns/api/engine/RecordSetChangeHandlerSpec.scala
+++ b/modules/api/src/test/scala/vinyldns/api/engine/RecordSetChangeHandlerSpec.scala
@@ -53,7 +53,7 @@ class RecordSetChangeHandlerSpec
private val rsRepoCaptor = ArgumentCaptor.forClass(classOf[ChangeSet])
private val changeRepoCaptor = ArgumentCaptor.forClass(classOf[ChangeSet])
- private val batchRepo = InMemoryBatchChangeRepository
+ private val batchRepo = new InMemoryBatchChangeRepository
private val rs = completeCreateAAAA.recordSet
@@ -302,7 +302,7 @@ class RecordSetChangeHandlerSpec
// resolve called once when validating, 12x for retries
verify(mockConn, times(13)).resolve(rs.name, rsChange.zone.name, rs.typ)
- val batchChangeUpdates = await(batchRepo.getBatchChange(batchChange.id))
+ val batchChangeUpdates = batchRepo.getBatchChange(batchChange.id).unsafeRunSync()
val updatedSingleChanges = completeCreateAAAASingleChanges.map { ch =>
ch.copy(
status = SingleChangeStatus.Failed,
diff --git a/modules/api/src/test/scala/vinyldns/api/repository/InMemoryBatchChangeRepository.scala b/modules/api/src/test/scala/vinyldns/api/repository/InMemoryBatchChangeRepository.scala
index 05b36709c..c34466cd8 100644
--- a/modules/api/src/test/scala/vinyldns/api/repository/InMemoryBatchChangeRepository.scala
+++ b/modules/api/src/test/scala/vinyldns/api/repository/InMemoryBatchChangeRepository.scala
@@ -23,7 +23,7 @@ import vinyldns.core.domain.batch._
import scala.collection.concurrent
import cats.effect._
-object InMemoryBatchChangeRepository extends BatchChangeRepository {
+class InMemoryBatchChangeRepository extends BatchChangeRepository {
implicit def dateTimeOrdering: Ordering[DateTime] = Ordering.fromLessThan(_.isAfter(_))
diff --git a/modules/api/src/test/scala/vinyldns/api/repository/InMemoryBatchChangeRepositorySpec.scala b/modules/api/src/test/scala/vinyldns/api/repository/InMemoryBatchChangeRepositorySpec.scala
deleted file mode 100644
index 01bc78b05..000000000
--- a/modules/api/src/test/scala/vinyldns/api/repository/InMemoryBatchChangeRepositorySpec.scala
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright 2018 Comcast Cable Communications Management, LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package vinyldns.api.repository
-
-import org.joda.time.DateTime
-import org.scalatest.{Matchers, WordSpec}
-import vinyldns.api.CatsHelpers
-import vinyldns.core.domain.batch.SingleChangeStatus.Pending
-import vinyldns.core.domain.batch._
-import vinyldns.core.domain.record.AData
-import vinyldns.core.domain.record.RecordType._
-
-class InMemoryBatchChangeRepositorySpec extends WordSpec with Matchers with CatsHelpers {
-
- private val addChange1 = SingleAddChange(
- "zoneid",
- "zoneName",
- "apex.test.com.",
- "apex.test.com.",
- A,
- 100,
- AData("1.1.1.1"),
- Pending,
- None,
- None,
- None,
- "addChangeId1")
- private val addChange2 =
- addChange1.copy(inputName = "test.test.com.", recordName = "test", id = "addChangeId2")
- private val batchChange = BatchChange(
- "userId",
- "username",
- None,
- DateTime.now,
- List(addChange1, addChange2),
- "batchChangeId")
-
- private val failedChange = addChange1.copy(status = SingleChangeStatus.Failed)
- private val completeChange = addChange2.copy(status = SingleChangeStatus.Complete)
-
- private val underTest = InMemoryBatchChangeRepository
-
- "InMemoryBatchChangeRepository" should {
- "save a batch change, retrieve" in {
- val saved = await(underTest.save(batchChange))
- saved shouldBe batchChange
-
- val checkBatch = await(underTest.getBatchChange(batchChange.id))
- checkBatch shouldBe Some(batchChange)
-
- val checkSingleChanges = await(underTest.getSingleChanges(List(addChange1.id, addChange2.id)))
- checkSingleChanges.length shouldBe 2
- checkSingleChanges should contain theSameElementsAs List(addChange1, addChange2)
- }
-
- "update single changes" in {
- val update1 =
- addChange1.copy(recordChangeId = Some("aRecordChange"), status = SingleChangeStatus.Pending)
- val update2 = addChange2.copy(
- recordChangeId = Some("aRecordChangeAgain"),
- status = SingleChangeStatus.Pending)
-
- await(underTest.updateSingleChanges(List(update1, update2)))
-
- val checkBatch = await(underTest.getBatchChange(batchChange.id))
- val expected = batchChange.copy(changes = List(update1, update2))
- checkBatch shouldBe Some(expected)
-
- val checkSingleChanges = await(underTest.getSingleChanges(List(addChange1.id, addChange2.id)))
- checkSingleChanges.length shouldBe 2
- checkSingleChanges should contain theSameElementsAs List(update1, update2)
- }
- }
-
- "list batch change summaries with correct status when complete" in {
- underTest.clear()
-
- val changes = List(completeChange, completeChange)
- val completeBatchChange = batchChange.copy(changes = changes)
- val saved = await(underTest.save(completeBatchChange))
- saved shouldBe completeBatchChange
-
- val batchChangeSummaryList = await(underTest.getBatchChangeSummariesByUserId("userId"))
- val expected = BatchChangeSummaryList(List(BatchChangeSummary(saved)))
-
- batchChangeSummaryList shouldBe expected
- batchChangeSummaryList.batchChanges(0).status shouldBe BatchChangeStatus.Complete
- }
-
- "list batch change summaries with correct status when pending" in {
- underTest.clear()
-
- val changes = List(completeChange, addChange1)
- val pendingBatchChange = batchChange.copy(changes = changes)
- val saved = await(underTest.save(pendingBatchChange))
- saved shouldBe pendingBatchChange
-
- val batchChangeSummaryList = await(underTest.getBatchChangeSummariesByUserId("userId"))
- val expected = BatchChangeSummaryList(List(BatchChangeSummary(saved)))
-
- batchChangeSummaryList shouldBe expected
- batchChangeSummaryList.batchChanges(0).status shouldBe BatchChangeStatus.Pending
- }
-
- "list batch change summaries with correct status when failed" in {
- underTest.clear()
-
- val changes = List(failedChange, failedChange)
- val failedBatchChange = batchChange.copy(changes = changes)
- val saved = await(underTest.save(failedBatchChange))
- saved shouldBe failedBatchChange
-
- val batchChangeSummaryList = await(underTest.getBatchChangeSummariesByUserId("userId"))
- val expected = BatchChangeSummaryList(List(BatchChangeSummary(saved)))
-
- batchChangeSummaryList shouldBe expected
- batchChangeSummaryList.batchChanges(0).status shouldBe BatchChangeStatus.Failed
- }
-
- "list batch change summaries with correct status when partial failure" in {
- underTest.clear()
-
- val changes = List(completeChange, failedChange)
- val partiallyFailedBatchChange = batchChange.copy(changes = changes)
- val saved = await(underTest.save(partiallyFailedBatchChange))
- saved shouldBe partiallyFailedBatchChange
-
- val batchChangeSummaryList = await(underTest.getBatchChangeSummariesByUserId("userId"))
- val expected = BatchChangeSummaryList(List(BatchChangeSummary(saved)))
-
- batchChangeSummaryList shouldBe expected
- batchChangeSummaryList.batchChanges(0).status shouldBe BatchChangeStatus.PartialFailure
- }
-}