/** * Generates an Amazon TestContext object that will be used to invoke our Bender Handlers. * * @return TestContext */ protected static TestContext getContext() { TestContext ctx = new TestContext(); ctx.setFunctionName("cli-main"); ctx.setInvokedFunctionArn("arn:aws:lambda:" + AWS_REGION + ":" + AWS_ACCOUNT + ":function:function_name:function_alias"); ctx.setAwsRequestId(System.currentTimeMillis() + ""); return ctx; } }
@Test(expected = HandlerException.class) public void testBadConfig() throws HandlerException { BaseHandler.CONFIG_FILE = "/config/handler_config_bad.json"; List<DummyEvent> events = new ArrayList<DummyEvent>(1); TestContext context = new TestContext(); context.setInvokedFunctionArn("arn:aws:lambda:us-east-1:123:function:test:tag"); handler.handler(events, context); }
@Test(expected = HandlerException.class) public void testMissingConfig() throws HandlerException { BaseHandler.CONFIG_FILE = "/config/missing.json"; List<DummyEvent> events = new ArrayList<DummyEvent>(1); TestContext context = new TestContext(); context.setInvokedFunctionArn("arn:aws:lambda:us-east-1:123:function:test:tag"); handler.handler(events, context); }
@Test(expected = InterruptedException.class) public void testInterruptedExceptionOnShutdown() throws Throwable { BaseHandler.CONFIG_FILE = "/config/handler_config.json"; List<DummyEvent> events = new ArrayList<DummyEvent>(1); events.add(new DummyEvent("foo", 0)); TestContext context = new TestContext(); context.setInvokedFunctionArn("arn:aws:lambda:us-east-1:123:function:test:tag"); handler.init(context); IpcSenderService spy = spy(handler.getIpcService()); handler.setIpcService(spy); doThrow(new InterruptedException("expected")).when(spy).flush(); try { handler.handler(events, context); } catch (Exception e) { throw e.getCause().getCause(); } }
@Test public void testEndToEndWithNoOperations() throws HandlerException { BaseHandler.CONFIG_FILE = "/config/handler_config_no_operations.json"; List<DummyEvent> events = new ArrayList<DummyEvent>(2); events.add(new DummyEvent("foo", 0)); events.add(new DummyEvent("bar", 0)); TestContext context = new TestContext(); context.setInvokedFunctionArn("arn:aws:lambda:us-east-1:123:function:test:tag"); handler.handler(events, context); /* * Verify Events made it all the way through */ assertEquals(2, BufferedTransporter.output.size()); assertEquals("foo", BufferedTransporter.output.get(0)); assertEquals("bar", BufferedTransporter.output.get(1)); }
@Test public void testContains() throws HandlerException { BaseHandler.CONFIG_FILE = "/config/handler_config_contains.json"; List<DummyEvent> events = new ArrayList<DummyEvent>(2); events.add(new DummyEvent("foo", 0)); events.add(new DummyEvent("bar", 0)); events.add(new DummyEvent("loop", 0)); TestContext context = new TestContext(); context.setInvokedFunctionArn("arn:aws:lambda:us-east-1:123:function:test:tag"); handler.handler(events, context); /* * Verify Events made it all the way through */ assertEquals(1, BufferedTransporter.output.size()); assertEquals("bar", BufferedTransporter.output.get(0)); }
@Test public void testEndToEnd() throws HandlerException { BaseHandler.CONFIG_FILE = "/config/handler_config.json"; List<DummyEvent> events = new ArrayList<DummyEvent>(2); events.add(new DummyEvent("foo", 0)); events.add(new DummyEvent("bar", 0)); TestContext context = new TestContext(); context.setInvokedFunctionArn("arn:aws:lambda:us-east-1:123:function:test:tag"); handler.handler(events, context); /* * Verify Events made it all the way through */ assertEquals(2, BufferedTransporter.output.size()); assertEquals("foo", BufferedTransporter.output.get(0)); assertEquals("bar", BufferedTransporter.output.get(1)); }
@Test public void testFilterNullDeserialization() throws HandlerException { BaseHandler.CONFIG_FILE = "/config/handler_config.json"; handler.skipWriteStats = true; List<DummyEvent> events = new ArrayList<DummyEvent>(1); events.add(new DummyEvent("foo", 0)); TestContext context = new TestContext(); context.setInvokedFunctionArn("arn:aws:lambda:us-east-1:123:function:test:tag"); handler.init(context); DeserializerProcessor proc = handler.sources.get(0).getDeserProcessor(); Deserializer deserSpy = spy(proc.getDeserializer()); when(deserSpy.deserialize(anyString())).thenReturn(null); proc.setDeserializer(deserSpy); handler.handler(events, context); assertEquals(0, BufferedTransporter.output.size()); }
@Test public void testRegex() throws HandlerException { BaseHandler.CONFIG_FILE = "/config/handler_config_regex.json"; List<DummyEvent> events = new ArrayList<DummyEvent>(2); events.add(new DummyEvent("foo", 0)); events.add(new DummyEvent("bar", 0)); events.add(new DummyEvent("loop", 0)); TestContext context = new TestContext(); context.setInvokedFunctionArn("arn:aws:lambda:us-east-1:123:function:test:tag"); handler.handler(events, context); /* * Verify Events made it all the way through */ assertEquals(1, BufferedTransporter.output.size()); assertEquals("bar", BufferedTransporter.output.get(0)); } }
@Test(expected = TransportException.class) public void testGeneralTransportExceptionOnShutdown() throws Throwable { BaseHandler.CONFIG_FILE = "/config/handler_config.json"; List<DummyEvent> events = new ArrayList<DummyEvent>(1); events.add(new DummyEvent("foo", 0)); TestContext context = new TestContext(); context.setInvokedFunctionArn("arn:aws:lambda:us-east-1:123:function:test:tag"); handler.init(context); IpcSenderService spy = spy(handler.getIpcService()); handler.setIpcService(spy); doThrow(new TransportException("expected")).when(spy).flush(); try { handler.handler(events, context); } catch (Exception e) { throw e.getCause().getCause(); } }
@Test public void testLatestTagConfig() throws HandlerException { List<DummyEvent> events = new ArrayList<DummyEvent>(1); TestContext context = new TestContext(); context.setInvokedFunctionArn("arn:aws:lambda:us-east-1:123:function:test"); handler.handler(events, context); assertEquals("/config/$LATEST.json", handler.config.getConfigFile()); }
@Test public void testTagConfig() throws HandlerException { List<DummyEvent> events = new ArrayList<DummyEvent>(1); TestContext context = new TestContext(); context.setInvokedFunctionArn("arn:aws:lambda:us-east-1:123:function:test:staging"); handler.handler(events, context); assertEquals("/config/staging.json", handler.config.getConfigFile()); }
@Test public void testFilterFailedDeserialization() throws HandlerException { BaseHandler.CONFIG_FILE = "/config/handler_config.json"; handler.skipWriteStats = true; List<DummyEvent> events = new ArrayList<DummyEvent>(1); events.add(new DummyEvent("foo", 0)); TestContext context = new TestContext(); context.setInvokedFunctionArn("arn:aws:lambda:us-east-1:123:function:test:tag"); handler.init(context); DeserializerProcessor proc = handler.sources.get(0).getDeserProcessor(); Deserializer deserSpy = spy(proc.getDeserializer()); doThrow(new DeserializationException("expected")).when(deserSpy).deserialize(anyString()); proc.setDeserializer(deserSpy); handler.handler(events, context); assertEquals(0, BufferedTransporter.output.size()); }
@Test public void testUserTags() throws HandlerException { BaseHandler.CONFIG_FILE = "/config/handler_config_user_tags.json"; TestContext context = new TestContext(); context.setInvokedFunctionArn("arn:aws:lambda:us-east-1:123:function:test:test_tags"); HashMap<String, String> expected = new HashMap<String, String>() { { put("u1", "foo"); put("u2", "bar"); } }; handler.init(context); Map<String, String> actual = handler.monitor.getTagsMap(); assertTrue(actual.entrySet().containsAll(expected.entrySet())); }
@Test public void testSerializationException() throws HandlerException, SerializationException { BaseHandler.CONFIG_FILE = "/config/handler_config.json"; handler.skipWriteStats = true; List<DummyEvent> events = new ArrayList<DummyEvent>(1); events.add(new DummyEvent("foo", 0)); TestContext context = new TestContext(); context.setInvokedFunctionArn("arn:aws:lambda:us-east-1:123:function:test:tag"); handler.init(context); Serializer serSpy = spy(handler.ser.getSerializer()); doThrow(new DeserializationException("")).when(serSpy).serialize(any()); handler.ser.setSerializer(serSpy); handler.handler(events, context); assertEquals(1, handler.ser.getErrorCountStat().getValue()); }
@Test public void testDeserializationException() throws HandlerException { BaseHandler.CONFIG_FILE = "/config/handler_config.json"; handler.skipWriteStats = true; List<DummyEvent> events = new ArrayList<DummyEvent>(1); events.add(new DummyEvent("foo", 0)); TestContext context = new TestContext(); context.setInvokedFunctionArn("arn:aws:lambda:us-east-1:123:function:test:tag"); handler.init(context); DeserializerProcessor proc = handler.sources.get(0).getDeserProcessor(); Deserializer deserSpy = spy(proc.getDeserializer()); doThrow(new DeserializationException("expected")).when(deserSpy).deserialize(anyString()); proc.setDeserializer(deserSpy); handler.handler(events, context); assertEquals(1, proc.getErrorCountStat().getValue()); }
@Test public void testOperationException() throws HandlerException { BaseHandler.CONFIG_FILE = "/config/handler_config.json"; handler.skipWriteStats = true; List<DummyEvent> events = new ArrayList<DummyEvent>(1); events.add(new DummyEvent("foo", 0)); TestContext context = new TestContext(); context.setInvokedFunctionArn("arn:aws:lambda:us-east-1:123:function:test:tag"); handler.init(context); List<OperationProcessor> operationProcessors = handler.sources.get(0).getOperationProcessors(); for (OperationProcessor operationProcessor : operationProcessors) { EventOperation operation = (EventOperation) spy(operationProcessor.getOperation()); doThrow(new OperationException("expected")).when(operation).perform(any()); operationProcessor.setOperation(operation); } handler.handler(events, context); assertEquals(1, operationProcessors.get(0).getErrorCountStat().getValue()); }
@Test public void testS3Config() throws HandlerException { BaseHandler handler = new DummyHandler(); handler.CONFIG_FILE = null; handler.s3ClientFactory = this.clientFactory; List<DummyEvent> events = new ArrayList<DummyEvent>(1); TestContext context = new TestContext(); context.setInvokedFunctionArn("arn:aws:lambda:us-east-1:123:function:test"); handler.handler(events, context); assertEquals("s3://" + S3_BUCKET + "/bender/config.json", handler.config.getConfigFile()); assertEquals("Test Events", handler.config.getSources().get(0).getName()); } }
@Test public void testFastSourceFastConsumer() throws HandlerException { BaseHandler.CONFIG_FILE = "/config/handler_config_queue.yaml"; Queue<DummyEvent> q = new Queue<DummyEvent>(); Iterator<DummyEvent> dummyEvents = q.stream().iterator(); for (int i = 0; i < 1000; i++) { q.offer(new DummyEvent("" + i, 0)); } q.close(); TestContext context = new TestContext(); context.setInvokedFunctionArn("arn:aws:lambda:us-east-1:123:function:test:tag"); handler.handler(dummyEvents, context); /* * Verify Events made it all the way through */ assertEquals(1000, BufferedTransporter.output.size()); }
@Test public void testFastSourceSlowConsumer() throws HandlerException { BaseHandler.CONFIG_FILE = "/config/handler_config_queue_throttle.yaml"; Queue<DummyEvent> q = new Queue<DummyEvent>(); Iterator<DummyEvent> dummyEvents = q.stream().iterator(); for (int i = 0; i < 1000; i++) { q.offer(new DummyEvent("" + i, 0)); } q.close(); TestContext context = new TestContext(); context.setInvokedFunctionArn("arn:aws:lambda:us-east-1:123:function:test:tag"); handler.handler(dummyEvents, context); /* * Verify Events made it all the way through */ assertEquals(1000, BufferedTransporter.output.size()); } }