Android Open Source - BLEMeshChat Chat App Test






From Project

Back to project page BLEMeshChat.

License

The source code is released under:

GNU General Public License

If you think the Android project BLEMeshChat listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package pro.dbro.ble;
//  w w w .ja  va  2  s .com
import android.app.Application;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.test.ApplicationTestCase;

import java.io.IOException;
import java.util.Arrays;
import java.util.Date;

import pro.dbro.ble.crypto.KeyPair;
import pro.dbro.ble.crypto.SodiumShaker;
import pro.dbro.ble.data.ContentProviderStore;
import pro.dbro.ble.data.model.ChatContentProvider;
import pro.dbro.ble.data.model.DataUtil;
import pro.dbro.ble.data.model.Peer;
import pro.dbro.ble.data.model.PeerTable;
import pro.dbro.ble.protocol.BLEProtocol;
import pro.dbro.ble.protocol.IdentityPacket;
import pro.dbro.ble.protocol.MessagePacket;
import pro.dbro.ble.protocol.OwnedIdentityPacket;
import pro.dbro.ble.util.RandomString;

/**
 * Tests of the ChatProtocol and Chat Application.
 */
public class ChatAppTest extends ApplicationTestCase<Application> {
    public ChatAppTest() {
        super(Application.class);
    }

    ChatApp mApp;
    OwnedIdentityPacket mSenderIdentity;
    boolean mCreatedNewPrimaryIdentity;
    BLEProtocol bleProtocol = new BLEProtocol();
    ContentProviderStore dataStore;

    protected void setUp() throws Exception {
        super.setUp();

        mApp = new ChatApp(getContext());
        dataStore = new ContentProviderStore(getContext());
        String username = new RandomString(BLEProtocol.ALIAS_LENGTH).nextString();
        KeyPair keyPair =  SodiumShaker.generateKeyPair();
        mSenderIdentity = new OwnedIdentityPacket(keyPair.secretKey, keyPair.publicKey, username, null);
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
    }

    /** Protocol Tests **/

    /**
     * {@link pro.dbro.ble.protocol.IdentityPacket} -> byte[] -> {@link pro.dbro.ble.protocol.IdentityPacket}
     */
    public void testCreateAndConsumeIdentityResponse() {
        byte[] identityResponse = bleProtocol.serializeIdentity(mSenderIdentity);

        // Parse Identity from sender's identityResponse response byte[]
        IdentityPacket parsedIdentityPacket = bleProtocol.deserializeIdentity(identityResponse);

        assertEquals(parsedIdentityPacket.alias, mSenderIdentity.alias);
        assertEquals(Arrays.equals(parsedIdentityPacket.publicKey, mSenderIdentity.publicKey), true);
        assertDateIsRecent(parsedIdentityPacket.dateSeen);
    }

    /**
     * {@link pro.dbro.ble.protocol.MessagePacket} -> byte[] -> {@link pro.dbro.ble.protocol.MessagePacket}
     */
    public void testCreateAndConsumeMessageResponse() {
        String messageBody = new RandomString(BLEProtocol.MESSAGE_BODY_LENGTH).nextString();

        MessagePacket messageResponse = bleProtocol.serializeMessage(mSenderIdentity, messageBody);

        MessagePacket parsedMessagePacket = bleProtocol.deserializeMessage(messageResponse.rawPacket);

        assertEquals(messageBody, parsedMessagePacket.body);
        assertEquals(Arrays.equals(parsedMessagePacket.sender.publicKey, mSenderIdentity.publicKey), true);
        assertDateIsRecent(parsedMessagePacket.authoredDate);
    }

    /** Application Tests **/

