package org.gridkit.jvmtool.stacktrace; import static org.assertj.core.api.Assertions.assertThat; import org.gridkit.jvmtool.event.SimpleTagCollection; import org.gridkit.jvmtool.event.TagCollection; import org.junit.Test; public class TagDictionaryTest { TagDictionary dic = new TagDictionary(4); TestEncoder encoder = new TestEncoder(); @Test public void empty_tag_set() { int id = dic.intern(tags(), encoder); assertThat(id).isEqualTo(0); assertThat(encoder.toString()).isEqualTo(""); } @Test public void tag_set_matching() { int id1 = dic.intern(tags("A", "1"), encoder); int id2 = dic.intern(tags("A", "1"), encoder); assertThat(id1).isEqualTo(id2); } @Test public void tag_encoding() { int id1 = dic.intern(tags("A", "1"), encoder); int id2 = dic.intern(tags("A", "2"), encoder); int id3 = dic.intern(tags("B", "1", "A", "1"), encoder); assertThat(id1).isEqualTo(1); assertThat(id2).isEqualTo(2); assertThat(id3).isEqualTo(3); assertThat(encoder.toString()).isEqualTo( "[1,0] +A:1! [2,0] +A:2! [3,1] +B:1!"); } @Test public void tag_eviction() { int id1 = dic.intern(tags("A", "1"), encoder); int id2 = dic.intern(tags("A", "2"), encoder); int id3 = dic.intern(tags("B", "1", "A", "1", "A", "2"), encoder); int id11 = dic.intern(tags("A", "1"), encoder); int id4 = dic.intern(tags("B", "1", "A", "2", "C", "1"), encoder); int id5 = dic.intern(tags("C", "1", "B", "1"), encoder); assertThat(id1).isEqualTo(1); assertThat(id2).isEqualTo(2); assertThat(id3).isEqualTo(3); assertThat(id11).isEqualTo(1); assertThat(id4).isEqualTo(2); // id reused assertThat(id5).isEqualTo(1); // id reused, 3 was used as base so it survives assertThat(encoder.toString()).isEqualTo( "[1,0] +A:1! [2,0] +A:2! [3,1] +A:2 +B:1! [2,3] -A:1 +C:1! [1,2] -A!"); } @Test public void tag_key_override() { int id1 = dic.intern(tags("A", "long", "B", "2"), encoder); int id2 = dic.intern(tags("A", "long", "B", "1"), encoder); int id3 = dic.intern(tags("A", "long", "B", "3"), encoder); assertThat(id1).isEqualTo(1); assertThat(id2).isEqualTo(2); assertThat(id3).isEqualTo(3); // reader must apply adds before removals assertThat(encoder.toString()).isEqualTo( "[1,0] +A:long +B:2! [2,1] +B:1 -B! [3,1] -B +B:3!"); } public TagCollection tags(String... kv) { SimpleTagCollection tc = new SimpleTagCollection(); if (kv.length % 2 != 0) { throw new IllegalArgumentException(); } for(int i = 0; i < kv.length; i += 2) { tc.put(kv[i], kv[i + 1]); } return tc; } public static class TestEncoder implements TagDictionary.TagSetEncoder { StringBuilder sb = new StringBuilder(); @Override public int cost(String key, String tag) { return tag == null ? 2 + key.length() : 3 + key.length() + tag.length(); } @Override public void startTagSet(int setId, int baseId) { if (sb.length() != 0) { sb.append(' '); } sb.append("[" + setId + "," + baseId + "]"); } @Override public void append(String key, String tag) { sb.append(" +" + key + ":" + tag); } @Override public void remove(String key) { sb.append(" -" + key); } @Override public void remove(String key, String tag) { sb.append(" -" + key + ":" + tag); } @Override public void finishTag() { sb.append("!"); } public String toString() { return sb.toString(); } } }