1 /*
2  * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 /*
25  @test
26  @key headful
27  @bug 8055197 7186036
28  @summary TextField should replace EOL character with space character
29  @run main EOLTest
30  */
31 
32 import java.awt.Frame;
33 import java.awt.TextField;
34 import java.io.ByteArrayInputStream;
35 import java.io.ByteArrayOutputStream;
36 import java.io.ObjectInput;
37 import java.io.ObjectInputStream;
38 import java.io.ObjectOutput;
39 import java.io.ObjectOutputStream;
40 
41 public class EOLTest {
42 
43     private Frame mainFrame;
44     private TextField textField;
45     private String testStrEOL;
46     private boolean isTestFail;
47     private int testFailCount;
48     StringBuilder testFailMessage;
49     private String expectedString = "Row1 Row2 Row3";
50 
EOLTest()51     public EOLTest() {
52         mainFrame = new Frame();
53         mainFrame.setSize(200, 200);
54         mainFrame.setVisible(true);
55         testFailMessage = new StringBuilder();
56         testStrEOL = "Row1" + System.lineSeparator() + "Row2\nRow3";
57     }
58 
testConstructor1()59     private void testConstructor1() {
60         textField = new TextField(testStrEOL);
61         textField.setSize(200, 100);
62         mainFrame.add(textField);
63         checkTest();
64         mainFrame.remove(textField);
65     }
66 
testConstructor2()67     private void testConstructor2() {
68         textField = new TextField(30);
69         textField.setSize(200, 100);
70         mainFrame.add(textField);
71         textField.setText(testStrEOL);
72         checkTest();
73         mainFrame.remove(textField);
74     }
75 
testConstructor3()76     private void testConstructor3() {
77         textField = new TextField(testStrEOL, 30);
78         textField.setSize(200, 100);
79         mainFrame.add(textField);
80         checkTest();
81         mainFrame.remove(textField);
82     }
83 
testSetText()84     private void testSetText() {
85         textField = new TextField();
86         textField.setSize(200, 100);
87         textField.setText(testStrEOL);
88         mainFrame.add(textField);
89         checkTest();
90         mainFrame.remove(textField);
91     }
92 
testDeserialization()93     private void testDeserialization() {
94         TextField textFieldToSerialize = new TextField(testStrEOL);
95         textFieldToSerialize.setSize(200, 100);
96         mainFrame.add(textFieldToSerialize);
97         try {
98             // Serialize TextField object "textFieldToSerialize".
99             ByteArrayOutputStream baos = new ByteArrayOutputStream();
100             ObjectOutput outStream = new ObjectOutputStream(baos);
101             outStream.writeObject(textFieldToSerialize);
102 
103             // Search the text variable data through serialized object stream.
104             byte[] streamedBytes = baos.toByteArray();
105             int foundLoc = 0;
106             for (int i = 0; i < streamedBytes.length; ++i) {
107                 if (streamedBytes[i] == expectedString.charAt(0)) {
108                     foundLoc = i;
109                     int j = 1;
110                     for (; j < expectedString.length(); ++j) {
111                         if (streamedBytes[i+j] != expectedString.charAt(j)) {
112                             break;
113                         }
114                     }
115                     if (j == expectedString.length()) {
116                         break;
117                     }
118                 }
119                 foundLoc = -1;
120             }
121 
122             if (foundLoc == -1) {
123                 // Could not find text data in serialized object stream.
124                 throw new Exception("Could not find text data in serialized "
125                     + "object stream.");
126             }
127             // Replace space character from serialized stream with
128             // EOL character for testing de-serialization.
129             String EOLChar = System.lineSeparator();
130             String newExpectedString = "";
131             for (int i = foundLoc, j = 0; j < expectedString.length(); ++i, ++j) {
132                 newExpectedString += (char)(streamedBytes[i]);
133                 if (streamedBytes[i] == ' ') {
134                     int k = 0;
135                     for (; k < EOLChar.length(); ++k) {
136                         streamedBytes[i + k] = (byte) EOLChar.charAt(k);
137                     }
138                     i += k-1;
139                     j += k-1;
140                 }
141             }
142             // New line character varies with platform,
143             // ex. For windows '\r\n', for linux '\n'.
144             // While replacing space from serialized object stream, the length
145             // of EOL character will affect the expected string as well.
146             expectedString = newExpectedString;
147 
148             // De-serialize TextField object stream.
149             ByteArrayInputStream bais = new ByteArrayInputStream(streamedBytes);
150             ObjectInput inStream = new ObjectInputStream(bais);
151             textField = (TextField) inStream.readObject();
152         } catch (Exception ex) {
153             // Serialization or De-serialization failed.
154             // Create textField with empty string to show failure.
155             ex.printStackTrace();
156             textField = new TextField();
157         }
158 
159         checkTest();
160         mainFrame.remove(textFieldToSerialize);
161     }
162 
checkTest()163     private void checkTest() {
164         if (!textField.getText().equals(expectedString)) {
165             testFailMessage.append("TestFail line : ");
166             testFailMessage.append(Thread.currentThread().getStackTrace()[2].
167                     getLineNumber());
168             testFailMessage.append(" TextField.getText() : \"");
169             testFailMessage.append(textField.getText());
170             testFailMessage.append("\" does not match expected string : \"");
171             testFailMessage.append(expectedString).append("\"");
172             testFailMessage.append(System.getProperty("line.separator"));
173             testFailCount++;
174             isTestFail = true;
175         }
176     }
177 
checkFailures()178     private void checkFailures() {
179         if (isTestFail) {
180             testFailMessage.insert(0, "Test Fail count : " + testFailCount
181                     + System.getProperty("line.separator"));
182             dispose();
183             throw new RuntimeException(testFailMessage.toString());
184         }
185     }
186 
dispose()187     private void dispose() {
188         if (mainFrame != null) {
189             mainFrame.dispose();
190         }
191     }
192 
main(String[] args)193     public static void main(String[] args) {
194         EOLTest testEOL = new EOLTest();
195         testEOL.testConstructor1();
196         testEOL.testConstructor2();
197         testEOL.testConstructor3();
198         testEOL.testSetText();
199         testEOL.testDeserialization();
200         testEOL.checkFailures();
201         testEOL.dispose();
202     }
203 }
204