/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestRetryFlowFile.java

https://github.com/apache/nifi · Java · 257 lines · 203 code · 38 blank · 16 comment · 1 complexity · 572115af58089e545888b1fca1231738 MD5 · raw file

  1. /*
  2. * Licensed to the Apache Software Foundation (ASF) under one or more
  3. * contributor license agreements. See the NOTICE file distributed with
  4. * this work for additional information regarding copyright ownership.
  5. * The ASF licenses this file to You under the Apache License, Version 2.0
  6. * (the "License"); you may not use this file except in compliance with
  7. * the License. You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. package org.apache.nifi.processors.standard;
  18. import org.apache.nifi.util.TestRunner;
  19. import org.apache.nifi.util.TestRunners;
  20. import org.junit.After;
  21. import org.junit.Assert;
  22. import org.junit.Before;
  23. import org.junit.Test;
  24. import java.util.Collections;
  25. import java.util.HashMap;
  26. import java.util.Map;
  27. public class TestRetryFlowFile {
  28. TestRunner runner;
  29. @Before
  30. public void before() {
  31. runner = TestRunners.newTestRunner(new RetryFlowFile());
  32. }
  33. @After
  34. public void after() {
  35. runner.shutdown();
  36. }
  37. @Test
  38. public void testNoRetryAttribute() {
  39. runner.enqueue("");
  40. runner.run();
  41. runner.assertTransferCount(RetryFlowFile.RETRY, 1);
  42. runner.assertTransferCount(RetryFlowFile.RETRIES_EXCEEDED, 0);
  43. runner.assertTransferCount(RetryFlowFile.FAILURE, 0);
  44. runner.assertAllConditionsMet(RetryFlowFile.RETRY, mff -> {
  45. mff.assertAttributeExists("flowfile.retries");
  46. mff.assertAttributeExists("flowfile.retries.uuid");
  47. mff.assertAttributeEquals("flowfile.retries", "1");
  48. return true;
  49. });
  50. }
  51. @Test
  52. public void testRetryPenalize() {
  53. runner.enqueue("", Collections.singletonMap("flowfile.retries", "2"));
  54. runner.run();
  55. runner.assertTransferCount(RetryFlowFile.RETRY, 1);
  56. runner.assertTransferCount(RetryFlowFile.RETRIES_EXCEEDED, 0);
  57. runner.assertTransferCount(RetryFlowFile.FAILURE, 0);
  58. runner.assertAllConditionsMet(RetryFlowFile.RETRY, mff -> {
  59. mff.assertAttributeExists("flowfile.retries");
  60. mff.assertAttributeExists("flowfile.retries.uuid");
  61. mff.assertAttributeEquals("flowfile.retries", "3");
  62. Assert.assertTrue("FlowFile was not penalized!", mff.isPenalized());
  63. return true;
  64. });
  65. }
  66. @Test
  67. public void testRetryClustered() {
  68. runner.setClustered(true);
  69. runner.setThreadCount(5);
  70. for (int i = 0; i < 5; i++) {
  71. runner.enqueue("", Collections.singletonMap("flowfile.retries", "2"));
  72. }
  73. runner.run(5);
  74. runner.assertTransferCount(RetryFlowFile.RETRY, 5);
  75. runner.assertTransferCount(RetryFlowFile.RETRIES_EXCEEDED, 0);
  76. runner.assertTransferCount(RetryFlowFile.FAILURE, 0);
  77. runner.assertAllConditionsMet(RetryFlowFile.RETRY, mff -> {
  78. mff.assertAttributeExists("flowfile.retries");
  79. mff.assertAttributeExists("flowfile.retries.uuid");
  80. mff.assertAttributeEquals("flowfile.retries", "3");
  81. Assert.assertTrue("FlowFile was not penalized!", mff.isPenalized());
  82. return true;
  83. });
  84. }
  85. @Test
  86. public void testRetryNoPenalize() {
  87. runner.setProperty(RetryFlowFile.PENALIZE_RETRIED, "false");
  88. runner.enqueue("", Collections.singletonMap("flowfile.retries", "2"));
  89. runner.run();
  90. runner.assertTransferCount(RetryFlowFile.RETRY, 1);
  91. runner.assertTransferCount(RetryFlowFile.RETRIES_EXCEEDED, 0);
  92. runner.assertTransferCount(RetryFlowFile.FAILURE, 0);
  93. runner.assertAllConditionsMet(RetryFlowFile.RETRY, mff -> {
  94. mff.assertAttributeExists("flowfile.retries.uuid");
  95. mff.assertAttributeExists("flowfile.retries");
  96. mff.assertAttributeEquals("flowfile.retries", "3");
  97. Assert.assertFalse("FlowFile was not penalized!", mff.isPenalized());
  98. return true;
  99. });
  100. }
  101. @Test
  102. public void testNoFailOnOverwrite() {
  103. runner.enqueue("", Collections.singletonMap("flowfile.retries", "ZZAaa"));
  104. runner.run();
  105. runner.assertTransferCount(RetryFlowFile.RETRY, 1);
  106. runner.assertTransferCount(RetryFlowFile.RETRIES_EXCEEDED, 0);
  107. runner.assertTransferCount(RetryFlowFile.FAILURE, 0);
  108. runner.assertAllConditionsMet(RetryFlowFile.RETRY, mff -> {
  109. mff.assertAttributeExists("flowfile.retries.uuid");
  110. mff.assertAttributeExists("flowfile.retries");
  111. mff.assertAttributeEquals("flowfile.retries", "1");
  112. Assert.assertTrue("FlowFile was not penalized!", mff.isPenalized());
  113. return true;
  114. });
  115. }
  116. @Test
  117. public void testFailOnOverwrite() {
  118. runner.setProperty(RetryFlowFile.FAIL_ON_OVERWRITE, "true");
  119. runner.enqueue("", Collections.singletonMap("flowfile.retries", "ZZAaa"));
  120. runner.run();
  121. runner.assertTransferCount(RetryFlowFile.RETRY, 0);
  122. runner.assertTransferCount(RetryFlowFile.RETRIES_EXCEEDED, 0);
  123. runner.assertTransferCount(RetryFlowFile.FAILURE, 1);
  124. }
  125. @Test
  126. public void testRetriesExceeded() {
  127. runner.setProperty("exceeded.time", "${now():toString()}");
  128. runner.setProperty("reason", "${uuid} exceeded retries");
  129. runner.enqueue("", Collections.singletonMap("flowfile.retries", "3"));
  130. runner.run();
  131. runner.assertTransferCount(RetryFlowFile.RETRY, 0);
  132. runner.assertTransferCount(RetryFlowFile.RETRIES_EXCEEDED, 1);
  133. runner.assertTransferCount(RetryFlowFile.FAILURE, 0);
  134. runner.assertAllConditionsMet(RetryFlowFile.RETRIES_EXCEEDED, mff -> {
  135. mff.assertAttributeExists("exceeded.time");
  136. mff.assertAttributeExists("reason");
  137. Assert.assertFalse("Expression language not evaluated!",
  138. mff.getAttribute("reason").contains("${uuid}"));
  139. return true;
  140. });
  141. }
  142. @Test
  143. public void testReuseFail() {
  144. runner.setProperty(RetryFlowFile.REUSE_MODE, RetryFlowFile.FAIL_ON_REUSE.getValue());
  145. Map<String, String> inputAttributes = new HashMap<>();
  146. inputAttributes.put("flowfile.retries", "2");
  147. inputAttributes.put("flowfile.retries.uuid", "1122334455");
  148. runner.enqueue("", inputAttributes);
  149. runner.run();
  150. runner.assertTransferCount(RetryFlowFile.RETRY, 0);
  151. runner.assertTransferCount(RetryFlowFile.RETRIES_EXCEEDED, 0);
  152. runner.assertTransferCount(RetryFlowFile.FAILURE, 1);
  153. }
  154. @Test
  155. public void testReuseWarn() {
  156. runner.setProperty(RetryFlowFile.REUSE_MODE, RetryFlowFile.WARN_ON_REUSE.getValue());
  157. Map<String, String> inputAttributes = new HashMap<>();
  158. inputAttributes.put("flowfile.retries", "2");
  159. inputAttributes.put("flowfile.retries.uuid", "1122334455");
  160. runner.enqueue("", inputAttributes);
  161. runner.run();
  162. runner.assertTransferCount(RetryFlowFile.RETRY, 1);
  163. runner.assertTransferCount(RetryFlowFile.RETRIES_EXCEEDED, 0);
  164. runner.assertTransferCount(RetryFlowFile.FAILURE, 0);
  165. runner.assertAllConditionsMet(RetryFlowFile.RETRY, mff -> {
  166. mff.assertAttributeExists("flowfile.retries");
  167. mff.assertAttributeEquals("flowfile.retries", "1");
  168. return true;
  169. });
  170. }
  171. @Test
  172. public void testReuseReset() {
  173. runner.setProperty(RetryFlowFile.REUSE_MODE, RetryFlowFile.RESET_ON_REUSE.getValue());
  174. Map<String, String> inputAttributes = new HashMap<>();
  175. inputAttributes.put("flowfile.retries", "2");
  176. inputAttributes.put("flowfile.retries.uuid", "1122334455");
  177. runner.enqueue("", inputAttributes);
  178. runner.run();
  179. runner.assertTransferCount(RetryFlowFile.RETRY, 1);
  180. runner.assertTransferCount(RetryFlowFile.RETRIES_EXCEEDED, 0);
  181. runner.assertTransferCount(RetryFlowFile.FAILURE, 0);
  182. runner.assertAllConditionsMet(RetryFlowFile.RETRY, mff -> {
  183. mff.assertAttributeExists("flowfile.retries");
  184. mff.assertAttributeEquals("flowfile.retries", "1");
  185. return true;
  186. });
  187. }
  188. @Test
  189. public void testAlternativeAttributeMaxRetries() {
  190. runner.setProperty(RetryFlowFile.MAXIMUM_RETRIES, "${retry.max}");
  191. Map<String, String> attributeMap = new HashMap<>();
  192. attributeMap.put("retry.max", "3");
  193. attributeMap.put("flowfile.retries", "2");
  194. runner.enqueue("", attributeMap);
  195. runner.run();
  196. runner.assertTransferCount(RetryFlowFile.RETRY, 1);
  197. runner.assertTransferCount(RetryFlowFile.RETRIES_EXCEEDED, 0);
  198. runner.assertTransferCount(RetryFlowFile.FAILURE, 0);
  199. runner.assertAllConditionsMet(RetryFlowFile.RETRY, mff -> {
  200. mff.assertAttributeExists("flowfile.retries");
  201. mff.assertAttributeExists("flowfile.retries.uuid");
  202. mff.assertAttributeEquals("flowfile.retries", "3");
  203. Assert.assertTrue("FlowFile was not penalized!", mff.isPenalized());
  204. return true;
  205. });
  206. }
  207. @Test
  208. public void testInvalidAlternativeAttributeMaxRetries() {
  209. runner.setProperty(RetryFlowFile.MAXIMUM_RETRIES, "${retry.max}");
  210. Map<String, String> attributeMap = new HashMap<>();
  211. attributeMap.put("retry.max", "NiFi");
  212. attributeMap.put("flowfile.retries", "2");
  213. runner.enqueue("", attributeMap);
  214. runner.run();
  215. runner.assertTransferCount(RetryFlowFile.RETRY, 0);
  216. runner.assertTransferCount(RetryFlowFile.RETRIES_EXCEEDED, 0);
  217. runner.assertTransferCount(RetryFlowFile.FAILURE, 1);
  218. }
  219. }