diff --git a/.github/workflows/on_push.yml b/.github/workflows/on_push.yml index ab17ead..fb1020b 100644 --- a/.github/workflows/on_push.yml +++ b/.github/workflows/on_push.yml @@ -23,6 +23,13 @@ jobs: - name: Run tests run: make coverage + - name: Test Reports + uses: actions/upload-artifact@v3 + if: always() + with: + name: Test Reports + path: ${{ github.workspace }}/**/target/site + # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive - name: Update dependency graph uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6 diff --git a/agent/src/main/java/com/intergral/deep/agent/DeepAgent.java b/agent/src/main/java/com/intergral/deep/agent/DeepAgent.java index 2c95007..7af47ee 100644 --- a/agent/src/main/java/com/intergral/deep/agent/DeepAgent.java +++ b/agent/src/main/java/com/intergral/deep/agent/DeepAgent.java @@ -198,4 +198,8 @@ public synchronized void setEnabled(final boolean enabled) { this.tracepointConfig.configUpdate(0, null, Collections.emptyList()); } } + + public void shutdown() { + this.grpcService.shutdown(); + } } diff --git a/agent/src/main/java/com/intergral/deep/agent/grpc/GrpcService.java b/agent/src/main/java/com/intergral/deep/agent/grpc/GrpcService.java index a83326b..7490224 100644 --- a/agent/src/main/java/com/intergral/deep/agent/grpc/GrpcService.java +++ b/agent/src/main/java/com/intergral/deep/agent/grpc/GrpcService.java @@ -64,7 +64,21 @@ public void start() { try { setupChannel(); } catch (Exception e) { - LOGGER.debug("Error setting up GRPC channel", e); + LOGGER.error("Error setting up GRPC channel", e); + } + } + + /** + * Shutdown the grpc channel. + */ + public void shutdown() { + if (this.channel == null) { + return; + } + try { + this.channel.shutdown().awaitTermination(10, TimeUnit.SECONDS); + } catch (InterruptedException e) { + LOGGER.debug("Could not shutdown cleanly.", e); } } diff --git a/agent/src/main/java/com/intergral/deep/agent/poll/DriftAwareThread.java b/agent/src/main/java/com/intergral/deep/agent/poll/DriftAwareThread.java index e2dc444..70e1a4b 100644 --- a/agent/src/main/java/com/intergral/deep/agent/poll/DriftAwareThread.java +++ b/agent/src/main/java/com/intergral/deep/agent/poll/DriftAwareThread.java @@ -144,11 +144,11 @@ public void run() { } private void trace(final String msg) { - LOGGER.trace(msg); + LOGGER.trace(this.getName() + " - " + msg); } - private void error(final String msg, final Throwable throwable) { + void error(final String msg, final Throwable throwable) { LOGGER.error(this.getName() + " - " + msg, throwable); } diff --git a/agent/src/test/java/com/intergral/deep/agent/DeepAgentTest.java b/agent/src/test/java/com/intergral/deep/agent/DeepAgentTest.java index 037cecb..ef84d57 100644 --- a/agent/src/test/java/com/intergral/deep/agent/DeepAgentTest.java +++ b/agent/src/test/java/com/intergral/deep/agent/DeepAgentTest.java @@ -30,6 +30,10 @@ import com.intergral.deep.agent.settings.Settings; import com.intergral.deep.agent.tracepoint.handler.Callback; import com.intergral.deep.agent.tracepoint.inst.TracepointInstrumentationService; +import io.grpc.Server; +import io.grpc.ServerBuilder; +import java.io.IOException; +import java.net.ServerSocket; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; @@ -45,6 +49,10 @@ class DeepAgentTest { void setUp() { Mockito.when(settings.getSettingAs("poll.timer", Integer.class)).thenReturn(1010); + Mockito.when(settings.getSettingAs(Mockito.anyString(), Mockito.eq(String.class))).thenReturn(""); + Mockito.when(settings.getSettingAs(Mockito.anyString(), Mockito.eq(Boolean.class))).thenReturn(false); + Mockito.when(settings.getServiceHost()).thenReturn("localhost"); + try (MockedStatic callback = Mockito.mockStatic(Callback.class, "init")) { deepAgent = new DeepAgent(settings, tracepointInstrumentationService); callback.verify(() -> Callback.init(Mockito.any(), Mockito.any(), Mockito.any()), times(1)); @@ -52,10 +60,27 @@ void setUp() { } @Test - void start_shouldSetPluginsAndResource() { + void start_shouldSetPluginsAndResource() throws IOException { + + // find a free port + int port; + try (ServerSocket socket = new ServerSocket(0)) { + port = socket.getLocalPort(); + } + Mockito.when(settings.getServicePort()).thenReturn(port); + + final Server server = ServerBuilder.forPort(port).build(); + + server.start(); + deepAgent.start(); + + server.shutdownNow(); + deepAgent.shutdown(); + Mockito.verify(settings).setPlugins(Mockito.anyCollection()); Mockito.verify(settings).setResource(Mockito.any()); + } @Test diff --git a/agent/src/test/java/com/intergral/deep/agent/grpc/GrpcServiceTest.java b/agent/src/test/java/com/intergral/deep/agent/grpc/GrpcServiceTest.java index 43dc10f..6468d4f 100644 --- a/agent/src/test/java/com/intergral/deep/agent/grpc/GrpcServiceTest.java +++ b/agent/src/test/java/com/intergral/deep/agent/grpc/GrpcServiceTest.java @@ -36,7 +36,6 @@ import io.grpc.ServerBuilder; import io.grpc.ServerInterceptors; import io.grpc.stub.StreamObserver; -import java.io.IOException; import java.net.ServerSocket; import java.util.Collections; import java.util.HashMap; @@ -51,6 +50,7 @@ class GrpcServiceTest { + private GrpcService grpcService; private Server server; private CountDownLatch pollLatch; private final AtomicReference pollRequest = new AtomicReference<>(); @@ -104,8 +104,11 @@ void setUp() throws Exception { } @AfterEach - void tearDown() throws IOException { + void tearDown() throws Exception { + this.grpcService.shutdown(); + this.server.shutdownNow(); + this.server.awaitTermination(); } @Test @@ -116,9 +119,7 @@ void serverCanConnect_poll() throws InterruptedException { map.put(ISettings.KEY_SERVICE_SECURE, "false"); map.put(ISettings.KEY_AUTH_PROVIDER, MockAuthProvider.class.getName()); - final GrpcService grpcService = new GrpcService(Settings.build(map)); - - new Thread(grpcService::start).start(); + grpcService = new GrpcService(Settings.build(map)); final PollResponse pollResponse = grpcService.pollService().poll(PollRequest.newBuilder().setTsNanos(101010L).build()); assertEquals(202020L, pollResponse.getTsNanos()); @@ -138,9 +139,8 @@ void serverCanConnect_snapshot() throws InterruptedException { map.put(ISettings.KEY_SERVICE_SECURE, "false"); map.put(ISettings.KEY_AUTH_PROVIDER, MockAuthProvider.class.getName()); - final GrpcService grpcService = new GrpcService(Settings.build(map)); + grpcService = new GrpcService(Settings.build(map)); - new Thread(grpcService::start).start(); final CountDownLatch responseLatch = new CountDownLatch(1); final AtomicReference responseAtomicReference = new AtomicReference<>(); grpcService.snapshotService().send(Snapshot.newBuilder().build(), diff --git a/agent/src/test/java/com/intergral/deep/agent/poll/DriftAwareThreadTest.java b/agent/src/test/java/com/intergral/deep/agent/poll/DriftAwareThreadTest.java index c9d2eaa..6036471 100644 --- a/agent/src/test/java/com/intergral/deep/agent/poll/DriftAwareThreadTest.java +++ b/agent/src/test/java/com/intergral/deep/agent/poll/DriftAwareThreadTest.java @@ -23,6 +23,7 @@ import java.util.concurrent.CountDownLatch; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; class DriftAwareThreadTest { @@ -65,6 +66,12 @@ public long callback(final long duration, final long next) { assertTrue((lwrap.now + 10000) >= currentTimeMillis); } + @Test + void errorLogs() { + final DriftAwareThread spy = Mockito.spy(task); + spy.error("test error", new RuntimeException("test exception")); + Mockito.verify(spy, Mockito.times(1)).getName(); + } @Test public void testCheckForEarlyWakeUp() throws Exception { diff --git a/agent/src/test/java/com/intergral/deep/agent/poll/LongPollServiceTest.java b/agent/src/test/java/com/intergral/deep/agent/poll/LongPollServiceTest.java index 0f204f8..1b0a5bf 100644 --- a/agent/src/test/java/com/intergral/deep/agent/poll/LongPollServiceTest.java +++ b/agent/src/test/java/com/intergral/deep/agent/poll/LongPollServiceTest.java @@ -50,6 +50,7 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.concurrent.atomic.AtomicReference; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -62,15 +63,16 @@ class LongPollServiceTest { private Server server; private LongPollService longPollService; - private PollRequest request; + private final AtomicReference request = new AtomicReference<>(null); private PollResponse response; private Throwable responseError; private int port; + private GrpcService grpcService; @BeforeEach void setUp() throws IOException { final TestPollService testPollService = new TestPollService((req, responseObserver) -> { - request = req; + request.set(req); if (responseError != null) { responseObserver.onError(responseError); } else { @@ -92,14 +94,18 @@ void setUp() throws IOException { agentArgs.put(ISettings.KEY_SERVICE_URL, "localhost:" + port); agentArgs.put(ISettings.KEY_SERVICE_SECURE, "false"); final Settings settings = Settings.build(agentArgs); + settings.setActive(true); settings.setResource(Resource.create(Collections.singletonMap("test", "resource"))); - final GrpcService grpcService = new GrpcService(settings); + grpcService = new GrpcService(settings); longPollService = new LongPollService(settings, grpcService); } @AfterEach - void tearDown() { + void tearDown() throws Exception { server.shutdownNow(); + server.awaitTermination(); + + grpcService.shutdown(); } @Test @@ -148,15 +154,15 @@ void propagateHashOnNextCall() { longPollService.run(100); - assertEquals("", request.getCurrentHash()); - assertEquals(100, request.getTsNanos()); + assertEquals("", request.get().getCurrentHash()); + assertEquals(100, request.get().getTsNanos()); response = PollResponse.newBuilder().setResponseType(ResponseType.UPDATE).setCurrentHash("321").build(); longPollService.run(101); - assertEquals("123", request.getCurrentHash()); - assertEquals(101, request.getTsNanos()); + assertEquals("123", request.get().getCurrentHash()); + assertEquals(101, request.get().getTsNanos()); verify(instrumentationService, times(2)).processBreakpoints(Mockito.anyCollection()); } @@ -204,8 +210,8 @@ void doesSendResourceOnRequest() { longPollService.run(100); - assertNotNull(request.getResource()); - assertEquals("test", request.getResource().getAttributes(0).getKey()); - assertEquals("resource", request.getResource().getAttributes(0).getValue().getStringValue()); + assertNotNull(request.get().getResource()); + assertEquals("test", request.get().getResource().getAttributes(0).getKey()); + assertEquals("resource", request.get().getResource().getAttributes(0).getValue().getStringValue()); } } \ No newline at end of file diff --git a/pom.xml b/pom.xml index a5bf9f4..975f628 100644 --- a/pom.xml +++ b/pom.xml @@ -85,7 +85,7 @@ - 1.55.1 + 1.57.0 2.0.51.Final 8.0.1