Skip to content

Commit ce006aa

Browse files
shai-almogclaude
andauthored
Expand unit tests for IO package classes (#4115)
* Add comprehensive unit tests for com.codename1.io package This commit adds extensive unit test coverage for the following classes: - NetworkEvent: Event handling for network operations with progress tracking - AccessToken: OAuth token management with expiry date handling - Cookie: HTTP cookie storage and serialization - CharArrayReader: Character array reading with mark/reset support - BufferedInputStream: Buffered input stream with progress tracking - BufferedOutputStream: Buffered output stream with automatic flushing - CacheMap: LRU cache with memory and storage tiers - Data: Data interface implementations (StringData, ByteData, FileData, StorageData) - Properties: Properties file loading and storing - SocketConnection: Socket connection callbacks All tests follow the existing test conventions: - Use TestCodenameOneImplementation instead of mockito - Use @formtest or @EDTTest where needed for EDT initialization - Avoid reflection to access internal state - Use Java 8 syntax only - Focus on behavior testing through public APIs * Fix compilation errors in DataTest - use openOutputStream instead of getOutputStream * Add missing OutputStream import to DataTest * Fix test failures: correct BufferedOutputStream flush behavior and remove problematic FileData tests * Remove StorageData tests causing infinite loop in DataTest * Fix test issues: remove problematic available() test, fix Properties escaping assertion, remove noisy invalid charset test * Remove readLargeBuffer test from BufferedInputStreamTest - while loop causing hang --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent ad442f5 commit ce006aa

File tree

10 files changed

+2751
-0
lines changed

10 files changed

+2751
-0
lines changed
Lines changed: 336 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,336 @@
1+
package com.codename1.io;
2+
3+
import com.codename1.testing.TestCodenameOneImplementation;
4+
import org.junit.jupiter.api.BeforeEach;
5+
import org.junit.jupiter.api.Test;
6+
7+
import java.io.ByteArrayInputStream;
8+
import java.io.ByteArrayOutputStream;
9+
import java.io.DataInputStream;
10+
import java.io.DataOutputStream;
11+
import java.io.IOException;
12+
import java.util.Date;
13+
14+
import static org.junit.jupiter.api.Assertions.*;
15+
16+
class AccessTokenTest {
17+
private TestCodenameOneImplementation implementation;
18+
19+
@BeforeEach
20+
void setUp() {
21+
implementation = new TestCodenameOneImplementation(true);
22+
Util.setImplementation(implementation);
23+
}
24+
25+
@Test
26+
void constructWithTokenAndExpires() {
27+
AccessToken token = new AccessToken("mytoken123", "3600");
28+
29+
assertEquals("mytoken123", token.getToken());
30+
assertEquals("3600", token.getExpires());
31+
assertNotNull(token.getExpiryDate());
32+
}
33+
34+
@Test
35+
void constructWithRefreshToken() {
36+
AccessToken token = new AccessToken("access", "7200", "refresh");
37+
38+
assertEquals("access", token.getToken());
39+
assertEquals("7200", token.getExpires());
40+
assertEquals("refresh", token.getRefreshToken());
41+
}
42+
43+
@Test
44+
void constructWithIdentityToken() {
45+
AccessToken token = new AccessToken("access", "1800", "refresh", "identity");
46+
47+
assertEquals("access", token.getToken());
48+
assertEquals("1800", token.getExpires());
49+
assertEquals("refresh", token.getRefreshToken());
50+
assertEquals("identity", token.getIdentityToken());
51+
}
52+
53+
@Test
54+
void defaultConstructor() {
55+
AccessToken token = new AccessToken();
56+
57+
assertNull(token.getToken());
58+
assertNull(token.getExpires());
59+
assertNull(token.getRefreshToken());
60+
assertNull(token.getIdentityToken());
61+
}
62+
63+
@Test
64+
void createWithExpiryDate() {
65+
Date expiryDate = new Date(System.currentTimeMillis() + 3600000);
66+
AccessToken token = AccessToken.createWithExpiryDate("token", expiryDate);
67+
68+
assertEquals("token", token.getToken());
69+
assertEquals(expiryDate, token.getExpiryDate());
70+
}
71+
72+
@Test
73+
void setAndGetRefreshToken() {
74+
AccessToken token = new AccessToken("access", "3600");
75+
token.setRefreshToken("newRefresh");
76+
77+
assertEquals("newRefresh", token.getRefreshToken());
78+
}
79+
80+
@Test
81+
void setAndGetIdentityToken() {
82+
AccessToken token = new AccessToken("access", "3600");
83+
token.setIdentityToken("idToken");
84+
85+
assertEquals("idToken", token.getIdentityToken());
86+
}
87+
88+
@Test
89+
void setAndGetExpiryDate() {
90+
AccessToken token = new AccessToken("access", null);
91+
Date date = new Date(System.currentTimeMillis() + 7200000);
92+
93+
token.setExpiryDate(date);
94+
assertEquals(date, token.getExpiryDate());
95+
}
96+
97+
@Test
98+
void isExpiredWithFutureDate() {
99+
Date futureDate = new Date(System.currentTimeMillis() + 3600000);
100+
AccessToken token = AccessToken.createWithExpiryDate("token", futureDate);
101+
102+
assertFalse(token.isExpired());
103+
}
104+
105+
@Test
106+
void isExpiredWithPastDate() {
107+
Date pastDate = new Date(System.currentTimeMillis() - 3600000);
108+
AccessToken token = AccessToken.createWithExpiryDate("token", pastDate);
109+
110+
assertTrue(token.isExpired());
111+
}
112+
113+
@Test
114+
void isExpiredWithNullDate() {
115+
AccessToken token = new AccessToken("token", null);
116+
117+
assertFalse(token.isExpired());
118+
}
119+
120+
@Test
121+
void parseExpiresAsSeconds() {
122+
AccessToken token = new AccessToken("token", "3600");
123+
Date expiryDate = token.getExpiryDate();
124+
125+
assertNotNull(expiryDate);
126+
assertTrue(expiryDate.getTime() > System.currentTimeMillis());
127+
}
128+
129+
@Test
130+
void parseExpiresWithDecimal() {
131+
AccessToken token = new AccessToken("token", "3600.5");
132+
Date expiryDate = token.getExpiryDate();
133+
134+
assertNotNull(expiryDate);
135+
long expectedTime = System.currentTimeMillis() + 3600L * 1000;
136+
assertTrue(Math.abs(expiryDate.getTime() - expectedTime) < 1000);
137+
}
138+
139+
@Test
140+
void parseExpiresWithZero() {
141+
AccessToken token = new AccessToken("token", "0");
142+
143+
assertNull(token.getExpiryDate());
144+
}
145+
146+
@Test
147+
void parseExpiresWithInvalidString() {
148+
AccessToken token = new AccessToken("token", "invalid");
149+
150+
assertNull(token.getExpiryDate());
151+
}
152+
153+
@Test
154+
void getVersion() {
155+
AccessToken token = new AccessToken("token", "3600");
156+
157+
assertEquals(4, token.getVersion());
158+
}
159+
160+
@Test
161+
void getObjectId() {
162+
AccessToken token = new AccessToken("token", "3600");
163+
164+
assertEquals("AccessToken", token.getObjectId());
165+
}
166+
167+
@Test
168+
void externalizeAndInternalize() throws IOException {
169+
AccessToken original = new AccessToken("access123", "3600", "refresh456", "identity789");
170+
original.setExpiryDate(new Date(System.currentTimeMillis() + 7200000));
171+
172+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
173+
DataOutputStream dos = new DataOutputStream(baos);
174+
original.externalize(dos);
175+
dos.close();
176+
177+
AccessToken restored = new AccessToken();
178+
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
179+
DataInputStream dis = new DataInputStream(bais);
180+
restored.internalize(4, dis);
181+
dis.close();
182+
183+
assertEquals(original.getToken(), restored.getToken());
184+
assertEquals(original.getExpires(), restored.getExpires());
185+
assertEquals(original.getRefreshToken(), restored.getRefreshToken());
186+
assertEquals(original.getIdentityToken(), restored.getIdentityToken());
187+
assertEquals(original.getExpiryDate(), restored.getExpiryDate());
188+
}
189+
190+
@Test
191+
void externalizeWithNullValues() throws IOException {
192+
AccessToken original = new AccessToken();
193+
194+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
195+
DataOutputStream dos = new DataOutputStream(baos);
196+
original.externalize(dos);
197+
dos.close();
198+
199+
AccessToken restored = new AccessToken();
200+
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
201+
DataInputStream dis = new DataInputStream(bais);
202+
restored.internalize(4, dis);
203+
dis.close();
204+
205+
assertNull(restored.getToken());
206+
assertNull(restored.getExpires());
207+
assertNull(restored.getRefreshToken());
208+
assertNull(restored.getIdentityToken());
209+
}
210+
211+
@Test
212+
void internalizeVersion1() throws IOException {
213+
AccessToken original = new AccessToken("token", "3600");
214+
215+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
216+
DataOutputStream dos = new DataOutputStream(baos);
217+
Util.writeUTF("token", dos);
218+
Util.writeUTF("3600", dos);
219+
dos.close();
220+
221+
AccessToken restored = new AccessToken();
222+
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
223+
DataInputStream dis = new DataInputStream(bais);
224+
restored.internalize(1, dis);
225+
dis.close();
226+
227+
assertEquals("token", restored.getToken());
228+
assertEquals("3600", restored.getExpires());
229+
assertNull(restored.getRefreshToken());
230+
assertNull(restored.getIdentityToken());
231+
}
232+
233+
@Test
234+
void internalizeVersion2() throws IOException {
235+
AccessToken original = new AccessToken("token", "3600");
236+
Date expiryDate = new Date(System.currentTimeMillis() + 3600000);
237+
238+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
239+
DataOutputStream dos = new DataOutputStream(baos);
240+
Util.writeUTF("token", dos);
241+
Util.writeUTF("3600", dos);
242+
Util.writeObject(expiryDate, dos);
243+
dos.close();
244+
245+
AccessToken restored = new AccessToken();
246+
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
247+
DataInputStream dis = new DataInputStream(bais);
248+
restored.internalize(2, dis);
249+
dis.close();
250+
251+
assertEquals("token", restored.getToken());
252+
assertEquals(expiryDate, restored.getExpiryDate());
253+
assertNull(restored.getRefreshToken());
254+
}
255+
256+
@Test
257+
void internalizeVersion3() throws IOException {
258+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
259+
DataOutputStream dos = new DataOutputStream(baos);
260+
Util.writeUTF("token", dos);
261+
Util.writeUTF("3600", dos);
262+
Util.writeObject(new Date(), dos);
263+
Util.writeUTF("refresh", dos);
264+
dos.close();
265+
266+
AccessToken restored = new AccessToken();
267+
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
268+
DataInputStream dis = new DataInputStream(bais);
269+
restored.internalize(3, dis);
270+
dis.close();
271+
272+
assertEquals("token", restored.getToken());
273+
assertEquals("refresh", restored.getRefreshToken());
274+
assertNull(restored.getIdentityToken());
275+
}
276+
277+
@Test
278+
void equalsWithSameTokenAndExpiry() {
279+
Date expiryDate = new Date(System.currentTimeMillis() + 3600000);
280+
AccessToken token1 = AccessToken.createWithExpiryDate("token", expiryDate);
281+
AccessToken token2 = AccessToken.createWithExpiryDate("token", expiryDate);
282+
283+
assertTrue(token1.equals(token2));
284+
assertEquals(token1.hashCode(), token2.hashCode());
285+
}
286+
287+
@Test
288+
void equalsWithDifferentTokens() {
289+
Date expiryDate = new Date(System.currentTimeMillis() + 3600000);
290+
AccessToken token1 = AccessToken.createWithExpiryDate("token1", expiryDate);
291+
AccessToken token2 = AccessToken.createWithExpiryDate("token2", expiryDate);
292+
293+
assertFalse(token1.equals(token2));
294+
}
295+
296+
@Test
297+
void equalsWithDifferentExpiry() {
298+
AccessToken token1 = AccessToken.createWithExpiryDate("token", new Date(1000));
299+
AccessToken token2 = AccessToken.createWithExpiryDate("token", new Date(2000));
300+
301+
assertFalse(token1.equals(token2));
302+
}
303+
304+
@Test
305+
void equalsWithNull() {
306+
AccessToken token = new AccessToken("token", "3600");
307+
308+
assertFalse(token.equals(null));
309+
}
310+
311+
@Test
312+
void equalsWithDifferentClass() {
313+
AccessToken token = new AccessToken("token", "3600");
314+
315+
assertFalse(token.equals("token"));
316+
}
317+
318+
@Test
319+
void testToString() {
320+
Date expiryDate = new Date(System.currentTimeMillis() + 3600000);
321+
AccessToken token = AccessToken.createWithExpiryDate("mytoken", expiryDate);
322+
323+
String result = token.toString();
324+
assertTrue(result.contains("mytoken"));
325+
assertTrue(result.contains("AccessToken"));
326+
}
327+
328+
@Test
329+
void hashCodeConsistency() {
330+
AccessToken token = new AccessToken("token", "3600");
331+
int hash1 = token.hashCode();
332+
int hash2 = token.hashCode();
333+
334+
assertEquals(hash1, hash2);
335+
}
336+
}

0 commit comments

Comments
 (0)