1 /*
2  * Copyright (C) 2022 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 package com.android.systemui.clipboardoverlay
17 
18 import android.content.ClipData
19 import android.content.ClipDescription
20 import android.content.ContentResolver
21 import android.content.Context
22 import android.graphics.Bitmap
23 import android.net.Uri
24 import android.os.PersistableBundle
25 import androidx.test.ext.junit.runners.AndroidJUnit4
26 import androidx.test.filters.SmallTest
27 import com.android.systemui.SysuiTestCase
28 import com.android.systemui.util.mockito.whenever
29 import java.io.IOException
30 import org.junit.Assert.assertEquals
31 import org.junit.Assert.assertFalse
32 import org.junit.Assert.assertNull
33 import org.junit.Assert.assertTrue
34 import org.junit.Before
35 import org.junit.Test
36 import org.junit.runner.RunWith
37 import org.mockito.ArgumentMatchers.any
38 import org.mockito.Mock
39 import org.mockito.MockitoAnnotations
40 
41 @SmallTest
42 @RunWith(AndroidJUnit4::class)
43 class ClipboardModelTest : SysuiTestCase() {
44     @Mock private lateinit var mClipboardUtils: ClipboardOverlayUtils
45     @Mock private lateinit var mMockContext: Context
46     @Mock private lateinit var mMockContentResolver: ContentResolver
47     private lateinit var mSampleClipData: ClipData
48 
49     @Before
setupnull50     fun setup() {
51         MockitoAnnotations.initMocks(this)
52         mSampleClipData = ClipData("Test", arrayOf("text/plain"), ClipData.Item("Test Item"))
53     }
54 
55     @Test
test_textClipDatanull56     fun test_textClipData() {
57         val source = "test source"
58         val model = ClipboardModel.fromClipData(mContext, mClipboardUtils, mSampleClipData, source)
59         assertEquals(mSampleClipData, model.clipData)
60         assertEquals(source, model.source)
61         assertEquals(ClipboardModel.Type.TEXT, model.type)
62         assertEquals(mSampleClipData.getItemAt(0).text, model.text)
63         assertEquals(mSampleClipData.getItemAt(0).textLinks, model.textLinks)
64         assertEquals(mSampleClipData.getItemAt(0).uri, model.uri)
65         assertFalse(model.isSensitive)
66         assertFalse(model.isRemote)
67         assertNull(model.loadThumbnail(mContext))
68     }
69 
70     @Test
test_sensitiveExtranull71     fun test_sensitiveExtra() {
72         val description = mSampleClipData.description
73         val b = PersistableBundle()
74         b.putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)
75         description.extras = b
76         val data = ClipData(description, mSampleClipData.getItemAt(0))
77         val (_, _, _, _, _, _, sensitive) =
78             ClipboardModel.fromClipData(mContext, mClipboardUtils, data, "")
79         assertTrue(sensitive)
80     }
81 
82     @Test
test_remoteExtranull83     fun test_remoteExtra() {
84         whenever(mClipboardUtils.isRemoteCopy(any(), any(), any())).thenReturn(true)
85         val model = ClipboardModel.fromClipData(mContext, mClipboardUtils, mSampleClipData, "")
86         assertTrue(model.isRemote)
87     }
88 
89     @Test
90     @Throws(IOException::class)
test_imageClipDatanull91     fun test_imageClipData() {
92         val testBitmap = Bitmap.createBitmap(50, 50, Bitmap.Config.ARGB_8888)
93         whenever(mMockContext.contentResolver).thenReturn(mMockContentResolver)
94         whenever(mMockContext.resources).thenReturn(mContext.resources)
95         whenever(mMockContentResolver.loadThumbnail(any(), any(), any())).thenReturn(testBitmap)
96         whenever(mMockContentResolver.getType(any())).thenReturn("image")
97         val imageClipData =
98             ClipData("Test", arrayOf("text/plain"), ClipData.Item(Uri.parse("test")))
99         val model = ClipboardModel.fromClipData(mMockContext, mClipboardUtils, imageClipData, "")
100         assertEquals(ClipboardModel.Type.IMAGE, model.type)
101         assertEquals(testBitmap, model.loadThumbnail(mMockContext))
102     }
103 
104     @Test
105     @Throws(IOException::class)
test_imageClipData_loadFailurenull106     fun test_imageClipData_loadFailure() {
107         whenever(mMockContext.contentResolver).thenReturn(mMockContentResolver)
108         whenever(mMockContext.resources).thenReturn(mContext.resources)
109         whenever(mMockContentResolver.loadThumbnail(any(), any(), any())).thenThrow(IOException())
110         whenever(mMockContentResolver.getType(any())).thenReturn("image")
111         val imageClipData =
112             ClipData("Test", arrayOf("text/plain"), ClipData.Item(Uri.parse("test")))
113         val model = ClipboardModel.fromClipData(mMockContext, mClipboardUtils, imageClipData, "")
114         assertEquals(ClipboardModel.Type.IMAGE, model.type)
115         assertNull(model.loadThumbnail(mMockContext))
116     }
117 }
118