1 /*
2  * Copyright (C) 2023 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.providers.telephony;
18 
19 import android.content.ContentValues;
20 import android.content.pm.PackageManager;
21 import android.content.pm.ProviderInfo;
22 import android.content.res.Resources;
23 import android.database.Cursor;
24 import android.provider.Telephony;
25 import android.test.mock.MockContentResolver;
26 import android.test.mock.MockContext;
27 import android.text.TextUtils;
28 import android.util.Log;
29 
30 import junit.framework.TestCase;
31 
32 import org.junit.Test;
33 
34 public class SatelliteProviderTest extends TestCase {
35     private static final String TAG = "SatelliteProviderTest";
36 
37     private MockContextWithProvider mContext;
38     private MockContentResolver mContentResolver;
39     private SatelliteProviderTestable mSatelliteProviderTestable;
40 
41     /**
42      * This is used to give the SatelliteProviderTest a mocked context which takes a
43      * SatelliteProvider and attaches it to the ContentResolver.
44      */
45     private class MockContextWithProvider extends MockContext {
46         private final MockContentResolver mResolver;
47 
MockContextWithProvider(SatelliteProvider satelliteProvider)48         public MockContextWithProvider(SatelliteProvider satelliteProvider) {
49             mResolver = new MockContentResolver();
50 
51             ProviderInfo providerInfo = new ProviderInfo();
52             providerInfo.authority = Telephony.SatelliteDatagrams.PROVIDER_NAME;
53 
54             // Add context to given satelliteProvider
55             satelliteProvider.attachInfoForTesting(this, providerInfo);
56             Log.d(TAG, "MockContextWithProvider: satelliteProvider.getContext(): "
57                     + satelliteProvider.getContext());
58 
59             // Add given satelliteProvider to mResolver, so that mResolver can send queries
60             // to the provider.
61             mResolver.addProvider(Telephony.SatelliteDatagrams.PROVIDER_NAME, satelliteProvider);
62             Log.d(TAG, "MockContextWithProvider: Add satelliteProvider to mResolver");
63         }
64 
65         @Override
getSystemService(String name)66         public Object getSystemService(String name) {
67             Log.d(TAG, "getSystemService: returning null");
68             return null;
69         }
70 
71         @Override
getResources()72         public Resources getResources() {
73             Log.d(TAG, "getResources: returning null");
74             return null;
75         }
76 
77         @Override
getContentResolver()78         public MockContentResolver getContentResolver() {
79             return mResolver;
80         }
81 
82         // Gives permission to write to the apn table within the MockContext
83         @Override
checkCallingOrSelfPermission(String permission)84         public int checkCallingOrSelfPermission(String permission) {
85             if (TextUtils.equals(permission, "android.permission.WRITE_APN_SETTINGS")) {
86                 Log.d(TAG, "checkCallingOrSelfPermission: permission=" + permission
87                         + ", returning PackageManager.PERMISSION_GRANTED");
88                 return PackageManager.PERMISSION_GRANTED;
89             } else {
90                 Log.d(TAG, "checkCallingOrSelfPermission: permission=" + permission
91                         + ", returning PackageManager.PERMISSION_DENIED");
92                 return PackageManager.PERMISSION_DENIED;
93             }
94         }
95     }
96 
97     @Override
setUp()98     protected void setUp() throws Exception {
99         super.setUp();
100         mSatelliteProviderTestable = new SatelliteProviderTestable();
101         mContext = new MockContextWithProvider(mSatelliteProviderTestable);
102         mContentResolver = (MockContentResolver) mContext.getContentResolver();
103     }
104 
105     @Override
tearDown()106     protected void tearDown() throws Exception {
107         super.tearDown();
108         mSatelliteProviderTestable.closeDatabase();
109     }
110 
111     @Test
testInsertDatagram()112     public void testInsertDatagram() {
113         long testDatagramId = 1;
114         String testDatagram = "testInsertDatagram";
115         ContentValues contentValues = new ContentValues();
116         contentValues.put(Telephony.SatelliteDatagrams.COLUMN_UNIQUE_KEY_DATAGRAM_ID,
117                 testDatagramId);
118         contentValues.put(Telephony.SatelliteDatagrams.COLUMN_DATAGRAM, testDatagram.getBytes());
119 
120         try {
121             mContentResolver.insert(Telephony.SatelliteDatagrams.CONTENT_URI, contentValues);
122         } catch (Exception e){
123             Log.d(TAG, "Error inserting satellite datagram:" + e);
124         }
125 
126         String whereClause = (Telephony.SatelliteDatagrams.COLUMN_UNIQUE_KEY_DATAGRAM_ID
127                 + "=" +testDatagramId);
128         try (Cursor cursor = mContentResolver.query(Telephony.SatelliteDatagrams.CONTENT_URI,
129                 null, whereClause, null, null)) {
130             cursor.moveToFirst();
131             byte[] datagram = cursor.getBlob(0);
132             assertEquals(testDatagram, new String(datagram));
133         } catch (Exception e) {
134             Log.d(TAG, "Exception in getting count:" + e);
135         }
136     }
137 
138     @Test
testDeleteDatagram()139     public void testDeleteDatagram() {
140         long testDatagramId = 10;
141         String testDatagram = "testDeleteDatagram";
142         ContentValues contentValues = new ContentValues();
143         contentValues.put(Telephony.SatelliteDatagrams.COLUMN_UNIQUE_KEY_DATAGRAM_ID,
144                 testDatagramId);
145         contentValues.put(Telephony.SatelliteDatagrams.COLUMN_DATAGRAM, testDatagram.getBytes());
146 
147         try {
148             mContentResolver.insert(Telephony.SatelliteDatagrams.CONTENT_URI, contentValues);
149         } catch (Exception e){
150             Log.d(TAG, "Error inserting satellite datagram:" + e);
151         }
152 
153         int numRowsDeleted = -1;
154         String whereClause = (Telephony.SatelliteDatagrams.COLUMN_UNIQUE_KEY_DATAGRAM_ID
155                 + "=" +testDatagramId);
156         try {
157             numRowsDeleted = mContentResolver.delete(Telephony.SatelliteDatagrams.CONTENT_URI,
158                     whereClause, null);
159         } catch (Exception e) {
160             Log.d(TAG, "Error deleting values:" + e);
161         }
162         assertEquals(1, numRowsDeleted);
163 
164         try (Cursor cursor = mContentResolver.query(Telephony.SatelliteDatagrams.CONTENT_URI,
165                 null, whereClause, null, null)) {
166             assertNotNull(cursor);
167             assertEquals(0, cursor.getCount());
168         } catch (Exception e) {
169             Log.d(TAG, "Exception in getting count:" + e);
170         }
171     }
172 }
173