    /**
     * Create a {@link pro.dbro.ble.data.model.Peer} for protocol {@link pro.dbro.ble.protocol.IdentityPacket},
     * then create a {@link pro.dbro.ble.data.model.Message} for protocol {@link pro.dbro.ble.protocol.MessagePacket}.
     */
    public void testApplicationIdentityCreationAndMessageConsumption() throws IOException {
        // TODO : Rewrite for new API
        // Get or create new primary identity. This Identity serves as the app user
        Peer user = getOrCreatePrimaryPeerIdentity();

        // User discovers a peer

        IdentityPacket remotePeer = bleProtocol.deserializeIdentity(bleProtocol.serializeIdentity(mSenderIdentity));
        // Assert Identity response parsed successfully
        assertEquals(Arrays.equals(remotePeer.publicKey, mSenderIdentity.publicKey), true);

        // Craft a mock message from remote peer
        String mockReceivedMessageBody = new RandomString(BLEProtocol.MESSAGE_BODY_LENGTH).nextString();
        MessagePacket mockReceivedMessage = bleProtocol.serializeMessage(mSenderIdentity, mockReceivedMessageBody);

        // User receives mock message from remote peer
//        pro.dbro.ble.data.model.Message parsedMockReceivedMessage = mApp.consumeReceivedBroadcastMessage(getContext(), mockReceivedMessage);
//        assertEquals(mockReceivedMessageBody.equals(parsedMockReceivedMessage.getBody()), true);

        // Cleanup
        // TODO: Should mock database
        int numDeleted = 0;
        if (mCreatedNewPrimaryIdentity) {
            numDeleted = getContext().getContentResolver().delete(ChatContentProvider.Peers.PEERS,
                    PeerTable.id + " = ?",
                    new String[]{String.valueOf(user.getId())});
            assertEquals(numDeleted, 1);
            numDeleted = 0;
        }

//        numDeleted = getContext().getContentResolver().delete(ChatContentProvider.Peers.PEERS,
//                PeerTable.id + " = ?",
//                new String[] {String.valueOf(remotePeer.getId())});
//
//        assertEquals(numDeleted, 1);
//        numDeleted = 0;
//
//        numDeleted = getContext().getContentResolver().delete(ChatContentProvider.Messages.MESSAGES,
//                MessageTable.id + " = ?",
//                new String[] {String.valueOf(parsedMockReceivedMessage.getId())});
//        assertEquals(numDeleted, 1);
//        numDeleted = 0;
    }

    /**
     * Test database lookups by BLOB column
     */
    public void testDatabaseQueryByBlob() {
        byte[] fakePubKey = new byte[] { (byte) 0x01 };
        ContentValues stubPeer = new ContentValues();
        stubPeer.put(PeerTable.alias, "test");
        stubPeer.put(PeerTable.lastSeenDate, DataUtil.storedDateFormatter.format(new Date()));
        stubPeer.put(PeerTable.pubKey, fakePubKey);
        Uri stubPeerUri = getContext().getContentResolver().insert(ChatContentProvider.Peers.PEERS, stubPeer);

        int stubPeerId = Integer.parseInt(stubPeerUri.getLastPathSegment());

        Cursor result = getContext().getContentResolver().query(ChatContentProvider.Peers.PEERS,
                null,
                PeerTable.id + " = ?",
                new String[] {
                        String.valueOf(stubPeerId)
                },
                null);

        assertEquals(result != null, true);
        assertEquals(result.moveToFirst(), true);

        byte[] resultBlob = result.getBlob(result.getColumnIndex(PeerTable.pubKey));

        assertEquals(Arrays.equals(resultBlob, fakePubKey), true);
        result.close();

        result = getContext().getContentResolver().query(ChatContentProvider.Peers.PEERS,
                null,
                "quote(" + PeerTable.pubKey + ") = ?",
                new String[] {
                  "X'01'"
                },
                null);

        assertEquals(result != null, true);
        assertEquals(result.moveToFirst(), true);

        // Cleanup

        int numDeleted = getContext().getContentResolver().delete((ChatContentProvider.Peers.PEERS),
                PeerTable.id + " = ?",
                new String[] {
                        String.valueOf(stubPeerId)
                });
        assertEquals(numDeleted ,1);
    }
    /** Utility **/

