/** * 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.file; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.PrintWriter; import java.time.Duration; import org.diirt.datasource.test.CountDownPVReaderListener; import java.util.Arrays; import org.diirt.datasource.DataSource; import org.diirt.datasource.PV; import org.diirt.datasource.PVManager; import org.diirt.datasource.PVReader; import org.diirt.datasource.PVReaderEvent; import static org.junit.Assert.*; import org.junit.*; import static org.diirt.datasource.vtype.ExpressionLanguage.*; import org.diirt.util.array.ArrayDouble; import org.diirt.vtype.VStringArray; import org.diirt.vtype.VTable; import org.diirt.vtype.VType; import org.diirt.vtype.ValueFactory; import static org.hamcrest.Matchers.*; import static java.time.Duration.*; /** * * @author carcassi */ public class FileDataSourceTest { public FileDataSourceTest() { } private static DataSource file; @BeforeClass public static void createDataSource() { file = new FileDataSourceConfiguration().pollEnabled(true).pollInterval(Duration.ofMillis(250)).create(); } @AfterClass public static void destroyDataSource() { file.close(); file = null; } @Before public void setUp() { pv = null; } @After public void tearDown() { if (pv != null) { pv.close(); pv = null; } } private volatile PVReader<?> pv; // TODO: Add a test for the image @Test public void readFile() throws Exception { CountDownPVReaderListener listener = new CountDownPVReaderListener(1, PVReaderEvent.VALUE_MASK); pv = PVManager.read(vType(getClass().getResource("data1.csv").getPath())).from(file) .readListener(listener) .maxRate(ofMillis(10)); // Wait for value listener.await(ofMillis(700)); assertThat(listener.getCount(), equalTo(0)); assertThat(pv.getValue(), instanceOf(VTable.class)); VTable vTable = (VTable) pv.getValue(); assertThat(vTable.getRowCount(), equalTo(3)); assertThat(vTable.getColumnCount(), equalTo(2)); assertThat(vTable.getColumnName(0), equalTo("Name")); assertThat(vTable.getColumnName(1), equalTo("Value")); assertThat(vTable.getColumnData(0), equalTo((Object) Arrays.asList("A", "B", "C"))); // listener.resetCount(1); // // // No new values, should get no new notification // listener.await(ofMillis(500)); // assertThat(listener.getCount(), equalTo(1)); // // // Add one value, notification should not come right away // queue.add(1); // listener.await(ofMillis(100)); // assertThat(listener.getCount(), equalTo(1)); // // // Add a few other values, still no new notification // queue.add(2); // queue.add(3); // listener.await(ofMillis(100)); // assertThat(listener.getCount(), equalTo(1)); // queue.add(4); // // // Wait longer for first notification // listener.await(ofMillis(500)); // assertThat(listener.getCount(), equalTo(0)); // assertThat(pv.getValue(), equalTo((Object) Arrays.asList(1))); // listener.resetCount(1); // // // Wait for second notification // listener.await(ofMillis(700)); // assertThat(listener.getCount(), equalTo(0)); // assertThat(pv.getValue(), equalTo((Object) Arrays.asList(2,3,4))); } @Test public void udpateFile() throws Exception { CountDownPVReaderListener listener = new CountDownPVReaderListener(1, PVReaderEvent.VALUE_MASK); File filename = File.createTempFile("file.", ".csv"); PrintWriter writer = new PrintWriter(filename); writer.println("Name,Value"); writer.println("Andrew,34"); writer.println("Bob,12"); writer.close(); pv = PVManager.read(vType(filename.toURI().getPath())).from(file) .readListener(listener) .maxRate(ofMillis(10)); // Wait for value listener.await(ofMillis(1500)); assertThat(listener.getCount(), equalTo(0)); assertThat(pv.getValue(), instanceOf(VTable.class)); VTable vTable = (VTable) pv.getValue(); assertThat(vTable.getRowCount(), equalTo(2)); assertThat(vTable.getColumnCount(), equalTo(2)); assertThat(vTable.getColumnName(0), equalTo("Name")); assertThat(vTable.getColumnName(1), equalTo("Value")); assertThat(vTable.getColumnData(0), equalTo((Object) Arrays.asList("Andrew", "Bob"))); assertThat(vTable.getColumnData(1), equalTo((Object) new ArrayDouble(34,12))); listener.resetCount(1); writer = new PrintWriter(new BufferedWriter(new FileWriter(filename, true))); writer.println("Charlie,71"); writer.close(); // Wait for value listener.await(ofMillis(3000)); assertThat(listener.getCount(), equalTo(0)); assertThat(pv.getValue(), instanceOf(VTable.class)); vTable = (VTable) pv.getValue(); assertThat(vTable.getRowCount(), equalTo(3)); assertThat(vTable.getColumnCount(), equalTo(2)); assertThat(vTable.getColumnName(0), equalTo("Name")); assertThat(vTable.getColumnName(1), equalTo("Value")); assertThat(vTable.getColumnData(0), equalTo((Object) Arrays.asList("Andrew", "Bob", "Charlie"))); assertThat(vTable.getColumnData(1), equalTo((Object) new ArrayDouble(34,12,71))); } @Test public void writeToList1() throws Exception { CountDownPVReaderListener listener = new CountDownPVReaderListener(1, PVReaderEvent.VALUE_MASK); File filename = File.createTempFile("file.", ".list"); PrintWriter writer = new PrintWriter(filename); writer.println("A"); writer.println("B"); writer.println("C"); writer.close(); PV<VType, Object> fullPv = PVManager.readAndWrite(vType(filename.toURI().getPath())).from(file) .readListener(listener) .synchWriteAndMaxReadRate(ofMillis(10)); pv = fullPv; // Wait for value listener.await(ofMillis(700)); assertThat(listener.getCount(), equalTo(0)); assertThat(pv.getValue(), instanceOf(VStringArray.class)); VStringArray array = (VStringArray) pv.getValue(); assertThat(array.getData(), equalTo(Arrays.asList("A", "B", "C"))); listener.resetCount(1); fullPv.write(ValueFactory.toVType(Arrays.asList("A", "B", "C", "D"))); listener.await(ofMillis(2000)); assertThat(listener.getCount(), equalTo(0)); assertThat(pv.getValue(), instanceOf(VStringArray.class)); array = (VStringArray) pv.getValue(); assertThat(array.getData(), equalTo(Arrays.asList("A", "B", "C", "D"))); try (BufferedReader reader = new BufferedReader(new FileReader(filename))) { String line = reader.readLine(); assertThat(line, equalTo("A")); line = reader.readLine(); assertThat(line, equalTo("B")); line = reader.readLine(); assertThat(line, equalTo("C")); line = reader.readLine(); assertThat(line, equalTo("D")); line = reader.readLine(); assertThat(line, nullValue()); } } }