/* * Kontalk Android client * Copyright (C) 2017 Kontalk Devteam <devteam@kontalk.org> * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * 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 for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kontalk.provider; import org.jivesoftware.smack.util.StringUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.jxmpp.util.XmppStringUtils; import android.annotation.TargetApi; import android.content.ContentUris; import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import android.test.ProviderTestCase2; import org.kontalk.provider.MyMessages.Groups; import org.kontalk.provider.MyMessages.Messages; import org.kontalk.provider.MyMessages.Threads; import org.kontalk.util.MessageUtils; import org.kontalk.util.SystemUtils; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.arrayContainingInAnyOrder; @RunWith(AndroidJUnit4.class) public class MessagesProviderTest extends ProviderTestCase2<MessagesProvider> { private static final String TEST_USERID = XmppStringUtils .completeJidFrom(MessageUtils.sha1("+15555215554"), "prime.kontalk.net"); public MessagesProviderTest() { super(MessagesProvider.class, MessagesProvider.AUTHORITY); } @Before @Override public void setUp() throws Exception { setContext(InstrumentationRegistry.getTargetContext()); super.setUp(); } @After @Override public void tearDown() throws Exception { super.tearDown(); } @Test public void testSetup() { assertQuery(Messages.CONTENT_URI); assertQuery(Threads.CONTENT_URI); } @Test public void testInsertMessages() { String msgId = MessageUtils.messageId(); Uri msg = MessagesProviderUtils.newOutgoingMessage(getMockContext(), msgId, TEST_USERID, "Test message for you", true); assertNotNull(msg); assertQueryValues(msg, Messages.MESSAGE_ID, msgId, Messages.BODY_CONTENT, "Test message for you", Messages.BODY_MIME, "text/plain", Messages.DIRECTION, String.valueOf(Messages.DIRECTION_OUT)); } @Test public void testDeleteMessage() { String msgId = MessageUtils.messageId(); Uri msg = MessagesProviderUtils.newOutgoingMessage(getMockContext(), msgId, TEST_USERID, "Test message for you", true); assertNotNull(msg); MessagesProviderUtils.deleteMessage(getMockContext(), ContentUris.parseId(msg)); assertQueryCount(msg, 0); } @Test public void testDeleteThread() { String msgId = MessageUtils.messageId(); Uri msg = MessagesProviderUtils.newOutgoingMessage(getMockContext(), msgId, TEST_USERID, "Test message for you", true); assertNotNull(msg); long threadId = MessagesProviderUtils.getThreadByMessage(getMockContext(), msg); assertTrue(threadId > 0); MessagesProviderUtils.deleteThread(getMockContext(), threadId, false); assertQueryCount(msg, 0); assertQueryCount(ContentUris.withAppendedId(Threads.CONTENT_URI, threadId), 0); } @Test public void testCreateGroup() { String groupId = StringUtils.randomString(20); String groupOwner = TEST_USERID; String groupJid = KontalkGroupCommands.createGroupJid(groupId, groupOwner); String[] members = { "alice@prime.kontalk.net", "bob@prime.kontalk.net", "charlie@prime.kontalk.net", }; long threadId = MessagesProviderUtils.createGroupThread(getMockContext(), groupJid, null, members, ""); assertTrue(threadId > 0); assertQueryCount(ContentUris.withAppendedId(Threads.CONTENT_URI, threadId), 1); assertQueryValues(Groups.getUri(groupJid), Groups.THREAD_ID, String.valueOf(threadId)); String[] actualMembers = MessagesProviderUtils.getGroupMembers(getMockContext(), groupJid, 0); assertThat(actualMembers, arrayContainingInAnyOrder(members)); } @Test public void testGroupAddRemove() { String groupId = StringUtils.randomString(20); String groupOwner = TEST_USERID; String groupJid = KontalkGroupCommands.createGroupJid(groupId, groupOwner); String[] members = { "alice@prime.kontalk.net", "bob@prime.kontalk.net", }; long threadId = MessagesProviderUtils.createGroupThread(getMockContext(), groupJid, null, members, ""); assertTrue(threadId > 0); // add a user now MessagesProviderUtils.addGroupMembers(getMockContext(), groupJid, new String[] { "charlie@prime.kontalk.net" }, true); // user list should return the same list as per create message String[] actualMembers = MessagesProviderUtils.getGroupMembers(getMockContext(), groupJid, 0); assertThat(actualMembers, arrayContainingInAnyOrder(members)); // clear pending flag getMockContext().getContentResolver().update(Groups .getMembersUri(groupJid).buildUpon() .appendPath("charlie@prime.kontalk.net") .appendQueryParameter(Messages.CLEAR_PENDING, String.valueOf(Groups.MEMBER_PENDING_ADDED)) .build(), null, null, null); // user list should return charlie too now actualMembers = MessagesProviderUtils.getGroupMembers(getMockContext(), groupJid, 0); members = SystemUtils.concatenate(members, "charlie@prime.kontalk.net"); assertThat(actualMembers, arrayContainingInAnyOrder(members)); } /** Tries to reproduce issue #761. */ @Test public void testEmptyPeer() { // from MessagingNotification String query = MyMessages.CommonColumns.NEW + " <> 0 AND " + MyMessages.CommonColumns.DIRECTION + " = " + Messages.DIRECTION_IN + " AND " + MyMessages.CommonColumns.PEER + " <> ? AND " + Groups.GROUP_JID + " <> ?"; String[] args = { "", "" }; Cursor c = getMockContentResolver().query(Threads.CONTENT_URI, null, query, args, null); assertNotNull(c); c.close(); args = new String[] { " ", " " }; c = getMockContentResolver().query(Threads.CONTENT_URI, null, query, args, null); assertNotNull(c); c.close(); } private void assertQuery(Uri uri) { Cursor c = getMockContentResolver().query(uri, null, null, null, null); assertNotNull(c); c.close(); } private void assertQueryCount(Uri uri, int count) { Cursor c = getMockContentResolver().query(uri, null, null, null, null); assertNotNull(c); assertEquals(count, c.getCount()); c.close(); } @TargetApi(Build.VERSION_CODES.HONEYCOMB) private void assertQueryValues(Uri uri, String... columnsExpected) { String[] columns = new String[columnsExpected.length / 2]; for (int i = 0; i < columns.length; i++) columns[i] = columnsExpected[i*2]; Cursor c = getMockContentResolver().query(uri, columns, null, null, null); assertNotNull(c); assertTrue(c.moveToFirst()); for (int i = 0; i < columns.length; i++) { String expected = columnsExpected[i*2+1]; String actual; if (c.getType(i) == Cursor.FIELD_TYPE_BLOB) { actual = new String(c.getBlob(i)); } else { actual = c.getString(i); } assertEquals(expected, actual); } c.close(); } }