diff --git a/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java b/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java
index 14c9da0..abb468f 100644
--- a/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java
+++ b/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java
@@ -74,6 +74,23 @@
         }
     }
 
+    private void checkExistenceAndRemoveDictFile(final Locale locale, final File dictFile) {
+        Log.d(TAG, "waiting for writing ...");
+        waitForWriting(locale);
+        if (!dictFile.exists()) {
+            try {
+                Log.d(TAG, dictFile + " is not existing. Wait "
+                        + WAIT_FOR_WRITING_FILE_IN_MILLISECONDS + " ms for writing.");
+                printAllFiles(dictFile.getParentFile());
+                Thread.sleep(WAIT_FOR_WRITING_FILE_IN_MILLISECONDS);
+            } catch (final InterruptedException e) {
+                Log.e(TAG, "Interrupted during waiting for writing the dict file.");
+            }
+        }
+        assertTrue("check exisiting of " + dictFile, dictFile.exists());
+        FileUtils.deleteRecursively(dictFile);
+    }
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
@@ -210,10 +227,7 @@
             addAndWriteRandomWords(dummyLocale, numberOfWords, random,
                     true /* checksContents */);
         } finally {
-            Log.d(TAG, "waiting for writing ...");
-            waitForWriting(dummyLocale);
-            assertTrue("check exisiting of " + dictFile, dictFile.exists());
-            FileUtils.deleteRecursively(dictFile);
+            checkExistenceAndRemoveDictFile(dummyLocale, dictFile);
         }
     }
 
@@ -251,20 +265,15 @@
             Log.d(TAG, "testStressTestForSwitchingLanguageAndAddingWords took "
                     + (end - start) + " ms");
         } finally {
-            Log.d(TAG, "waiting for writing ...");
             for (int i = 0; i < numberOfLanguages; i++) {
-                waitForWriting(dummyLocales[i]);
-            }
-            for (final File dictFile : dictFiles) {
-                assertTrue("check exisiting of " + dictFile, dictFile.exists());
-                FileUtils.deleteRecursively(dictFile);
+                checkExistenceAndRemoveDictFile(dummyLocales[i], dictFiles[i]);
             }
         }
     }
 
     public void testAddManyWords() {
         final Locale dummyLocale =
-                new Locale(TEST_LOCALE_PREFIX + "random_words" + System.currentTimeMillis());
+                new Locale(TEST_LOCALE_PREFIX + "many_random_words" + System.currentTimeMillis());
         final String dictName = ExpandableBinaryDictionary.getDictName(
                 UserHistoryDictionary.NAME, dummyLocale, null /* dictFile */);
         final File dictFile = ExpandableBinaryDictionary.getDictFile(
@@ -275,20 +284,7 @@
         try {
             addAndWriteRandomWords(dummyLocale, numberOfWords, random, true /* checksContents */);
         } finally {
-            Log.d(TAG, "waiting for writing ...");
-            waitForWriting(dummyLocale);
-            if (!dictFile.exists()) {
-                try {
-                    Log.d(TAG, dictFile +" is not existing. Wait "
-                            + WAIT_FOR_WRITING_FILE_IN_MILLISECONDS + " ms for writing.");
-                    printAllFiles(dictFile.getParentFile());
-                    Thread.sleep(WAIT_FOR_WRITING_FILE_IN_MILLISECONDS);
-                } catch (final InterruptedException e) {
-                    Log.e(TAG, "Interrupted during waiting for writing the dict file.");
-                }
-            }
-            assertTrue("check exisiting of " + dictFile, dictFile.exists());
-            FileUtils.deleteRecursively(dictFile);
+            checkExistenceAndRemoveDictFile(dummyLocale, dictFile);
         }
     }
 
