UserHistoryDictionaryTests.java revision 2fa3693c264a4c150ac307d9bb7f6f8f18cc4ffc
184d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada/*
284d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada * Copyright (C) 2012 The Android Open Source Project
384d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada *
484d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada * Licensed under the Apache License, Version 2.0 (the "License");
584d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada * you may not use this file except in compliance with the License.
684d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada * You may obtain a copy of the License at
784d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada *
884d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada *      http://www.apache.org/licenses/LICENSE-2.0
984d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada *
1084d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada * Unless required by applicable law or agreed to in writing, software
1184d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada * distributed under the License is distributed on an "AS IS" BASIS,
1284d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1384d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada * See the License for the specific language governing permissions and
1484d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada * limitations under the License.
1584d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada */
1684d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada
17ffcbbaf12788a9fc9398607a548e552d7d2bf05eSatoshi Kataokapackage com.android.inputmethod.latin.personalization;
1884d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada
1984d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanadaimport android.test.AndroidTestCase;
20b4598f7d05d6afd01ddc7ea0bed71dda837d1debTadashi G. Takaokaimport android.test.suitebuilder.annotation.LargeTest;
2184d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanadaimport android.util.Log;
2284d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada
238aaae56cf6694ec75043be56f1c7812a343b24d5Yuichiro Hanadaimport com.android.inputmethod.latin.ExpandableBinaryDictionary;
24e28eba5074664d5716b8e58b8d0a235746b261ebKen Wakasaimport com.android.inputmethod.latin.utils.CollectionUtils;
25e28eba5074664d5716b8e58b8d0a235746b261ebKen Wakasa
266def28d1dacb0f02c08d91c8be3ed877624f74abYuichiro Hanadaimport java.io.File;
2784d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanadaimport java.util.ArrayList;
2884d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanadaimport java.util.List;
292fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasaimport java.util.Locale;
3084d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanadaimport java.util.Random;
3184d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanadaimport java.util.Set;
320d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanadaimport java.util.concurrent.TimeUnit;
3384d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada
3484d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada/**
3584d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada * Unit tests for UserHistoryDictionary
3684d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada */
37b4598f7d05d6afd01ddc7ea0bed71dda837d1debTadashi G. Takaoka@LargeTest
3884d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanadapublic class UserHistoryDictionaryTests extends AndroidTestCase {
3984d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada    private static final String TAG = UserHistoryDictionaryTests.class.getSimpleName();
4084d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada
4184d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada    private static final String[] CHARACTERS = {
4284d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada        "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
4384d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada        "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"
4484d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada    };
4584d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada
4684d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada    /**
4784d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada     * Generates a random word.
4884d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada     */
4984d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada    private String generateWord(final int value) {
5084d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada        final int lengthOfChars = CHARACTERS.length;
5184d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada        StringBuilder builder = new StringBuilder();
5284d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada        long lvalue = Math.abs((long)value);
5384d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada        while (lvalue > 0) {
5484d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada            builder.append(CHARACTERS[(int)(lvalue % lengthOfChars)]);
5584d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada            lvalue /= lengthOfChars;
5684d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada        }
5784d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada        return builder.toString();
5884d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada    }
5984d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada
6084d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada    private List<String> generateWords(final int number, final Random random) {
6184d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada        final Set<String> wordSet = CollectionUtils.newHashSet();
6284d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada        while (wordSet.size() < number) {
6384d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada            wordSet.add(generateWord(random.nextInt()));
6484d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada        }
6584d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada        return new ArrayList<String>(wordSet);
6684d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada    }
6784d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada
685ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi    private void addToDict(final UserHistoryDictionary dict, final List<String> words) {
6984d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada        String prevWord = null;
7084d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada        for (String word : words) {
712fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            dict.addToDictionary(prevWord, word, true,
722fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa                    (int)TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()));
7384d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada            prevWord = word;
7484d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada        }
7584d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada    }
7684d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada
77e5a35711b854aedeeea2f45105b941b9deee49bcSatoshi Kataoka    /**
78a328f538c34ad2dafdfa53642085cb1072224d80Yuichiro Hanada     * @param checkContents if true, checks whether written words are actually in the dictionary
79e5a35711b854aedeeea2f45105b941b9deee49bcSatoshi Kataoka     * or not.
80e5a35711b854aedeeea2f45105b941b9deee49bcSatoshi Kataoka     */
818aaae56cf6694ec75043be56f1c7812a343b24d5Yuichiro Hanada    private void addAndWriteRandomWords(final String testFilenameSuffix, final int numberOfWords,
82a328f538c34ad2dafdfa53642085cb1072224d80Yuichiro Hanada            final Random random, final boolean checkContents) {
830d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada        final List<String> words = generateWords(numberOfWords, random);
845ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi        final UserHistoryDictionary dict =
855ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi                PersonalizationHelper.getUserHistoryDictionary(getContext(),
862fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa                        new Locale(testFilenameSuffix));
870d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada        // Add random words to the user history dictionary.
880d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada        addToDict(dict, words);
89a328f538c34ad2dafdfa53642085cb1072224d80Yuichiro Hanada        if (checkContents) {
902fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            dict.waitAllTasksForTests();
91a328f538c34ad2dafdfa53642085cb1072224d80Yuichiro Hanada            for (int i = 0; i < numberOfWords; ++i) {
92e5a35711b854aedeeea2f45105b941b9deee49bcSatoshi Kataoka                final String word = words.get(i);
93e5a35711b854aedeeea2f45105b941b9deee49bcSatoshi Kataoka                assertTrue(dict.isInDictionaryForTests(word));
94e5a35711b854aedeeea2f45105b941b9deee49bcSatoshi Kataoka            }
95e5a35711b854aedeeea2f45105b941b9deee49bcSatoshi Kataoka        }
960d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada        // write to file.
970d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada        dict.close();
980d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada    }
990d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada
10011f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi    /**
10111f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi     * Clear all entries in the user history dictionary.
10211f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi     * @param testFilenameSuffix file name suffix used for testing.
10311f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi     */
10411f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi    private void clearHistory(final String testFilenameSuffix) {
10511f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi        final UserHistoryDictionary dict =
10611f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi                PersonalizationHelper.getUserHistoryDictionary(getContext(),
1072fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa                        new Locale(testFilenameSuffix));
10811f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi        dict.clearAndFlushDictionary();
10911f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi        dict.close();
11011f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi    }
11111f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi
11211f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi    /**
11311f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi     * Shut down executer and wait until all operations of user history are done.
11411f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi     * @param testFilenameSuffix file name suffix used for testing.
11511f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi     */
11611f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi    private void waitForWriting(final String testFilenameSuffix) {
1172fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        final UserHistoryDictionary dict =
1182fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa                PersonalizationHelper.getUserHistoryDictionary(getContext(),
1192fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa                        new Locale(testFilenameSuffix));
1202fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        dict.waitAllTasksForTests();
12111f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi    }
12211f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi
12384d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada    public void testRandomWords() {
1240d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada        Log.d(TAG, "This test can be used for profiling.");
1250d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada        Log.d(TAG, "Usage: please set UserHistoryDictionary.PROFILE_SAVE_RESTORE to true.");
1262fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        final String testFilenameSuffix = "test_random_words" + System.currentTimeMillis();
12711f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi        final String fileName = UserHistoryDictionary.NAME + "." + testFilenameSuffix
12811f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi                + ExpandableBinaryDictionary.DICT_FILE_EXTENSION;
12911f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi
1300d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada        final int numberOfWords = 1000;
1310d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada        final Random random = new Random(123456);
1326def28d1dacb0f02c08d91c8be3ed877624f74abYuichiro Hanada
1330d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada        try {
13411f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi            clearHistory(testFilenameSuffix);
135e5a35711b854aedeeea2f45105b941b9deee49bcSatoshi Kataoka            addAndWriteRandomWords(testFilenameSuffix, numberOfWords, random,
136e5a35711b854aedeeea2f45105b941b9deee49bcSatoshi Kataoka                    true /* checksContents */);
1370d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada        } finally {
13811f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi            Log.d(TAG, "waiting for writing ...");
13911f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi            waitForWriting(testFilenameSuffix);
14011f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi            final File dictFile = new File(getContext().getFilesDir(), fileName);
1416def28d1dacb0f02c08d91c8be3ed877624f74abYuichiro Hanada            if (dictFile != null) {
1420d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada                assertTrue(dictFile.exists());
1436def28d1dacb0f02c08d91c8be3ed877624f74abYuichiro Hanada                dictFile.delete();
1446def28d1dacb0f02c08d91c8be3ed877624f74abYuichiro Hanada            }
14584d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada        }
14684d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada    }
14728a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi
14828a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi    public void testStressTestForSwitchingLanguagesAndAddingWords() {
14928a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi        final int numberOfLanguages = 2;
1500d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada        final int numberOfLanguageSwitching = 80;
1510d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada        final int numberOfWordsInsertedForEachLanguageSwitch = 100;
15228a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi
15328a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi        final File dictFiles[] = new File[numberOfLanguages];
154a099a3e341d8de0512c8bb8f4dbe352456f2a4a4Yuichiro Hanada        final String testFilenameSuffixes[] = new String[numberOfLanguages];
15528a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi        try {
15628a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi            final Random random = new Random(123456);
15728a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi
1580d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada            // Create filename suffixes for this test.
15928a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi            for (int i = 0; i < numberOfLanguages; i++) {
1602fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa                testFilenameSuffixes[i] = "test_switching_languages" + i;
1612fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa                final String fileName = UserHistoryDictionary.NAME + "." + testFilenameSuffixes[i]
1622fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa                        + ExpandableBinaryDictionary.DICT_FILE_EXTENSION;
16328a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi                dictFiles[i] = new File(getContext().getFilesDir(), fileName);
16411f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi                clearHistory(testFilenameSuffixes[i]);
16528a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi            }
16628a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi
1670d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada            final long start = System.currentTimeMillis();
16828a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi
16928a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi            for (int i = 0; i < numberOfLanguageSwitching; i++) {
17028a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi                final int index = i % numberOfLanguages;
1710d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada                // Switch languages to testFilenameSuffixes[index].
1720d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada                addAndWriteRandomWords(testFilenameSuffixes[index],
173e5a35711b854aedeeea2f45105b941b9deee49bcSatoshi Kataoka                        numberOfWordsInsertedForEachLanguageSwitch, random,
174e5a35711b854aedeeea2f45105b941b9deee49bcSatoshi Kataoka                        false /* checksContents */);
17528a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi            }
17628a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi
17728a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi            final long end = System.currentTimeMillis();
17828a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi            Log.d(TAG, "testStressTestForSwitchingLanguageAndAddingWords took "
1790d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada                    + (end - start) + " ms");
1800d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada        } finally {
18111f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi            Log.d(TAG, "waiting for writing ...");
18211f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi            for (int i = 0; i < numberOfLanguages; i++) {
18311f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi                waitForWriting(testFilenameSuffixes[i]);
18428a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi            }
18528a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi            for (final File file : dictFiles) {
18628a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi                if (file != null) {
1870d70bcc821c22f7001b66f4c7b83842661b8391eYuichiro Hanada                    assertTrue(file.exists());
18828a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi                    file.delete();
18928a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi                }
19028a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi            }
19128a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi        }
19228a70b63c5748783c3b6fcac551cb69852840474Keisuke Kuroynagi    }
1932e58670da9687fd1fd28c322e03343957d11568cKeisuke Kuroyanagi
1942e58670da9687fd1fd28c322e03343957d11568cKeisuke Kuroyanagi    public void testAddManyWords() {
1952fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        final String testFilenameSuffix = "test_random_words" + System.currentTimeMillis();
1962fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        final int numberOfWords = 10000;
1972e58670da9687fd1fd28c322e03343957d11568cKeisuke Kuroyanagi        final Random random = new Random(123456);
19811f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi        clearHistory(testFilenameSuffix);
1992e58670da9687fd1fd28c322e03343957d11568cKeisuke Kuroyanagi        try {
2002e58670da9687fd1fd28c322e03343957d11568cKeisuke Kuroyanagi            addAndWriteRandomWords(testFilenameSuffix, numberOfWords, random,
2012e58670da9687fd1fd28c322e03343957d11568cKeisuke Kuroyanagi                    true /* checksContents */);
2022e58670da9687fd1fd28c322e03343957d11568cKeisuke Kuroyanagi        } finally {
20311f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi            Log.d(TAG, "waiting for writing ...");
20411f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi            waitForWriting(testFilenameSuffix);
2055ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi            final String fileName = UserHistoryDictionary.NAME + "." + testFilenameSuffix
2062e58670da9687fd1fd28c322e03343957d11568cKeisuke Kuroyanagi                    + ExpandableBinaryDictionary.DICT_FILE_EXTENSION;
20711f7cae094720c3ab47e6c18772b1fc44e9e5372Keisuke Kuroyanagi            final File dictFile = new File(getContext().getFilesDir(), fileName);
2082e58670da9687fd1fd28c322e03343957d11568cKeisuke Kuroyanagi            if (dictFile != null) {
2092e58670da9687fd1fd28c322e03343957d11568cKeisuke Kuroyanagi                assertTrue(dictFile.exists());
2102e58670da9687fd1fd28c322e03343957d11568cKeisuke Kuroyanagi                dictFile.delete();
2112e58670da9687fd1fd28c322e03343957d11568cKeisuke Kuroyanagi            }
2122e58670da9687fd1fd28c322e03343957d11568cKeisuke Kuroyanagi        }
2132e58670da9687fd1fd28c322e03343957d11568cKeisuke Kuroyanagi    }
2142e58670da9687fd1fd28c322e03343957d11568cKeisuke Kuroyanagi
21584d858ed5e187eb9d4b56b593e1d9287f762bbcaYuichiro Hanada}
216