/* ================================================================== * JdbcGeneralNodeDatumDaoTest.java - Aug 26, 2014 9:09:51 AM * * Copyright 2007-2014 SolarNetwork.net Dev Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * ================================================================== */ package net.solarnetwork.node.dao.jdbc.general.test; import java.sql.Timestamp; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.sql.DataSource; import net.solarnetwork.domain.GeneralNodeDatumSamples; import net.solarnetwork.node.dao.jdbc.DatabaseSetup; import net.solarnetwork.node.dao.jdbc.general.JdbcGeneralNodeDatumDao; import net.solarnetwork.node.domain.GeneralNodeDatum; import net.solarnetwork.node.test.AbstractNodeTransactionalTest; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.databind.ObjectMapper; /** * Test cases for the {@link JdbcGeneralNodeDatumDao} class. * * @author matt * @version 1.0 */ public class JdbcGeneralNodeDatumDaoTest extends AbstractNodeTransactionalTest { @Resource(name = "dataSource") private DataSource dataSource; private JdbcGeneralNodeDatumDao dao; @Before public void setup() { DatabaseSetup setup = new DatabaseSetup(); setup.setDataSource(dataSource); setup.init(); ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(Include.NON_NULL); dao = new JdbcGeneralNodeDatumDao(); dao.setDataSource(dataSource); dao.setObjectMapper(mapper); dao.init(); } private GeneralNodeDatumSamples samplesInstance() { GeneralNodeDatumSamples samples = new GeneralNodeDatumSamples(); // some sample data Map<String, Number> instants = new HashMap<String, Number>(2); instants.put("watts", 231); samples.setInstantaneous(instants); Map<String, Number> accum = new HashMap<String, Number>(2); accum.put("watt_hours", 4123); samples.setAccumulating(accum); return samples; } @Test public void insert() { GeneralNodeDatum datum = new GeneralNodeDatum(); datum.setCreated(new Date()); datum.setSourceId("Test"); datum.setSamples(samplesInstance()); dao.storeDatum(datum); } @Test public void findForUpload() { final int numDatum = 5; final long now = System.currentTimeMillis(); final GeneralNodeDatumSamples samples = samplesInstance(); for ( int i = 0; i < numDatum; i++ ) { GeneralNodeDatum datum = new GeneralNodeDatum(); datum.setCreated(new Date(now)); datum.setSourceId(String.valueOf(i)); datum.setSamples(samples); dao.storeDatum(datum); } List<GeneralNodeDatum> results = dao.getDatumNotUploaded("test"); Assert.assertNotNull(results); Assert.assertEquals(numDatum, results.size()); for ( int i = 0; i < numDatum; i++ ) { GeneralNodeDatum datum = results.get(i); Assert.assertEquals(now, datum.getCreated().getTime()); Assert.assertEquals(String.valueOf(i), datum.getSourceId()); Assert.assertEquals(samples, datum.getSamples()); Assert.assertNull(datum.getUploaded()); } } @Test public void markUploaded() { final int numDatum = 5; final long now = System.currentTimeMillis(); final GeneralNodeDatumSamples samples = samplesInstance(); for ( int i = 0; i < numDatum; i++ ) { GeneralNodeDatum datum = new GeneralNodeDatum(); datum.setCreated(new Date(now)); datum.setSourceId(String.valueOf(i)); datum.setSamples(samples); dao.storeDatum(datum); } List<GeneralNodeDatum> results = dao.getDatumNotUploaded("test"); Assert.assertNotNull(results); Assert.assertEquals(numDatum, results.size()); final int numUploaded = 3; final Date uploadDate = new Date(System.currentTimeMillis() + 1000L); for ( int i = 0; i < numUploaded; i++ ) { GeneralNodeDatum datum = results.get(i); dao.setDatumUploaded(datum, uploadDate, "test", String.valueOf(i + 10)); } // now find not uploaded again, should be just 2 results = dao.getDatumNotUploaded("test"); Assert.assertNotNull(results); Assert.assertEquals(numDatum - numUploaded, results.size()); for ( int i = 0; i < (numDatum - numUploaded); i++ ) { GeneralNodeDatum datum = results.get(i); Assert.assertEquals(now, datum.getCreated().getTime()); Assert.assertEquals(String.valueOf(i + numUploaded), datum.getSourceId()); Assert.assertEquals(samples, datum.getSamples()); Assert.assertNull(datum.getUploaded()); } } @Test public void deleteOld() { final int numDatum = 5; final long start = System.currentTimeMillis() - (1000 * 60 * 60 * numDatum); final GeneralNodeDatumSamples samples = samplesInstance(); for ( int i = 0; i < numDatum; i++ ) { GeneralNodeDatum datum = new GeneralNodeDatum(); datum.setCreated(new Date(start + (1000 * 60 * 60 * i))); datum.setSourceId(String.valueOf(i)); datum.setSamples(samples); dao.storeDatum(datum); } // mark 3 uploaded List<GeneralNodeDatum> results = dao.getDatumNotUploaded("test"); Assert.assertNotNull(results); Assert.assertEquals(numDatum, results.size()); final int numUploaded = 3; for ( int i = 0; i < numUploaded; i++ ) { GeneralNodeDatum datum = results.get(i); Date uploadDate = new Date(datum.getCreated().getTime() + 1000L); dao.setDatumUploaded(datum, uploadDate, "test", String.valueOf(i + 10)); } // now delete any older than 1 hour; should only delete the 3 uploaded ones int deleted = dao.deleteUploadedDataOlderThan(1); Assert.assertEquals(3, deleted); results = dao.getDatumNotUploaded("test"); Assert.assertNotNull(results); Assert.assertEquals(numDatum - numUploaded, results.size()); for ( int i = 0; i < (numDatum - numUploaded); i++ ) { GeneralNodeDatum datum = results.get(i); Assert.assertEquals(String.valueOf(i + numUploaded), datum.getSourceId()); Assert.assertEquals(samples, datum.getSamples()); Assert.assertNull(datum.getUploaded()); } } @Test public void update() { GeneralNodeDatum datum = new GeneralNodeDatum(); datum.setCreated(new Date()); datum.setSourceId("Test"); datum.setSamples(samplesInstance()); // insert dao.storeDatum(datum); // mark as uploaded dao.setDatumUploaded(datum, new Date(), "test", "test_id"); // now change data and update datum.getSamples().addTag("foo"); dao.storeDatum(datum); String jdata = jdbcTemplate.queryForObject( "select jdata from solarnode.sn_general_node_datum where created = ? and source_id = ?", new Object[] { new Timestamp(datum.getCreated().getTime()), datum.getSourceId() }, String.class); Assert.assertEquals("{\"i\":{\"watts\":231},\"a\":{\"watt_hours\":4123},\"t\":[\"foo\"]}", jdata); List<GeneralNodeDatum> local = dao.getDatumNotUploaded("test"); Assert.assertNotNull(local); Assert.assertEquals(1, local.size()); Assert.assertEquals(datum, local.get(0)); } @Test public void updateUnchangedSamples() { GeneralNodeDatum datum = new GeneralNodeDatum(); datum.setCreated(new Date()); datum.setSourceId("Test"); datum.setSamples(samplesInstance()); // insert dao.storeDatum(datum); // mark as uploaded dao.setDatumUploaded(datum, new Date(), "test", "test_id"); // now update dao.storeDatum(datum); String jdata = jdbcTemplate.queryForObject( "select jdata from solarnode.sn_general_node_datum where created = ? and source_id = ?", new Object[] { new Timestamp(datum.getCreated().getTime()), datum.getSourceId() }, String.class); Assert.assertEquals("{\"i\":{\"watts\":231},\"a\":{\"watt_hours\":4123}}", jdata); List<GeneralNodeDatum> local = dao.getDatumNotUploaded("test"); Assert.assertNotNull(local); Assert.assertEquals(0, local.size()); } }