blob: 5ac576171d053fdfe742fab5cf3dd2db68148c85 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.metron.common.configuration.profiler;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import org.adrianwalker.multilinestring.Multiline;
import org.junit.jupiter.api.Test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* Tests the {@link ProfilerConfig} class.
*/
public class ProfilerConfigTest {
/**
* {
* "profiles": [
* {
* "profile": "profile1",
* "foreach": "ip_src_addr",
* "init": { "count": "0" },
* "update": { "count": "count + 1" },
* "result": "count"
* }
* ]
* }
*/
@Multiline
private String profile;
/**
* Tests deserializing the Profiler configuration using the fromJSON(...) method.
*/
@Test
public void testFromJSON() throws IOException {
ProfilerConfig conf = ProfilerConfig.fromJSON(profile);
assertFalse(conf.getTimestampField().isPresent());
assertEquals(1, conf.getProfiles().size());
}
/**
* {
* "profiles": [
* {
* "profile": "profile1",
* "foreach": "ip_src_addr",
* "init": { "count": "0" },
* "update": { "count": "count + 1" },
* "result": "count"
* }
* ]
* }
*/
@Multiline
private String noTimestampField;
/**
* If no 'timestampField' is defined, it should not be present by default.
*/
@Test
public void testFromJSONWithNoTimestampField() throws IOException {
ProfilerConfig conf = ProfilerConfig.fromJSON(noTimestampField);
assertFalse(conf.getTimestampField().isPresent());
}
/**
* {
* "profiles": [
* {
* "profile": "profile1",
* "foreach": "ip_src_addr",
* "init": { "count": "0" },
* "update": { "count": "count + 1" },
* "result": "count"
* }
* ],
* "timestampField": "timestamp"
* }
*/
@Multiline
private String timestampField;
/**
* Tests deserializing the Profiler configuration when the timestamp field is defined.
*/
@Test
public void testFromJSONWithTimestampField() throws IOException {
ProfilerConfig conf = ProfilerConfig.fromJSON(timestampField);
assertTrue(conf.getTimestampField().isPresent());
}
/**
* {
* "profiles": [
* {
* "profile": "profile1",
* "foreach": "ip_src_addr",
* "init": { "count": "0" },
* "update": { "count": "count + 1" },
* "result": "count"
* },
* {
* "profile": "profile2",
* "foreach": "ip_dst_addr",
* "init": { "count": "0" },
* "update": { "count": "count + 1" },
* "result": "count"
* }
* ]
* }
*/
@Multiline
private String twoProfiles;
@Test
public void testFromJSONTwoProfiles() throws IOException {
ProfilerConfig conf = ProfilerConfig.fromJSON(twoProfiles);
assertEquals(2, conf.getProfiles().size());
assertFalse(conf.getTimestampField().isPresent());
}
/**
* Tests serializing the Profiler configuration to JSON.
*/
@Test
public void testToJSON() throws Exception {
// setup a profiler config to serialize
ProfilerConfig expected = ProfilerConfig.fromJSON(profile);
// execute the test - serialize the config
String asJson = expected.toJSON();
// validate - deserialize to validate
ProfilerConfig actual = ProfilerConfig.fromJSON(asJson);
assertEquals(expected, actual);
}
/**
* {
* "profiles": [
* {
* "profile": "profile1",
* "foreach": "ip_src_addr",
* "init": { "count": "0" },
* "update": { "count": "count + 1" },
* "result": {
* "profile": "count",
* "triage" : { "count": "count" }
* }
* }
* ]
* }
*/
@Multiline
private String profileWithTriageExpression;
@Test
public void testToJSONWithTriageExpression() throws Exception {
// setup a profiler config to serialize
ProfilerConfig expected = ProfilerConfig.fromJSON(profileWithTriageExpression);
// execute the test - serialize the config
String asJson = expected.toJSON();
// validate - deserialize to validate
ProfilerConfig actual = ProfilerConfig.fromJSON(asJson);
assertEquals(expected, actual);
}
@Test
public void testToJSONWithTwoProfiles() throws Exception {
// setup a profiler config to serialize
ProfilerConfig expected = ProfilerConfig.fromJSON(twoProfiles);
// execute the test - serialize the config
String asJson = expected.toJSON();
// validate - deserialize to validate
ProfilerConfig actual = ProfilerConfig.fromJSON(asJson);
assertEquals(expected, actual);
}
/**
* {
* "profiles": [
* {
* "profile": "profile1",
* "foreach": "ip_src_addr",
* "init": { "count": "0" },
* "update": { "count": "count + 1" },
* "result": "count"
* },
* {
* "profile": "profile2",
* "foreach": "ip_dst_addr",
* "init": { "count": "0" },
* "update": { "count": "count + 1" },
* "result": "count"
* },
* {
* "profile": "profile3",
* "foreach": "ip_src_addr",
* "init": { "count": "0" },
* "update": { "count": "count + 1" },
* "result": {
* "profile": "count",
* "triage" : { "count": "count" }
* }
* }
* ]
* }
*/
@Multiline
private String profilesToSerialize;
/**
* Ensure that the Profiler configuration can undergo Kryo serialization which
* occurs when the Profiler is running in Storm.
*/
@Test
public void testKryoSerialization() throws Exception {
// setup a profiler config to serialize
ProfilerConfig expected = ProfilerConfig.fromJSON(profilesToSerialize);
assertNotNull(expected);
Kryo kryo = new Kryo();
// serialize
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
Output output = new Output(byteStream);
kryo.writeObject(output, expected);
// validate serialization
byte[] bits = output.toBytes();
assertNotNull(bits);
// deserialize
Input input = new Input(new ByteArrayInputStream(bits));
ProfilerConfig actual = kryo.readObject(input, ProfilerConfig.class);
// validate deserialization
assertNotNull(actual);
assertEquals(expected, actual);
}
/**
* Ensure that the Profiler configuration can undergo Java serialization, should a user
* prefer that over Kryo serialization, which can occur when the Profiler is running
* in Storm.
*/
@Test
public void testJavaSerialization() throws Exception {
// setup a profiler config to serialize
ProfilerConfig expected = ProfilerConfig.fromJSON(profilesToSerialize);
// serialize using java
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bytes);
out.writeObject(expected);
// the serialized bits
byte[] raw = bytes.toByteArray();
assertTrue(raw.length > 0);
// deserialize using java
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(raw));
Object actual = in.readObject();
// ensure that the round-trip was successful
assertEquals(expected, actual);
}
}