/* * RedirectTest.java * JUnit based test */ package wikipedia.data; import junit.framework.*; import wikipedia.sql.Connect; import wikipedia.sql.PageTable; import wikipedia.sql.PageNamespace; import wikipedia.sql.Links; import wikipedia.kleinberg.SessionHolder; import wikipedia.kleinberg.Article; import java.util.List; import java.util.ArrayList; import java.util.Map; import java.util.HashMap; import java.util.Set; public class RedirectTest extends TestCase { public Connect connect, connect_ru; ArticleIdAndTitle[] aid_t1_tredirect; ArticleIdAndTitle[] aid_s1_sredirect; //Article[] source_nodes, redirect_nodes1, redirect_nodes2; SessionHolder session; int categories_max_steps; static String t1, t_redirect, t2; static int t1_id, t_redirect_id, t2_id; static String s1, s_redirect, s2, s1b, s_redirect2, s3; static int s1_id, s_redirect_id, s2_id, s1b_id, s_redirect2_id, s3_id; static Map<String,Set<String>> m_out = new HashMap<String,Set<String>>(); static Map<String,Set<String>> m_in = new HashMap<String,Set<String>>(); public RedirectTest(String testName) { super(testName); } protected void setUp() throws Exception { connect = new Connect(); connect.Open(Connect.WP_HOST, Connect.WP_DB, Connect.WP_USER, Connect.WP_PASS); connect_ru = new Connect(); connect_ru.Open(Connect.WP_RU_HOST, Connect.WP_RU_DB, Connect.WP_RU_USER, Connect.WP_RU_PASS); // Redirects: t1 -> t_redirect -> t2 // Джемини -> MIT -> Массачусетсский_технологический_институт // Польская_Википедия -> Бот_(программа) -> Робот_(программа) // CAPTCHA -> Bot -> Робот_(программа) t1 = connect.enc.EncodeFromJava("Джемини"); t_redirect = connect.enc.EncodeFromJava("MIT"); t2 = connect.enc.EncodeFromJava("Массачусетсский_технологический_институт"); s1 = connect.enc.EncodeFromJava("Польская_Википедия"); s_redirect = connect.enc.EncodeFromJava("Бот_(программа)"); s1b = connect.enc.EncodeFromJava("CAPTCHA"); s_redirect2 = connect.enc.EncodeFromJava("Bot"); s2 = connect.enc.EncodeFromJava("Робот_(программа)"); s3 = connect.enc.EncodeFromJava("Википедия"); m_out.clear(); m_in.clear(); Links.addTitlesToMaps(t1, t_redirect, m_out, m_in); Links.addTitlesToMaps(s1, s_redirect, m_out, m_in); Links.addTitlesToMaps(s1b,s_redirect2, m_out, m_in); t1_id = PageTable.getIDByTitleNamespace(connect_ru, t1, PageNamespace.MAIN); t_redirect_id = PageTable.getIDByTitleNamespace(connect_ru, t_redirect, PageNamespace.MAIN); t2_id = PageTable.getIDByTitleNamespace(connect_ru, t2, PageNamespace.MAIN); s1_id = PageTable.getIDByTitleNamespace(connect_ru, s1, PageNamespace.MAIN); s_redirect_id = PageTable.getIDByTitleNamespace(connect_ru, s_redirect, PageNamespace.MAIN); s1b_id = PageTable.getIDByTitleNamespace(connect_ru, s1b,PageNamespace.MAIN); s_redirect2_id= PageTable.getIDByTitleNamespace(connect_ru, s_redirect2,PageNamespace.MAIN); s2_id = PageTable.getIDByTitleNamespace(connect_ru, s2, PageNamespace.MAIN); s3_id = PageTable.getIDByTitleNamespace(connect_ru, s3, PageNamespace.MAIN); String[] _t = {t1, t_redirect}; aid_t1_tredirect = ArticleIdAndTitle.createByTitle(connect_ru, m_out, m_in, _t); String[] _s = {s1, s_redirect, s_redirect2}; aid_s1_sredirect = ArticleIdAndTitle.createByTitle(connect_ru, m_out, m_in, _s); session = new SessionHolder(); session.initObjects(); categories_max_steps = 99; } protected void tearDown() throws Exception { connect.Close(); connect_ru.Close(); } public void testAddRedirect_ArticleIdAndTitle_ru() { System.out.println("testAddRedirect_ArticleIdAndTitle_ru"); Redirect.addRedirect(null, 1111, "string"); ArticleIdAndTitle aid = new ArticleIdAndTitle(1, "title1"); assertEquals(aid.redirect.size(), 0); Redirect.addRedirect(aid, 1, "title1"); assertEquals(aid.redirect.size(), 1); Redirect.addRedirect(aid, 2, "title2"); assertEquals(aid.redirect.size(), 2); // again title1, skip it Redirect.addRedirect(aid, 1, "title1"); assertEquals(aid.redirect.size(), 2); } public void testAddRedirect_Article_ru() { System.out.println("testAddRedirect_Article_ru"); Article a = new Article(); Redirect.addRedirect(a, ArticleIdAndTitle.NULL_ARTICLEIDANDTITLE_LIST); assertEquals(0, a.redirect.size()); List<ArticleIdAndTitle> r_list = new ArrayList<ArticleIdAndTitle>(); ArticleIdAndTitle r1 = new ArticleIdAndTitle(1, "title1"); r_list.add(r1); Redirect.addRedirect(a, r_list); assertEquals(1, a.redirect.size()); List<ArticleIdAndTitle> r_list2 = new ArrayList<ArticleIdAndTitle>(); ArticleIdAndTitle r2 = new ArticleIdAndTitle(2, "title2"); r_list2.add(r1); r_list2.add(r2); Redirect.addRedirect(a, r_list2); assertEquals(2, a.redirect.size()); } public void testHasRedirect_ru() { System.out.println("testHasRedirect_ru"); assertFalse(Redirect.hasRedirect(null)); assertFalse(Redirect.hasRedirect(ArticleIdAndTitle.NULL_ARTICLEIDANDTITLE_ARRAY)); assertTrue(Redirect.hasRedirect(aid_t1_tredirect)); assertTrue(Redirect.hasRedirect(aid_s1_sredirect)); } /** * Test of resolveByIdAndTitles method, of class wikipedia.data.Redirect. */ public void testResolveByIdAndTitles_ru() { System.out.println("resolveByIdAndTitles_ru"); session.Init(connect_ru, null, categories_max_steps); session.skipTitlesWithSpaces(false); session.randomPages(false); // Redirects: // t1 -> t_redirect -> t2 // Джемини -> MIT -> Массачусетсский_технологический_институт // 62186 -> -52141 -> 52137 ArticleIdAndTitle[] result = Redirect.resolveByIdAndTitles(session, m_out, m_in, aid_t1_tredirect); assertEquals(2, result.length); // t1 remain assertEquals(result[0].title,t1); assertEquals(result[0].redirect.size(), 0); // t_redirect replaced by t2 assertEquals(result[1].title, t2); assertEquals(result[1].id, t2_id); assertTrue(result[1].redirect != null); assertEquals(result[1].redirect.size(), 1); ArticleIdAndTitle redirect1 = result[1].redirect.get(0); assertEquals( redirect1.title, t_redirect); assertEquals( redirect1.id, t_redirect_id); } /** Checks updating of links in m_out, m_in */ public void testResolveByIdAndTitles_m_out_m_in_ru() { System.out.println("testResolveByIdAndTitles_m_out_m_in_ru"); session.Init(connect_ru, null, categories_max_steps); session.skipTitlesWithSpaces(false); session.randomPages(false); m_out.clear(); m_in.clear(); Links.addTitlesToMaps(t1, t_redirect, m_out, m_in); // test 1 with skip spaces: // t1 -> t_redirect -> t2 // Facts : Джемини -> MIT -> Массачусетсский_технологический_институт // Source: Джемини -> MIT // Result: Джемини -> Массачусетсский_технологический_институт assertEquals(1, m_out.size()); assertEquals(1, m_in.size()); assertEquals(1, m_out.get(t1).size()); assertEquals(1, m_in. get(t_redirect).size()); assertTrue(m_in.containsKey(t_redirect)); assertTrue(m_out.get(t1).contains( t_redirect )); assertTrue( m_in.get( t_redirect ).contains(t1)); ArticleIdAndTitle[] result = Redirect.resolveByIdAndTitles(session, m_out, m_in, aid_t1_tredirect); assertEquals(1, m_out.size()); assertEquals(1, m_in.size()); assertEquals(1, m_out.get(t1).size()); assertTrue(m_in.containsKey(t2)); assertEquals(1, m_in. get(t2).size()); assertTrue(m_in.containsKey(t2)); assertTrue(m_out.get(t1).contains( t2 )); assertTrue( m_in.get( t2 ).contains(t1)); } /** Tests treating of several redirects to one page */ public void testResolveByIdAndTitles_several_redirects_ru() { System.out.println("testResolveByIdAndTitles_several_redirects_ru"); session.Init(connect_ru, null, categories_max_steps); session.skipTitlesWithSpaces(false); session.randomPages(false); // test 2 // s1 -> s_redirect -> s2 // Польская_Википедия -> Бот_(программа) -> Робот_(программа) // Bot -> Робот_(программа) ArticleIdAndTitle[] result = Redirect.resolveByIdAndTitles(session, m_out, m_in, aid_s1_sredirect); assertEquals(2, result.length); // s1 remain assertEquals(s1, result[0].title); assertEquals(0, result[0].redirect.size()); // s_redirect and s_redirect2 were replaced by s2 assertEquals(result[1].title, s2); assertEquals(result[1].id, s2_id); assertTrue(result[1].redirect != null); assertEquals(result[1].redirect.size(), 2); ArticleIdAndTitle redirect1 = result[1].redirect.get(0); assertEquals( redirect1.title, s_redirect); assertEquals( redirect1.id, s_redirect_id); ArticleIdAndTitle redirect2 = result[1].redirect.get(1); assertEquals( redirect2.title, s_redirect2); assertEquals( redirect2.id, s_redirect2_id); } } // redirects philoshophy (without the page 'redirect') // // 1a. SELECT page_id, page_is_redirect FROM page WHERE page_namespace=0 AND page_title='MIT'; // 52141 1 // 1b. SELECT page_id, page_is_redirect FROM page WHERE page_namespace=0 AND page_title='Массачусетсский_технологический_институт'; // 52137 0 // 2a. SELECT * FROM pagelinks WHERE pl_from=52141; // Массачусетсский_технологический_институт // 2b. SELECT * FROM pagelinks WHERE pl_from=52137; // ~ 106 rows... // 3a. who links to 'MIT': // SELECT * FROM pagelinks WHERE pl_title='MIT';