• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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