| Index: chrome/android/javatests/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceTest.java | 
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceTest.java | 
| index 6df1e96a6ee3d10319327d01f4cac261225f4f09..2f72de3353caf01c7bb7ca63037b8fb70694e6dc 100644 | 
| --- a/chrome/android/javatests/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceTest.java | 
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceTest.java | 
| @@ -154,6 +154,87 @@ public class TemplateUrlServiceTest extends NativeLibraryTestBase { | 
| assertEquals(searchEngines.get(1).getKeyword(), searchEngineKeyword); | 
| } | 
|  | 
| +    @SmallTest | 
| +    @Feature({"SearchEngines"}) | 
| +    public void testSortandGetCustomSearchEngine() { | 
| +        final TemplateUrlService templateUrlService = waitForTemplateUrlServiceToLoad(); | 
| + | 
| +        // Get the number of prepopulated search engine. | 
| +        final int prepopulatedEngineNum = | 
| +                ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Integer>() { | 
| +                    @Override | 
| +                    public Integer call() throws Exception { | 
| +                        return templateUrlService.getSearchEngines().size(); | 
| +                    } | 
| +                }); | 
| + | 
| +        // Add custom search engines and verified only engines visited within 2 days are added. | 
| +        // Also verified custom engines are sorted correctly. | 
| +        List<TemplateUrl> customSearchEngines = | 
| +                ThreadUtils.runOnUiThreadBlockingNoException(new Callable<List<TemplateUrl>>() { | 
| +                    @Override | 
| +                    public List<TemplateUrl> call() throws Exception { | 
| +                        templateUrlService.addSearchEngineForTesting("keyword1", 0); | 
| +                        templateUrlService.addSearchEngineForTesting("keyword2", 0); | 
| +                        templateUrlService.addSearchEngineForTesting("keyword3", 3); | 
| +                        List<TemplateUrl> searchEngines = templateUrlService.getSearchEngines(); | 
| +                        return searchEngines.subList(prepopulatedEngineNum, searchEngines.size()); | 
| +                    } | 
| +                }); | 
| +        assertEquals(2, customSearchEngines.size()); | 
| +        assertEquals("keyword2", customSearchEngines.get(0).getKeyword()); | 
| +        assertEquals("keyword1", customSearchEngines.get(1).getKeyword()); | 
| + | 
| +        // Add more custom search engines and verified at most 3 custom engines are returned. | 
| +        // Also verified custom engines are sorted correctly. | 
| +        customSearchEngines = | 
| +                ThreadUtils.runOnUiThreadBlockingNoException(new Callable<List<TemplateUrl>>() { | 
| +                    @Override | 
| +                    public List<TemplateUrl> call() throws Exception { | 
| +                        templateUrlService.addSearchEngineForTesting("keyword4", 0); | 
| +                        templateUrlService.addSearchEngineForTesting("keyword5", 0); | 
| +                        List<TemplateUrl> searchEngines = templateUrlService.getSearchEngines(); | 
| +                        return searchEngines.subList(prepopulatedEngineNum, searchEngines.size()); | 
| +                    } | 
| +                }); | 
| +        assertEquals(3, customSearchEngines.size()); | 
| +        assertEquals("keyword5", customSearchEngines.get(0).getKeyword()); | 
| +        assertEquals("keyword4", customSearchEngines.get(1).getKeyword()); | 
| +        assertEquals("keyword2", customSearchEngines.get(2).getKeyword()); | 
| + | 
| +        // Verified last_visited is updated correctly and sorting in descending order correctly. | 
| +        customSearchEngines = | 
| +                ThreadUtils.runOnUiThreadBlockingNoException(new Callable<List<TemplateUrl>>() { | 
| +                    @Override | 
| +                    public List<TemplateUrl> call() throws Exception { | 
| +                        templateUrlService.updateLastVisitedForTesting("keyword3"); | 
| +                        List<TemplateUrl> searchEngines = templateUrlService.getSearchEngines(); | 
| +                        return searchEngines.subList(prepopulatedEngineNum, searchEngines.size()); | 
| +                    } | 
| +                }); | 
| +        assertEquals(3, customSearchEngines.size()); | 
| +        assertEquals("keyword3", customSearchEngines.get(0).getKeyword()); | 
| +        assertEquals("keyword5", customSearchEngines.get(1).getKeyword()); | 
| +        assertEquals("keyword4", customSearchEngines.get(2).getKeyword()); | 
| + | 
| +        // Set a custom engine as default provider and verified still 3 custom engines are returned. | 
| +        // Also verified custom engines are sorted correctly. | 
| +        customSearchEngines = | 
| +                ThreadUtils.runOnUiThreadBlockingNoException(new Callable<List<TemplateUrl>>() { | 
| +                    @Override | 
| +                    public List<TemplateUrl> call() throws Exception { | 
| +                        templateUrlService.setSearchEngine("keyword4"); | 
| +                        List<TemplateUrl> searchEngines = templateUrlService.getSearchEngines(); | 
| +                        return searchEngines.subList(prepopulatedEngineNum, searchEngines.size()); | 
| +                    } | 
| +                }); | 
| +        assertEquals(4, customSearchEngines.size()); | 
| +        assertEquals("keyword4", customSearchEngines.get(0).getKeyword()); | 
| +        assertEquals("keyword3", customSearchEngines.get(1).getKeyword()); | 
| +        assertEquals("keyword5", customSearchEngines.get(2).getKeyword()); | 
| +        assertEquals("keyword2", customSearchEngines.get(3).getKeyword()); | 
| +    } | 
| + | 
| private TemplateUrlService waitForTemplateUrlServiceToLoad() { | 
| final AtomicBoolean observerNotified = new AtomicBoolean(false); | 
| final LoadListener listener = new LoadListener() { | 
|  |