    private Peer getOrCreatePrimaryPeerIdentity() throws IOException {
        Peer user = mApp.getPrimaryIdentity();
        if (user == null) {
            mCreatedNewPrimaryIdentity = true;
            user =  mApp.createPrimaryIdentity(new RandomString(BLEProtocol.ALIAS_LENGTH).nextString());
            Peer testUser = mApp.getPrimaryIdentity();
            assertEquals(testUser.getId(), user.getId());
            testUser.close();
        }
        return user;
    }

    private void assertDateIsRecent(Date mustBeRecent) {
        long now = new Date().getTime();
        long oneSecondAgo = now - 1000;

        if ( (mustBeRecent.getTime() > now) ){
            throw new IllegalStateException("Parsed Identity time is from the future " + mustBeRecent);

        } else if (mustBeRecent.getTime() < oneSecondAgo) {
            throw new IllegalStateException("Parsed Identity time is from more than 500ms ago " + mustBeRecent);
        }
    }
}




Java Source Code List

im.delight.android.identicons.AsymmetricIdenticon.java
im.delight.android.identicons.Identicon.java
im.delight.android.identicons.SymmetricIdenticon.java
pro.dbro.ble.ActivityRecevingMessagesIndicator.java
pro.dbro.ble.ChatAppTest.java
pro.dbro.ble.ChatApp.java
pro.dbro.ble.ChatService.java
pro.dbro.ble.crypto.KeyPair.java
pro.dbro.ble.crypto.SodiumShaker.java
pro.dbro.ble.data.ContentProviderStore.java
pro.dbro.ble.data.DataStore.java
pro.dbro.ble.data.model.ChatContentProvider.java
pro.dbro.ble.data.model.ChatDatabase.java
pro.dbro.ble.data.model.CursorModel.java
pro.dbro.ble.data.model.DataUtil.java
pro.dbro.ble.data.model.IdentityDeliveryTable.java
pro.dbro.ble.data.model.MessageCollection.java
pro.dbro.ble.data.model.MessageDeliveryTable.java
pro.dbro.ble.data.model.MessageTable.java
pro.dbro.ble.data.model.Message.java
pro.dbro.ble.data.model.PeerTable.java
pro.dbro.ble.data.model.Peer.java
pro.dbro.ble.protocol.BLEProtocol.java
pro.dbro.ble.protocol.IdentityPacket.java
pro.dbro.ble.protocol.MessagePacket.java
pro.dbro.ble.protocol.OwnedIdentityPacket.java
pro.dbro.ble.protocol.Protocol.java
pro.dbro.ble.transport.ConnectionGovernor.java
pro.dbro.ble.transport.ConnectionListener.java
pro.dbro.ble.transport.Transport.java
pro.dbro.ble.transport.ble.BLECentralConnection.java
pro.dbro.ble.transport.ble.BLECentralRequest.java
pro.dbro.ble.transport.ble.BLECentral.java
pro.dbro.ble.transport.ble.BLEPeripheralResponse.java
pro.dbro.ble.transport.ble.BLEPeripheral.java
pro.dbro.ble.transport.ble.BLETransport.java
pro.dbro.ble.transport.ble.BLEUtil.java
pro.dbro.ble.transport.ble.GATT.java
pro.dbro.ble.ui.Notification.java
pro.dbro.ble.ui.activities.LogConsumer.java
pro.dbro.ble.ui.activities.MainActivity.java
pro.dbro.ble.ui.activities.Util.java
pro.dbro.ble.ui.adapter.CursorFilter.java
pro.dbro.ble.ui.adapter.MessageAdapter.java
pro.dbro.ble.ui.adapter.PeerAdapter.java
pro.dbro.ble.ui.adapter.RecyclerViewCursorAdapter.java
pro.dbro.ble.ui.fragment.MessageListFragment.java
pro.dbro.ble.util.RandomString.java