org.flite.cach3.test.UpdateSingleCacheTest.java Source code

Java tutorial

Introduction

Here is the source code for org.flite.cach3.test.UpdateSingleCacheTest.java

Source

/*
 * Copyright (c) 2011-2013 Flite, Inc
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

package org.flite.cach3.test;

import org.apache.commons.lang.*;
import org.flite.cach3.test.dao.*;
import org.flite.cach3.test.listeners.*;
import org.flite.cach3.test.svc.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.*;
import org.springframework.context.support.*;
import org.testng.annotations.*;

import java.util.*;

import static org.testng.AssertJUnit.*;

public class UpdateSingleCacheTest {
    private static final Logger LOG = LoggerFactory.getLogger(UpdateSingleCacheTest.class);

    private ApplicationContext context;

    @BeforeClass
    public void beforeClass() {
        context = new ClassPathXmlApplicationContext("/test-context.xml");
    }

    @Test
    public void test() {
        final Long rawNow = System.currentTimeMillis();
        final Long now = (rawNow / 1000) * 10000;
        final List<Long> subset = new ArrayList<Long>();
        final List<Long> superset = new ArrayList<Long>();

        for (Long ix = 1 + now; ix < 35 + now; ix++) {
            if (ix % 3 == 0) {
                // Add every 3rd generated key to the 'subset'
                subset.add(ix);
            }
            superset.add(ix);
        }

        final Map<Long, String> originalResults = new HashMap<Long, String>();
        final Map<Long, String> expectedResults = new HashMap<Long, String>();

        final TestSvc test = (TestSvc) context.getBean("testSvc");
        final StubUpdateSingleCacheListenerImpl listener = (StubUpdateSingleCacheListenerImpl) context
                .getBean("stubUS");

        // This should hit the DAO, filling every value with the same first part,
        // followed by an "X", followed by the key.
        final List<String> r1List = test.getTimestampValues(superset);
        for (int ix = 0; ix < r1List.size(); ix++) {
            final Long key = superset.get(ix);
            final String value = r1List.get(ix);

            originalResults.put(key, value);
            if (!subset.contains(key)) {
                expectedResults.put(key, value);
            }
        }

        // Go thru each key in the 'subset', and replace the cache
        // value with a single value, followed by a "U", followed by the key.
        for (final Long key : subset) {
            final int previous = listener.getTriggers().size();
            final String value = test.updateTimestampValue(key);

            // Testing that the listener got invoked as required.
            assertTrue("Doesn't look like the listener got called.", listener.getTriggers().size() == previous + 1);
            final String expected = StubUpdateSingleCacheListenerImpl.formatTriggers(TestDAOImpl.TIME_NAMESPACE,
                    null, key.toString(), value, value, new Object[] { key });
            assertEquals(expected, listener.getTriggers().get(listener.getTriggers().size() - 1));

            assertFalse(originalResults.get(key).equals(value));
            expectedResults.put(key, value);
        }

        // Now get the list out of the cache, and make sure all the values
        // are as we expect. I.e. every 3rd value (in the 'subset') has a value with a "U"
        // rather than the original "X"
        final List<String> r2List = test.getTimestampValues(superset);
        for (int ix = 0; ix < r2List.size(); ix++) {
            final Long key = superset.get(ix);
            final String value = r2List.get(ix);
            LOG.info(value);
            assertEquals(expectedResults.get(key), value);
        }
    }

    @Test
    public void testDataIndex() {
        final String key = "silly-old-key-" + (System.currentTimeMillis() % 1000);
        final String overrideData = "data that is not generated by the dao";

        final TestSvc test = (TestSvc) context.getBean("testSvc");

        final String r1 = test.getDateString(key);
        final String r2 = test.getDateString(key);

        assertEquals(r1, r2);

        test.overrideDateString(42, key, overrideData);

        final String r3 = test.getDateString(key);

        assertNotSame(r3, r2);
        assertEquals(overrideData, r3);
    }

    @Test
    public void testVelocity() {
        final TestSvc test = (TestSvc) context.getBean("testSvc");
        final StubUpdateSingleCacheListenerImpl listener = (StubUpdateSingleCacheListenerImpl) context
                .getBean("stubUS");

        final String original = RandomStringUtils.randomAlphanumeric(7);
        final String update = RandomStringUtils.randomAlphanumeric(9);
        final String replace = RandomStringUtils.randomAlphanumeric(11);

        final Long first = System.currentTimeMillis();
        final Long second = first - 133700;
        final String baseKey = first.toString() + "&&" + second.toString();

        final String r1 = test.getCompoundString(first, original, second);
        assertEquals(r1, original);

        final String r2 = test.getCompoundString(first, replace, second);
        assertEquals(r2, original);

        final int previous = listener.getTriggers().size();
        final String r3 = test.updateCompoundString(second, update, first);
        assertEquals(r3, update);

        // Testing that the listener got invoked as required.
        assertTrue("Doesn't look like the listener got called.", listener.getTriggers().size() == previous + 1);
        final String expected = StubUpdateSingleCacheListenerImpl.formatTriggers(TestDAOImpl.COMPOUND_NAMESPACE,
                TestDAOImpl.COMPOUND_PREFIX, baseKey, update, update, new Object[] { second, update, first });
        assertEquals(expected, listener.getTriggers().get(listener.getTriggers().size() - 1));

        // Now, verify that the update happened.
        final String r4 = test.getCompoundString(first, replace, second);
        assertEquals(r4, update);
    }
}