1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.messaging.datamodel.action; 18 19 import android.content.pm.ProviderInfo; 20 import android.database.Cursor; 21 import android.net.Uri; 22 import android.test.mock.MockContentProvider; 23 24 import androidx.test.filters.SmallTest; 25 26 import com.android.messaging.BugleTestCase; 27 import com.android.messaging.FakeContext; 28 import com.android.messaging.FakeFactory; 29 import com.android.messaging.datamodel.BugleDatabaseOperations; 30 import com.android.messaging.datamodel.DataModel; 31 import com.android.messaging.datamodel.DatabaseWrapper; 32 import com.android.messaging.datamodel.FakeDataModel; 33 import com.android.messaging.datamodel.MessagingContentProvider; 34 import com.android.messaging.datamodel.action.ActionTestHelpers.StubActionService; 35 import com.android.messaging.datamodel.action.ActionTestHelpers.StubActionService.StubActionServiceCallLog; 36 import com.android.messaging.datamodel.action.GetOrCreateConversationAction.GetOrCreateConversationActionListener; 37 import com.android.messaging.datamodel.action.GetOrCreateConversationAction.GetOrCreateConversationActionMonitor; 38 import com.android.messaging.datamodel.data.ParticipantData; 39 import com.android.messaging.datamodel.data.TestDataFactory; 40 import com.android.messaging.sms.MmsUtils; 41 42 import org.mockito.Mock; 43 44 import java.util.ArrayList; 45 46 @SmallTest 47 public class GetOrCreateConversationActionTest extends BugleTestCase { 48 49 @Mock GetOrCreateConversationActionListener mockListener; 50 testGetOrCreateConversation()51 public void testGetOrCreateConversation() { 52 final DatabaseWrapper db = DataModel.get().getDatabase(); 53 54 final ArrayList<String> recipients = new ArrayList<String>(); 55 recipients.add("5551234567"); 56 recipients.add("5551234568"); 57 58 // Generate a list of partially formed participants 59 final ArrayList<ParticipantData> participants = new 60 ArrayList<ParticipantData>(); 61 62 63 for (final String recipient : recipients) { 64 participants.add(ParticipantData.getFromRawPhoneBySystemLocale(recipient)); 65 } 66 67 // Test that we properly stubbed the SMS provider to return a thread id 68 final long threadId = MmsUtils.getOrCreateThreadId(mContext, recipients); 69 assertEquals(TestDataFactory.SMS_MMS_THREAD_ID_CURSOR_VALUE, threadId); 70 71 ArrayList<StubActionServiceCallLog> calls = mService.getCalls(); 72 73 GetOrCreateConversationActionMonitor monitor = 74 GetOrCreateConversationAction.getOrCreateConversation(participants, null, 75 mockListener); 76 77 assertEquals("Failed to start service once for action", calls.size(), 1); 78 assertTrue("Action not GetOrCreateConversationAction", calls.get(0).action instanceof 79 GetOrCreateConversationAction); 80 81 GetOrCreateConversationAction action = (GetOrCreateConversationAction) 82 calls.get(0).action; 83 84 Object result = action.executeAction(); 85 86 assertTrue(result instanceof String); 87 88 // Make sure that we created a new conversation 89 int expectedConversationId = TestDataFactory.NUM_TEST_CONVERSATIONS + 1; 90 assertEquals(expectedConversationId, Integer.parseInt((String) result)); 91 92 // Now get the conversation that we just created again 93 monitor = GetOrCreateConversationAction.getOrCreateConversation(participants, null, 94 mockListener); 95 96 calls = mService.getCalls(); 97 assertEquals("Failed to start service for second action", calls.size(), 2); 98 assertTrue("Action not GetOrCreateConversationAction", calls.get(1).action instanceof 99 GetOrCreateConversationAction); 100 action = (GetOrCreateConversationAction)calls.get(1).action; 101 result = action.executeAction(); 102 103 assertTrue(result instanceof String); 104 105 final String conversationId = (String) result; 106 107 // Make sure that we found the same conversation id 108 assertEquals(expectedConversationId, Integer.parseInt((String) result)); 109 110 final ArrayList<ParticipantData> conversationParticipants = 111 BugleDatabaseOperations.getParticipantsForConversation(db, conversationId); 112 113 assertEquals("Participant count mismatch", recipients.size(), 114 conversationParticipants.size()); 115 for(final ParticipantData participant : conversationParticipants) { 116 assertTrue(recipients.contains(participant.getSendDestination())); 117 } 118 119 final Uri conversationParticipantsUri = 120 MessagingContentProvider.buildConversationParticipantsUri(conversationId); 121 final Cursor cursor = mContext.getContentResolver().query(conversationParticipantsUri, 122 ParticipantData.ParticipantsQuery.PROJECTION, null, null, null); 123 124 int countSelf = 0; 125 while(cursor.moveToNext()) { 126 final ParticipantData participant = ParticipantData.getFromCursor(cursor); 127 if (participant.isSelf()) { 128 countSelf++; 129 } else { 130 assertTrue(recipients.contains(participant.getSendDestination())); 131 } 132 } 133 cursor.close(); 134 assertEquals("Expect one self participant in conversations", 1, countSelf); 135 assertEquals("Cursor count mismatch", recipients.size(), cursor.getCount() - countSelf); 136 137 final String realId = BugleDatabaseOperations.getExistingConversation(db, threadId, false); 138 assertEquals("Conversation already exists", realId, conversationId); 139 } 140 141 private FakeContext mContext; 142 private StubActionService mService; 143 144 @Override setUp()145 public void setUp() throws Exception { 146 super.setUp(); 147 148 mContext = new FakeContext(getTestContext()); 149 150 final MockContentProvider mockProvider = new MockContentProvider() { 151 @Override 152 public Cursor query(final Uri uri, final String[] projection, final String selection, 153 final String[] selectionArgs, final String sortOrder) { 154 return TestDataFactory.getSmsMmsThreadIdCursor(); 155 } 156 }; 157 158 mContext.addContentProvider("mms-sms", mockProvider); 159 final MessagingContentProvider provider = new MessagingContentProvider(); 160 final ProviderInfo providerInfo = new ProviderInfo(); 161 providerInfo.authority = MessagingContentProvider.AUTHORITY; 162 provider.attachInfo(mContext, providerInfo); 163 mContext.addContentProvider(MessagingContentProvider.AUTHORITY, provider); 164 165 mService = new StubActionService(); 166 final FakeDataModel fakeDataModel = new FakeDataModel(mContext) 167 .withActionService(mService); 168 FakeFactory.registerWithFakeContext(getTestContext(), mContext) 169 .withDataModel(fakeDataModel); 170 provider.setDatabaseForTest(fakeDataModel.getDatabase()); 171 } 172 } 173