Java tutorial
/* * * * Copyright (C) 2007 Pingtel Corp., certain elements licensed under a Contributor Agreement. * Contributors retain copyright to elements licensed under a Contributor Agreement. * Licensed to the User under the LGPL license. * * $ */ package org.sipfoundry.sipxconfig.phonebook; import static java.util.Arrays.asList; import static java.util.Collections.singleton; import static java.util.Collections.singletonList; import static org.easymock.EasyMock.expectLastCall; import static org.easymock.classextension.EasyMock.createMock; import static org.easymock.classextension.EasyMock.replay; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.easymock.EasyMock; import org.easymock.IMocksControl; import org.sipfoundry.sipxconfig.bulk.csv.CsvParserImpl; import org.sipfoundry.sipxconfig.bulk.vcard.VcardParserImpl; import org.sipfoundry.sipxconfig.common.CoreContext; import org.sipfoundry.sipxconfig.common.User; import org.sipfoundry.sipxconfig.common.UserException; import org.sipfoundry.sipxconfig.phonebook.PhonebookManager.PhonebookFormat; import org.sipfoundry.sipxconfig.phonebook.PhonebookManagerImpl.FileEntrySearchPredicate; import org.sipfoundry.sipxconfig.phonebook.PhonebookManagerImpl.GoogleEntrySearchPredicate; import org.sipfoundry.sipxconfig.phonebook.PhonebookManagerImpl.PhoneEntryComparator; import org.sipfoundry.sipxconfig.phonebook.PhonebookManagerImpl.PhonebookEntryPredicate; import org.sipfoundry.sipxconfig.phonebook.PhonebookManagerImpl.StringArrayPhonebookEntry; import org.sipfoundry.sipxconfig.phonebook.PhonebookManagerImpl.UserPhonebookEntry; import org.sipfoundry.sipxconfig.setting.BeanWithSettingsTestCase; import org.sipfoundry.sipxconfig.setting.Group; import org.sipfoundry.sipxconfig.test.PhonebookTestHelper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowCallbackHandler; import org.springframework.orm.hibernate3.HibernateTemplate; public class PhonebookManagerTest extends BeanWithSettingsTestCase { GeneralPhonebookSettings settings; HibernateTemplate m_hibernateTemplate; JdbcTemplate m_jdbcTemplate; protected void setUp() throws Exception { super.setUp(); settings = new GeneralPhonebookSettings(); initializeBeanWithSettings(settings); settings.setEveryoneEnabled(false); List<GeneralPhonebookSettings> settingsList = new ArrayList<GeneralPhonebookSettings>(); settingsList.add(settings); m_hibernateTemplate = createMock(HibernateTemplate.class); m_hibernateTemplate.loadAll(GeneralPhonebookSettings.class); expectLastCall().andReturn(settingsList); replay(m_hibernateTemplate); m_jdbcTemplate = createMock(JdbcTemplate.class); } public void testGetEmptyPhonebookRows() { PhonebookManagerImpl context = new PhonebookManagerImpl(); context.setHibernateTemplate(m_hibernateTemplate); assertEquals(0, context.getEntries(new Phonebook()).size()); } public void testGetRows() { Phonebook phonebook = new Phonebook(); IMocksControl coreContextControl = EasyMock.createControl(); CoreContext coreContext = coreContextControl.createMock(CoreContext.class); coreContextControl.replay(); PhonebookManagerImpl context = new PhonebookManagerImpl(); context.setCoreContext(coreContext); context.setHibernateTemplate(m_hibernateTemplate); context.setConfigJdbcTemplate(m_jdbcTemplate); //This just performs DATABASE query - see PhonebookManagerTestIntegration. Here we can //just test that m_jdbcTemplate is used context.getEntries(phonebook); coreContextControl.verify(); } public void testPhoneEntryComparator() { PhoneEntryComparator c = new PhoneEntryComparator(); PhonebookEntry a = new PhonebookEntry(); PhonebookEntry b = new PhonebookEntry(); a.setLastName("Avocet"); b.setLastName("Vireo"); assertTrue(c.compare(a, b) < 0); a.setFirstName("Southern"); b.setLastName("Avocet"); b.setFirstName("Northern"); assertTrue(c.compare(a, b) > 0); a.setLastName("Avocet"); a.setFirstName("Northern"); a.setNumber("1234"); b.setLastName("Avocet"); b.setFirstName("Northern"); b.setNumber("abc"); assertTrue(c.compare(a, b) < 0); } public void testStringArrayPhonebookEntry() { try { new StringArrayPhonebookEntry(new String[2]); fail(); } catch (UserException e) { assertTrue(true); } } public void testStringArrayPhonebookEntryOk() { // no exceptions expected new StringArrayPhonebookEntry(new String[3]); } public void testInvalidFile() throws Exception { PhonebookManagerImpl context = new PhonebookManagerImpl(); VcardParserImpl impl = new VcardParserImpl(); context.setCsvParser(new CsvParserImpl()); context.setVcardParser(impl); context.setVcardEncoding("US-ASCII"); try { // use invalid file format Phonebook phonebook2 = new Phonebook(); context.addEntries(phonebook2, getClass().getResourceAsStream("PhonebookSeed.db.xml")); fail("Should fail"); } catch (UserException e) { assertEquals("&msg.invalidPhonebookFormat", e.getMessage()); } } public void testIsVcard() throws Exception { PhonebookManagerImpl context = new PhonebookManagerImpl(); context.setVcardEncoding("UTF-8"); assertTrue(context.isVcard(toInputStream("BEGIN:VCARD"), "UTF-8")); assertTrue(context.isVcard(toInputStream("\n\nBEGIN:VCARD"), "UTF-8")); assertFalse(context.isVcard(toInputStream("\nsomething\nBEGIN:VCARD"), "UTF-8")); assertFalse(context.isVcard(toInputStream("something"), "UTF-8")); } private static BufferedInputStream toInputStream(String text) throws Exception { return new BufferedInputStream(new ByteArrayInputStream(text.getBytes("UTF-8"))); } public void testGetCsvFile() throws Exception { PhonebookManagerImpl context = new PhonebookManagerImpl(); VcardParserImpl impl = new VcardParserImpl(); CsvParserImpl csvParser = new CsvParserImpl(); csvParser.setSkipHeaderLine(false); context.setCsvParser(csvParser); context.setVcardParser(impl); context.setVcardEncoding("US-ASCII"); Phonebook phonebook1 = new Phonebook(); context.addEntries(phonebook1, getClass().getResourceAsStream("phonebook.csv")); assertEquals(1, phonebook1.getEntries().size()); } public void testGetVCardFile() throws Exception { PhonebookManagerImpl context = new PhonebookManagerImpl(); CsvParserImpl csvParser = new CsvParserImpl(); csvParser.setSkipHeaderLine(false); context.setCsvParser(csvParser); VcardParserImpl impl = new VcardParserImpl(); context.setVcardParser(impl); context.setVcardEncoding("US-ASCII"); Phonebook phonebook1 = new Phonebook(); context.addEntries(phonebook1, getClass().getResourceAsStream("phonebook.vcf")); assertEquals(1, phonebook1.getEntries().size()); } public void testParseContactUsingPhonebookEntry() { InputStream testPhonebookFile = getClass().getResourceAsStream("StevenSpielberg.vcf"); Reader reader = new InputStreamReader(testPhonebookFile); VcardParserImpl parser = new VcardParserImpl(); Map<String, PhonebookEntry> entries = new TreeMap<String, PhonebookEntry>(); parser.parse(reader, new PhonebookManagerImpl.PhonebookEntryMaker(entries, false)); List<PhonebookEntry> entriesList = new ArrayList(entries.values()); assertEquals(1, entriesList.size()); PhonebookEntry entry = entriesList.get(0); assertEquals("Steven", entry.getFirstName()); assertEquals("Spielberg", entry.getLastName()); assertEquals("999", entry.getNumber()); AddressBookEntry abe = entry.getAddressBookEntry(); assertEquals("9986", abe.getCellPhoneNumber()); assertEquals("080332", abe.getHomePhoneNumber()); assertEquals("080-45", abe.getFaxNumber()); assertEquals("stevens@sipx.com", abe.getEmailAddress()); assertEquals("stevens123@sipx.com", abe.getAlternateEmailAddress()); assertEquals("Qantom", abe.getCompanyName()); assertEquals("Test Engineer", abe.getJobTitle()); assertEquals("SCS", abe.getJobDept()); Address homeAddress = abe.getHomeAddress(); assertEquals("3rd Phase JP Nagar", homeAddress.getStreet()); assertEquals("560078", homeAddress.getZip()); assertEquals("India", homeAddress.getCountry()); assertEquals("Ktaka", homeAddress.getState()); assertEquals("Bangalore", homeAddress.getCity()); Address officeAddress = abe.getOfficeAddress(); assertEquals("Andheri East", officeAddress.getStreet()); assertEquals("400010", officeAddress.getZip()); assertEquals("India", officeAddress.getCountry()); assertEquals("Maharastra", officeAddress.getState()); assertEquals("Mumbai", officeAddress.getCity()); assertEquals("PostOffice", officeAddress.getOfficeDesignation()); } public void testExport() throws Exception { VcardWriter vcardWriter = new VcardWriter(); PhonebookManagerImpl context = new PhonebookManagerImpl(); //context.setVcardWriter(vcardWriter); context.setVcardEncoding("US-ASCII"); ByteArrayOutputStream empty = new ByteArrayOutputStream(); try { context.exportPhonebook(new ArrayList(), empty, PhonebookFormat.VCARD); } catch (UserException e) { assertTrue(true); } PhonebookEntry e1 = new StringArrayPhonebookEntry("Jean Luc", "Picard", "1234"); PhonebookEntry e2 = new StringArrayPhonebookEntry("Luke", "Skywalker", "1235"); PhonebookEntry e3 = new StringArrayPhonebookEntry("", "", "1235"); PhonebookEntry e4 = new StringArrayPhonebookEntry("Frank", "Dawson", "+1-919-676-9515", "Senior Programmer", "IT Dept", "Lotus Development Corporation", "Lois Lane", "+34(345)112-345", "+34 (445) 43 22", "+34 (445) 43 33", "+1-919-676-9564", "frankDawson", "dawsonFrank", "location", "Mountain View", "U.S.A.", "CA", "501 E. Middlefield Rd.", "94043", "Raleigh", "U.S.A.", "NC", "6544 Battleford Drive", "27613-3502", "Lotus PostOffice", "Frank_Dawson@Lotus.com", "fdawson@earthlink.net"); ByteArrayOutputStream actual = new ByteArrayOutputStream(); context.exportPhonebook(asList(e1, e2, e3, e4), actual, PhonebookFormat.VCARD); InputStream expectedStream = getClass().getResourceAsStream("export.test.vcf"); assertNotNull(expectedStream); String expected = IOUtils.toString(expectedStream); assertEquals(expected, actual.toString("UTF-8")); actual = new ByteArrayOutputStream(); context.exportPhonebook(asList(e1, e2, e3, e4), actual, PhonebookFormat.CSV); InputStream expectedStreamCsv = getClass().getResourceAsStream("export.test.csv"); assertNotNull(expectedStreamCsv); expected = IOUtils.toString(expectedStreamCsv); assertEquals(expected, actual.toString("UTF-8")); } public void testSearch() { final PhonebookTestHelper testHelper = new PhonebookTestHelper(); CoreContext coreContextMock = EasyMock.createMock(CoreContext.class); testHelper.configureCoreContextMock(coreContextMock); EasyMock.replay(coreContextMock); List<PhonebookEntry> allEntries = new ArrayList(testHelper.getPhonebookEntries()); // require there is at least one test user defined if (allEntries.size() < 1) { fail("Not enough test users defined by test helper"); } PhonebookEntry testEntry = allEntries.get(0); User userPortal = testHelper.getUserByUsername(testEntry.getNumber()); String username = userPortal.getUserName(); // need to override the getEntries method to control what entries we use PhonebookManagerImpl out = new PhonebookManagerImpl() { @Override public Collection<PhonebookEntry> getEntries(Collection<Phonebook> phonebooks, User user) { return testHelper.getPhonebookEntries(); } }; out.setCoreContext(coreContextMock); // test searching by username in all lowercase Collection<PhonebookEntry> entriesThatMatchUsername = out.search(singletonList(new Phonebook()), username.toLowerCase(), userPortal); assertEquals(1, entriesThatMatchUsername.size()); assertTrue(entriesThatMatchUsername.contains(testEntry)); // test searching by username in all caps Collection<PhonebookEntry> entriesThatMatchUsernameCaps = out.search(singletonList(new Phonebook()), username.toUpperCase(), userPortal); assertEquals(1, entriesThatMatchUsernameCaps.size()); assertTrue(entriesThatMatchUsernameCaps.contains(testEntry)); // test searching by first name Collection<PhonebookEntry> entriesThatMatchFirstName = out.search(singletonList(new Phonebook()), testEntry.getFirstName(), userPortal); assertEquals(1, entriesThatMatchFirstName.size()); assertTrue(entriesThatMatchFirstName.contains(testEntry)); // test searching by last name - should return more than one result String lastName = testEntry.getLastName(); int lastNameCount = 0; for (PhonebookEntry entry : testHelper.getPhonebookEntries()) { if (lastName.equals(entry.getLastName())) { lastNameCount++; } } Collection<PhonebookEntry> entriesThatMatchLastName = out.search(singletonList(new Phonebook()), testEntry.getLastName(), userPortal); assertEquals(lastNameCount, entriesThatMatchLastName.size()); assertTrue(entriesThatMatchLastName.contains(testEntry)); // test searching by partial first name Collection<PhonebookEntry> entriesThatMatchPartialFirstName = out.search(singletonList(new Phonebook()), testEntry.getFirstName().substring(0, 3), userPortal); assertEquals(1, entriesThatMatchPartialFirstName.size()); assertTrue(entriesThatMatchPartialFirstName.contains(testEntry)); // test searching with alias User userWithAlias = null; for (User user : testHelper.getTestUsers()) { if (StringUtils.isNotEmpty(user.getAliasesString())) { userWithAlias = user; break; } } Collection<PhonebookEntry> entriesThatMatchAlias = out.search(singletonList(new Phonebook()), userWithAlias.getAliases().iterator().next(), userPortal); assertEquals(1, entriesThatMatchAlias.size()); assertTrue(entriesThatMatchAlias.contains(testHelper.getEntryByNumber(userWithAlias.getUserName()))); // test searching lucene stop names Collection<PhonebookEntry> entriesThatMatchStopWords = out.search(singletonList(new Phonebook()), PhonebookTestHelper.LUCENE_STOP_WORD_USERNAME, userPortal); assertEquals(1, entriesThatMatchStopWords.size()); assertTrue(entriesThatMatchStopWords .contains(testHelper.getEntryByNumber(PhonebookTestHelper.LUCENE_STOP_WORD_USERNAME))); out.search(singletonList(new Phonebook()), "300", userPortal); out.search(singletonList(new Phonebook()), "nulluser", userPortal); } private class MockUser extends User { private Boolean m_imEnabled; public MockUser(Boolean imEnabled) { m_imEnabled = imEnabled; } public Object getSettingTypedValue(String path) { return m_imEnabled; } } public void testGetEntries() throws Exception { // check if get entries removes duplicates properly PhonebookManagerImpl impl = new PhonebookManagerImpl(); PhonebookEntry entry = new PhonebookEntry(); entry.setNumber("1234"); entry.setFirstName("Adam"); PhonebookEntry entry2 = new PhonebookEntry(); entry2.setNumber("1234"); entry2.setFirstName("Bob"); Phonebook phonebook = new Phonebook(); phonebook.setEntries(asList(entry, entry, entry2)); impl.setHibernateTemplate(m_hibernateTemplate); Collection<PhonebookEntry> entries = impl.getEntries(phonebook); assertEquals(2, entries.size()); Iterator<PhonebookEntry> it = entries.iterator(); assertEquals(it.next().getFirstName(), "Adam"); assertEquals(it.next().getFirstName(), "Bob"); } public void testPhonebookEntryPredicate() { PhonebookEntry a = new PhonebookEntry(); PhonebookEntry b = new PhonebookEntry(); a.setLastName("a"); a.setFirstName("b"); a.setNumber("201"); AddressBookEntry abe = new AddressBookEntry(); abe.setEmailAddress("test@test.com"); a.setAddressBookEntry(abe); PhonebookEntryPredicate predicate = new PhonebookEntryPredicate("q"); assertFalse(predicate.evaluate(a)); predicate = new PhonebookEntryPredicate("a"); assertTrue(predicate.evaluate(a)); predicate = new PhonebookEntryPredicate("b"); assertTrue(predicate.evaluate(a)); predicate = new PhonebookEntryPredicate("test"); assertTrue(predicate.evaluate(a)); } public void testEntrySearchPredicates() { PhonebookEntry a = new FilePhonebookEntry(); a.setInternalId("internalId"); PhonebookEntry b = new PhonebookEntry(); b.setInternalId("internalId"); GooglePhonebookEntry c = new GooglePhonebookEntry(); c.setGoogleAccount("account1"); GooglePhonebookEntry d = new GooglePhonebookEntry(); d.setGoogleAccount("account1"); GooglePhonebookEntry e = new GooglePhonebookEntry(); e.setGoogleAccount("account2"); Collection<PhonebookEntry> entries = new ArrayList<PhonebookEntry>(); entries.add(a); entries.add(b); entries.add(c); entries.add(d); entries.add(e); assertEquals(1, CollectionUtils.select(entries, new FileEntrySearchPredicate("internalId")).size()); assertEquals(2, CollectionUtils.select(entries, new GoogleEntrySearchPredicate("account1")).size()); } }