001    package org.apache.jcs.utils.key;
002    
003    import java.text.ParseException;
004    import java.util.Calendar;
005    import java.util.Date;
006    
007    import junit.framework.TestCase;
008    
009    import org.apache.jcs.utils.date.DateFormatter;
010    import org.apache.jcs.utils.timing.SleepUtil;
011    
012    /**
013     * Tests for the Key Generator Util.
014     */
015    public class KeyGeneratorUtilUnitTest
016        extends TestCase
017    {
018        /**
019         * Creates a query id. Verify that we lead with the system lead.
020         */
021        public void testGetQueryId_SytemLeadNumber_Good()
022        {
023            // SETUP
024            String lead = "9";
025            System.setProperty( KeyGeneratorUtil.KEY_LEAD_NUMBER_PROPERTY_NAME, lead );
026            // have to force this since it might have already been loaded.
027            KeyGeneratorUtil.setLeadFromSystemProperty();
028            String expectedDate = DateFormatter.getDddHHmm( new Date() );
029    
030            // DO WORK
031            String result = KeyGeneratorUtil.generateRequestId();
032    
033            // VERIFY
034            assertNotNull( "We should have a query id.", result );
035            assertTrue( "Should have the input.", result.indexOf( String.valueOf( expectedDate ) ) != -1 );
036            assertEquals( "Wrong lead", lead, result.substring( 0, 1 ) );
037        }
038    
039        /**
040         * Creates a query id. Verify that we lead with the default if the system lead is junk.
041         */
042        public void testGetQueryId_SytemLeadNumber_Nan()
043        {
044            // SETUP
045            KeyGeneratorUtil.leadNumber = KeyGeneratorUtil.DEFAULT_LEAD_NUMBER;
046            String lead = "afdsafsadf";
047            System.setProperty( KeyGeneratorUtil.KEY_LEAD_NUMBER_PROPERTY_NAME, lead );
048            // have to force this since it might have already been loaded.
049            KeyGeneratorUtil.setLeadFromSystemProperty();
050            String expectedDate = DateFormatter.getDddHHmm( new Date() );
051    
052            // DO WORK
053            String result = KeyGeneratorUtil.generateRequestId();
054    
055            // VERIFY
056            assertNotNull( "We should have a query id.", result );
057            assertTrue( "Should have the input.", result.indexOf( String.valueOf( expectedDate ) ) != -1 );
058            assertEquals( "Wrong lead", String.valueOf( KeyGeneratorUtil.DEFAULT_LEAD_NUMBER ), result.substring( 0, 1 ) );
059        }
060    
061        /**
062         * Creates a query id.
063         */
064        public void testGetQueryId()
065        {
066            // SETUP
067            String expectedDate = DateFormatter.getDddHHmm( new Date() );
068    
069            // DO WORK
070            String result = KeyGeneratorUtil.generateRequestId();
071    
072            // VERIFY
073            assertNotNull( "We should have a query id.", result );
074            assertTrue( "Should have the input.", result.indexOf( String.valueOf( expectedDate ) ) != -1 );
075        }
076    
077        /**
078         * Verify that we get the right date out. This has just the leading 9 and the date.
079         */
080        public void testGetDateFromQueryId_exact()
081        {
082            Calendar cal = Calendar.getInstance();
083            cal.set( Calendar.HOUR_OF_DAY, 13 );
084            cal.set( Calendar.MINUTE, 59 );
085    
086            String inputDate = DateFormatter.getDddHHmm( cal.getTime() );
087    
088            // DO WORK
089            try
090            {
091                Date result = KeyGeneratorUtil.getDateOfShopFromRequestId( "9" + inputDate );
092    
093                // VERIFY
094                Calendar resultCal = Calendar.getInstance();
095                resultCal.setTime( result );
096    
097                assertEquals( "Wrong day of year.", cal.get( Calendar.DAY_OF_YEAR ), resultCal.get( Calendar.DAY_OF_YEAR ) );
098                assertEquals( "Wrong hour.", cal.get( Calendar.HOUR_OF_DAY ), resultCal.get( Calendar.HOUR_OF_DAY ) );
099                assertEquals( "Wrong minute.", cal.get( Calendar.MINUTE ), resultCal.get( Calendar.MINUTE ) );
100            }
101            catch ( ParseException e )
102            {
103                fail( e.getMessage() );
104            }
105        }
106    
107        /**
108         * Verify that we get the right date out. This has the leading 9, the date, and more
109         */
110        public void testGetDateFromQueryId_over()
111        {
112            Calendar cal = Calendar.getInstance();
113            cal.set( Calendar.HOUR_OF_DAY, 13 );
114            cal.set( Calendar.MINUTE, 59 );
115    
116            String inputDate = DateFormatter.getDddHHmm( cal.getTime() );
117    
118            // DO WORK
119            try
120            {
121                Date result = KeyGeneratorUtil.getDateOfShopFromRequestId( "9" + inputDate + "542143211242134" );
122    
123                // VERIFY
124                Calendar resultCal = Calendar.getInstance();
125                resultCal.setTime( result );
126    
127                assertEquals( "Wrong day of year.", cal.get( Calendar.DAY_OF_YEAR ), resultCal.get( Calendar.DAY_OF_YEAR ) );
128                assertEquals( "Wrong hour.", cal.get( Calendar.HOUR_OF_DAY ), resultCal.get( Calendar.HOUR_OF_DAY ) );
129                assertEquals( "Wrong minute.", cal.get( Calendar.MINUTE ), resultCal.get( Calendar.MINUTE ) );
130            }
131            catch ( ParseException e )
132            {
133                fail( e.getMessage() );
134            }
135        }
136    
137        /**
138         * Verify that we get an error if it is too small
139         */
140        public void testGetDateFromQueryId_tooSmall()
141        {
142            // DO WORK
143            try
144            {
145                KeyGeneratorUtil.getDateOfShopFromRequestId( "9876" );
146    
147                fail( "We should have an error." );
148            }
149            catch ( ParseException e )
150            {
151                // expected
152                assertTrue( "Missing string from error message.", e.getMessage().indexOf( "9876" ) != -1 );
153            }
154        }
155    
156        /**
157         * Verify that we get an error if it is null
158         */
159        public void testGetDateFromQueryId_null()
160        {
161            // DO WORK
162            try
163            {
164                KeyGeneratorUtil.getDateOfShopFromRequestId( null );
165    
166                fail( "We should have an error." );
167            }
168            catch ( ParseException e )
169            {
170                // expected
171                assertTrue( "Missing string from error message.", e.getMessage().indexOf( "null" ) != -1 );
172            }
173        }
174    
175        /**
176         * Reset and verify that we get 1;
177         */
178        public void testGetNextRequestCounter_simple()
179        {
180            // SETUP
181            KeyGeneratorUtil.resetCounter();
182    
183            // DO WORK
184            int result = KeyGeneratorUtil.getNextRequestCounter();
185    
186            // VERIFY
187            assertEquals( "Wrong counter value.", 1, result );
188        }
189    
190        /**
191         * Reset, call twice, and verify that we get 2;
192         */
193        public void testGetNextRequestCounter_twice()
194        {
195            // SETUP
196            KeyGeneratorUtil.resetCounter();
197    
198            // DO WORK
199            KeyGeneratorUtil.getNextRequestCounter();
200            int result = KeyGeneratorUtil.getNextRequestCounter();
201    
202            // VERIFY
203            assertEquals( "Wrong counter value.", 2, result );
204        }
205    
206        /**
207         * Verify that the counter is reset if we set the interval vey low.
208         */
209        public void testGetNextRequestCounter_delay()
210        {
211            // SETUP
212            long interval = 10;
213            KeyGeneratorUtil.counterResetIntervalMillis = interval;
214            KeyGeneratorUtil.resetCounter();
215    
216            // DO WORK
217            KeyGeneratorUtil.getNextRequestCounter();
218    
219            SleepUtil.sleepAtLeast( interval * 2 );
220    
221            int result = KeyGeneratorUtil.getNextRequestCounter();
222    
223            // VERIFY
224            assertEquals( "Wrong counter value.", 1, result );
225        }
226    }