From be46c8b4c1443d723048fe9d45b4b8313fa87da4 Mon Sep 17 00:00:00 2001 From: Joanna Ko Date: Wed, 13 Jul 2022 22:46:46 -0700 Subject: [PATCH] Fix SourceTagSubmissionTask Failing Tests --- .../agent/data/SourceTagSubmissionTask.java | 12 ++- .../com/wavefront/agent/data/TaskResult.java | 14 --- .../data/SourceTagSubmissionTaskTest.java | 93 ++++++++++++++----- 3 files changed, 80 insertions(+), 39 deletions(-) delete mode 100644 proxy/src/main/java/com/wavefront/agent/data/TaskResult.java diff --git a/proxy/src/main/java/com/wavefront/agent/data/SourceTagSubmissionTask.java b/proxy/src/main/java/com/wavefront/agent/data/SourceTagSubmissionTask.java index 166b0eb20..7f9ff816f 100644 --- a/proxy/src/main/java/com/wavefront/agent/data/SourceTagSubmissionTask.java +++ b/proxy/src/main/java/com/wavefront/agent/data/SourceTagSubmissionTask.java @@ -64,7 +64,17 @@ Response doExecute() throws DataSubmissionException { case SOURCE_TAG: switch (sourceTag.getAction()) { case ADD: - return api.appendTag(sourceTag.getSource(), sourceTag.getAnnotations().get(0)); + String addTag = sourceTag.getAnnotations().get(0); + Response re = api.appendTag(sourceTag.getSource(), addTag); + if (re.getStatus() == 404) { + throw new IgnoreStatusCodeException( + "Failed to add tag " + + addTag + + " for source " + + sourceTag.getSource() + + ", ignoring"); + } + return re; case DELETE: String tag = sourceTag.getAnnotations().get(0); Response resp = api.removeTag(sourceTag.getSource(), tag); diff --git a/proxy/src/main/java/com/wavefront/agent/data/TaskResult.java b/proxy/src/main/java/com/wavefront/agent/data/TaskResult.java deleted file mode 100644 index 7efec8272..000000000 --- a/proxy/src/main/java/com/wavefront/agent/data/TaskResult.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.wavefront.agent.data; - -/** - * Possible outcomes of {@link DataSubmissionTask} execution - * - * @author vasily@wavefront.com - */ -public enum TaskResult { - DELIVERED, // success - REMOVED, // data is removed from queue, due to feature disabled or auth error - PERSISTED, // data is persisted in the queue, start back-off process - PERSISTED_RETRY, // data is persisted in the queue, ok to continue processing backlog - RETRY_LATER // data needs to be returned to the pool and retried later -} diff --git a/proxy/src/test/java/com/wavefront/agent/data/SourceTagSubmissionTaskTest.java b/proxy/src/test/java/com/wavefront/agent/data/SourceTagSubmissionTaskTest.java index c709be023..4d70909c6 100644 --- a/proxy/src/test/java/com/wavefront/agent/data/SourceTagSubmissionTaskTest.java +++ b/proxy/src/test/java/com/wavefront/agent/data/SourceTagSubmissionTaskTest.java @@ -1,8 +1,8 @@ package com.wavefront.agent.data; -import static com.wavefront.agent.ProxyContext.queuesManager; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.expectLastCall; +import static org.easymock.EasyMock.replay; import static org.junit.Assert.assertEquals; import com.google.common.collect.ImmutableList; @@ -27,6 +27,9 @@ public class SourceTagSubmissionTaskTest { private final EntityProperties props = new DefaultEntityPropertiesForTesting(); private SourceTagAPI sourceTagAPI = EasyMock.createMock(SourceTagAPI.class); + private QueueInfo queue = EasyMock.createMock(QueueInfo.class); + private Response mockResponse = EasyMock.createMock(Response.class); + @Test public void test200() { ReportSourceTag sourceDescDelete = @@ -41,7 +44,9 @@ public void test200() { ReportSourceTag sourceTagAdd = new ReportSourceTag( SourceOperationType.SOURCE_TAG, SourceTagAction.ADD, "src", ImmutableList.of("tag")); - QueueInfo queue = queuesManager.initQueue(ReportableEntityType.SOURCE_TAG); + expect(queue.getName()).andReturn("").anyTimes(); + expect(queue.getEntityType()).andReturn(ReportableEntityType.SOURCE_TAG).anyTimes(); + replay(queue); SenderStats stats = SenderStats.create(queue, new ScheduledThreadPoolExecutor(0)); SourceTagSubmissionTask task = new SourceTagSubmissionTask( @@ -67,29 +72,29 @@ public void test200() { new SourceTag(sourceTagAdd), System::currentTimeMillis, stats); + expect(mockResponse.getStatus()).andReturn(200).times(3); expect(sourceTagAPI.removeDescription("dummy")).andReturn(Response.status(200).build()).once(); expect(sourceTagAPI.removeTag("src", "tag")).andReturn(Response.status(200).build()).once(); expect(sourceTagAPI.appendTag("src", "tag")).andReturn(Response.status(200).build()).once(); - assertEquals(TaskResult.DELIVERED, task.execute()); - assertEquals(TaskResult.DELIVERED, task2.execute()); - assertEquals(TaskResult.DELIVERED, task3.execute()); + replay(sourceTagAPI, mockResponse); + // Note: Changed TaskResult.DELIVERED to 0 as AbstractDataSubmissionTask execute() has + // changed return type from TaskResult to int + assertEquals(0, task.execute()); + assertEquals(0, task2.execute()); + assertEquals(0, task3.execute()); } - @Test - public void test404() throws Exception { + @Test(expected = RuntimeException.class) + public void test404_RemoveDescription() { ReportSourceTag sourceDescDelete = new ReportSourceTag( SourceOperationType.SOURCE_DESCRIPTION, SourceTagAction.DELETE, "dummy", ImmutableList.of()); - ReportSourceTag sourceTagDelete = - new ReportSourceTag( - SourceOperationType.SOURCE_TAG, SourceTagAction.DELETE, "src", ImmutableList.of("tag")); - ReportSourceTag sourceTagAdd = - new ReportSourceTag( - SourceOperationType.SOURCE_TAG, SourceTagAction.ADD, "src", ImmutableList.of("tag")); - QueueInfo queue = queuesManager.initQueue(ReportableEntityType.SOURCE_TAG); + expect(queue.getName()).andReturn("").anyTimes(); + expect(queue.getEntityType()).andReturn(ReportableEntityType.SOURCE_TAG).anyTimes(); + replay(queue); SenderStats stats = SenderStats.create(queue, new ScheduledThreadPoolExecutor(0)); SourceTagSubmissionTask task = new SourceTagSubmissionTask( @@ -99,6 +104,24 @@ public void test404() throws Exception { new SourceTag(sourceDescDelete), System::currentTimeMillis, stats); + expect(mockResponse.getStatus()).andReturn(404).once(); + expect(sourceTagAPI.removeDescription("dummy")).andReturn(Response.status(404).build()).once(); + expectLastCall(); + replay(sourceTagAPI, mockResponse); + + // Currently, status 404 returns RuntimeException("Unhandled DataSubmissionException", ex) + task.execute(); + } + + @Test(expected = RuntimeException.class) + public void test404_RemoveTag() { + ReportSourceTag sourceTagDelete = + new ReportSourceTag( + SourceOperationType.SOURCE_TAG, SourceTagAction.DELETE, "src", ImmutableList.of("tag")); + expect(queue.getName()).andReturn("").anyTimes(); + expect(queue.getEntityType()).andReturn(ReportableEntityType.SOURCE_TAG).anyTimes(); + replay(queue); + SenderStats stats = SenderStats.create(queue, new ScheduledThreadPoolExecutor(0)); SourceTagSubmissionTask task2 = new SourceTagSubmissionTask( sourceTagAPI, @@ -107,6 +130,24 @@ public void test404() throws Exception { new SourceTag(sourceTagDelete), System::currentTimeMillis, stats); + expect(mockResponse.getStatus()).andReturn(404).once(); + expect(sourceTagAPI.removeTag("src", "tag")).andReturn(Response.status(404).build()).once(); + expectLastCall(); + replay(sourceTagAPI, mockResponse); + + // Currently, status 404 returns RuntimeException("Unhandled DataSubmissionException", ex) + task2.execute(); + } + + @Test(expected = RuntimeException.class) + public void test404_AddTag() { + ReportSourceTag sourceTagAdd = + new ReportSourceTag( + SourceOperationType.SOURCE_TAG, SourceTagAction.ADD, "src", ImmutableList.of("tag")); + expect(queue.getName()).andReturn("").anyTimes(); + expect(queue.getEntityType()).andReturn(ReportableEntityType.SOURCE_TAG).anyTimes(); + replay(queue); + SenderStats stats = SenderStats.create(queue, new ScheduledThreadPoolExecutor(0)); SourceTagSubmissionTask task3 = new SourceTagSubmissionTask( sourceTagAPI, @@ -115,18 +156,16 @@ public void test404() throws Exception { new SourceTag(sourceTagAdd), System::currentTimeMillis, stats); - expect(sourceTagAPI.removeDescription("dummy")).andReturn(Response.status(404).build()).once(); - expect(sourceTagAPI.removeTag("src", "tag")).andReturn(Response.status(404).build()).once(); + expect(mockResponse.getStatus()).andReturn(404).once(); expect(sourceTagAPI.appendTag("src", "tag")).andReturn(Response.status(404).build()).once(); expectLastCall(); + replay(sourceTagAPI, mockResponse); - assertEquals(TaskResult.DELIVERED, task.execute()); - assertEquals(TaskResult.DELIVERED, task2.execute()); - assertEquals(TaskResult.PERSISTED, task3.execute()); + task3.execute(); } @Test - public void test500() throws Exception { + public void test500() { ReportSourceTag sourceDescDelete = new ReportSourceTag( SourceOperationType.SOURCE_DESCRIPTION, @@ -139,7 +178,9 @@ public void test500() throws Exception { ReportSourceTag sourceTagAdd = new ReportSourceTag( SourceOperationType.SOURCE_TAG, SourceTagAction.ADD, "src", ImmutableList.of("tag")); - QueueInfo queue = queuesManager.initQueue(ReportableEntityType.SOURCE_TAG); + expect(queue.getName()).andReturn("").anyTimes(); + expect(queue.getEntityType()).andReturn(ReportableEntityType.SOURCE_TAG).anyTimes(); + replay(queue); SenderStats stats = SenderStats.create(queue, new ScheduledThreadPoolExecutor(0)); SourceTagSubmissionTask task = new SourceTagSubmissionTask( @@ -165,12 +206,16 @@ public void test500() throws Exception { new SourceTag(sourceTagAdd), System::currentTimeMillis, stats); + expect(mockResponse.getStatus()).andReturn(500).once(); expect(sourceTagAPI.removeDescription("dummy")).andReturn(Response.status(500).build()).once(); expect(sourceTagAPI.removeTag("src", "tag")).andReturn(Response.status(500).build()).once(); expect(sourceTagAPI.appendTag("src", "tag")).andReturn(Response.status(500).build()).once(); expectLastCall(); - assertEquals(TaskResult.PERSISTED, task.execute()); - assertEquals(TaskResult.PERSISTED, task2.execute()); - assertEquals(TaskResult.PERSISTED, task3.execute()); + replay(sourceTagAPI, mockResponse); + + // Right now we are not throwing IgnoreStatusCodeException for 500 + assertEquals(500, task.execute()); + assertEquals(500, task2.execute()); + assertEquals(500, task3.execute()); } }