/** * Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT * All rights reserved. Use is subject to license terms. See LICENSE.TXT */ package org.diirt.datasource.timecache.impl; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.time.Instant; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeSet; import org.diirt.datasource.timecache.Data; import org.diirt.datasource.timecache.DataChunk; import org.diirt.datasource.timecache.DataRequestListener; import org.diirt.datasource.timecache.DataRequestThread; import org.diirt.datasource.timecache.impl.SimpleFileDataSource; import org.diirt.datasource.timecache.source.DataSource; import org.diirt.datasource.timecache.util.CacheHelper; import org.diirt.util.time.TimeInterval; import org.junit.Assert; import org.junit.Test; /** * Test {@link SimpleFileDataSource}: read samples from a file dump of * 'sample_view' from Archive RDB. * @author Fred Arnaud (Sopra Group) - ITER */ public class SimpleFileDataSourceUnitTests { private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); private static Map<DataRequestThread, Set<Instant>> dataTimes = new HashMap<DataRequestThread, Set<Instant>>(); private static Instant start = null; private static Instant end = null; private static boolean finished = false; // listener that counts data in the requested interval private static class TUListener implements DataRequestListener { @Override public void newData(DataChunk chunk, DataRequestThread thread) { System.out.println(CacheHelper.format(TimeInterval.between( chunk.getDatas().first().getTimestamp(), chunk.getDatas().last().getTimestamp())) + ": " + chunk.getDatas().size()); for (Data d : chunk.getDatas()) { if (d.getTimestamp().compareTo(start) >= 0) { if (dataTimes.get(thread).contains(d.getTimestamp())) System.out.println("D: " + CacheHelper.format(d.getTimestamp())); dataTimes.get(thread).add(d.getTimestamp()); } } } @Override public void intervalComplete(DataRequestThread thread) { finished = true; } } // starts the thread and counts received data private static void startAndCount(DataRequestThread thread) { if (dataTimes.get(thread) == null) dataTimes.put(thread, new TreeSet<Instant>()); dataTimes.get(thread).clear(); finished = false; thread.start(); int limit = 0; while (!finished && limit <= 60) { // 30s try { Thread.sleep(500); } catch (InterruptedException e) { } limit++; } } /** * Test that wrong parameters setting in DataSource.getData does not raise * an exception and results in an empty chunk. Test that DataSource.getData * returns an ordered chunk with all samples times superior to the specified * one. Test that all samples times are included in DataChunk.getInterval. */ @Test public void readData() { DataSource source = new SimpleFileDataSource( "src/test/resources/archive-export.csv"); try { start = dateFormat.parse("2014-03-14 16:00").toInstant(); // test wrong parameters DataChunk chunk = null; chunk = source.getData(null, null); Assert.assertTrue(chunk.isEmpty()); chunk = source.getData("TEST-BTY0:AI1", null); Assert.assertTrue(chunk.isEmpty()); chunk = source.getData(null, start); Assert.assertTrue(chunk.isEmpty()); // test chunk time interval chunk = source.getData("TEST-BTY0:AI1", start); Assert.assertTrue(chunk.isFull()); TimeInterval chunkInterval = chunk.getInterval(); Assert.assertEquals(chunkInterval.getStart(), chunk.getDatas().first().getTimestamp()); Assert.assertEquals(chunkInterval.getEnd(), chunk.getDatas().last().getTimestamp()); Assert.assertTrue(chunkInterval.getStart().compareTo(start) >= 0); // test values are ordered by timestamp Iterator<Data> itChunk = chunk.getDatas().iterator(); Instant next = null; Instant previous = itChunk.next().getTimestamp(); while (itChunk.hasNext()) { next = itChunk.next().getTimestamp(); Assert.assertTrue(previous.compareTo(next) < 0); previous = next; } } catch (Exception e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } /** * Test that {@link DataRequestThread} reads all samples from a small dedicated * file. Test that samples are grouped in chunks. Test that result are * returned in chronological order. Test that wrong intervals values do not * raise an exception. */ @Test public void readInterval() { DataSource source = new SimpleFileDataSource( "src/test/resources/mini-archive-export.csv"); DataRequestThread thread = null; try { start = dateFormat.parse("2014-03-14 16:00").toInstant(); end = dateFormat.parse("2014-03-14 17:00").toInstant(); thread = new DataRequestThread("TEST-BTY0:AI1", source, TimeInterval.between(start, end)); thread.addListener(new TUListener()); startAndCount(thread); Assert.assertEquals(234, dataTimes.get(thread).size()); // inverse interval => same result thread = new DataRequestThread("TEST-BTY0:AI1", source, TimeInterval.between(end, start)); thread.addListener(new TUListener()); startAndCount(thread); Assert.assertEquals(234, dataTimes.get(thread).size()); // empty interval => no data start = dateFormat.parse("2014-03-14 17:00").toInstant(); end = dateFormat.parse("2014-03-14 18:00").toInstant(); thread = new DataRequestThread("TEST-BTY0:AI1", source, TimeInterval.between(start, end)); thread.addListener(new TUListener()); startAndCount(thread); Assert.assertEquals(0, dataTimes.get(thread).size()); // only start => same result start = dateFormat.parse("2014-03-14 16:00").toInstant(); thread = new DataRequestThread("TEST-BTY0:AI1", source, TimeInterval.between(start, null)); thread.addListener(new TUListener()); startAndCount(thread); Assert.assertEquals(234, dataTimes.get(thread).size()); // only end => no data end = dateFormat.parse("2014-03-14 17:00").toInstant(); thread = new DataRequestThread("TEST-BTY0:AI1", source, TimeInterval.between(null, end)); thread.addListener(new TUListener()); startAndCount(thread); Assert.assertEquals(0, dataTimes.get(thread).size()); // infinite => no data end = dateFormat.parse("2014-03-14 17:00").toInstant(); thread = new DataRequestThread("TEST-BTY0:AI1", source, TimeInterval.between(null, null)); thread.addListener(new TUListener()); startAndCount(thread); Assert.assertEquals(0, dataTimes.get(thread).size()); // test wrong parameters try { thread = new DataRequestThread(null, source, TimeInterval.between(null, null)); Assert.fail(); } catch (Exception e) { Assert.assertTrue(true); } try { thread = new DataRequestThread("TEST-BTY0:AI1", null, TimeInterval.between(null, null)); Assert.fail(); } catch (Exception e) { Assert.assertTrue(true); } try { thread = new DataRequestThread("TEST-BTY0:AI1", source, null); Assert.fail(); } catch (Exception e) { Assert.assertTrue(true); } } catch (Exception e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } /** * Test that the source can be requested by more than one thread at the same * time and on the same channel. */ @Test public void readMultiple() { DataSource source = new SimpleFileDataSource( "src/test/resources/mini-archive-export.csv"); try { start = dateFormat.parse("2014-03-14 16:00").toInstant(); end = dateFormat.parse("2014-03-14 17:00").toInstant(); DataRequestThread thread1 = new DataRequestThread( "TEST-BTY0:AI1", source, TimeInterval.between(start, end)); DataRequestThread thread2 = new DataRequestThread( "TEST-BTY0:AI1", source, TimeInterval.between(start, end)); DataRequestThread thread3 = new DataRequestThread( "TEST-BTY0:AI1", source, TimeInterval.between(start, end)); thread1.addListener(new TUListener()); thread2.addListener(new TUListener()); thread3.addListener(new TUListener()); startAndCount(thread1); startAndCount(thread2); startAndCount(thread3); Assert.assertEquals(234, dataTimes.get(thread1).size()); Assert.assertEquals(234, dataTimes.get(thread2).size()); Assert.assertEquals(234, dataTimes.get(thread3).size()); } catch (Exception e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } /** * Test that no data is missing when requesting the source. */ @Test public void readCount() { DataSource source = new SimpleFileDataSource( "src/test/resources/archive-ramps-1H.csv", 10); try { start = dateFormat.parse("2014-12-04 00:00").toInstant(); end = dateFormat.parse("2014-12-04 00:30").toInstant(); DataRequestThread thread = new DataRequestThread("TEST-BTY0:RAMP2", source, TimeInterval.between(start, end)); thread.addListener(new TUListener()); startAndCount(thread); Assert.assertEquals(900, dataTimes.get(thread).size()); } catch (Exception e) { e.printStackTrace(); Assert.fail(e.getMessage()); } } }