testrecordstore.java

来自「This is a resource based on j2me embedde」· Java 代码 · 共 269 行

JAVA
269
字号
/* *    * * Copyright  1990-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER *  * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. *  * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). *  * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA *  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */package javax.microedition.rms;import com.sun.midp.i3test.*;import java.util.Random;public class TestRecordStore extends TestCase {    final String RECORD_STORE_NAME = "testrms";    byte[] smallData;    byte[] largeData;    int recordId1, recordId2;    /**     * Add a small record then a large record.     */    private void setupRSTest() throws RecordStoreException {        smallData = new byte[5]; // 5 Bytes        // Contents are 0,1,...,n        for (int i = 0; i < smallData.length; i++) {            smallData[i] = (byte)i;        }        Random random = new Random();        largeData = new byte[10*1024]; // 10K Bytes        // Contents are 0,1,...,n        for (int i = 0; i < largeData.length; i++) {            largeData[i] = (byte)(random.nextInt(8) & 0xff);        }        // Remove old record store        try {            RecordStore.deleteRecordStore(RECORD_STORE_NAME);        } catch (RecordStoreNotFoundException rnfe) {}        RecordStore store = RecordStore.openRecordStore(RECORD_STORE_NAME, true);        recordId1 = store.addRecord(smallData, 0, smallData.length);        recordId2 = store.addRecord(largeData, 0, largeData.length);        store.closeRecordStore();    }    private void testSequentialRMS() throws RecordStoreException {        RecordStore store1 = null;        RecordStore store2 = null;        boolean exceptionThrown = false;        declare("Sequential access");        store1 = RecordStore.openForLockTesting(RECORD_STORE_NAME);        try {            try {                store2 = RecordStore.openForLockTesting(RECORD_STORE_NAME);            } catch (RecordStoreException re) {                exceptionThrown = true;            }                         if (store2 != null) {                    store2.closeRecordStore();            }        } finally {            store1.closeRecordStore();        }        assertTrue(exceptionThrown);    }    private void testEnumeration() throws RecordStoreException {        declare("getNumRecords");        RecordStore store = RecordStore.openRecordStore(RECORD_STORE_NAME, false);        assertTrue(store.getNumRecords() == 2);        declare("Enumeration nextRecordId");        RecordEnumeration recordenumeration = store.enumerateRecords(null, null,            true);        assertTrue("recordId1", recordenumeration.nextRecordId() == recordId1);        assertTrue("recordId2", recordenumeration.nextRecordId() == recordId2);        declare("Enumeration nextRecord");        byte record[];        int i;        recordenumeration.reset();        record = recordenumeration.nextRecord();        for (i = 0; i < record.length; i++)            if (record[i] != smallData[i])                break;        assertTrue("small", record.length == smallData.length && i == record.length);        record = recordenumeration.nextRecord();        for (i = 0; i < record.length; i++)            if (record[i] != largeData[i])                break;        assertTrue("large", record.length == largeData.length && i == record.length);        store.closeRecordStore();    }    private void testCompactRecords() throws RecordStoreException {        declare("testCompactRecords");        RecordStore store = RecordStore.openRecordStore(RECORD_STORE_NAME, false);        // Delete the small record        store.deleteRecord(recordId1);        // Close the store to exercise compacting code        store.closeRecordStore();        // Reopen and check for the large record        store = RecordStore.openRecordStore(RECORD_STORE_NAME, false);                byte record[] = store.getRecord(recordId2);        int i;        for (i = 0; i < record.length; i++)            if (record[i] != largeData[i])                break;        assertTrue(record.length == largeData.length && i == record.length);        store.closeRecordStore();    }    /**     * Creates a pseudo random record which is actually a fragment of     * largeData array.     * @param size of record required     * @return byte array of size requested     */    private byte[] getRandomRecord(int size) {        byte[] record = new byte[size];        byte ind = (byte) (new Random().nextInt(7) & 0x7f);        record[0] = ind;        for (int i = 1; i < size; i++) {            record[i] = largeData[(ind + i) % largeData.length];        }        return record;    }    /**     * Checks if record given could be created by getRandomRecord().     * @param record record to be checked     * @return false if record with content given cannot be created by     *          getRandomRecord()     */    private boolean isValidRandomRecord(byte[] record) {        if (record.length < 2) {            return false;        }        byte ind = record [0];        if (ind < 0) {            return false;        }        for (int i = 1; i < record.length; i++) {            if (record[i] != largeData[(ind + i) % largeData.length]) {                return false;            }        }        return true;    }    private void testSizeLimit() throws RecordStoreException {        final int RECORD_SIZE = 64;        final int DOUBLE_SIZE = RECORD_SIZE * 2;        int id1 = -1;        int id2 = -1;        declare("testSizeLimit");        RecordStore store = RecordStore.openRecordStore(RECORD_STORE_NAME, true);        try {            id1 = store.addRecord(getRandomRecord(RECORD_SIZE), 0, RECORD_SIZE);            while (true) {                id2 = store.addRecord(getRandomRecord(RECORD_SIZE),                        0, RECORD_SIZE);            }        } catch (RecordStoreFullException e) {            // Ok, the record store is full, now deleting two short records            assertTrue("failed adding two distinct records", id1 != id2);            store.deleteRecord(id1);            store.deleteRecord(id2);            // Now there should be enough space for one double-size record            try {                store.addRecord(getRandomRecord(DOUBLE_SIZE), 0, DOUBLE_SIZE);                //Checking data is not damaged by preceding operations                RecordEnumeration enum = store.enumerateRecords(null, null, false);                boolean damaged = false;                while (enum.hasNextElement()) {                    int id = enum.nextRecordId();                    byte[] record = store.getRecord(id);                    if (id == id1 || id == id2 || !isValidRandomRecord(record)) {                        damaged = true;                        break;                    }                }                assertTrue("data is damaged", !damaged);            } catch (Throwable t) {                fail("Failed adding a record to freed space: " + t);            }        }        store.closeRecordStore();    }    private void cleanup() throws RecordStoreException {        RecordStore.deleteRecordStore(RECORD_STORE_NAME);    }    public void runTests() throws Throwable {        setupRSTest();        try {            testSequentialRMS();            testEnumeration();            testCompactRecords();            cleanup();            testSizeLimit();        } catch (Throwable t) {            t.printStackTrace();        } finally {            cleanup();        }    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?