/**
* Copyright 2011-2017 Asakusa Framework Team.
*
* 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 com.asakusafw.yaess.tools.log.summarize;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import org.junit.Test;
import com.asakusafw.yaess.tools.log.YaessJobId;
import com.asakusafw.yaess.tools.log.YaessLogRecord;
import com.asakusafw.yaess.tools.log.util.LogCodeRegexFilter;
/**
* Test for {@link SummarizeYaessLogSink}.
*/
public class SummarizeYaessLogSinkTest {
private final List<YaessLogRecord> records = new ArrayList<>();
private final YaessJobIdProvider provider = new YaessJobIdProvider() {
@Override
protected YaessJobId createId() {
YaessJobId id = super.createId();
id.setBatchId("b");
id.setFlowId("f");
id.setJobId("j");
id.setPhase("main");
id.setExecutionId("e");
id.setServiceId("s");
id.setTrackingId("t");
return id;
}
};
/**
* Simple test case.
*/
@Test
public void simple() {
YaessJobId id1 = provider.copy();
append(0, "YS-CORE-I00000", id1);
append(100, "YS-CORE-I00999", id1);
Map<YaessJobId, List<String>> results = summarize(anything -> true);
assertThat(results.size(), is(1));
List<String> r1 = results.get(id1);
assertThat(r1, is(notNullValue()));
assertThat(r1.get(0), is("0"));
assertThat(r1.get(1), is("100"));
assertThat(r1.get(2), is("INFO"));
}
/**
* Multiple records.
*/
@Test
public void multiple() {
provider.id().setJobId("j1");
YaessJobId id1 = provider.copy();
append(10000, "YS-CORE-I00000", id1);
append(10001, "YS-CORE-I00001", id1);
append(10100, "YS-CORE-I00999", id1);
provider.id().setJobId("j2");
YaessJobId id2 = provider.copy();
append(11000, "YS-CORE-I00000", id2);
append(11001, "YS-CORE-W00001", id2);
append(11200, "YS-CORE-I00999", id2);
provider.id().setJobId("j3");
YaessJobId id3 = provider.copy();
append(12000, "YS-CORE-I00000", id3);
append(12001, "YS-CORE-E00001", id3);
append(12300, "YS-CORE-I00999", id3);
Map<YaessJobId, List<String>> results = summarize(anything -> true);
assertThat(results.size(), is(3));
List<String> r1 = results.get(id1);
assertThat(r1, is(notNullValue()));
assertThat(r1.get(0), is("0"));
assertThat(r1.get(1), is("100"));
assertThat(r1.get(2), is("INFO"));
List<String> r2 = results.get(id2);
assertThat(r2, is(notNullValue()));
assertThat(r2.get(0), is("1000"));
assertThat(r2.get(1), is("200"));
assertThat(r2.get(2), is("WARN"));
List<String> r3 = results.get(id3);
assertThat(r3, is(notNullValue()));
assertThat(r3.get(0), is("2000"));
assertThat(r3.get(1), is("300"));
assertThat(r3.get(2), is("ERROR"));
}
/**
* w/ filter.
*/
@Test
public void filtered() {
YaessJobId id1 = provider.copy();
append(0, "YS-CORE-I00000", id1);
append(100, "YS-CORE-I00999", id1);
append(500, "YS-UNKNOWN-I00000", id1);
Map<YaessJobId, List<String>> results = summarize(new LogCodeRegexFilter(Pattern.compile("YS-CORE-.*")));
assertThat(results.size(), is(1));
List<String> r1 = results.get(id1);
assertThat(r1, is(notNullValue()));
assertThat(r1.get(0), is("0"));
assertThat(r1.get(1), is("100"));
assertThat(r1.get(2), is("INFO"));
}
private void append(long time, String code, YaessJobId id) {
YaessLogRecord record = new YaessLogRecord();
record.setTime(time);
record.setCode(code);
record.setJobId(id);
records.add(record);
}
private Map<YaessJobId, List<String>> summarize(Predicate<? super YaessLogRecord> filter) {
List<List<String>> lines;
try (ListWriter writer = new ListWriter();
SummarizeYaessLogSink sink = new SummarizeYaessLogSink(writer, filter)) {
for (YaessLogRecord record : records) {
sink.put(record);
}
sink.flush();
lines = writer.getLines();
} catch (Exception e) {
throw new AssertionError(e);
}
Map<YaessJobId, List<String>> results = new HashMap<>();
if (lines.isEmpty() == false) {
// ignore header
lines = lines.subList(1, lines.size());
}
for (List<String> record : lines) {
YaessJobId id = new YaessJobId();
id.setBatchId(record.get(0));
id.setFlowId(record.get(1));
id.setExecutionId(record.get(2));
id.setPhase(record.get(3));
id.setServiceId(record.get(4));
id.setJobId(record.get(5));
id.setTrackingId(record.get(6));
assertThat(results.get(id), is(nullValue()));
results.put(id, new ArrayList<>(record.subList(7, record.size())));
}
return results;
}
}