/*
* Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.tsdr.spi.util;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.opendaylight.tsdr.spi.util.TSDRKeyCache.TSDRCacheEntry;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.log.data.rev160325.storetsdrlogrecord.input.TSDRLogRecord;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.log.data.rev160325.storetsdrlogrecord.input.TSDRLogRecordBuilder;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.metric.data.rev160325.storetsdrmetricrecord.input.TSDRMetricRecord;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.metric.data.rev160325.storetsdrmetricrecord.input.TSDRMetricRecordBuilder;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.rev150219.DataCategory;
import java.io.File;
import java.util.Collection;
import java.util.List;
/**
* @author saichler@gmail.com
**/
public class TSDRKeyCacheTest {
private static final String TSDR_TEST_KEY = "[NID=openflow:1][DC=EXTERNAL][MN=Memory][RK=hello:world,Testing:test]";
private static final String TSDR_TEST_KEY2 = "[NID=openflow:11][DC=EXTERNAL][MN=Memory][RK=hello:world,Testing:test]";
private static final String TSDR_TEST_KEY3 = "[NID=openflow:11][DC=EXTERNAL][MN=Memory][RK=he:world,Testing:test]";
private static final String TSDR_TEST_KEY4 = "[NID=openflow:11][DC=EXTERNAL][MN=Memory][RK=hello:worl,Testing:test]";
private static final String TSDR_TEST_5080_KEY1 = "[NID=openflow:2][DC=QUEUESTATS][MN=TransmittedPackets][RK=Node:openflow:2,NodeConnector:openflow:2:2,Queue:1]";
private static final String TSDR_TEST_5080_KEY2 = "[NID=openflow:2][DC=QUEUESTATS][MN=TransmittedPackets][RK=Node:openflow:2,NodeConnector:openflow:2:1,Queue:1]";
private static final String KEY_5080 = "[NID=][DC=QUEUESTATS][MN=][RK=Queue:2]";
private static final String KEY_5052 = "[NID=openflow:1][DC=][MN=FLOWTABLESTATS][RK=Table:0]";
private static final String TSDR_TEST_5052_KEY1 = "[NID=openflow:1][DC=FLOWTABLESTATS][MN=PacketLookup][RK=Node:openflow:1,Table:150]";
private static final String TSDR_TEST_5052_KEY2 = "[NID=openflow:1][DC=FLOWTABLESTATS][MN=PacketLookup][RK=Node:openflow:1,Table:160]";
private TSDRKeyCache keyCache = null;
@Before
public void before(){
keyCache = new TSDRKeyCache();
}
@After
public void after(){
keyCache.shutdown();
File dir = new File("./tsdr");
File[] files = dir.listFiles();
for(File f:files){
f.delete();
}
dir.delete();
}
@Test
public void testAddTsdrCacheEntry(){
TSDRCacheEntry entry = keyCache.addTSDRCacheEntry(TSDR_TEST_KEY);
Assert.assertEquals("openflow:1",entry.getNodeID());
Assert.assertEquals(DataCategory.EXTERNAL,entry.getDataCategory());
Assert.assertEquals("Memory",entry.getMetricName());
Assert.assertEquals("world",entry.getRecordKeys().get(0).getKeyValue());
}
@Test
public void testGetTsdrCacheEntry(){
keyCache.addTSDRCacheEntry(TSDR_TEST_KEY);
TSDRCacheEntry entry = keyCache.getCacheEntry(TSDR_TEST_KEY);
Assert.assertEquals("openflow:1",entry.getNodeID());
Assert.assertEquals(DataCategory.EXTERNAL,entry.getDataCategory());
Assert.assertEquals("Memory",entry.getMetricName());
Assert.assertEquals("Testing",entry.getRecordKeys().get(1).getKeyName());
}
@Test
public void testGetTsdrCacheEntryByMD5(){
keyCache.addTSDRCacheEntry(TSDR_TEST_KEY);
MD5ID md5 = MD5ID.createTSDRID(TSDR_TEST_KEY);
TSDRCacheEntry entry = keyCache.getCacheEntry(md5);
Assert.assertEquals("openflow:1",entry.getNodeID());
Assert.assertEquals(DataCategory.EXTERNAL,entry.getDataCategory());
Assert.assertEquals("Memory",entry.getMetricName());
Assert.assertEquals("Testing",entry.getRecordKeys().get(1).getKeyName());
}
@Test
public void testGetallKeys(){
keyCache.addTSDRCacheEntry(TSDR_TEST_KEY);
Collection<TSDRCacheEntry> all = keyCache.getAll();
Assert.assertEquals(1,all.size());
TSDRCacheEntry entry = all.iterator().next();
Assert.assertEquals("openflow:1",entry.getNodeID());
Assert.assertEquals(DataCategory.EXTERNAL,entry.getDataCategory());
Assert.assertEquals("Memory",entry.getMetricName());
Assert.assertEquals("Testing",entry.getRecordKeys().get(1).getKeyName());
}
private class TestMetricJob implements TSDRKeyCache.TSDRMetricCollectJob {
@Override
public void collectMetricRecords(TSDRCacheEntry entry, long startDateTime, long endDateTime, int recordLimit, List<TSDRMetricRecord> globalResult) {
TSDRMetricRecordBuilder b = new TSDRMetricRecordBuilder();
b.setNodeID(entry.getNodeID());
b.setTSDRDataCategory(entry.getDataCategory());
b.setMetricName(entry.getMetricName());
b.setRecordKeys(entry.getRecordKeys());
b.setTimeStamp(System.currentTimeMillis());
globalResult.add(b.build());
}
}
private class TestLogJob implements TSDRKeyCache.TSDRLogCollectJob {
@Override
public void collectLogRecords(TSDRCacheEntry entry, long startDateTime, long endDateTime, int recordLimit, List<TSDRLogRecord> globalResult) {
TSDRLogRecordBuilder b = new TSDRLogRecordBuilder();
b.setNodeID(entry.getNodeID());
b.setTSDRDataCategory(entry.getDataCategory());
b.setRecordKeys(entry.getRecordKeys());
b.setTimeStamp(System.currentTimeMillis());
globalResult.add(b.build());
}
}
@Test
public void testMetricByNode(){
keyCache.addTSDRCacheEntry(TSDR_TEST_KEY);
List<TSDRMetricRecord> list = keyCache.getTSDRMetricRecords(FormatUtil.KEY_NODEID+FormatUtil.getNodeIdFromTSDRKey(TSDR_TEST_KEY)+"]",0,Long.MAX_VALUE,1000,new TestMetricJob());
Assert.assertEquals(1,list.size());
TSDRMetricRecord entry = list.get(0);
Assert.assertEquals("openflow:1",entry.getNodeID());
Assert.assertEquals(DataCategory.EXTERNAL,entry.getTSDRDataCategory());
Assert.assertEquals("Memory",entry.getMetricName());
Assert.assertEquals("Testing",entry.getRecordKeys().get(1).getKeyName());
}
@Test
public void testMetricByDataCategory(){
keyCache.addTSDRCacheEntry(TSDR_TEST_KEY);
List<TSDRMetricRecord> list = keyCache.getTSDRMetricRecords(FormatUtil.KEY_CATEGORY+FormatUtil.getDataCategoryFromTSDRKey(TSDR_TEST_KEY)+"]",0,Long.MAX_VALUE,1000,new TestMetricJob());
Assert.assertEquals(1,list.size());
TSDRMetricRecord entry = list.get(0);
Assert.assertEquals("openflow:1",entry.getNodeID());
Assert.assertEquals(DataCategory.EXTERNAL,entry.getTSDRDataCategory());
Assert.assertEquals("Memory",entry.getMetricName());
Assert.assertEquals("Testing",entry.getRecordKeys().get(1).getKeyName());
}
@Test
public void testMetricByMetricName(){
keyCache.addTSDRCacheEntry(TSDR_TEST_KEY);
List<TSDRMetricRecord> list = keyCache.getTSDRMetricRecords(FormatUtil.KEY_METRICNAME+FormatUtil.getMetriNameFromTSDRKey(TSDR_TEST_KEY)+']',0,Long.MAX_VALUE,1000,new TestMetricJob());
Assert.assertEquals(1,list.size());
TSDRMetricRecord entry = list.get(0);
Assert.assertEquals("openflow:1",entry.getNodeID());
Assert.assertEquals(DataCategory.EXTERNAL,entry.getTSDRDataCategory());
Assert.assertEquals("Memory",entry.getMetricName());
Assert.assertEquals("Testing",entry.getRecordKeys().get(1).getKeyName());
}
@Test
public void testMetricByRecordKey(){
keyCache.addTSDRCacheEntry(TSDR_TEST_KEY);
List<TSDRMetricRecord> list = keyCache.getTSDRMetricRecords(FormatUtil.KEY_RECORDKEYS+"hello:world"+']',0,Long.MAX_VALUE,1000,new TestMetricJob());
Assert.assertEquals(1,list.size());
TSDRMetricRecord entry = list.get(0);
Assert.assertEquals("openflow:1",entry.getNodeID());
Assert.assertEquals(DataCategory.EXTERNAL,entry.getTSDRDataCategory());
Assert.assertEquals("Memory",entry.getMetricName());
Assert.assertEquals("Testing",entry.getRecordKeys().get(1).getKeyName());
}
@Test
public void testLogByNode(){
keyCache.addTSDRCacheEntry(TSDR_TEST_KEY);
List<TSDRLogRecord> list = keyCache.getTSDRLogRecords(FormatUtil.KEY_NODEID+FormatUtil.getNodeIdFromTSDRKey(TSDR_TEST_KEY)+"]",0,Long.MAX_VALUE,1000,new TestLogJob());
Assert.assertEquals(1,list.size());
TSDRLogRecord entry = list.get(0);
Assert.assertEquals("openflow:1",entry.getNodeID());
Assert.assertEquals(DataCategory.EXTERNAL,entry.getTSDRDataCategory());
Assert.assertEquals("Testing",entry.getRecordKeys().get(1).getKeyName());
}
@Test
public void testLogByDataCategory(){
keyCache.addTSDRCacheEntry(TSDR_TEST_KEY);
List<TSDRLogRecord> list = keyCache.getTSDRLogRecords(FormatUtil.KEY_CATEGORY+FormatUtil.getDataCategoryFromTSDRKey(TSDR_TEST_KEY)+"]",0,Long.MAX_VALUE,1000,new TestLogJob());
Assert.assertEquals(1,list.size());
TSDRLogRecord entry = list.get(0);
Assert.assertEquals("openflow:1",entry.getNodeID());
Assert.assertEquals(DataCategory.EXTERNAL,entry.getTSDRDataCategory());
Assert.assertEquals("Testing",entry.getRecordKeys().get(1).getKeyName());
}
@Test
public void testLogByMetricName(){
keyCache.addTSDRCacheEntry(TSDR_TEST_KEY);
List<TSDRLogRecord> list = keyCache.getTSDRLogRecords(FormatUtil.KEY_METRICNAME+FormatUtil.getMetriNameFromTSDRKey(TSDR_TEST_KEY)+']',0,Long.MAX_VALUE,1000,new TestLogJob());
Assert.assertEquals(1,list.size());
TSDRLogRecord entry = list.get(0);
Assert.assertEquals("openflow:1",entry.getNodeID());
Assert.assertEquals(DataCategory.EXTERNAL,entry.getTSDRDataCategory());
Assert.assertEquals("Testing",entry.getRecordKeys().get(1).getKeyName());
}
@Test
public void testLogByRecordKey(){
keyCache.addTSDRCacheEntry(TSDR_TEST_KEY);
List<TSDRLogRecord> list = keyCache.getTSDRLogRecords(FormatUtil.KEY_RECORDKEYS+"hello:world"+']',0,Long.MAX_VALUE,1000,new TestLogJob());
Assert.assertEquals(1,list.size());
TSDRLogRecord entry = list.get(0);
Assert.assertEquals("openflow:1",entry.getNodeID());
Assert.assertEquals(DataCategory.EXTERNAL,entry.getTSDRDataCategory());
Assert.assertEquals("Testing",entry.getRecordKeys().get(1).getKeyName());
}
@Test
public void tesBugFixPrefix(){
keyCache.addTSDRCacheEntry(TSDR_TEST_KEY);
keyCache.addTSDRCacheEntry(TSDR_TEST_KEY2);
List<TSDRLogRecord> list = keyCache.getTSDRLogRecords(FormatUtil.KEY_NODEID+"openflow:1]",0,Long.MAX_VALUE,1000,new TestLogJob());
Assert.assertEquals(1,list.size());
TSDRLogRecord entry = list.get(0);
Assert.assertEquals("openflow:1",entry.getNodeID());
Assert.assertEquals(DataCategory.EXTERNAL,entry.getTSDRDataCategory());
Assert.assertEquals("Testing",entry.getRecordKeys().get(1).getKeyName());
}
@Test
public void tesBugFixRKKey(){
keyCache.addTSDRCacheEntry(TSDR_TEST_KEY);
keyCache.addTSDRCacheEntry(TSDR_TEST_KEY2);
keyCache.addTSDRCacheEntry(TSDR_TEST_KEY3);
keyCache.addTSDRCacheEntry(TSDR_TEST_KEY4);
List<TSDRLogRecord> list = keyCache.getTSDRLogRecords(FormatUtil.KEY_RECORDKEYS+"he:world]",0,Long.MAX_VALUE,1000,new TestLogJob());
Assert.assertEquals(1,list.size());
TSDRLogRecord entry = list.get(0);
Assert.assertEquals("openflow:11",entry.getNodeID());
Assert.assertEquals(DataCategory.EXTERNAL,entry.getTSDRDataCategory());
Assert.assertEquals("Testing",entry.getRecordKeys().get(1).getKeyName());
}
@Test
public void tesBugFixRKValue(){
keyCache.addTSDRCacheEntry(TSDR_TEST_KEY);
keyCache.addTSDRCacheEntry(TSDR_TEST_KEY2);
keyCache.addTSDRCacheEntry(TSDR_TEST_KEY3);
keyCache.addTSDRCacheEntry(TSDR_TEST_KEY4);
List<TSDRLogRecord> list = keyCache.getTSDRLogRecords(FormatUtil.KEY_RECORDKEYS+"hello:worl]",0,Long.MAX_VALUE,1000,new TestLogJob());
Assert.assertEquals(1,list.size());
}
@Test
public void tesBug5080(){
keyCache.addTSDRCacheEntry(TSDR_TEST_5080_KEY1);
keyCache.addTSDRCacheEntry(TSDR_TEST_5080_KEY2);
List<TSDRLogRecord> list = keyCache.getTSDRLogRecords(KEY_5080,0,Long.MAX_VALUE,1000,new TestLogJob());
Assert.assertEquals(0,list.size());
}
@Test
public void tesBug5052(){
keyCache.addTSDRCacheEntry(TSDR_TEST_5052_KEY1);
keyCache.addTSDRCacheEntry(TSDR_TEST_5052_KEY2);
List<TSDRLogRecord> list = keyCache.getTSDRLogRecords(KEY_5052,0,Long.MAX_VALUE,1000,new TestLogJob());
Assert.assertEquals(0,list.size());
}
}