com.daemon.TransactorTest.java Source code

Java tutorial

Introduction

Here is the source code for com.daemon.TransactorTest.java

Source

/*******************************************************************************
 * This file is part of Tmetrics.
 *
 * Tmetrics 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 3 of the License, or
 * (at your option) any later version.
 *
 * Tmetrics 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 Tmetrics. If not, see <http://www.gnu.org/licenses/>.
 *******************************************************************************/
package com.daemon;

import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.io.IOException;
import java.io.Reader;
import java.net.URL;
import java.net.URLDecoder;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

import org.joda.time.DateTime;
import org.joda.time.Duration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import com.daemon.database.SearchTerm;
import com.daemon.database.Transactor;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.jdbc.ScriptRunner;

public class TransactorTest {
    private static Transactor _trans = null;
    private static String _dbPath = null;

    @BeforeClass
    public static void beforeClass() {
        try {
            _dbPath = Transactor.DATABASE_PROPERTY_PATH;
            URL url = Resources.getResourceURL("database.properties");
            Transactor.DATABASE_PROPERTY_PATH = URLDecoder.decode(url.getFile(), "UTF-8");
            _trans = new Transactor();
            _trans.connect();

            // Prepare database
            Reader reader = Resources.getResourceAsReader("DaemonDump.sql");

            ScriptRunner sr = new ScriptRunner(_trans.getConnection());

            sr.setDelimiter(";");
            sr.setLogWriter(null);
            sr.setErrorLogWriter(null);
            sr.runScript(reader);

            _trans.getConnection().commit();
            reader.close();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        } catch (SQLException sqle) {
            sqle.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testGetSearchTerms() {
        String[] termNames = new String[] { "snowden", "merkel", "korea", "wurst", null, // Not in DB
                "testentry", "duration25" };

        // Check ALL search terms
        List<SearchTerm> terms = _trans.getSearchTerms(false);

        assertTrue("terms.size() returned " + terms.size() + ", expected 6.", terms.size() == 6);

        int counter = 1;
        for (SearchTerm term : terms) {
            try {
                if (counter == 5) // There is no entry for id 5, next id is 6
                    counter++;

                assertTrue("term.getId() returned " + term.getId() + ", expected " + counter + ".",
                        term.getId() == counter);
                assertTrue(
                        "term.getTerm() returned " + term.getTerm() + ", expected " + termNames[counter - 1] + ".",
                        term.getTerm().equals(termNames[counter - 1]));
            } catch (Exception ex) {
                // Not possible
            }
            counter++;
        }

        // Check only for "active" search terms (that is term.isActive() == true and
        // they are out of the min. interval length)
        terms = _trans.getSearchTerms(true);

        // 5th entry: isActive() == false -> not in this list
        assertTrue("terms.size() returned " + terms.size() + ", expected 5.", terms.size() == 5);

        counter = 1;
        for (SearchTerm term : terms) {
            try {
                if (counter == 5) // There is no entry for id 5, next id is 6
                    counter += 2; // But id 6 is inactive, so next id is 7

                assertTrue("term.getId() returned " + term.getId() + ", expected " + counter + ".",
                        term.getId() == counter);
                assertTrue(
                        "term.getTerm() returned " + term.getTerm() + ", expected " + termNames[counter - 1] + ".",
                        term.getTerm().equals(termNames[counter - 1]));
                assertTrue("term.isActive() returned " + term.isActive() + ", expected true.",
                        term.isActive() == true);
            } catch (Exception ex) {
                // Not possible
            }
            counter++;
        }
    }

    @Test
    public void testGetLongIntervalLength() {
        // 25h15m in Milliseconds
        long intervalLengthMillis = ((25 * 60 * 60 + 15 * 60) * 1000);

        // Get search terms
        List<SearchTerm> terms = _trans.getSearchTerms(true);
        assertTrue(
                "terms[(id=7)].getIntervalLength() returned " + terms.get(4).getIntervalLength().toPeriod()
                        + ", expected 25h15m.",
                terms.get(4).getIntervalLength().getMillis() == intervalLengthMillis);
    }

    @Test
    public void testUpdateIntervalLength() {
        // 36h40m in Milliseconds
        long intervalLengthMillis = ((36 * 60 * 60 + 40 * 60) * 1000);

        // Get search terms
        List<SearchTerm> terms = _trans.getSearchTerms(true);

        // Update interval length
        terms.get(4).setIntervalLength(new Duration(intervalLengthMillis));
        _trans.updateSearchTerm(terms.get(4));

        // Refetch entry
        String dbPath = "";
        try {
            dbPath = SearchTerm.DATABASE_PROPERTY_PATH;
            SearchTerm.DATABASE_PROPERTY_PATH = Transactor.DATABASE_PROPERTY_PATH;

            SearchTerm term = SearchTerm.load(7);
            assertTrue(
                    "term(id).getIntervalLength() returned " + term.getIntervalLength().getMillis() + ", expected "
                            + intervalLengthMillis + ".",
                    term.getIntervalLength().getMillis() == intervalLengthMillis);
            term = SearchTerm.load("duration25");
            assertTrue(
                    "term(string).getIntervalLength() returned " + term.getIntervalLength().getMillis()
                            + ", expected " + intervalLengthMillis + ".",
                    term.getIntervalLength().getMillis() == intervalLengthMillis);
        } catch (Exception ex) {
            fail(ex.getMessage());
        } finally {
            SearchTerm.DATABASE_PROPERTY_PATH = dbPath;
        }
    }

    @Test
    public void testGetSearchTermsImmediately() throws IOException {
        Transactor transactor = null;
        Statement stmt = null;

        try {
            transactor = new Transactor();
            transactor.connect();

            // Get "old" search terms
            List<SearchTerm> termsBefore = _trans.getSearchTerms(false);
            SearchTerm toBeInserted = new SearchTerm("NOT_INSERTED_YET", new DateTime());

            // Add a new search term on a different connection
            transactor.insertSearchTerm(toBeInserted);

            List<SearchTerm> termsAfter = _trans.getSearchTerms(false);

            // Test if new search term is already there
            assertTrue("termsBefore().size() < termsAfter.size()? Returned "
                    + (termsBefore.size() < termsAfter.size()) + ", expected true",
                    termsBefore.size() < termsAfter.size());

            // Delete newly created search term from DB
            stmt = transactor.getConnection().createStatement();
            stmt.executeUpdate("DELETE FROM search_terms WHERE term = 'NOT_INSERTED_YET'");
            transactor.getConnection().commit();

            termsAfter = _trans.getSearchTerms(false);

            // Test if search term was removed and we know about it
            assertTrue(
                    "termsBefore().size() == termsAfter.size()? Returned "
                            + (termsBefore.size() == termsAfter.size()) + ", expected true",
                    termsBefore.size() == termsAfter.size());
        } catch (Exception ex) {
            fail("Exception" + ex.getMessage());
            ex.printStackTrace();
        } finally {
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (Exception _) {
                }
            }

            if (transactor != null) {
                transactor.close();
            }
        }
    }

    @Test
    public void testTransactorConnect() {
        Transactor trans = null;

        try {
            trans = new Transactor();
            trans.connect();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            if (trans != null)
                trans.close();
        }
    }

    @Test
    public void testUpdateSearchTerm() throws IOException {
        // Restore old value at end
        SearchTerm copy = null;
        String dbPath = SearchTerm.DATABASE_PROPERTY_PATH;
        try {
            URL url = Resources.getResourceURL("database.properties");
            SearchTerm.DATABASE_PROPERTY_PATH = URLDecoder.decode(url.getFile(), "UTF-8");
            copy = SearchTerm.load(1);
            SearchTerm term = SearchTerm.load(1);

            term.setCurrentStart(new DateTime(2013, 12, 04, 13, 40, 30));
            term.setOldStart(new DateTime(2013, 12, 03, 23, 40, 30));
            term.setIntervalLength(SearchTerm.DURATION_FORMATTER.parsePeriod("01:00:00").toStandardDuration());
            term.setTimeLastFetched(null);
            term.setLastFetchedTweetId(null);
            term.setLastFetchedTweetCount(null);

            _trans.updateSearchTerm(term);

            term = null;
            term = SearchTerm.load(1);

            assertTrue(
                    "term.getCurrentStart().getMillis() returned " + term.getCurrentStart().getMillis()
                            + ", expected " + new DateTime(2013, 12, 04, 13, 40, 30).getMillis() + ".",
                    term.getCurrentStart().getMillis() == new DateTime(2013, 12, 04, 13, 40, 30).getMillis());
            assertTrue(
                    "term.getOldStart().getMillis() returned " + term.getOldStart().getMillis() + ", expected "
                            + new DateTime(2013, 12, 03, 23, 40, 30).getMillis() + ".",
                    term.getOldStart().getMillis() == new DateTime(2013, 12, 03, 23, 40, 30).getMillis());
            assertTrue("term.getIntervalLength().getMillis() returned " + term.getIntervalLength().getMillis()
                    + ", expected 3600000.", term.getIntervalLength().getMillis() == 3600000);
            assertTrue("term.getTimeLastFetched() returned " + term.getTimeLastFetched() + ", expected null.",
                    term.getTimeLastFetched() == null);
            assertTrue("term.getLastFetchedTweetId() returned " + term.getLastFetchedTweetId() + ", expected null.",
                    term.getLastFetchedTweetId() == null);
            assertTrue("term.getLastFetchedTweetCount() returned " + term.getLastFetchedTweetCount()
                    + ", expected null.", term.getLastFetchedTweetCount() == null);
        } catch (SQLException ex) {
            fail("SQL Exception" + ex.getMessage());
            ex.printStackTrace();
        } finally {
            SearchTerm.DATABASE_PROPERTY_PATH = dbPath;
            if (copy != null) {
                _trans.updateSearchTerm(copy);
            }
        }
    }

    @AfterClass
    public static void afterClass() {
        // Restore old DB path
        Transactor.DATABASE_PROPERTY_PATH = _dbPath;
        _trans.close();
    }
}