28
28
import com .amazon .sqs .javamessaging .acknowledge .Acknowledger ;
29
29
import com .amazon .sqs .javamessaging .message .SQSMessage ;
30
30
import com .amazonaws .services .sqs .model .MessageAttributeValue ;
31
+
32
+ import org .junit .Assert ;
31
33
import org .junit .Before ;
32
34
import org .junit .Test ;
33
35
34
36
import javax .jms .Message ;
35
37
import javax .jms .MessageFormatException ;
36
38
import javax .jms .MessageNotWriteableException ;
37
39
38
- import junit .framework .Assert ;
39
-
40
40
import java .util .*;
41
41
42
42
/**
43
43
* Test the SQSMessageTest class
44
44
*/
45
45
public class SQSMessageTest {
46
46
private SQSSession mockSQSSession ;
47
+ final String myNumber = "myNumber" ;
48
+ final String myNumberOverflow = "myNumberOverflow" ;
47
49
final String myTrueBoolean = "myTrueBoolean" ;
48
50
final String myFalseBoolean = "myFalseBoolean" ;
49
51
final String myInteger = "myInteger" ;
@@ -67,65 +69,66 @@ public void testProperty() throws JMSException {
67
69
when (mockSQSSession .createMessage ()).thenReturn (new SQSMessage ());
68
70
Message message = mockSQSSession .createMessage ();
69
71
70
- message .setBooleanProperty (" myTrueBoolean" , true );
71
- message .setBooleanProperty (" myFalseBoolean" , false );
72
- message .setIntProperty (" myInteger" , 100 );
73
- message .setDoubleProperty (" myDouble" , 2.1768 );
74
- message .setFloatProperty (" myFloat" , 3.1457f );
75
- message .setLongProperty (" myLong" , 1290772974281L );
76
- message .setShortProperty (" myShort" , (short ) 123 );
77
- message .setByteProperty ("myByteProperty" , (byte ) 'a' );
78
- message .setStringProperty (" myString" , "StringValue" );
79
-
80
- Assert .assertTrue (message .propertyExists (" myTrueBoolean" ));
81
- Assert .assertEquals (message .getObjectProperty (" myTrueBoolean" ), true );
82
- Assert .assertEquals (message .getBooleanProperty (" myTrueBoolean" ), true );
72
+ message .setBooleanProperty (myTrueBoolean , true );
73
+ message .setBooleanProperty (myFalseBoolean , false );
74
+ message .setIntProperty (myInteger , 100 );
75
+ message .setDoubleProperty (myDouble , 2.1768 );
76
+ message .setFloatProperty (myFloat , 3.1457f );
77
+ message .setLongProperty (myLong , 1290772974281L );
78
+ message .setShortProperty (myShort , (short ) 123 );
79
+ message .setByteProperty (myByte , (byte ) 'a' );
80
+ message .setStringProperty (myString , "StringValue" );
81
+
82
+ Assert .assertTrue (message .propertyExists (myTrueBoolean ));
83
+ Assert .assertEquals (message .getObjectProperty (myTrueBoolean ), true );
84
+ Assert .assertEquals (message .getBooleanProperty (myTrueBoolean ), true );
83
85
84
- Assert .assertTrue (message .propertyExists (" myFalseBoolean" ));
85
- Assert .assertEquals (message .getObjectProperty (" myFalseBoolean" ), false );
86
- Assert .assertEquals (message .getBooleanProperty (" myFalseBoolean" ), false );
86
+ Assert .assertTrue (message .propertyExists (myFalseBoolean ));
87
+ Assert .assertEquals (message .getObjectProperty (myFalseBoolean ), false );
88
+ Assert .assertEquals (message .getBooleanProperty (myFalseBoolean ), false );
87
89
88
- Assert .assertTrue (message .propertyExists (" myInteger" ));
89
- Assert .assertEquals (message .getObjectProperty (" myInteger" ), 100 );
90
- Assert .assertEquals (message .getIntProperty (" myInteger" ), 100 );
90
+ Assert .assertTrue (message .propertyExists (myInteger ));
91
+ Assert .assertEquals (message .getObjectProperty (myInteger ), 100 );
92
+ Assert .assertEquals (message .getIntProperty (myInteger ), 100 );
91
93
92
- Assert .assertTrue (message .propertyExists (" myDouble" ));
93
- Assert .assertEquals (message .getObjectProperty (" myDouble" ), 2.1768 );
94
- Assert .assertEquals (message .getDoubleProperty (" myDouble" ), 2.1768 );
94
+ Assert .assertTrue (message .propertyExists (myDouble ));
95
+ Assert .assertEquals (( double ) message .getObjectProperty (myDouble ), 2.1768 , 0 );
96
+ Assert .assertEquals (message .getDoubleProperty (myDouble ), 2.1768 , 0 );
95
97
96
- Assert .assertTrue (message .propertyExists (" myFloat" ));
97
- Assert .assertEquals (message .getObjectProperty (" myFloat" ), 3.1457f );
98
- Assert .assertEquals (message .getFloatProperty (" myFloat" ), 3.1457f );
98
+ Assert .assertTrue (message .propertyExists (myFloat ));
99
+ Assert .assertEquals (( float ) message .getObjectProperty (myFloat ), 3.1457f , 0 );
100
+ Assert .assertEquals (message .getFloatProperty (myFloat ), 3.1457f , 0 );
99
101
100
- Assert .assertTrue (message .propertyExists (" myLong" ));
101
- Assert .assertEquals (message .getObjectProperty (" myLong" ), 1290772974281L );
102
- Assert .assertEquals (message .getLongProperty (" myLong" ), 1290772974281L );
102
+ Assert .assertTrue (message .propertyExists (myLong ));
103
+ Assert .assertEquals (message .getObjectProperty (myLong ), 1290772974281L );
104
+ Assert .assertEquals (message .getLongProperty (myLong ), 1290772974281L );
103
105
104
- Assert .assertTrue (message .propertyExists (" myShort" ));
105
- Assert .assertEquals (message .getObjectProperty (" myShort" ), (short ) 123 );
106
- Assert .assertEquals (message .getShortProperty (" myShort" ), (short ) 123 );
106
+ Assert .assertTrue (message .propertyExists (myShort ));
107
+ Assert .assertEquals (message .getObjectProperty (myShort ), (short ) 123 );
108
+ Assert .assertEquals (message .getShortProperty (myShort ), (short ) 123 );
107
109
108
- Assert .assertTrue (message .propertyExists ("myByteProperty" ));
109
- Assert .assertEquals (message .getObjectProperty ("myByteProperty" ), (byte ) 'a' );
110
- Assert .assertEquals (message .getByteProperty ("myByteProperty" ), (byte ) 'a' );
110
+ Assert .assertTrue (message .propertyExists (myByte ));
111
+ Assert .assertEquals (message .getObjectProperty (myByte ), (byte ) 'a' );
112
+ Assert .assertEquals (message .getByteProperty (myByte ), (byte ) 'a' );
111
113
112
- Assert .assertTrue (message .propertyExists (" myString" ));
113
- Assert .assertEquals (message .getObjectProperty (" myString" ), "StringValue" );
114
- Assert .assertEquals (message .getStringProperty (" myString" ), "StringValue" );
114
+ Assert .assertTrue (message .propertyExists (myString ));
115
+ Assert .assertEquals (message .getObjectProperty (myString ), "StringValue" );
116
+ Assert .assertEquals (message .getStringProperty (myString ), "StringValue" );
115
117
116
118
// Validate property names
117
119
Set <String > propertyNamesSet = new HashSet <String >(Arrays .asList (
118
- " myTrueBoolean" ,
119
- " myFalseBoolean" ,
120
- " myInteger" ,
121
- " myDouble" ,
122
- " myFloat" ,
123
- " myLong" ,
124
- " myShort" ,
125
- "myByteProperty" ,
126
- " myString" ));
120
+ myTrueBoolean ,
121
+ myFalseBoolean ,
122
+ myInteger ,
123
+ myDouble ,
124
+ myFloat ,
125
+ myLong ,
126
+ myShort ,
127
+ myByte ,
128
+ myString ));
127
129
128
- Enumeration <String > propertyNames = message .getPropertyNames ();
130
+ @ SuppressWarnings ("unchecked" )
131
+ Enumeration <String > propertyNames = message .getPropertyNames ();
129
132
int counter = 0 ;
130
133
while (propertyNames .hasMoreElements ()) {
131
134
assertTrue (propertyNamesSet .contains (propertyNames .nextElement ()));
@@ -134,15 +137,10 @@ public void testProperty() throws JMSException {
134
137
assertEquals (propertyNamesSet .size (), counter );
135
138
136
139
message .clearProperties ();
137
- Assert .assertFalse (message .propertyExists ("myTrueBoolean" ));
138
- Assert .assertFalse (message .propertyExists ("myInteger" ));
139
- Assert .assertFalse (message .propertyExists ("myDouble" ));
140
- Assert .assertFalse (message .propertyExists ("myFloat" ));
141
- Assert .assertFalse (message .propertyExists ("myLong" ));
142
- Assert .assertFalse (message .propertyExists ("myShort" ));
143
- Assert .assertFalse (message .propertyExists ("myByteProperty" ));
144
- Assert .assertFalse (message .propertyExists ("myString" ));
145
-
140
+ for (String propName : propertyNamesSet ) {
141
+ Assert .assertFalse (message .propertyExists (propName ));
142
+ }
143
+
146
144
propertyNames = message .getPropertyNames ();
147
145
assertFalse (propertyNames .hasMoreElements ());
148
146
}
@@ -272,11 +270,23 @@ public void testSQSMessageAttributeToProperty() throws JMSException {
272
270
273
271
Acknowledger ack = mock (Acknowledger .class );
274
272
273
+ // 52 digits of value.
274
+ final String numberOverflowValue = "1234567890123456789012345678901234567890123456789012" ;
275
+
275
276
Map <String ,String > systemAttributes = new HashMap <String , String >();
276
277
systemAttributes .put (APPROXIMATE_RECEIVE_COUNT , "100" );
277
278
278
279
Map <String , MessageAttributeValue > messageAttributes = new HashMap <String , MessageAttributeValue >();
279
280
281
+ /* SQS Supports Logical Data Types: String, Number, and Binary so we'd best know what to do with those at the very minimum! */
282
+ messageAttributes .put (myNumber , new MessageAttributeValue ()
283
+ .withDataType (SQSMessagingClientConstants .NUMBER )
284
+ .withStringValue ("4" ));
285
+
286
+ messageAttributes .put (myNumberOverflow , new MessageAttributeValue ()
287
+ .withDataType (SQSMessagingClientConstants .NUMBER )
288
+ .withStringValue (numberOverflowValue ));
289
+
280
290
messageAttributes .put (myTrueBoolean , new MessageAttributeValue ()
281
291
.withDataType (SQSMessagingClientConstants .BOOLEAN )
282
292
.withStringValue ("1" ));
@@ -312,6 +322,7 @@ public void testSQSMessageAttributeToProperty() throws JMSException {
312
322
messageAttributes .put (myString , new MessageAttributeValue ()
313
323
.withDataType (SQSMessagingClientConstants .STRING )
314
324
.withStringValue ("StringValue" ));
325
+
315
326
316
327
com .amazonaws .services .sqs .model .Message sqsMessage = new com .amazonaws .services .sqs .model .Message ()
317
328
.withMessageAttributes (messageAttributes )
@@ -321,6 +332,27 @@ public void testSQSMessageAttributeToProperty() throws JMSException {
321
332
322
333
SQSMessage message = new SQSMessage (ack , "QueueUrl" , sqsMessage );
323
334
335
+ // SQS "Number" data type must use StringValue, may be a floating point number
336
+ Assert .assertTrue (message .propertyExists (myNumber ));
337
+ Assert .assertEquals ("4" , message .getObjectProperty (myNumber ));
338
+ Assert .assertEquals ("4" , message .getStringProperty (myNumber ));
339
+ Assert .assertEquals (4 , message .getIntProperty (myNumber ));
340
+ Assert .assertEquals (4.0 , message .getDoubleProperty (myNumber ), 0 );
341
+
342
+ // A Number can hold a value with quite a lot of significant digits, it must be represented as a StringValue,
343
+ // and can be interpreted as other things, but we should expect errors if the value overflows.
344
+ Assert .assertTrue (message .propertyExists (myNumberOverflow ));
345
+ Assert .assertEquals (numberOverflowValue , message .getObjectProperty (myNumberOverflow ));
346
+ Assert .assertEquals (numberOverflowValue , message .getStringProperty (myNumberOverflow ));
347
+ // Expecting a loss of precision here when interpreted as a double.
348
+ Assert .assertEquals (1.23456789012345678E51 , message .getDoubleProperty (myNumberOverflow ), 0 );
349
+ try {
350
+ message .getIntProperty (myNumberOverflow );
351
+ Assert .fail ("message.getIntProperty did not throw a NumberFormatException" );
352
+ } catch (NumberFormatException nfe ) {
353
+ Assert .assertEquals ("For input string: \" " +numberOverflowValue +"\" " , nfe .getMessage ());
354
+ }
355
+
324
356
Assert .assertTrue (message .propertyExists (myTrueBoolean ));
325
357
Assert .assertEquals (message .getObjectProperty (myTrueBoolean ), true );
326
358
Assert .assertEquals (message .getBooleanProperty (myTrueBoolean ), true );
@@ -334,12 +366,12 @@ public void testSQSMessageAttributeToProperty() throws JMSException {
334
366
Assert .assertEquals (message .getIntProperty (myInteger ), 100 );
335
367
336
368
Assert .assertTrue (message .propertyExists (myDouble ));
337
- Assert .assertEquals (message .getObjectProperty (myDouble ), 2.1768 );
338
- Assert .assertEquals (message .getDoubleProperty (myDouble ), 2.1768 );
369
+ Assert .assertEquals (( double ) message .getObjectProperty (myDouble ), 2.1768 , 0 );
370
+ Assert .assertEquals (message .getDoubleProperty (myDouble ), 2.1768 , 0 );
339
371
340
372
Assert .assertTrue (message .propertyExists (myFloat ));
341
- Assert .assertEquals (message .getObjectProperty (myFloat ), 3.1457f );
342
- Assert .assertEquals (message .getFloatProperty (myFloat ), 3.1457f );
373
+ Assert .assertEquals (( float ) message .getObjectProperty (myFloat ), 3.1457f , 0 );
374
+ Assert .assertEquals (message .getFloatProperty (myFloat ), 3.1457f , 0 );
343
375
344
376
Assert .assertTrue (message .propertyExists (myLong ));
345
377
Assert .assertEquals (message .getObjectProperty (myLong ), 1290772974281L );
@@ -360,6 +392,8 @@ public void testSQSMessageAttributeToProperty() throws JMSException {
360
392
361
393
// Validate property names
362
394
Set <String > propertyNamesSet = new HashSet <String >(Arrays .asList (
395
+ myNumber ,
396
+ myNumberOverflow ,
363
397
myTrueBoolean ,
364
398
myFalseBoolean ,
365
399
myInteger ,
@@ -374,7 +408,8 @@ public void testSQSMessageAttributeToProperty() throws JMSException {
374
408
Enumeration <String > propertyNames = message .getPropertyNames ();
375
409
int counter = 0 ;
376
410
while (propertyNames .hasMoreElements ()) {
377
- assertTrue (propertyNamesSet .contains (propertyNames .nextElement ()));
411
+ String propName = propertyNames .nextElement ();
412
+ Assert .assertTrue ("Found Unknown Property: " + propName , propertyNamesSet .contains (propName ));
378
413
counter ++;
379
414
}
380
415
assertEquals (propertyNamesSet .size (), counter );
0 commit comments