1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 package org.chromium.ui.base;
6 
7 import static org.junit.Assert.assertEquals;
8 import static org.junit.Assert.assertNotNull;
9 import static org.junit.Assert.assertNull;
10 import static org.mockito.Mockito.any;
11 import static org.mockito.Mockito.doThrow;
12 import static org.mockito.Mockito.verify;
13 
14 import android.content.ClipData;
15 import android.content.ClipboardManager;
16 import android.content.Intent;
17 import android.net.Uri;
18 import android.text.SpannableString;
19 import android.text.style.RelativeSizeSpan;
20 
21 import org.junit.Test;
22 import org.junit.runner.RunWith;
23 import org.mockito.ArgumentCaptor;
24 import org.mockito.Mockito;
25 import org.robolectric.annotation.Config;
26 
27 import org.chromium.base.ContentUriUtils;
28 import org.chromium.base.StreamUtil;
29 import org.chromium.base.test.BaseRobolectricTestRunner;
30 import org.chromium.base.test.util.UrlUtils;
31 
32 import java.io.File;
33 import java.io.FileOutputStream;
34 import java.io.IOException;
35 
36 /**
37  * Tests logic in the Clipboard class.
38  */
39 @RunWith(BaseRobolectricTestRunner.class)
40 @Config(manifest = Config.NONE)
41 public class ClipboardTest {
42     private static final String PLAIN_TEXT = "plain";
43     private static final String HTML_TEXT = "<span style=\"color: red;\">HTML</span>";
44     private static final byte[] TEST_IMAGE_DATA = new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
45 
generateUriFromImage(final byte[] jpegImageData)46     private Uri generateUriFromImage(final byte[] jpegImageData) {
47         FileOutputStream fOut = null;
48         try {
49             File path = new File(UrlUtils.getIsolatedTestFilePath("test_image"));
50             if (path.exists() || path.mkdir()) {
51                 File saveFile = File.createTempFile(
52                         String.valueOf(System.currentTimeMillis()), ".jpg", path);
53                 fOut = new FileOutputStream(saveFile);
54                 fOut.write(jpegImageData);
55                 fOut.flush();
56 
57                 return ContentUriUtils.getContentUriFromFile(saveFile);
58             }
59         } catch (IOException ie) {
60             // Ignore exception.
61         } finally {
62             StreamUtil.closeQuietly(fOut);
63         }
64 
65         return null;
66     }
67 
68     @Test
testClipDataToHtmlText()69     public void testClipDataToHtmlText() {
70         Clipboard clipboard = Clipboard.getInstance();
71 
72         // HTML text
73         ClipData html = ClipData.newHtmlText("html", PLAIN_TEXT, HTML_TEXT);
74         assertEquals(HTML_TEXT, clipboard.clipDataToHtmlText(html));
75 
76         // Plain text without span
77         ClipData plainTextNoSpan = ClipData.newPlainText("plain", PLAIN_TEXT);
78         assertNull(clipboard.clipDataToHtmlText(plainTextNoSpan));
79 
80         // Plain text with span
81         SpannableString spanned = new SpannableString(PLAIN_TEXT);
82         spanned.setSpan(new RelativeSizeSpan(2f), 0, 5, 0);
83         ClipData plainTextSpan = ClipData.newPlainText("plain", spanned);
84         assertNotNull(clipboard.clipDataToHtmlText(plainTextSpan));
85 
86         // Intent
87         Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
88         intent.addCategory(Intent.CATEGORY_OPENABLE);
89         intent.setType("*/*");
90         ClipData intentClip = ClipData.newIntent("intent", intent);
91         assertNull(clipboard.clipDataToHtmlText(intentClip));
92     }
93 
94     @Test
testClipboardSetImage()95     public void testClipboardSetImage() {
96         Clipboard clipboard = Clipboard.getInstance();
97 
98         // simple set a null, check if there is no crash.
99         clipboard.setImageUri(null);
100 
101         // Set actually data.
102         Uri imageUri = generateUriFromImage(TEST_IMAGE_DATA);
103         clipboard.setImageUri(imageUri);
104 
105         assertEquals(imageUri, clipboard.getImageUri());
106     }
107 
108     @Test
testClipboardCopyUrlToClipboard()109     public void testClipboardCopyUrlToClipboard() {
110         Clipboard clipboard = Clipboard.getInstance();
111         ClipboardManager clipboardManager = Mockito.mock(ClipboardManager.class);
112         clipboard.overrideClipboardManagerForTesting(clipboardManager);
113 
114         String url = "https://google.com";
115         clipboard.copyUrlToClipboard(url);
116 
117         ArgumentCaptor<ClipData> clipCaptor = ArgumentCaptor.forClass(ClipData.class);
118         verify(clipboardManager).setPrimaryClip(clipCaptor.capture());
119         assertEquals("url", clipCaptor.getValue().getDescription().getLabel());
120         assertEquals(url, clipCaptor.getValue().getItemAt(0).getText());
121     }
122 
123     @Test
testClipboardCopyUrlToClipboardNoException()124     public void testClipboardCopyUrlToClipboardNoException() {
125         Clipboard clipboard = Clipboard.getInstance();
126         ClipboardManager clipboardManager = Mockito.mock(ClipboardManager.class);
127         clipboard.overrideClipboardManagerForTesting(clipboardManager);
128 
129         doThrow(SecurityException.class).when(clipboardManager).setPrimaryClip(any(ClipData.class));
130         String url = "https://google.com";
131         clipboard.copyUrlToClipboard(url);
132 
133         ArgumentCaptor<ClipData> clipCaptor = ArgumentCaptor.forClass(ClipData.class);
134         verify(clipboardManager).setPrimaryClip(clipCaptor.capture());
135         assertEquals("url", clipCaptor.getValue().getDescription().getLabel());
136         assertEquals(url, clipCaptor.getValue().getItemAt(0).getText());
137     }
138 }
139