/* * Copyright 2014-2016 CyberVision, Inc. * * 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 org.kaaproject.kaa.server.appenders.file.appender; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import org.junit.Assert; import org.junit.Test; import org.kaaproject.kaa.common.avro.AvroByteArrayConverter; import org.kaaproject.kaa.common.avro.AvroJsonConverter; import org.kaaproject.kaa.common.avro.GenericAvroConverter; import org.kaaproject.kaa.common.dto.EndpointProfileDataDto; import org.kaaproject.kaa.common.dto.logs.LogAppenderDto; import org.kaaproject.kaa.common.dto.logs.LogHeaderStructureDto; import org.kaaproject.kaa.common.dto.logs.LogSchemaDto; import org.kaaproject.kaa.common.endpoint.gen.BasicEndpointProfile; import org.kaaproject.kaa.server.appenders.file.config.gen.FileConfig; import org.kaaproject.kaa.server.common.core.algorithms.generation.DefaultRecordGenerationAlgorithm; import org.kaaproject.kaa.server.common.core.algorithms.generation.DefaultRecordGenerationAlgorithmImpl; import org.kaaproject.kaa.server.common.core.configuration.RawData; import org.kaaproject.kaa.server.common.core.configuration.RawDataFactory; import org.kaaproject.kaa.server.common.core.schema.RawSchema; import org.kaaproject.kaa.server.common.log.shared.appender.LogDeliveryCallback; import org.kaaproject.kaa.server.common.log.shared.appender.LogEvent; import org.kaaproject.kaa.server.common.log.shared.appender.LogSchema; import org.kaaproject.kaa.server.common.log.shared.appender.data.BaseLogEventPack; import org.mockito.Mockito; import org.springframework.test.util.ReflectionTestUtils; import java.io.File; import java.util.Arrays; import java.util.Collections; public class FileSystemLogAppenderTest { private static final String APPENDER_ID = "appender_id"; private static final String APPLICATION_ID = "application_id"; private static final String TENANT_ID = "tenant_id"; private static final String APPENDER_NAME = "test"; private FileSystemLogEventService fileSystemLogEventService; @Test public void testAppend() throws Exception { FileSystemLogAppender appender = new FileSystemLogAppender(); appender.setName("test"); FileSystemLogEventService service = Mockito.mock(FileSystemLogEventService.class); ReflectionTestUtils.setField(appender, "fileSystemLogEventService", service); appender.setName(APPENDER_NAME); appender.setAppenderId(APPENDER_ID); LogAppenderDto logAppenderDto = prepareConfig(); logAppenderDto.setApplicationId(APPLICATION_ID); logAppenderDto.setName("test"); logAppenderDto.setTenantId(TENANT_ID); try { appender.init(logAppenderDto); ReflectionTestUtils.setField(appender, "header", Arrays.asList(LogHeaderStructureDto.values())); GenericAvroConverter<BasicEndpointProfile> converter = new GenericAvroConverter<BasicEndpointProfile>( BasicEndpointProfile.SCHEMA$); BasicEndpointProfile theLog = new BasicEndpointProfile("test"); LogSchemaDto schemaDto = new LogSchemaDto(); LogSchema schema = new LogSchema(schemaDto, BasicEndpointProfile.SCHEMA$.toString()); LogEvent logEvent = new LogEvent(); logEvent.setLogData(converter.encode(theLog)); EndpointProfileDataDto profileDto = new EndpointProfileDataDto("1", "endpointKey", 1, "", 0, null); BaseLogEventPack logEventPack = new BaseLogEventPack(profileDto, 1234567l, schema.getVersion(), Collections.singletonList(logEvent)); logEventPack.setLogSchema(schema); TestLogDeliveryCallback callback = new TestLogDeliveryCallback(); appender.doAppend(logEventPack, callback); Assert.assertTrue(callback.success); } finally { appender.close(); } } @Test public void appendToClosedAppenderTest() { FileSystemLogAppender appender = new FileSystemLogAppender(); LogDeliveryCallback listener = mock(LogDeliveryCallback.class); ReflectionTestUtils.setField(appender, "closed", true); appender.doAppend(null, null, listener); verify(listener).onInternalError(); } @Test public void testAppendWithInternalError() throws Exception { FileSystemLogAppender appender = new FileSystemLogAppender(); appender.setName("test"); FileSystemLogEventService service = Mockito.mock(FileSystemLogEventService.class); ReflectionTestUtils.setField(appender, "fileSystemLogEventService", service); appender.setName(APPENDER_NAME); appender.setAppenderId(APPENDER_ID); LogAppenderDto logAppenderDto = prepareConfig(); logAppenderDto.setApplicationId(APPLICATION_ID); logAppenderDto.setName("test"); logAppenderDto.setTenantId(TENANT_ID); try { appender.init(logAppenderDto); ReflectionTestUtils.setField(appender, "header", Arrays.asList(LogHeaderStructureDto.values())); LogSchemaDto schemaDto = new LogSchemaDto(); LogSchema schema = new LogSchema(schemaDto, BasicEndpointProfile.SCHEMA$.toString()); LogEvent logEvent = new LogEvent(); logEvent.setLogData(new byte[0]); EndpointProfileDataDto profileDto = new EndpointProfileDataDto("1", "endpointKey", 1, "", 0, null); BaseLogEventPack logEventPack = new BaseLogEventPack(profileDto, 1234567l, schema.getVersion(), Collections.singletonList(logEvent)); logEventPack.setLogSchema(schema); TestLogDeliveryCallback callback = new TestLogDeliveryCallback(); appender.doAppend(logEventPack, callback); Assert.assertTrue(callback.internallError); } finally { appender.close(); } } @Test public void initTest() throws Exception { FileSystemLogAppender appender = new FileSystemLogAppender(); fileSystemLogEventService = mock(FileSystemLogEventService.class); FileSystemLogger logger = Mockito.mock(FileSystemLogger.class); ReflectionTestUtils.setField(appender, "fileSystemLogEventService", fileSystemLogEventService); ReflectionTestUtils.setField(appender, "logger", logger); appender.setName(APPENDER_NAME); appender.setAppenderId(APPENDER_ID); LogAppenderDto logAppenderDto = prepareConfig(); logAppenderDto.setApplicationId(APPLICATION_ID); logAppenderDto.setName("test"); logAppenderDto.setTenantId(TENANT_ID); try { appender.init(logAppenderDto); Assert.assertEquals(APPENDER_NAME, appender.getName()); Assert.assertEquals(APPENDER_ID, appender.getAppenderId()); } finally { appender.close(); } } private LogAppenderDto prepareConfig() throws Exception { LogAppenderDto logAppenderDto = new LogAppenderDto(); logAppenderDto.setApplicationId(APPLICATION_ID); logAppenderDto.setName("test"); logAppenderDto.setTenantId(TENANT_ID); RawSchema rawSchema = new RawSchema(FileConfig.getClassSchema().toString()); DefaultRecordGenerationAlgorithm<RawData> algotithm = new DefaultRecordGenerationAlgorithmImpl<>(rawSchema, new RawDataFactory()); RawData rawData = algotithm.getRootData(); AvroJsonConverter<FileConfig> converter = new AvroJsonConverter<>(FileConfig.getClassSchema(), FileConfig.class); FileConfig fileConfig = converter.decodeJson(rawData.getRawData()); fileConfig.setLogsRootPath(System.getProperty("java.io.tmpdir") + File.separator + "tmp_logs_" + System.currentTimeMillis()); AvroByteArrayConverter<FileConfig> byteConverter = new AvroByteArrayConverter<>(FileConfig.class); byte[] rawConfiguration = byteConverter.toByteArray(fileConfig); logAppenderDto.setRawConfiguration(rawConfiguration); return logAppenderDto; } private static class TestLogDeliveryCallback implements LogDeliveryCallback { private volatile boolean success; private volatile boolean internallError; @Override public void onSuccess() { success = true; } @Override public void onInternalError() { internallError = true; } @Override public void onConnectionError() { } @Override public void onRemoteError() { } } }