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