anthill_smpp_ruby 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. data/MIT-LICENSE +21 -0
  2. data/README +30 -0
  3. data/anthill_smpp_ruby.gemspec +18 -0
  4. data/changelog +43 -0
  5. data/data/dumps/random_command.dump +1 -0
  6. data/data/dumps/smpp_alert_notification.dump +1 -0
  7. data/data/dumps/smpp_bind_receiver.dump +1 -0
  8. data/data/dumps/smpp_bind_receiver_resp.dump +1 -0
  9. data/data/dumps/smpp_bind_transceiver.dump +1 -0
  10. data/data/dumps/smpp_bind_transceiver_1.dump +2 -0
  11. data/data/dumps/smpp_bind_transceiver_resp.dump +1 -0
  12. data/data/dumps/smpp_bind_transmitter.dump +1 -0
  13. data/data/dumps/smpp_bind_transmitter_resp.dump +1 -0
  14. data/data/dumps/smpp_broadcast_sm.dump +1 -0
  15. data/data/dumps/smpp_broadcast_sm_resp.dump +1 -0
  16. data/data/dumps/smpp_cancel_broadcast_sm.dump +1 -0
  17. data/data/dumps/smpp_cancel_broadcast_sm_resp.dump +1 -0
  18. data/data/dumps/smpp_cancel_sm.dump +1 -0
  19. data/data/dumps/smpp_cancel_sm_resp.dump +1 -0
  20. data/data/dumps/smpp_data_sm.dump +1 -0
  21. data/data/dumps/smpp_data_sm_resp.dump +1 -0
  22. data/data/dumps/smpp_deliver_sm.dump +1 -0
  23. data/data/dumps/smpp_deliver_sm_resp.dump +1 -0
  24. data/data/dumps/smpp_enquire_link.dump +1 -0
  25. data/data/dumps/smpp_enquire_link_resp.dump +1 -0
  26. data/data/dumps/smpp_generic_nack.dump +1 -0
  27. data/data/dumps/smpp_outbind.dump +1 -0
  28. data/data/dumps/smpp_query_broadcast_sm.dump +1 -0
  29. data/data/dumps/smpp_query_broadcast_sm_resp.dump +1 -0
  30. data/data/dumps/smpp_query_broadcast_sm_resp_1.dump +1 -0
  31. data/data/dumps/smpp_query_sm.dump +1 -0
  32. data/data/dumps/smpp_query_sm_resp.dump +1 -0
  33. data/data/dumps/smpp_replace_sm.dump +1 -0
  34. data/data/dumps/smpp_replace_sm_resp.dump +1 -0
  35. data/data/dumps/smpp_submit_multi.dump +1 -0
  36. data/data/dumps/smpp_submit_multi_resp.dump +1 -0
  37. data/data/dumps/smpp_submit_sm.dump +1 -0
  38. data/data/dumps/smpp_submit_sm_resp.dump +1 -0
  39. data/data/dumps/smpp_unbind.dump +1 -0
  40. data/data/dumps/smpp_unbind_resp.dump +1 -0
  41. data/data/pdus/random_command.xml +35 -0
  42. data/data/pdus/smpp_alert_notification.xml +14 -0
  43. data/data/pdus/smpp_alert_notification_no_optional.xml +13 -0
  44. data/data/pdus/smpp_bind_receiver.xml +17 -0
  45. data/data/pdus/smpp_bind_receiver_resp.xml +12 -0
  46. data/data/pdus/smpp_bind_receiver_resp_no_optional.xml +11 -0
  47. data/data/pdus/smpp_bind_transceiver.xml +17 -0
  48. data/data/pdus/smpp_bind_transceiver_resp.xml +12 -0
  49. data/data/pdus/smpp_bind_transceiver_resp_no_optional.xml +11 -0
  50. data/data/pdus/smpp_bind_transmitter.xml +17 -0
  51. data/data/pdus/smpp_bind_transmitter_resp.xml +12 -0
  52. data/data/pdus/smpp_bind_transmitter_resp_no_optional.xml +11 -0
  53. data/data/pdus/smpp_broadcast_sm.xml +47 -0
  54. data/data/pdus/smpp_broadcast_sm_no_optional.xml +26 -0
  55. data/data/pdus/smpp_broadcast_sm_resp.xml +14 -0
  56. data/data/pdus/smpp_broadcast_sm_resp_no_optional.xml +8 -0
  57. data/data/pdus/smpp_cancel_broadcast_sm.xml +17 -0
  58. data/data/pdus/smpp_cancel_broadcast_sm_no_optional.xml +15 -0
  59. data/data/pdus/smpp_cancel_broadcast_sm_resp.xml +7 -0
  60. data/data/pdus/smpp_cancel_sm.xml +18 -0
  61. data/data/pdus/smpp_cancel_sm_resp.xml +10 -0
  62. data/data/pdus/smpp_commands.xsd +914 -0
  63. data/data/pdus/smpp_data_sm.xml +58 -0
  64. data/data/pdus/smpp_data_sm_no_optional.xml +17 -0
  65. data/data/pdus/smpp_data_sm_resp.xml +15 -0
  66. data/data/pdus/smpp_data_sm_resp_no_optional.xml +8 -0
  67. data/data/pdus/smpp_deliver_sm.xml +46 -0
  68. data/data/pdus/smpp_deliver_sm_no_optional.xml +25 -0
  69. data/data/pdus/smpp_deliver_sm_resp.xml +14 -0
  70. data/data/pdus/smpp_deliver_sm_resp_no_optional.xml +8 -0
  71. data/data/pdus/smpp_enquire_link.xml +10 -0
  72. data/data/pdus/smpp_enquire_link_resp.xml +10 -0
  73. data/data/pdus/smpp_generic_nack.xml +10 -0
  74. data/data/pdus/smpp_outbind.xml +12 -0
  75. data/data/pdus/smpp_query_broadcast_sm.xml +12 -0
  76. data/data/pdus/smpp_query_broadcast_sm_no_optional.xml +11 -0
  77. data/data/pdus/smpp_query_broadcast_sm_resp.xml +17 -0
  78. data/data/pdus/smpp_query_broadcast_sm_resp_no_optional.xml +15 -0
  79. data/data/pdus/smpp_query_sm.xml +11 -0
  80. data/data/pdus/smpp_query_sm_resp.xml +11 -0
  81. data/data/pdus/smpp_replace_sm.xml +18 -0
  82. data/data/pdus/smpp_replace_sm_no_optional.xml +17 -0
  83. data/data/pdus/smpp_replace_sm_resp.xml +7 -0
  84. data/data/pdus/smpp_submit_multi.xml +73 -0
  85. data/data/pdus/smpp_submit_multi_no_optional.xml +51 -0
  86. data/data/pdus/smpp_submit_multi_resp.xml +35 -0
  87. data/data/pdus/smpp_submit_sm.xml +57 -0
  88. data/data/pdus/smpp_submit_sm_no_optional.xml +28 -0
  89. data/data/pdus/smpp_submit_sm_resp.xml +8 -0
  90. data/data/pdus/smpp_unbind.xml +10 -0
  91. data/data/pdus/smpp_unbind_resp.xml +10 -0
  92. data/examples/dump_viewer.rb +298 -0
  93. data/examples/pdu_composer.rb +1331 -0
  94. data/knownbugs +24 -0
  95. data/lib/anthill_smpp_ruby.rb +83 -0
  96. data/lib/i_smpp_outputter.rb +425 -0
  97. data/lib/pdu/smpp_alert_notification.rb +132 -0
  98. data/lib/pdu/smpp_bind.rb +102 -0
  99. data/lib/pdu/smpp_bind_receiver.rb +29 -0
  100. data/lib/pdu/smpp_bind_receiver_resp.rb +30 -0
  101. data/lib/pdu/smpp_bind_resp.rb +100 -0
  102. data/lib/pdu/smpp_bind_transceiver.rb +29 -0
  103. data/lib/pdu/smpp_bind_transceiver_resp.rb +31 -0
  104. data/lib/pdu/smpp_bind_transmitter.rb +29 -0
  105. data/lib/pdu/smpp_bind_transmitter_resp.rb +30 -0
  106. data/lib/pdu/smpp_broadcast_sm.rb +566 -0
  107. data/lib/pdu/smpp_broadcast_sm_resp.rb +130 -0
  108. data/lib/pdu/smpp_cancel_broadcast_sm.rb +143 -0
  109. data/lib/pdu/smpp_cancel_broadcast_sm_resp.rb +60 -0
  110. data/lib/pdu/smpp_cancel_sm.rb +110 -0
  111. data/lib/pdu/smpp_cancel_sm_resp.rb +60 -0
  112. data/lib/pdu/smpp_data_sm.rb +679 -0
  113. data/lib/pdu/smpp_data_sm_resp.rb +148 -0
  114. data/lib/pdu/smpp_deliver_sm.rb +458 -0
  115. data/lib/pdu/smpp_deliver_sm_resp.rb +137 -0
  116. data/lib/pdu/smpp_enquire_link.rb +59 -0
  117. data/lib/pdu/smpp_enquire_link_resp.rb +61 -0
  118. data/lib/pdu/smpp_generic_nack.rb +61 -0
  119. data/lib/pdu/smpp_outbind.rb +71 -0
  120. data/lib/pdu/smpp_pdu.rb +90 -0
  121. data/lib/pdu/smpp_query_broadcast_sm.rb +120 -0
  122. data/lib/pdu/smpp_query_broadcast_sm_resp.rb +192 -0
  123. data/lib/pdu/smpp_query_sm.rb +92 -0
  124. data/lib/pdu/smpp_query_sm_resp.rb +92 -0
  125. data/lib/pdu/smpp_replace_sm.rb +172 -0
  126. data/lib/pdu/smpp_replace_sm_resp.rb +61 -0
  127. data/lib/pdu/smpp_resp.rb +40 -0
  128. data/lib/pdu/smpp_submit_multi.rb +517 -0
  129. data/lib/pdu/smpp_submit_multi_resp.rb +90 -0
  130. data/lib/pdu/smpp_submit_sm.rb +591 -0
  131. data/lib/pdu/smpp_submit_sm_resp.rb +72 -0
  132. data/lib/pdu/smpp_unbind.rb +60 -0
  133. data/lib/pdu/smpp_unbind_resp.rb +61 -0
  134. data/lib/smpp_constants.rb +917 -0
  135. data/lib/smpp_csv_outputter.rb +1601 -0
  136. data/lib/smpp_datatypes.rb +89 -0
  137. data/lib/smpp_decoder.rb +627 -0
  138. data/lib/smpp_encoder.rb +495 -0
  139. data/lib/smpp_hex_outputter.rb +36 -0
  140. data/lib/smpp_outputter_base.rb +315 -0
  141. data/lib/smpp_structures.rb +98 -0
  142. data/lib/smpp_txt_outputter.rb +1895 -0
  143. data/lib/smpp_validator.rb +373 -0
  144. data/lib/smpp_xml_outputter.rb +34 -0
  145. data/roadmap +18 -0
  146. data/setup.rb +1585 -0
  147. data/test/anthill_smpp_test.rb +29 -0
  148. data/test/smpp_codec_test.rb +30 -0
  149. data/test/smpp_datatypes_test.rb +69 -0
  150. data/test/smpp_outputter_test.rb +1261 -0
  151. data/test/smpp_parsing_test.rb +1758 -0
  152. data/test/smpp_rawdump_test.rb +2095 -0
  153. data/test/smpp_validator_test.rb +441 -0
  154. metadata +206 -0
@@ -0,0 +1,2095 @@
1
+ #
2
+ # Copyright 2007 Majoron.com (developers@majoron.com)
3
+ # Original sources are available at www.majoron.com
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ $:.unshift File.dirname(__FILE__) + '/../lib/'
19
+ $:.unshift File.dirname(__FILE__) + '/../lib/' + '/../../../AntHill/0.5/lib/'
20
+
21
+ require "test/unit"
22
+ require "anthill"
23
+ require "anthill_smpp"
24
+
25
+
26
+ class SMPPRawdumpTest < Test::Unit::TestCase
27
+ def test_decode_smpp_bind_receiver
28
+ dump = String.new()
29
+ # read and decode package based on hex dump
30
+ dump << "00 00 00 2E 00 00 00 01 00 00 00 00 00 00 00 0B 53 79 73 74 65 6D 49 "
31
+ dump << "64 00 70 61 73 73 77 6F 72 64 00 53 4D 53 43 00 50 01 01 31 32 33 00 "
32
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
33
+
34
+ # declare variables
35
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
36
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
37
+
38
+ # decode package
39
+ decoder.append_buffer(buffer)
40
+ pdu = decoder.get_packet()
41
+ assert_not_nil pdu, "PDU is null"
42
+ pdu.decode_packet(decoder)
43
+ pdu.validate_packet(validator)
44
+ decoder.validate_offset(pdu.command_length())
45
+
46
+ # check instanse type and fields value
47
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPBindReceiver, pdu, "PDU class is invalid" )
48
+ assert_equal 46, pdu.command_length
49
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_BIND_RECEIVER, pdu.command_id
50
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
51
+ assert_equal 11, pdu.sequence_number
52
+ assert_equal "SystemId", pdu.system_id
53
+ assert_equal "password", pdu.password
54
+ assert_equal "SMSC", pdu.system_type
55
+ assert_equal Majoron::AntHill::SMPP::InterfaceVersion::SMPP_VER_5_0, pdu.interface_version
56
+ assert_equal Majoron::AntHill::SMPP::TON::INTERNATIONAL, pdu.addr_ton
57
+ assert_equal Majoron::AntHill::SMPP::NPI::ISDN, pdu.addr_npi
58
+ assert_equal "123", pdu.address_range
59
+ end
60
+
61
+ def test_decode_smpp_bind_receiver_resp
62
+ dump = String.new()
63
+ # read and decode package based on hex dump
64
+ dump << "00 00 00 1c 80 00 00 01 00 00 00 00 00 00 24 ba 53 53 53 4d "
65
+ dump << "53 43 00 02 10 00 01 33 "
66
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
67
+
68
+ # declare variables
69
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
70
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
71
+
72
+ # decode package
73
+ decoder.append_buffer(buffer)
74
+ pdu = decoder.get_packet()
75
+ assert_not_nil pdu, "PDU is null"
76
+ pdu.decode_packet(decoder)
77
+ pdu.validate_packet(validator)
78
+ decoder.validate_offset(pdu.command_length())
79
+
80
+ # check instanse type and fields value
81
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPBindReceiverResp, pdu, "PDU class is invalid" )
82
+ assert_equal 28, pdu.command_length
83
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_BIND_RECEIVER_RESP, pdu.command_id
84
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
85
+ assert_equal 9402, pdu.sequence_number
86
+ assert_equal "SSSMSC", pdu.system_id
87
+ assert_equal Majoron::AntHill::SMPP::InterfaceVersion::SMPP_VER_3_3, pdu.sc_interface_version
88
+ end
89
+
90
+ def test_decode_smpp_bind_transceiver
91
+ dump = String.new()
92
+ # read and decode package based on hex dump
93
+ dump << "00 00 00 2E 00 00 00 09 00 00 00 00 00 00 00 0B 53 79 73 74 65 6D 49 "
94
+ dump << "64 00 70 61 73 73 77 6F 72 64 00 53 4D 53 43 00 50 01 01 31 32 33 00 "
95
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
96
+
97
+ # declare variables
98
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
99
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
100
+
101
+ # decode package
102
+ decoder.append_buffer(buffer)
103
+ pdu = decoder.get_packet()
104
+ assert_not_nil pdu, "PDU is null"
105
+ pdu.decode_packet(decoder)
106
+ pdu.validate_packet(validator)
107
+ decoder.validate_offset(pdu.command_length())
108
+
109
+ # check instanse type and fields value
110
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPBindTransceiver, pdu, "PDU class is invalid" )
111
+ assert_equal 46, pdu.command_length
112
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_BIND_TRANSCEIVER, pdu.command_id
113
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
114
+ assert_equal 11, pdu.sequence_number
115
+ assert_equal "SystemId", pdu.system_id
116
+ assert_equal "password", pdu.password
117
+ assert_equal "SMSC", pdu.system_type
118
+ assert_equal Majoron::AntHill::SMPP::InterfaceVersion::SMPP_VER_5_0, pdu.interface_version
119
+ assert_equal Majoron::AntHill::SMPP::TON::INTERNATIONAL, pdu.addr_ton
120
+ assert_equal Majoron::AntHill::SMPP::NPI::ISDN, pdu.addr_npi
121
+ assert_equal "123", pdu.address_range
122
+ end
123
+
124
+ def test_decode_smpp_bind_transceiver_resp
125
+ dump = String.new()
126
+ # read and decode package based on hex dump
127
+ dump << "00 00 00 1c 80 00 00 09 00 00 00 00 00 00 24 ba 53 53 53 4d "
128
+ dump << "53 43 00 02 10 00 01 33 "
129
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
130
+
131
+ # declare variables
132
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
133
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
134
+
135
+ # decode package
136
+ decoder.append_buffer(buffer)
137
+ pdu = decoder.get_packet()
138
+ assert_not_nil pdu, "PDU is null"
139
+ pdu.decode_packet(decoder)
140
+ pdu.validate_packet(validator)
141
+ decoder.validate_offset(pdu.command_length())
142
+
143
+ # check instanse type and fields value
144
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPBindTransceiverResp, pdu, "PDU class is invalid" )
145
+ assert_equal 28, pdu.command_length
146
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_BIND_TRANSCEIVER_RESP, pdu.command_id
147
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
148
+ assert_equal 9402, pdu.sequence_number
149
+ assert_equal "SSSMSC", pdu.system_id
150
+ assert_equal Majoron::AntHill::SMPP::InterfaceVersion::SMPP_VER_3_3, pdu.sc_interface_version
151
+ end
152
+
153
+ def test_decode_smpp_bind_transmitter
154
+ dump = String.new()
155
+ # read and decode package based on hex dump
156
+ dump << "00 00 00 2E 00 00 00 02 00 00 00 00 00 00 00 0B 53 79 73 74 65 6D 49 "
157
+ dump << "64 00 70 61 73 73 77 6F 72 64 00 53 4D 53 43 00 50 01 01 31 32 33 00 "
158
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
159
+
160
+ # declare variables
161
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
162
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
163
+
164
+ # decode package
165
+ decoder.append_buffer(buffer)
166
+ pdu = decoder.get_packet()
167
+ assert_not_nil pdu, "PDU is null"
168
+ pdu.decode_packet(decoder)
169
+ pdu.validate_packet(validator)
170
+ decoder.validate_offset(pdu.command_length())
171
+
172
+ # check instanse type and fields value
173
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPBindTransmitter, pdu, "PDU class is invalid" )
174
+ assert_equal 46, pdu.command_length
175
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_BIND_TRANSMITTER, pdu.command_id
176
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
177
+ assert_equal 11, pdu.sequence_number
178
+ assert_equal "SystemId", pdu.system_id
179
+ assert_equal "password", pdu.password
180
+ assert_equal "SMSC", pdu.system_type
181
+ assert_equal Majoron::AntHill::SMPP::InterfaceVersion::SMPP_VER_5_0, pdu.interface_version
182
+ assert_equal Majoron::AntHill::SMPP::TON::INTERNATIONAL, pdu.addr_ton
183
+ assert_equal Majoron::AntHill::SMPP::NPI::ISDN, pdu.addr_npi
184
+ assert_equal "123", pdu.address_range
185
+ end
186
+
187
+ def test_decode_smpp_bind_transmitter_invalid_command_length
188
+ dump = String.new()
189
+ # read and decode package based on hex dump
190
+ dump << "10 00 00 31 00 00 00 02 00 00 00 00 00 00 00 01 53 79 73 74 65 6d 49 "
191
+ dump << "44 00 50 61 73 73 77 6f 72 64 00 53 79 73 54 79 70 65 00 01 01 01 31 "
192
+ dump << "32 33 00"
193
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
194
+
195
+ # declare variables
196
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
197
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
198
+
199
+ # decode package
200
+ decoder.append_buffer(buffer)
201
+ pdu = decoder.get_packet()
202
+ assert_not_nil pdu, "PDU is null"
203
+ pdu.decode_packet(decoder)
204
+ pdu.validate_packet(validator)
205
+ assert_raise RuntimeError do
206
+ decoder.validate_offset(pdu.command_length())
207
+ end
208
+
209
+ # check instanse type and fields value
210
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPBindTransmitter, pdu, "PDU class is invalid" )
211
+ assert_equal 268435505, pdu.command_length
212
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_BIND_TRANSMITTER, pdu.command_id
213
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
214
+ assert_equal 1, pdu.sequence_number
215
+ assert_equal "SystemID", pdu.system_id
216
+ assert_equal "Password", pdu.password
217
+ assert_equal "SysType", pdu.system_type
218
+ assert_equal 1, pdu.interface_version
219
+ assert_equal Majoron::AntHill::SMPP::TON::INTERNATIONAL, pdu.addr_ton
220
+ assert_equal Majoron::AntHill::SMPP::NPI::ISDN, pdu.addr_npi
221
+ assert_equal "123", pdu.address_range
222
+ end
223
+
224
+
225
+
226
+ def test_decode_smpp_bind_transmitter_resp
227
+ dump = String.new()
228
+ # read and decode package based on hex dump
229
+ dump << "00 00 00 1c 80 00 00 02 00 00 00 00 00 00 24 ba 53 53 53 4d "
230
+ dump << "53 43 00 02 10 00 01 33 "
231
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
232
+
233
+ # declare variables
234
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
235
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
236
+
237
+ # decode package
238
+ decoder.append_buffer(buffer)
239
+ pdu = decoder.get_packet()
240
+ assert_not_nil pdu, "PDU is null"
241
+ pdu.decode_packet(decoder)
242
+ pdu.validate_packet(validator)
243
+ decoder.validate_offset(pdu.command_length())
244
+
245
+ # check instanse type and fields value
246
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPBindTransmitterResp, pdu, "PDU class is invalid" )
247
+ assert_equal 28, pdu.command_length
248
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_BIND_TRANSMITTER_RESP, pdu.command_id
249
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
250
+ assert_equal 9402, pdu.sequence_number
251
+ assert_equal "SSSMSC", pdu.system_id
252
+ assert_equal Majoron::AntHill::SMPP::InterfaceVersion::SMPP_VER_3_3, pdu.sc_interface_version
253
+ end
254
+
255
+ def test_decode_smpp_submit_sm
256
+ dump = String.new()
257
+ # read and decode package based on hex dump
258
+ dump << "00 00 00 51 00 00 00 04 00 00 00 00 00 00 2C F9 00 00 01 33 "
259
+ dump << "33 31 31 00 01 01 37 39 32 31 31 32 33 34 35 36 37 00 00 00 "
260
+ dump << "00 00 00 00 00 08 00 21 68 65 72 65 20 69 73 20 74 65 78 74 "
261
+ dump << "20 6F 66 20 74 68 65 20 73 68 6F 72 74 20 6D 65 73 73 61 67 "
262
+ dump << "65 "
263
+
264
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
265
+
266
+ # declare variables
267
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
268
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
269
+
270
+ # decode package
271
+ decoder.append_buffer(buffer)
272
+ pdu = decoder.get_packet()
273
+ assert_not_nil pdu, "PDU is null"
274
+ pdu.decode_packet(decoder)
275
+ pdu.validate_packet(validator)
276
+ decoder.validate_offset(pdu.command_length())
277
+
278
+ # check instanse type and fields value
279
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPSubmitSM, pdu, "PDU class is invalid" )
280
+ assert_equal 81, pdu.command_length
281
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_SUBMIT_SM, pdu.command_id
282
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
283
+ assert_equal 11513, pdu.sequence_number
284
+ assert_equal "", pdu.service_type
285
+ assert_equal Majoron::AntHill::SMPP::TON::UNKNOWN, pdu.source_addr_ton
286
+ assert_equal Majoron::AntHill::SMPP::NPI::ISDN, pdu.source_addr_npi
287
+ assert_equal "3311", pdu.source_addr
288
+ assert_equal Majoron::AntHill::SMPP::TON::INTERNATIONAL, pdu.dest_addr_ton
289
+ assert_equal Majoron::AntHill::SMPP::NPI::ISDN, pdu.dest_addr_npi
290
+ assert_equal "79211234567", pdu.dest_addr
291
+ assert_equal 0, pdu.esm_class
292
+ assert_equal 8, pdu.data_coding
293
+ assert_equal "here is text of the short message", pdu.short_message
294
+ end
295
+
296
+ def test_decode_smpp_submit_sm_invalid_schedule_delivery_time
297
+ dump = String.new()
298
+ # read and decode package based on hex dump
299
+ dump << "0 0 0 d7 0 0 0 4 0 0 0 0 0 0 0 1 53 4d 53 31 32 0 1 1 31 32 "
300
+ dump << "33 0 1 1 31 32 33 0 1 1 1 66 61 6b 65 0 66 61 6b 65 0 1 1 1 "
301
+ dump << "1 7 6d 65 73 73 61 67 65 2 4 0 2 0 1 2 a 0 2 0 1 0 d 0 1 1 2 "
302
+ dump << "b 0 2 0 1 0 5 0 1 1 2 c 0 2 0 1 2 e 0 1 1 2 f 0 1 1 4 26 0 1 "
303
+ dump << "1 0 19 0 1 1 4 24 0 3 1 2 3 2 1 0 1 1 3 81 0 3 1 2 3 3 2 0 1 "
304
+ dump << "1 3 3 0 3 1 2 3 2 2 0 3 1 2 3 2 3 0 3 1 2 3 2 5 0 1 1 12 1 0 "
305
+ dump << "1 1 12 3 0 2 0 1 12 4 0 1 1 0 30 0 1 1 3 4 0 1 1 13 c 0 1 1 2 "
306
+ dump << "d 0 1 1 13 80 0 1 1 13 83 0 2 0 1 5 1 0 1 1"
307
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
308
+
309
+ # declare variables
310
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
311
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
312
+
313
+ # decode package
314
+ decoder.append_buffer(buffer)
315
+ pdu = decoder.get_packet()
316
+ assert_not_nil pdu, "PDU is null"
317
+ pdu.decode_packet(decoder)
318
+ assert_raise RuntimeError do
319
+ pdu.validate_packet(validator)
320
+ end
321
+ decoder.validate_offset(pdu.command_length())
322
+
323
+ # check instanse type and fields value
324
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPSubmitSM, pdu, "PDU class is invalid" )
325
+ assert_equal 215, pdu.command_length
326
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_SUBMIT_SM, pdu.command_id
327
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
328
+ assert_equal 1, pdu.sequence_number
329
+ assert_equal "SMS12", pdu.service_type
330
+ assert_equal Majoron::AntHill::SMPP::TON::INTERNATIONAL, pdu.source_addr_ton
331
+ assert_equal Majoron::AntHill::SMPP::NPI::ISDN, pdu.source_addr_npi
332
+ assert_equal "123", pdu.source_addr
333
+ assert_equal Majoron::AntHill::SMPP::TON::INTERNATIONAL, pdu.dest_addr_ton
334
+ assert_equal Majoron::AntHill::SMPP::NPI::ISDN, pdu.dest_addr_npi
335
+ assert_equal "123", pdu.dest_addr
336
+ assert_equal 1, pdu.esm_class
337
+ assert_equal 1, pdu.protocol_id
338
+ assert_equal 1, pdu.priority_flag
339
+ assert_equal "fake", pdu.schedule_delivery_time
340
+ assert_equal "fake", pdu.validity_period
341
+ assert_equal 1, pdu.registered_delivery
342
+ assert_equal 1, pdu.replace_if_present_flag
343
+ assert_equal 1, pdu.data_coding
344
+ assert_equal 1, pdu.sm_default_msg_id
345
+ assert_equal 7, pdu.sm_length
346
+ assert_equal "message", pdu.short_message
347
+
348
+ # Check optional fields value
349
+ assert_equal 1, pdu.user_message_reference
350
+ assert_equal 1, pdu.source_port
351
+ assert_equal 1, pdu.source_addr_subunit
352
+ assert_equal 1, pdu.destination_port
353
+ assert_equal 1, pdu.dest_addr_subunit
354
+ assert_equal 1, pdu.sar_msg_ref_num
355
+ assert_equal 1, pdu.sar_total_segments
356
+ assert_equal 1, pdu.sar_segment_seqnum
357
+ assert_equal 1, pdu.more_messages_to_send
358
+ assert_equal 1, pdu.payload_type
359
+ assert_equal "01 02 03", Majoron::AntHill::ByteBuffer.encode_hex(pdu.message_payload).strip.upcase
360
+ assert_equal 1, pdu.privacy_indicator
361
+ assert_equal "01 02 03", Majoron::AntHill::ByteBuffer.encode_hex(pdu.callback_num).strip.upcase
362
+ assert_equal 1, pdu.callback_num_pres_ind
363
+ assert_equal "01 02 03", Majoron::AntHill::ByteBuffer.encode_hex(pdu.callback_num_atag).strip.upcase
364
+ assert_equal "01 02 03", Majoron::AntHill::ByteBuffer.encode_hex(pdu.source_subaddress).strip.upcase
365
+ assert_equal "01 02 03", Majoron::AntHill::ByteBuffer.encode_hex(pdu.dest_subaddress).strip.upcase
366
+ assert_equal 1, pdu.user_response_code
367
+ assert_equal 1, pdu.display_time
368
+ assert_equal 1, pdu.sms_signal
369
+ assert_equal 1, pdu.ms_validity
370
+ assert_equal 1, pdu.ms_msg_wait_facilities
371
+ assert_equal 1, pdu.number_of_messages
372
+ assert_equal 1, pdu.alert_on_msg_delivery
373
+ assert_equal 1, pdu.language_indicator
374
+ assert_equal 1, pdu.its_reply_type
375
+ assert_equal 1, pdu.its_session_info
376
+ assert_equal 1, pdu.ussd_service_op
377
+
378
+ # Check optional fields len value
379
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.user_message_reference_len
380
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.source_port_len
381
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.source_addr_subunit_len
382
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.destination_port_len
383
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.dest_addr_subunit_len
384
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.sar_msg_ref_num_len
385
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.sar_total_segments_len
386
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.sar_segment_seqnum_len
387
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.more_messages_to_send_len
388
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.payload_type_len
389
+ assert_equal 3, pdu.message_payload_len
390
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.privacy_indicator_len
391
+ assert_equal 3, pdu.callback_num_len
392
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.callback_num_pres_ind_len
393
+ assert_equal 3, pdu.callback_num_atag_len
394
+ assert_equal 3, pdu.source_subaddress_len
395
+ assert_equal 3, pdu.dest_subaddress_len
396
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.user_response_code_len
397
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.display_time_len
398
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.sms_signal_len
399
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.ms_validity_len
400
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.ms_msg_wait_facilities_len
401
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.number_of_messages_len
402
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.alert_on_msg_delivery_len
403
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.language_indicator_len
404
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.its_reply_type_len
405
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.its_session_info_len
406
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.ussd_service_op_len
407
+ end
408
+
409
+
410
+ def test_decode_smpp_submit_sm_resp
411
+ dump = String.new()
412
+ # read and decode package based on hex dump
413
+ dump << "00 00 00 14 80 00 00 04 00 00 00 00 00 00 00 0C 31 32 33 00"
414
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
415
+
416
+ # declare variables
417
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
418
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
419
+
420
+ # decode package
421
+ decoder.append_buffer(buffer)
422
+ pdu = decoder.get_packet()
423
+ assert_not_nil pdu, "PDU is null"
424
+ pdu.decode_packet(decoder)
425
+ pdu.validate_packet(validator)
426
+ decoder.validate_offset(pdu.command_length())
427
+
428
+ # check instanse type and fields value
429
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPSubmitSMResp, pdu, "PDU class is invalid" )
430
+ assert_equal 20, pdu.command_length
431
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_SUBMIT_SM_RESP, pdu.command_id
432
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
433
+ assert_equal 12, pdu.sequence_number
434
+ assert_equal "123", pdu.message_id
435
+
436
+ end
437
+
438
+ def test_decode_smpp_submit_multi
439
+ dump = String.new()
440
+ # read and decode package based on hex dump
441
+ dump << "00 00 00 E2 00 00 00 21 00 00 00 00 00 00 00 0C 73 72 76 74 70 00 01 "
442
+ dump << "02 31 32 33 00 06 02 64 69 73 74 72 5F 6C 69 73 74 31 00 02 64 69 73 "
443
+ dump << "74 72 5F 6C 69 73 74 32 00 01 31 31 31 32 33 00 01 32 32 32 32 33 00 "
444
+ dump << "02 64 69 73 74 72 5F 6C 69 73 74 31 00 02 64 69 73 74 72 5F 6C 69 73 "
445
+ dump << "74 32 00 01 02 03 00 00 04 05 06 07 00 02 0A 00 02 00 02 00 0D 00 01 "
446
+ dump << "03 02 0B 00 02 00 04 00 05 00 01 05 02 0C 00 02 00 06 02 0E 00 01 07 "
447
+ dump << "02 0F 00 01 08 00 19 00 01 09 04 24 00 01 09 02 01 00 01 0A 03 81 00 "
448
+ dump << "04 01 02 AA FF 03 02 00 01 0B 03 03 00 04 01 02 AA FF 02 02 00 04 01 "
449
+ dump << "02 AA FF 02 03 00 04 01 02 AA FF 12 01 00 01 0C 12 03 00 02 00 0D 12 "
450
+ dump << "04 00 01 0E 00 30 00 01 0F 13 0C 00 01 10 02 0D 00 01 11"
451
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
452
+
453
+ # declare variables
454
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
455
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
456
+
457
+ # decode package
458
+ decoder.append_buffer(buffer)
459
+ pdu = decoder.get_packet()
460
+ assert_not_nil pdu, "PDU is null"
461
+ pdu.decode_packet(decoder)
462
+ pdu.validate_packet(validator)
463
+ decoder.validate_offset(pdu.command_length())
464
+
465
+ # check instanse type and fields value
466
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPSubmitMulti, pdu, "PDU class is invalid" )
467
+ assert_equal 226, pdu.command_length
468
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_SUBMIT_MULTI, pdu.command_id
469
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
470
+ assert_equal 12, pdu.sequence_number
471
+ assert_equal "srvtp", pdu.service_type
472
+ assert_equal Majoron::AntHill::SMPP::TON::INTERNATIONAL, pdu.source_addr_ton
473
+ assert_equal Majoron::AntHill::SMPP::NPI::DATA, pdu.source_addr_npi
474
+ assert_equal "123", pdu.source_addr
475
+ assert_equal 6, pdu.number_of_dest
476
+ assert_equal 6, pdu.dest_addresses.size()
477
+
478
+ assert_equal 2, pdu.dest_addresses[0].dest_flag
479
+ assert_equal "distr_list1", pdu.dest_addresses[0].distr_list_name
480
+
481
+ assert_equal 2, pdu.dest_addresses[1].dest_flag
482
+ assert_equal "distr_list2", pdu.dest_addresses[1].distr_list_name
483
+
484
+ assert_equal 1, pdu.dest_addresses[2].dest_flag
485
+ assert_equal 49, pdu.dest_addresses[2].address.ton
486
+ assert_equal 49, pdu.dest_addresses[2].address.npi
487
+ assert_equal "123", pdu.dest_addresses[2].address.address
488
+
489
+ assert_equal 1, pdu.dest_addresses[3].dest_flag
490
+ assert_equal 50, pdu.dest_addresses[3].address.ton
491
+ assert_equal 50, pdu.dest_addresses[3].address.npi
492
+ assert_equal "223", pdu.dest_addresses[3].address.address
493
+
494
+ assert_equal 2, pdu.dest_addresses[4].dest_flag
495
+ assert_equal "distr_list1", pdu.dest_addresses[4].distr_list_name
496
+
497
+ assert_equal 2, pdu.dest_addresses[5].dest_flag
498
+ assert_equal "distr_list2", pdu.dest_addresses[5].distr_list_name
499
+
500
+ assert_equal 1, pdu.esm_class
501
+ assert_equal 2, pdu.protocol_id
502
+ assert_equal 3, pdu.priority_flag
503
+ assert_equal "", pdu.schedule_delivery_time
504
+ assert_equal "", pdu.validity_period
505
+ assert_equal 4, pdu.registered_delivery
506
+ assert_equal 5, pdu.replace_if_present_flag
507
+ assert_equal 6, pdu.data_coding
508
+ assert_equal 7, pdu.sm_default_msg_id
509
+ assert_equal 0, pdu.sm_length
510
+ assert_equal "", pdu.short_message
511
+
512
+ # Check optional fields value
513
+ assert_equal 2, pdu.source_port
514
+ assert_equal 3, pdu.source_addr_subunit
515
+ assert_equal 4, pdu.destination_port
516
+ assert_equal 5, pdu.dest_addr_subunit
517
+ assert_equal 6, pdu.sar_msg_ref_num
518
+ assert_equal 7, pdu.sar_total_segments
519
+ assert_equal 8, pdu.sar_segment_seqnum
520
+ assert_equal 9, pdu.payload_type
521
+ assert_equal "09", Majoron::AntHill::ByteBuffer.encode_hex(pdu.message_payload).strip.upcase
522
+ assert_equal 10, pdu.privacy_indicator
523
+ assert_equal "01 02 AA FF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.callback_num).strip.upcase
524
+ assert_equal 11, pdu.callback_num_pres_ind
525
+ assert_equal "01 02 AA FF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.callback_num_atag).strip.upcase
526
+ assert_equal "01 02 AA FF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.source_subaddress).strip.upcase
527
+ assert_equal "01 02 AA FF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.dest_subaddress).strip.upcase
528
+ assert_equal 12, pdu.display_time
529
+ assert_equal 13, pdu.sms_signal
530
+ assert_equal 14, pdu.ms_validity
531
+ assert_equal 15, pdu.ms_msg_wait_facilities
532
+ assert_equal 16, pdu.alert_on_msg_delivery
533
+ assert_equal 17, pdu.language_indicator
534
+
535
+ # Check optional fields len value
536
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.source_port_len
537
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.source_addr_subunit_len
538
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.destination_port_len
539
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.dest_addr_subunit_len
540
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.sar_msg_ref_num_len
541
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.sar_total_segments_len
542
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.sar_segment_seqnum_len
543
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.payload_type_len
544
+ assert_equal 1, pdu.message_payload_len
545
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.privacy_indicator_len
546
+ assert_equal 4, pdu.callback_num_len
547
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.callback_num_pres_ind_len
548
+ assert_equal 4, pdu.callback_num_atag_len
549
+ assert_equal 4, pdu.source_subaddress_len
550
+ assert_equal 4, pdu.dest_subaddress_len
551
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.display_time_len
552
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.sms_signal_len
553
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.ms_validity_len
554
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.ms_msg_wait_facilities_len
555
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.alert_on_msg_delivery_len
556
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.language_indicator_len
557
+ end
558
+
559
+
560
+ def test_decode_smpp_submit_multi_invalid_schedule_delivery_time
561
+ dump = String.new()
562
+ # read and decode package based on hex dump
563
+ dump << "00 00 01 02 00 00 00 21 00 00 00 00 00 00 00 01 53 4d 53 00 01 "
564
+ dump << "01 31 32 33 00 09 02 44 69 73 74 72 4c 69 73 74 31 00 02 44 69 "
565
+ dump << "73 74 72 4c 69 73 74 32 00 02 44 69 73 74 72 4c 69 73 74 33 00 "
566
+ dump << "01 01 02 31 32 33 00 01 03 04 34 35 36 00 01 05 06 37 38 39 00 "
567
+ dump << "01 01 02 31 31 32 33 00 01 03 04 31 34 35 36 00 01 05 06 31 37 "
568
+ dump << "38 39 00 01 01 01 66 61 6b 65 00 66 61 6b 65 00 01 01 01 01 07 "
569
+ dump << "6d 65 73 73 61 67 65 02 04 00 02 00 01 02 0a 00 02 00 01 00 0d "
570
+ dump << "00 01 01 02 0b 00 02 00 01 00 05 00 01 01 02 0c 00 02 00 01 02 "
571
+ dump << "0e 00 01 01 02 0f 00 01 01 00 19 00 01 01 04 24 00 03 01 02 03 "
572
+ dump << "02 01 00 01 01 03 81 00 03 01 02 03 03 02 00 01 01 03 03 00 03 "
573
+ dump << "01 02 03 02 02 00 03 01 02 03 02 03 00 03 01 02 03 12 01 00 01 "
574
+ dump << "01 12 03 00 02 00 01 12 04 00 01 01 00 30 00 01 01 13 0c 00 01 "
575
+ dump << "01 02 0d 00 01 01"
576
+
577
+
578
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
579
+
580
+ # declare variables
581
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
582
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
583
+
584
+ # decode package
585
+ decoder.append_buffer(buffer)
586
+ pdu = decoder.get_packet()
587
+ assert_not_nil pdu, "PDU is null"
588
+ pdu.decode_packet(decoder)
589
+ assert_raise RuntimeError do
590
+ pdu.validate_packet(validator)
591
+ end
592
+ decoder.validate_offset(pdu.command_length())
593
+
594
+ # check instanse type and fields value
595
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPSubmitMulti, pdu, "PDU class is invalid" )
596
+ assert_equal 258, pdu.command_length
597
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_SUBMIT_MULTI, pdu.command_id
598
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
599
+ assert_equal 1, pdu.sequence_number
600
+ assert_equal "SMS", pdu.service_type
601
+ assert_equal Majoron::AntHill::SMPP::TON::INTERNATIONAL, pdu.source_addr_ton
602
+ assert_equal Majoron::AntHill::SMPP::NPI::ISDN, pdu.source_addr_npi
603
+ assert_equal "123", pdu.source_addr
604
+ assert_equal 9, pdu.number_of_dest
605
+ assert_equal 9, pdu.dest_addresses.size()
606
+
607
+ assert_equal 2, pdu.dest_addresses[0].dest_flag
608
+ assert_equal "DistrList1", pdu.dest_addresses[0].distr_list_name
609
+
610
+ assert_equal 2, pdu.dest_addresses[1].dest_flag
611
+ assert_equal "DistrList2", pdu.dest_addresses[1].distr_list_name
612
+
613
+ assert_equal 2, pdu.dest_addresses[2].dest_flag
614
+ assert_equal "DistrList3", pdu.dest_addresses[2].distr_list_name
615
+
616
+ assert_equal 1, pdu.dest_addresses[3].dest_flag
617
+ assert_equal 1, pdu.dest_addresses[3].address.ton
618
+ assert_equal 2, pdu.dest_addresses[3].address.npi
619
+ assert_equal "123", pdu.dest_addresses[3].address.address
620
+
621
+ assert_equal 1, pdu.dest_addresses[4].dest_flag
622
+ assert_equal 3, pdu.dest_addresses[4].address.ton
623
+ assert_equal 4, pdu.dest_addresses[4].address.npi
624
+ assert_equal "456", pdu.dest_addresses[4].address.address
625
+
626
+ assert_equal 1, pdu.dest_addresses[5].dest_flag
627
+ assert_equal 5, pdu.dest_addresses[5].address.ton
628
+ assert_equal 6, pdu.dest_addresses[5].address.npi
629
+ assert_equal "789", pdu.dest_addresses[5].address.address
630
+
631
+
632
+ assert_equal 1, pdu.dest_addresses[6].dest_flag
633
+ assert_equal 1, pdu.dest_addresses[6].address.ton
634
+ assert_equal 2, pdu.dest_addresses[6].address.npi
635
+ assert_equal "1123", pdu.dest_addresses[6].address.address
636
+
637
+
638
+ assert_equal 1, pdu.dest_addresses[7].dest_flag
639
+ assert_equal 3, pdu.dest_addresses[7].address.ton
640
+ assert_equal 4, pdu.dest_addresses[7].address.npi
641
+ assert_equal "1456", pdu.dest_addresses[7].address.address
642
+
643
+ assert_equal 1, pdu.dest_addresses[8].dest_flag
644
+ assert_equal 5, pdu.dest_addresses[8].address.ton
645
+ assert_equal 6, pdu.dest_addresses[8].address.npi
646
+ assert_equal "1789", pdu.dest_addresses[8].address.address
647
+
648
+ assert_equal 1, pdu.esm_class
649
+ assert_equal 1, pdu.protocol_id
650
+ assert_equal 1, pdu.priority_flag
651
+ assert_equal "fake", pdu.schedule_delivery_time
652
+ assert_equal "fake", pdu.validity_period
653
+ assert_equal 1, pdu.registered_delivery
654
+ assert_equal 1, pdu.replace_if_present_flag
655
+ assert_equal 1, pdu.data_coding
656
+ assert_equal 1, pdu.sm_default_msg_id
657
+ assert_equal 7, pdu.sm_length
658
+ assert_equal "message", pdu.short_message
659
+
660
+ # Check optional fields value
661
+ assert_equal 1, pdu.user_message_reference
662
+ assert_equal 1, pdu.source_port
663
+ assert_equal 1, pdu.source_addr_subunit
664
+ assert_equal 1, pdu.destination_port
665
+ assert_equal 1, pdu.dest_addr_subunit
666
+ assert_equal 1, pdu.sar_msg_ref_num
667
+ assert_equal 1, pdu.sar_total_segments
668
+ assert_equal 1, pdu.sar_segment_seqnum
669
+ assert_equal 1, pdu.payload_type
670
+ assert_equal "01 02 03", Majoron::AntHill::ByteBuffer.encode_hex(pdu.message_payload).strip.upcase
671
+ assert_equal 1, pdu.privacy_indicator
672
+ assert_equal "01 02 03", Majoron::AntHill::ByteBuffer.encode_hex(pdu.callback_num).strip.upcase
673
+ assert_equal 1, pdu.callback_num_pres_ind
674
+ assert_equal "01 02 03", Majoron::AntHill::ByteBuffer.encode_hex(pdu.callback_num_atag).strip.upcase
675
+ assert_equal "01 02 03", Majoron::AntHill::ByteBuffer.encode_hex(pdu.source_subaddress).strip.upcase
676
+ assert_equal "01 02 03", Majoron::AntHill::ByteBuffer.encode_hex(pdu.dest_subaddress).strip.upcase
677
+ assert_equal 1, pdu.display_time
678
+ assert_equal 1, pdu.sms_signal
679
+ assert_equal 1, pdu.ms_validity
680
+ assert_equal 1, pdu.ms_msg_wait_facilities
681
+ assert_equal 1, pdu.alert_on_msg_delivery
682
+ assert_equal 1, pdu.language_indicator
683
+
684
+ # Check optional fields len value
685
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.user_message_reference_len
686
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.source_port_len
687
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.source_addr_subunit_len
688
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.destination_port_len
689
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.dest_addr_subunit_len
690
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.sar_msg_ref_num_len
691
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.sar_total_segments_len
692
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.sar_segment_seqnum_len
693
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.payload_type_len
694
+ assert_equal 3, pdu.message_payload_len
695
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.privacy_indicator_len
696
+ assert_equal 3, pdu.callback_num_len
697
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.callback_num_pres_ind_len
698
+ assert_equal 3, pdu.callback_num_atag_len
699
+ assert_equal 3, pdu.source_subaddress_len
700
+ assert_equal 3, pdu.dest_subaddress_len
701
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.display_time_len
702
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.sms_signal_len
703
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.ms_validity_len
704
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.ms_msg_wait_facilities_len
705
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.alert_on_msg_delivery_len
706
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.language_indicator_len
707
+ end
708
+
709
+
710
+
711
+ def test_decode_smpp_submit_multi_resp
712
+ dump = String.new()
713
+ # read and decode package based on hex dump
714
+ dump << "00 00 00 33 80 00 00 21 00 00 00 00 00 00 00 0C 31 32 33 00 03 "
715
+ dump << "01 02 31 32 33 00 00 00 00 01 03 04 33 32 31 00 00 00 00 03 05 "
716
+ dump << "06 32 31 33 00 00 00 00 03"
717
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
718
+
719
+ # declare variables
720
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
721
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
722
+
723
+ # decode package
724
+ decoder.append_buffer(buffer)
725
+ pdu = decoder.get_packet()
726
+ assert_not_nil pdu, "PDU is null"
727
+ pdu.decode_packet(decoder)
728
+ pdu.validate_packet(validator)
729
+ decoder.validate_offset(pdu.command_length())
730
+
731
+ # check instanse type and fields value
732
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPSubmitMultiResp, pdu, "PDU class is invalid" )
733
+ assert_equal 51, pdu.command_length
734
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_SUBMIT_MULTI_RESP, pdu.command_id
735
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
736
+ assert_equal 12, pdu.sequence_number
737
+ assert_equal "123", pdu.message_id
738
+
739
+ assert_equal 3, pdu.no_unsuccess
740
+ assert_equal 3, pdu.unsuccess_smes.size()
741
+
742
+ assert_equal 1, pdu.unsuccess_smes[0].sme_address.ton
743
+ assert_equal 2, pdu.unsuccess_smes[0].sme_address.npi
744
+ assert_equal "123", pdu.unsuccess_smes[0].sme_address.address
745
+ assert_equal 1, pdu.unsuccess_smes[0].error_status_code
746
+
747
+ assert_equal 3, pdu.unsuccess_smes[1].sme_address.ton
748
+ assert_equal 4, pdu.unsuccess_smes[1].sme_address.npi
749
+ assert_equal "321", pdu.unsuccess_smes[1].sme_address.address
750
+ assert_equal 3, pdu.unsuccess_smes[1].error_status_code
751
+
752
+
753
+ assert_equal 5, pdu.unsuccess_smes[2].sme_address.ton
754
+ assert_equal 6, pdu.unsuccess_smes[2].sme_address.npi
755
+ assert_equal "213", pdu.unsuccess_smes[2].sme_address.address
756
+ assert_equal 3, pdu.unsuccess_smes[2].error_status_code
757
+ end
758
+
759
+
760
+ def test_decode_smpp_deliver_sm
761
+ dump = String.new()
762
+ # read and decode package based on hex dump
763
+ dump << "00 00 00 96 00 00 00 05 00 00 00 00 00 00 00 0C 53 4D 53 00 01 "
764
+ dump << "02 31 32 33 00 04 05 33 32 31 00 06 07 08 00 00 09 0A 0B 0C 00 "
765
+ dump << "02 04 00 02 00 01 02 0A 00 02 00 02 02 0B 00 02 00 03 02 0C 00 "
766
+ dump << "02 00 04 02 0E 00 01 05 02 0F 00 01 06 02 05 00 01 07 02 01 00 "
767
+ dump << "01 08 00 19 00 01 09 04 24 00 03 01 FF AA 03 81 00 03 01 FF AA "
768
+ dump << "02 02 00 03 01 FF AA 02 03 00 03 01 FF AA 02 0D 00 01 0A 13 83 "
769
+ dump << "00 02 00 0A 04 23 00 03 03 00 0C 04 27 00 01 03 00 1E 00 04 31 "
770
+ dump << "32 33 00 "
771
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
772
+
773
+ # declare variables
774
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
775
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
776
+
777
+ # decode package
778
+ decoder.append_buffer(buffer)
779
+ pdu = decoder.get_packet()
780
+ assert_not_nil pdu, "PDU is null"
781
+ pdu.decode_packet(decoder)
782
+ pdu.validate_packet(validator)
783
+ decoder.validate_offset(pdu.command_length())
784
+
785
+ # Check instanse type and fields value
786
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPDeliverSM, pdu, "PDU class is invalid" )
787
+ assert_equal 150, pdu.command_length
788
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_DELIVER_SM, pdu.command_id
789
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
790
+ assert_equal 12, pdu.sequence_number
791
+ assert_equal "SMS", pdu.service_type
792
+ assert_equal 1, pdu.source_addr_ton
793
+ assert_equal 2, pdu.source_addr_npi
794
+ assert_equal "123", pdu.source_addr
795
+ assert_equal 4, pdu.dest_addr_ton
796
+ assert_equal 5, pdu.dest_addr_npi
797
+ assert_equal "321", pdu.dest_addr
798
+ assert_equal 6, pdu.esm_class
799
+ assert_equal 7, pdu.protocol_id
800
+ assert_equal 8, pdu.priority_flag
801
+ assert_equal "", pdu.schedule_delivery_time
802
+ assert_equal "", pdu.validity_period
803
+ assert_equal 9, pdu.registered_delivery
804
+ assert_equal 10, pdu.replace_if_present_flag
805
+ assert_equal 11, pdu.data_coding
806
+ assert_equal 12, pdu.sm_default_msg_id
807
+ assert_equal 0, pdu.sm_length
808
+ assert_equal "", pdu.short_message
809
+
810
+ # Check optional fields
811
+ assert_equal 1, pdu.user_message_reference
812
+ assert_equal 2, pdu.source_port
813
+ assert_equal 3, pdu.destination_port
814
+ assert_equal 4, pdu.sar_msg_ref_num
815
+ assert_equal 5, pdu.sar_total_segments
816
+ assert_equal 6, pdu.sar_segment_seqnum
817
+ assert_equal 7, pdu.user_response_code
818
+ assert_equal 8, pdu.privacy_indicator
819
+ assert_equal 9, pdu.payload_type
820
+ assert_equal "01 FF AA", Majoron::AntHill::ByteBuffer.encode_hex(pdu.message_payload).strip.upcase
821
+ assert_equal "01 FF AA", Majoron::AntHill::ByteBuffer.encode_hex(pdu.callback_num).strip.upcase
822
+ assert_equal "01 FF AA", Majoron::AntHill::ByteBuffer.encode_hex(pdu.source_subaddress).strip.upcase
823
+ assert_equal "01 FF AA", Majoron::AntHill::ByteBuffer.encode_hex(pdu.dest_subaddress).strip.upcase
824
+ assert_equal 10, pdu.language_indicator
825
+ assert_equal 10, pdu.its_session_info
826
+ assert_equal Majoron::AntHill::SMPP::NetworkTypeErrorCode::GSM, pdu.network_error_code.network_code
827
+ assert_equal 12, pdu.network_error_code.error_code
828
+ assert_equal 3, pdu.message_state
829
+ assert_equal "123", pdu.receipted_message_id
830
+
831
+ # Check optional fields len
832
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.user_message_reference_len
833
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.source_port_len
834
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.destination_port_len
835
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.sar_msg_ref_num_len
836
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.sar_total_segments_len
837
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.sar_segment_seqnum_len
838
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.user_response_code_len
839
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.privacy_indicator_len
840
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.payload_type_len
841
+ assert_equal 3, pdu.message_payload_len
842
+ assert_equal 3, pdu.callback_num_len
843
+ assert_equal 3, pdu.source_subaddress_len
844
+ assert_equal 3, pdu.dest_subaddress_len
845
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.language_indicator_len
846
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.its_session_info_len
847
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN + Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.network_error_code_len
848
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.message_state_len
849
+ assert_equal 4, pdu.receipted_message_id_len
850
+ end
851
+
852
+
853
+ def test_decode_smpp_deliver_sm_1
854
+ dump = String.new()
855
+ # read and decode package based on hex dump
856
+ dump << "00 00 00 5A 00 00 00 05 00 00 00 00 00 00 00 0F 53 72 76 74 00 "
857
+ dump << "00 01 33 33 31 31 00 01 01 37 39 32 31 31 32 33 34 35 36 37 00 "
858
+ dump << "04 00 00 00 00 00 00 00 00 19 68 65 72 65 20 69 73 20 74 68 65 "
859
+ dump << "20 73 68 6F 72 74 20 6D 65 73 73 61 67 65 04 27 00 01 02 00 1E "
860
+ dump << "00 04 31 32 33 00 "
861
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
862
+
863
+ # declare variables
864
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
865
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
866
+
867
+ # decode package
868
+ decoder.append_buffer(buffer)
869
+ pdu = decoder.get_packet()
870
+ assert_not_nil pdu, "PDU is null"
871
+ pdu.decode_packet(decoder)
872
+ pdu.validate_packet(validator)
873
+ decoder.validate_offset(pdu.command_length())
874
+
875
+ # check instanse type and fields value
876
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPDeliverSM, pdu, "PDU class is invalid" )
877
+ assert_equal 90, pdu.command_length
878
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_DELIVER_SM, pdu.command_id
879
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
880
+ assert_equal 15, pdu.sequence_number
881
+ assert_equal "Srvt", pdu.service_type
882
+ assert_equal Majoron::AntHill::SMPP::TON::UNKNOWN, pdu.source_addr_ton
883
+ assert_equal Majoron::AntHill::SMPP::NPI::ISDN, pdu.source_addr_npi
884
+ assert_equal "3311", pdu.source_addr
885
+ assert_equal Majoron::AntHill::SMPP::TON::INTERNATIONAL, pdu.dest_addr_ton
886
+ assert_equal Majoron::AntHill::SMPP::NPI::ISDN, pdu.dest_addr_npi
887
+ assert_equal "79211234567", pdu.dest_addr
888
+ assert_equal 0x04, pdu.esm_class
889
+ assert_equal "here is the short message", pdu.short_message
890
+ assert_equal Majoron::AntHill::SMPP::MessageState::DELIVERED, pdu.message_state
891
+ assert_equal "123", pdu.receipted_message_id
892
+ end
893
+
894
+ def test_decode_smpp_deliver_sm_resp
895
+ dump = String.new()
896
+ # read and decode package based on hex dump
897
+ dump << "00 00 00 24 80 00 00 05 00 00 00 00 00 00 00 0C 00 00 1D 00 03 "
898
+ dump << "01 FF AA 04 25 00 01 01 04 23 00 03 01 00 02"
899
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
900
+
901
+ # declare variables
902
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
903
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
904
+
905
+ # decode package
906
+ decoder.append_buffer(buffer)
907
+ pdu = decoder.get_packet()
908
+ assert_not_nil pdu, "PDU is null"
909
+ pdu.decode_packet(decoder)
910
+ pdu.validate_packet(validator)
911
+ decoder.validate_offset(pdu.command_length())
912
+
913
+ # check instanse type and fields value
914
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPDeliverSMResp, pdu, "PDU class is invalid" )
915
+ assert_equal 36, pdu.command_length
916
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_DELIVER_SM_RESP, pdu.command_id
917
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
918
+ assert_equal 12, pdu.sequence_number
919
+ assert_equal "", pdu.message_id
920
+
921
+ # Check optional fields
922
+ assert_equal "01 FF AA", Majoron::AntHill::ByteBuffer.encode_hex(pdu.additional_status_info_text).strip.upcase
923
+ assert_equal 1, pdu.delivery_failure_reason
924
+ assert_equal Majoron::AntHill::SMPP::NetworkTypeErrorCode::ANSI_136_ACCESS_DENIED_REASON, pdu.network_error_code.network_code
925
+ assert_equal 2, pdu.network_error_code.error_code
926
+
927
+ # Check optional fields len
928
+ assert_equal 3, pdu.additional_status_info_text_len
929
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.delivery_failure_reason
930
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN + Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.network_error_code_len
931
+ end
932
+
933
+ def test_decode_smpp_data_sm
934
+ dump = String.new()
935
+ # read and decode package based on hex dump
936
+ dump << "00 00 01 00 00 00 01 03 00 00 00 00 00 00 00 0C 73 72 76 74 70 "
937
+ dump << "00 01 02 31 32 33 00 03 04 33 32 31 00 00 01 08 02 0A 00 02 00 "
938
+ dump << "01 00 0D 00 01 02 00 0E 00 01 03 00 0F 00 01 04 00 10 00 01 05 "
939
+ dump << "02 0B 00 02 00 06 00 05 00 01 07 00 06 00 01 08 00 07 00 01 09 "
940
+ dump << "00 08 00 01 0A 02 0C 00 02 00 0B 02 0E 00 01 0C 02 0F 00 01 0D "
941
+ dump << "04 26 00 01 01 00 17 00 04 00 00 00 0E 00 19 00 01 0F 04 24 00 "
942
+ dump << "05 01 02 03 AF FF 04 21 00 01 10 00 1E 00 06 31 32 33 32 31 00 "
943
+ dump << "04 27 00 01 01 04 23 00 03 01 00 01 02 04 00 02 00 7B 02 01 00 "
944
+ dump << "01 01 03 81 00 02 FF AA 03 02 00 01 01 03 03 00 02 AA FF 02 02 "
945
+ dump << "00 02 AA FF 02 03 00 02 AA FF 02 05 00 01 01 12 01 00 01 02 12 "
946
+ dump << "03 00 02 00 03 12 04 00 01 04 00 30 00 01 05 03 04 00 01 06 03 "
947
+ dump << "04 00 01 06 13 0C 00 01 07 02 0D 00 01 08 13 80 00 01 09 13 83 "
948
+ dump << "00 02 00 0A "
949
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
950
+
951
+ # declare variables
952
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
953
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
954
+
955
+ # decode package
956
+ decoder.append_buffer(buffer)
957
+ pdu = decoder.get_packet()
958
+ assert_not_nil pdu, "PDU is null"
959
+ pdu.decode_packet(decoder)
960
+ pdu.validate_packet(validator)
961
+ decoder.validate_offset(pdu.command_length())
962
+
963
+ # check instanse type and fields value
964
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPDataSM, pdu, "PDU class is invalid" )
965
+ assert_equal 256, pdu.command_length
966
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_DATA_SM, pdu.command_id
967
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
968
+ assert_equal 12, pdu.sequence_number
969
+ assert_equal "srvtp", pdu.service_type
970
+ assert_equal 1, pdu.source_addr_ton
971
+ assert_equal 2, pdu.source_addr_npi
972
+ assert_equal "123", pdu.source_addr
973
+ assert_equal 3, pdu.dest_addr_ton
974
+ assert_equal 4, pdu.dest_addr_npi
975
+ assert_equal "321", pdu.dest_addr
976
+ assert_equal 0, pdu.esm_class
977
+ assert_equal 1, pdu.registered_delivery
978
+ assert_equal 8, pdu.data_coding
979
+
980
+ # Check optional fields
981
+ assert_equal 1, pdu.source_port
982
+ assert_equal 2, pdu.source_addr_subunit
983
+ assert_equal 3, pdu.source_network_type
984
+ assert_equal 4, pdu.source_bearer_type
985
+ assert_equal 5, pdu.source_telematics_id
986
+ assert_equal 6, pdu.destination_port
987
+ assert_equal 7, pdu.dest_addr_subunit
988
+ assert_equal 8, pdu.dest_network_type
989
+ assert_equal 9, pdu.dest_bearer_type
990
+ assert_equal 10, pdu.dest_telematics_id
991
+ assert_equal 11, pdu.sar_msg_ref_num
992
+ assert_equal 12, pdu.sar_total_segments
993
+ assert_equal 13, pdu.sar_segment_seqnum
994
+ assert_equal 1, pdu.more_messages_to_send
995
+ assert_equal 14, pdu.qos_time_to_live
996
+ assert_equal 15, pdu.payload_type
997
+ assert_equal "01 02 03 AF FF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.message_payload).strip.upcase
998
+ assert_equal 16, pdu.set_dpf
999
+ assert_equal "12321", pdu.receipted_message_id
1000
+ assert_equal 1, pdu.message_state
1001
+ assert_equal Majoron::AntHill::SMPP::NetworkTypeErrorCode::ANSI_136_ACCESS_DENIED_REASON, pdu.network_error_code.network_code
1002
+ assert_equal 1, pdu.network_error_code.error_code
1003
+ assert_equal 123, pdu.user_message_reference
1004
+ assert_equal 1, pdu.privacy_indicator
1005
+ assert_equal "FF AA", Majoron::AntHill::ByteBuffer.encode_hex(pdu.callback_num).strip.upcase
1006
+ assert_equal 1, pdu.callback_num_pres_ind
1007
+ assert_equal "AA FF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.callback_num_atag).strip.upcase
1008
+ assert_equal "AA FF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.source_subaddress).strip.upcase
1009
+ assert_equal "AA FF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.dest_subaddress).strip.upcase
1010
+ assert_equal 1, pdu.user_response_code
1011
+ assert_equal 2, pdu.display_time
1012
+ assert_equal 3, pdu.sms_signal
1013
+ assert_equal 4, pdu.ms_validity
1014
+ assert_equal 5, pdu.ms_msg_wait_facilities
1015
+ assert_equal 6, pdu.number_of_messages
1016
+ assert_equal 7, pdu.alert_on_msg_delivery
1017
+ assert_equal 8, pdu.language_indicator
1018
+ assert_equal 9, pdu.its_reply_type
1019
+ assert_equal 10, pdu.its_session_info
1020
+
1021
+ # Check optional fields len
1022
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.source_port_len
1023
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.source_addr_subunit_len
1024
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.source_network_type_len
1025
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.source_bearer_type_len
1026
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.source_telematics_id_len
1027
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.destination_port_len
1028
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.dest_addr_subunit_len
1029
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.dest_network_type_len
1030
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.dest_bearer_type_len
1031
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.dest_telematics_id_len
1032
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.sar_msg_ref_num_len
1033
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.sar_total_segments_len
1034
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.sar_segment_seqnum_len
1035
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.more_messages_to_send_len
1036
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::DWORD_LEN, pdu.qos_time_to_live_len
1037
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.payload_type_len
1038
+ assert_equal 5, pdu.message_payload_len
1039
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.set_dpf_len
1040
+ assert_equal 6, pdu.receipted_message_id_len
1041
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.message_state_len
1042
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN + Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.network_error_code_len
1043
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.user_message_reference_len
1044
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.privacy_indicator_len
1045
+ assert_equal 2, pdu.callback_num_len
1046
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.callback_num_pres_ind_len
1047
+ assert_equal 2, pdu.callback_num_atag_len
1048
+ assert_equal 2, pdu.source_subaddress_len
1049
+ assert_equal 2, pdu.dest_subaddress_len
1050
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.user_response_code_len
1051
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.display_time_len
1052
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.sms_signal_len
1053
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.ms_validity_len
1054
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.ms_msg_wait_facilities_len
1055
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.number_of_messages_len
1056
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.alert_on_msg_delivery_len
1057
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.language_indicator_len
1058
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.its_reply_type_len
1059
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.its_session_info_len
1060
+ end
1061
+
1062
+ def test_decode_smpp_data_sm_resp
1063
+ dump = String.new()
1064
+ # read and decode package based on hex dump
1065
+ dump << "00 00 00 29 80 00 01 03 00 00 00 00 00 00 00 0C 00 04 25 00 "
1066
+ dump << "01 01 04 23 00 03 03 00 01 00 1D 00 03 01 FF AA 04 20 00 01 "
1067
+ dump << "17"
1068
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1069
+
1070
+ # declare variables
1071
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1072
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1073
+
1074
+ # decode package
1075
+ decoder.append_buffer(buffer)
1076
+ pdu = decoder.get_packet()
1077
+ assert_not_nil pdu, "PDU is null"
1078
+ pdu.decode_packet(decoder)
1079
+ pdu.validate_packet(validator)
1080
+ decoder.validate_offset(pdu.command_length())
1081
+
1082
+ # check instanse type and fields value
1083
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPDataSMResp, pdu, "PDU class is invalid" )
1084
+ assert_equal 41, pdu.command_length
1085
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_DATA_SM_RESP, pdu.command_id
1086
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1087
+ assert_equal 12, pdu.sequence_number
1088
+ assert_equal "", pdu.message_id
1089
+ assert_equal 1, pdu.delivery_failure_reason
1090
+ assert_equal Majoron::AntHill::SMPP::NetworkTypeErrorCode::GSM, pdu.network_error_code.network_code
1091
+ assert_equal 1, pdu.network_error_code.error_code
1092
+ assert_equal "01 FF AA", Majoron::AntHill::ByteBuffer.encode_hex(pdu.additional_status_info_text).strip.upcase
1093
+ assert_equal 23, pdu.dpf_result
1094
+ end
1095
+
1096
+
1097
+ def test_decode_smpp_data_sm_resp_1
1098
+ dump = String.new()
1099
+ # read and decode package based on hex dump
1100
+ dump << "00 00 00 3F 80 00 01 03 00 00 00 00 00 00 00 0E 00 04 23 00 "
1101
+ dump << "03 03 00 00 00 1D 00 23 68 65 72 65 20 69 73 20 61 64 64 69 "
1102
+ dump << "74 69 6F 6E 61 6C 20 73 74 61 74 75 73 20 69 6E 66 6F 20 74 "
1103
+ dump << "65 78 74 "
1104
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1105
+
1106
+ # declare variables
1107
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1108
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1109
+
1110
+ # decode package
1111
+ decoder.append_buffer(buffer)
1112
+ pdu = decoder.get_packet()
1113
+ assert_not_nil pdu, "PDU is null"
1114
+ pdu.decode_packet(decoder)
1115
+ pdu.validate_packet(validator)
1116
+ decoder.validate_offset(pdu.command_length())
1117
+
1118
+ # check instanse type and fields value
1119
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPDataSMResp, pdu, "PDU class is invalid" )
1120
+ assert_equal 63, pdu.command_length
1121
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_DATA_SM_RESP, pdu.command_id
1122
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1123
+ assert_equal 14, pdu.sequence_number
1124
+ assert_equal "here is additional status info text", pdu.additional_status_info_text
1125
+ assert_equal Majoron::AntHill::SMPP::NetworkTypeErrorCode::GSM, pdu.network_error_code.network_code
1126
+ assert_equal 0, pdu.network_error_code.error_code
1127
+ end
1128
+
1129
+
1130
+ def test_decode_smpp_cancel_sm
1131
+ dump = String.new()
1132
+ # read and decode package based on hex dump
1133
+ dump << "00 00 00 26 00 00 00 08 00 00 00 00 00 00 00 0C 73 72 76 74 70 00 "
1134
+ dump << "31 32 33 00 01 02 31 32 33 00 04 05 33 32 31 00"
1135
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1136
+
1137
+ # declare variables
1138
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1139
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1140
+
1141
+ # decode package
1142
+ decoder.append_buffer(buffer)
1143
+ pdu = decoder.get_packet()
1144
+ assert_not_nil pdu, "PDU is null"
1145
+ pdu.decode_packet(decoder)
1146
+ pdu.validate_packet(validator)
1147
+ decoder.validate_offset(pdu.command_length())
1148
+
1149
+ # check instanse type and fields value
1150
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPCancelSM, pdu, "PDU class is invalid" )
1151
+ assert_equal 38, pdu.command_length
1152
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_CANCEL_SM, pdu.command_id
1153
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1154
+ assert_equal 12, pdu.sequence_number
1155
+ assert_equal "srvtp", pdu.service_type
1156
+ assert_equal "123", pdu.message_id
1157
+ assert_equal 1, pdu.source_addr_ton
1158
+ assert_equal 2, pdu.source_addr_npi
1159
+ assert_equal "123", pdu.source_addr
1160
+ assert_equal 4, pdu.dest_addr_ton
1161
+ assert_equal 5, pdu.dest_addr_npi
1162
+ assert_equal "321", pdu.dest_addr
1163
+ end
1164
+
1165
+
1166
+ def test_decode_smpp_cancel_sm_resp
1167
+ dump = String.new()
1168
+ # read and decode package based on hex dump
1169
+ dump << "00 00 00 10 80 00 00 08 00 00 00 00 00 00 00 0C"
1170
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1171
+
1172
+ # declare variables
1173
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1174
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1175
+
1176
+ # decode package
1177
+ decoder.append_buffer(buffer)
1178
+ pdu = decoder.get_packet()
1179
+ assert_not_nil pdu, "PDU is null"
1180
+ pdu.decode_packet(decoder)
1181
+ pdu.validate_packet(validator)
1182
+ decoder.validate_offset(pdu.command_length())
1183
+
1184
+ # check instanse type and fields value
1185
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPCancelSMResp, pdu, "PDU class is invalid" )
1186
+ assert_equal 16, pdu.command_length
1187
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_CANCEL_SM_RESP, pdu.command_id
1188
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1189
+ assert_equal 12, pdu.sequence_number
1190
+ end
1191
+
1192
+ def test_decode_smpp_query_sm
1193
+ dump = String.new()
1194
+ # read and decode package based on hex dump
1195
+ dump << "00 00 00 1A 00 00 00 03 00 00 00 00 00 00 00 0C 31 32 33 00 01 02 33 32 31 00"
1196
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1197
+
1198
+ # declare variables
1199
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1200
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1201
+
1202
+ # decode package
1203
+ decoder.append_buffer(buffer)
1204
+ pdu = decoder.get_packet()
1205
+ assert_not_nil pdu, "PDU is null"
1206
+ pdu.decode_packet(decoder)
1207
+ pdu.validate_packet(validator)
1208
+ decoder.validate_offset(pdu.command_length())
1209
+
1210
+ # check instanse type and fields value
1211
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPQuerySM, pdu, "PDU class is invalid" )
1212
+ assert_equal 26, pdu.command_length
1213
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_QUERY_SM, pdu.command_id
1214
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1215
+ assert_equal 12, pdu.sequence_number
1216
+ assert_equal "123", pdu.message_id
1217
+ assert_equal 1, pdu.source_addr_ton
1218
+ assert_equal 2, pdu.source_addr_npi
1219
+ assert_equal "321", pdu.source_addr
1220
+ end
1221
+
1222
+ def test_decode_smpp_query_sm_resp
1223
+ dump = String.new()
1224
+ # read and decode package based on hex dump
1225
+ dump << "00 00 00 17 80 00 00 03 00 00 00 00 00 00 00 0C 31 32 33 00 00 01 02"
1226
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1227
+
1228
+ # declare variables
1229
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1230
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1231
+
1232
+ # decode package
1233
+ decoder.append_buffer(buffer)
1234
+ pdu = decoder.get_packet()
1235
+ assert_not_nil pdu, "PDU is null"
1236
+ pdu.decode_packet(decoder)
1237
+ pdu.validate_packet(validator)
1238
+ decoder.validate_offset(pdu.command_length())
1239
+
1240
+ # check instanse type and fields value
1241
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPQuerySMResp, pdu, "PDU class is invalid" )
1242
+ assert_equal 23, pdu.command_length
1243
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_QUERY_SM_RESP, pdu.command_id
1244
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1245
+ assert_equal 12, pdu.sequence_number
1246
+ assert_equal "123", pdu.message_id
1247
+ assert_equal "", pdu.final_date
1248
+ assert_equal 1, pdu.message_state
1249
+ assert_equal 2, pdu.error_code
1250
+ end
1251
+
1252
+
1253
+
1254
+ def test_decode_smpp_replace_sm
1255
+ dump = String.new()
1256
+ # read and decode package based on hex dump
1257
+ dump << "00 00 00 26 00 00 00 07 00 00 00 00 00 00 00 0C 33 34 35 00 01 02 "
1258
+ dump << "31 32 33 00 00 00 01 07 00 04 24 00 03 01 FF AA"
1259
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1260
+
1261
+ # declare variables
1262
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1263
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1264
+
1265
+ # decode package
1266
+ decoder.append_buffer(buffer)
1267
+ pdu = decoder.get_packet()
1268
+ assert_not_nil pdu, "PDU is null"
1269
+ pdu.decode_packet(decoder)
1270
+ pdu.validate_packet(validator)
1271
+ decoder.validate_offset(pdu.command_length())
1272
+
1273
+ # check instanse type and fields value
1274
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPReplaceSM, pdu, "PDU class is invalid" )
1275
+ assert_equal 38, pdu.command_length
1276
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_REPLACE_SM, pdu.command_id
1277
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1278
+ assert_equal 12, pdu.sequence_number
1279
+ assert_equal "345", pdu.message_id
1280
+ assert_equal 1, pdu.source_addr_ton
1281
+ assert_equal 2, pdu.source_addr_npi
1282
+ assert_equal "123", pdu.source_addr
1283
+ assert_equal "", pdu.schedule_delivery_time
1284
+ assert_equal "", pdu.validity_period
1285
+ assert_equal 1, pdu.registered_delivery
1286
+ assert_equal 7, pdu.sm_default_msg_id
1287
+ assert_equal 0, pdu.sm_length
1288
+ assert_equal "", pdu.short_message
1289
+
1290
+ # Check optional fields value
1291
+ assert_equal "01 FF AA", Majoron::AntHill::ByteBuffer.encode_hex(pdu.message_payload).strip.upcase
1292
+
1293
+ # Check optional fields len value
1294
+ assert_equal 3, pdu.message_payload_len
1295
+ end
1296
+
1297
+
1298
+ def test_decode_smpp_replace_sm_resp
1299
+ dump = String.new()
1300
+ # read and decode package based on hex dump
1301
+ dump << "00 00 00 10 80 00 00 07 00 00 00 00 00 00 00 0C"
1302
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1303
+
1304
+ # declare variables
1305
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1306
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1307
+
1308
+ # decode package
1309
+ decoder.append_buffer(buffer)
1310
+ pdu = decoder.get_packet()
1311
+ assert_not_nil pdu, "PDU is null"
1312
+ pdu.decode_packet(decoder)
1313
+ pdu.validate_packet(validator)
1314
+ decoder.validate_offset(pdu.command_length())
1315
+
1316
+ # check instanse type and fields value
1317
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPReplaceSMResp, pdu, "PDU class is invalid" )
1318
+ assert_equal 16, pdu.command_length
1319
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_REPLACE_SM_RESP, pdu.command_id
1320
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1321
+ assert_equal 12, pdu.sequence_number
1322
+ end
1323
+
1324
+ def test_decode_smpp_generic_nack
1325
+ dump = String.new()
1326
+ # read and decode package based on hex dump
1327
+ dump << "00 00 00 10 80 00 00 00 00 00 00 00 00 00 00 0E "
1328
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1329
+
1330
+ # declare variables
1331
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1332
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1333
+
1334
+ # decode package
1335
+ decoder.append_buffer(buffer)
1336
+ pdu = decoder.get_packet()
1337
+ assert_not_nil pdu, "PDU is null"
1338
+ pdu.decode_packet(decoder)
1339
+ pdu.validate_packet(validator)
1340
+ decoder.validate_offset(pdu.command_length())
1341
+
1342
+ # check instanse type and fields value
1343
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPGenericNack, pdu, "PDU class is invalid" )
1344
+ assert_equal 16, pdu.command_length
1345
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_GENERIC_NACK, pdu.command_id
1346
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1347
+ assert_equal 14, pdu.sequence_number
1348
+ end
1349
+
1350
+
1351
+ def test_decode_smpp_enquire_link
1352
+ dump = String.new()
1353
+ # read and decode package based on hex dump
1354
+ dump << "00 00 00 10 00 00 00 15 00 00 00 00 00 00 04 00 "
1355
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1356
+
1357
+ # declare variables
1358
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1359
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1360
+
1361
+ # decode package
1362
+ decoder.append_buffer(buffer)
1363
+ pdu = decoder.get_packet()
1364
+ assert_not_nil pdu, "PDU is null"
1365
+ pdu.decode_packet(decoder)
1366
+ pdu.validate_packet(validator)
1367
+ decoder.validate_offset(pdu.command_length())
1368
+
1369
+ # check instanse type and fields value
1370
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPEnquireLink, pdu, "PDU class is invalid" )
1371
+ assert_equal 16, pdu.command_length
1372
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_ENQUIRE_LINK, pdu.command_id
1373
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1374
+ assert_equal 1024, pdu.sequence_number
1375
+ end
1376
+
1377
+ def test_decode_smpp_enquire_link_resp
1378
+ dump = String.new()
1379
+ # read and decode package based on hex dump
1380
+ dump << "00 00 00 10 80 00 00 15 00 00 00 00 00 00 08 00 "
1381
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1382
+
1383
+ # declare variables
1384
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1385
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1386
+
1387
+ # decode package
1388
+ decoder.append_buffer(buffer)
1389
+ pdu = decoder.get_packet()
1390
+ assert_not_nil pdu, "PDU is null"
1391
+ pdu.decode_packet(decoder)
1392
+ pdu.validate_packet(validator)
1393
+ decoder.validate_offset(pdu.command_length())
1394
+
1395
+ # check instanse type and fields value
1396
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPEnquireLinkResp, pdu, "PDU class is invalid" )
1397
+ assert_equal 16, pdu.command_length
1398
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_ENQUIRE_LINK_RESP, pdu.command_id
1399
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1400
+ assert_equal 2048, pdu.sequence_number
1401
+ end
1402
+
1403
+
1404
+ def test_decode_smpp_outbind
1405
+ dump = String.new()
1406
+ # read and decode package based on hex dump
1407
+ dump << "00 00 00 1E 00 00 00 0B 00 00 00 00 00 00 10 00 69 61 6D 72 6F 6F "
1408
+ dump << "74 00 6D 79 70 77 64 00 "
1409
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1410
+
1411
+ # declare variables
1412
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1413
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1414
+
1415
+ # decode package
1416
+ decoder.append_buffer(buffer)
1417
+ pdu = decoder.get_packet()
1418
+ assert_not_nil pdu, "PDU is null"
1419
+ pdu.decode_packet(decoder)
1420
+ pdu.validate_packet(validator)
1421
+ decoder.validate_offset(pdu.command_length())
1422
+
1423
+ # check instanse type and fields value
1424
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPOutbind, pdu, "PDU class is invalid" )
1425
+ assert_equal 30, pdu.command_length
1426
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_OUTBIND, pdu.command_id
1427
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1428
+ assert_equal 2048*2, pdu.sequence_number
1429
+ assert_equal "iamroot", pdu.system_id
1430
+ assert_equal "mypwd", pdu.password
1431
+ end
1432
+
1433
+
1434
+ def test_decode_smpp_unbind
1435
+ dump = String.new()
1436
+ # read and decode package based on hex dump
1437
+ dump << "00 00 00 10 00 00 00 06 00 00 00 00 00 00 08 00 "
1438
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1439
+
1440
+ # declare variables
1441
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1442
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1443
+
1444
+ # decode package
1445
+ decoder.append_buffer(buffer)
1446
+ pdu = decoder.get_packet()
1447
+ assert_not_nil pdu, "PDU is null"
1448
+ pdu.decode_packet(decoder)
1449
+ pdu.validate_packet(validator)
1450
+ decoder.validate_offset(pdu.command_length())
1451
+
1452
+ # check instanse type and fields value
1453
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPUnbind, pdu, "PDU class is invalid" )
1454
+ assert_equal 16, pdu.command_length
1455
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_UNBIND, pdu.command_id
1456
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1457
+ assert_equal 2048, pdu.sequence_number
1458
+ end
1459
+
1460
+ def test_decode_smpp_unbind_resp
1461
+ dump = String.new()
1462
+ # read and decode package based on hex dump
1463
+ dump << "00 00 00 10 80 00 00 06 00 00 00 00 00 00 00 0C"
1464
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1465
+
1466
+ # declare variables
1467
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1468
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1469
+
1470
+ # decode package
1471
+ decoder.append_buffer(buffer)
1472
+ pdu = decoder.get_packet()
1473
+ assert_not_nil pdu, "PDU is null"
1474
+ pdu.decode_packet(decoder)
1475
+ pdu.validate_packet(validator)
1476
+ decoder.validate_offset(pdu.command_length())
1477
+
1478
+ # check instanse type and fields value
1479
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPUnbindResp, pdu, "PDU class is invalid" )
1480
+ assert_equal 16, pdu.command_length
1481
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_UNBIND_RESP, pdu.command_id
1482
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1483
+ assert_equal 12, pdu.sequence_number
1484
+ end
1485
+
1486
+
1487
+
1488
+
1489
+ def test_decode_smpp_query_broadcast_sm
1490
+ dump = String.new()
1491
+ # read and decode package based on hex dump
1492
+ dump << "00 00 00 20 00 00 01 12 00 00 00 00 00 00 00 0C 31 32 33 00 01 02 33 "
1493
+ dump << "34 35 00 02 04 00 02 00 02"
1494
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1495
+
1496
+ # declare variables
1497
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1498
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1499
+
1500
+ # decode package
1501
+ decoder.append_buffer(buffer)
1502
+ pdu = decoder.get_packet()
1503
+ assert_not_nil pdu, "PDU is null"
1504
+ pdu.decode_packet(decoder)
1505
+ pdu.validate_packet(validator)
1506
+ decoder.validate_offset(pdu.command_length())
1507
+
1508
+ # check instanse type and fields value
1509
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPQueryBroadcastSM, pdu, "PDU class is invalid" )
1510
+ assert_equal 32, pdu.command_length
1511
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_QUERY_BROADCAST_SM, pdu.command_id
1512
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1513
+ assert_equal 12, pdu.sequence_number
1514
+ assert_equal "123", pdu.message_id
1515
+ assert_equal 1, pdu.source_addr_ton
1516
+ assert_equal 2, pdu.source_addr_npi
1517
+ assert_equal "345", pdu.source_addr
1518
+
1519
+ assert_equal 2, pdu.user_message_reference
1520
+
1521
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.user_message_reference_len
1522
+
1523
+ end
1524
+
1525
+
1526
+
1527
+
1528
+ def test_decode_smpp_query_broadcast_sm_resp
1529
+ dump = String.new()
1530
+ # read and decode package based on hex dump
1531
+ dump << "00 00 00 36 80 00 01 12 00 00 00 00 00 00 00 0C 31 32 33 00 04 27 00 "
1532
+ dump << "01 02 06 06 00 02 01 FF 06 06 00 02 01 AF 06 06 00 02 01 DF 06 08 00 "
1533
+ dump << "01 66 02 04 00 02 00 7B"
1534
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1535
+
1536
+ # declare variables
1537
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1538
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1539
+
1540
+ # decode package
1541
+ decoder.append_buffer(buffer)
1542
+ pdu = decoder.get_packet()
1543
+ assert_not_nil pdu, "PDU is null"
1544
+ pdu.decode_packet(decoder)
1545
+ pdu.validate_packet(validator)
1546
+ decoder.validate_offset(pdu.command_length())
1547
+
1548
+ # check instanse type and fields value
1549
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPQueryBroadcastSMResp, pdu, "PDU class is invalid" )
1550
+ assert_equal 54, pdu.command_length
1551
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_QUERY_BROADCAST_SM_RESP, pdu.command_id
1552
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1553
+ assert_equal 12, pdu.sequence_number
1554
+ assert_equal "123", pdu.message_id
1555
+ assert_equal Majoron::AntHill::SMPP::MessageState::DELIVERED, pdu.message_state
1556
+ assert_equal 3, pdu.broadcast_area_identifier.size
1557
+ assert_equal "01 FF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.broadcast_area_identifier[0].value )
1558
+ assert_equal "01 AF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.broadcast_area_identifier[1].value )
1559
+ assert_equal "01 DF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.broadcast_area_identifier[2].value )
1560
+ assert_equal 102, pdu.broadcast_area_success
1561
+ assert_equal 123, pdu.user_message_reference
1562
+ assert_equal nil, pdu.broadcast_end_time
1563
+ end
1564
+
1565
+
1566
+ def test_decode_smpp_query_broadcast_sm_resp_1
1567
+ dump = String.new()
1568
+ # read and decode package based on hex dump
1569
+ dump << "00 00 00 36 80 00 01 12 00 00 00 00 00 00 00 0C 31 32 33 00 04 27 00 "
1570
+ dump << "01 02 06 06 00 02 01 FF 06 06 00 02 01 AF 06 06 00 02 01 DF 06 08 00 "
1571
+ dump << "01 66 02 04 00 02 00 7B 06 09 00 01 00"
1572
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1573
+
1574
+ # declare variables
1575
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1576
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1577
+
1578
+ # decode package
1579
+ decoder.append_buffer(buffer)
1580
+ pdu = decoder.get_packet()
1581
+ assert_not_nil pdu, "PDU is null"
1582
+ pdu.decode_packet(decoder)
1583
+ pdu.validate_packet(validator)
1584
+ decoder.validate_offset(pdu.command_length())
1585
+
1586
+ # check instanse type and fields value
1587
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPQueryBroadcastSMResp, pdu, "PDU class is invalid" )
1588
+ assert_equal 54, pdu.command_length
1589
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_QUERY_BROADCAST_SM_RESP, pdu.command_id
1590
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1591
+ assert_equal 12, pdu.sequence_number
1592
+ assert_equal "123", pdu.message_id
1593
+ assert_equal Majoron::AntHill::SMPP::MessageState::DELIVERED, pdu.message_state
1594
+ assert_equal 3, pdu.broadcast_area_identifier.size
1595
+ assert_equal "01 FF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.broadcast_area_identifier[0].value )
1596
+ assert_equal "01 AF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.broadcast_area_identifier[1].value )
1597
+ assert_equal "01 DF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.broadcast_area_identifier[2].value )
1598
+ assert_equal 102, pdu.broadcast_area_success
1599
+ assert_equal 123, pdu.user_message_reference
1600
+ assert_equal "", pdu.broadcast_end_time
1601
+ end
1602
+
1603
+ def test_decode_smpp_query_broadcast_sm_resp_1
1604
+ dump = String.new()
1605
+ # read and decode package based on hex dump
1606
+ dump << "00 00 00 43 80 00 01 12 00 00 00 00 00 00 00 02 31 00 04 27 00 01 01 "
1607
+ dump << "06 06 00 03 05 06 07 06 06 00 03 05 06 07 06 06 00 03 05 06 07 06 06 "
1608
+ dump << "00 03 05 06 07 06 08 00 01 01 02 04 00 02 00 01 06 09 00 01 00"
1609
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1610
+
1611
+ # declare variables
1612
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1613
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1614
+
1615
+ # decode package
1616
+ decoder.append_buffer(buffer)
1617
+ pdu = decoder.get_packet()
1618
+ assert_not_nil pdu, "PDU is null"
1619
+ pdu.decode_packet(decoder)
1620
+ pdu.validate_packet(validator)
1621
+ decoder.validate_offset(pdu.command_length())
1622
+
1623
+ # check instanse type and fields value
1624
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPQueryBroadcastSMResp, pdu, "PDU class is invalid" )
1625
+ assert_equal 67, pdu.command_length
1626
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_QUERY_BROADCAST_SM_RESP, pdu.command_id
1627
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1628
+ assert_equal 2, pdu.sequence_number
1629
+ assert_equal "1", pdu.message_id
1630
+ assert_equal Majoron::AntHill::SMPP::MessageState::ENROUTE, pdu.message_state
1631
+ assert_equal 4, pdu.broadcast_area_identifier.size
1632
+ assert_equal "05 06 07", Majoron::AntHill::ByteBuffer.encode_hex(pdu.broadcast_area_identifier[0].value )
1633
+ assert_equal "05 06 07", Majoron::AntHill::ByteBuffer.encode_hex(pdu.broadcast_area_identifier[1].value )
1634
+ assert_equal "05 06 07", Majoron::AntHill::ByteBuffer.encode_hex(pdu.broadcast_area_identifier[2].value )
1635
+ assert_equal "05 06 07", Majoron::AntHill::ByteBuffer.encode_hex(pdu.broadcast_area_identifier[3].value )
1636
+ assert_equal 1, pdu.user_message_reference
1637
+ assert_equal "", pdu.broadcast_end_time
1638
+ end
1639
+
1640
+ def test_decode_smpp_cancel_broadcast_sm
1641
+ dump = String.new()
1642
+ # read and decode package based on hex dump
1643
+ dump << "00 00 00 2C 00 00 01 13 00 00 00 00 00 00 00 0C 73 72 76 74 70 00 31 "
1644
+ dump << "32 33 00 01 01 31 32 33 00 06 01 00 02 01 FF 02 04 00 02 00 0A"
1645
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1646
+
1647
+ # declare variables
1648
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1649
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1650
+
1651
+ # decode package
1652
+ decoder.append_buffer(buffer)
1653
+ pdu = decoder.get_packet()
1654
+ assert_not_nil pdu, "PDU is null"
1655
+ pdu.decode_packet(decoder)
1656
+ pdu.validate_packet(validator)
1657
+ decoder.validate_offset(pdu.command_length())
1658
+
1659
+ # check instanse type and fields value
1660
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPCancelBroadcastSM, pdu, "PDU class is invalid" )
1661
+ assert_equal 44, pdu.command_length
1662
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_CANCEL_BROADCAST_SM, pdu.command_id
1663
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1664
+ assert_equal 12, pdu.sequence_number
1665
+ assert_equal "srvtp", pdu.service_type
1666
+ assert_equal "123", pdu.message_id
1667
+ assert_equal 1, pdu.source_addr_ton
1668
+ assert_equal 1, pdu.source_addr_npi
1669
+ assert_equal "123", pdu.source_addr
1670
+
1671
+ # Check optional fields value
1672
+ assert_equal "01 FF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.broadcast_content_type).strip.upcase
1673
+ assert_equal 10, pdu.user_message_reference
1674
+
1675
+ # Check optional fields len value
1676
+ assert_equal 2, pdu.broadcast_content_type_len
1677
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.user_message_reference_len
1678
+ end
1679
+
1680
+ def test_decode_smpp_cancel_broadcast_sm_resp
1681
+ dump = String.new()
1682
+ # read and decode package based on hex dump
1683
+ dump << "00 00 00 10 80 00 01 13 00 00 00 00 00 00 00 0C"
1684
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1685
+
1686
+ # declare variables
1687
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1688
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1689
+
1690
+ # decode package
1691
+ decoder.append_buffer(buffer)
1692
+ pdu = decoder.get_packet()
1693
+ assert_not_nil pdu, "PDU is null"
1694
+ pdu.decode_packet(decoder)
1695
+ pdu.validate_packet(validator)
1696
+ decoder.validate_offset(pdu.command_length())
1697
+
1698
+ # check instanse type and fields value
1699
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPCancelBroadcastSMResp, pdu, "PDU class is invalid" )
1700
+ assert_equal 16, pdu.command_length
1701
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_CANCEL_BROADCAST_SM_RESP, pdu.command_id
1702
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1703
+ end
1704
+
1705
+ def test_decode_smpp_broadcast_sm
1706
+ dump = String.new()
1707
+ # read and decode package based on hex dump
1708
+ dump << "00 00 00 C5 00 00 01 11 00 00 00 00 00 00 00 0C 73 72 76 74 70 00 01 "
1709
+ dump << "02 31 32 33 00 33 34 35 00 01 00 00 03 04 05 06 06 00 02 01 FF 06 06 "
1710
+ dump << "00 02 01 AF 06 06 00 02 01 DF 06 01 00 03 01 02 FF 06 04 00 02 00 0A "
1711
+ dump << "06 05 00 03 01 02 FF 13 0C 00 01 01 06 00 00 01 02 06 02 00 03 01 FF "
1712
+ dump << "AA 06 03 00 01 03 06 0A 00 03 01 FF AA 03 81 00 01 10 03 03 00 03 01 "
1713
+ dump << "FF AA 03 02 00 01 04 02 03 00 03 01 FF AA 02 0B 00 02 00 05 12 01 00 "
1714
+ dump << "01 06 02 0D 00 01 07 04 24 00 03 01 FF AA 12 04 00 01 08 00 19 00 01 "
1715
+ dump << "09 02 01 00 01 0A 12 03 00 02 00 0B 00 0D 00 01 0C 02 0A 00 02 00 0D "
1716
+ dump << "02 02 00 03 01 FF AA 02 04 00 02 00 16"
1717
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1718
+
1719
+ # declare variables
1720
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1721
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1722
+
1723
+ # decode package
1724
+ decoder.append_buffer(buffer)
1725
+ pdu = decoder.get_packet()
1726
+ assert_not_nil pdu, "PDU is null"
1727
+ pdu.decode_packet(decoder)
1728
+ pdu.validate_packet(validator)
1729
+ decoder.validate_offset(pdu.command_length())
1730
+
1731
+ # check instanse type and fields value
1732
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPBroadcastSM, pdu, "PDU class is invalid" )
1733
+ assert_equal 197, pdu.command_length
1734
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_BROADCAST_SM, pdu.command_id
1735
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1736
+ assert_equal 12, pdu.sequence_number
1737
+ assert_equal "srvtp", pdu.service_type
1738
+ assert_equal Majoron::AntHill::SMPP::TON::INTERNATIONAL, pdu.source_addr_ton
1739
+ assert_equal Majoron::AntHill::SMPP::NPI::DATA, pdu.source_addr_npi
1740
+ assert_equal "123", pdu.source_addr
1741
+ assert_equal "345", pdu.message_id
1742
+ assert_equal 1, pdu.priority_flag
1743
+ assert_equal "", pdu.schedule_delivery_time
1744
+ assert_equal "", pdu.validity_period
1745
+ assert_equal 3, pdu.replace_if_present_flag
1746
+ assert_equal 4, pdu.data_coding
1747
+ assert_equal 5, pdu.sm_default_msg_id
1748
+
1749
+
1750
+ # Check mandatory fields with len
1751
+ assert_equal 3, pdu.broadcast_area_identifier.size
1752
+ assert_equal "01 FF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.broadcast_area_identifier[0].value )
1753
+ assert_equal "01 AF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.broadcast_area_identifier[1].value )
1754
+ assert_equal "01 DF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.broadcast_area_identifier[2].value )
1755
+ assert_equal 3, pdu.broadcast_area_identifier_len.size
1756
+ assert_equal 2, pdu.broadcast_area_identifier_len[0]
1757
+ assert_equal 2, pdu.broadcast_area_identifier_len[1]
1758
+ assert_equal 2, pdu.broadcast_area_identifier_len[2]
1759
+ assert_equal "01 02 FF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.broadcast_content_type)
1760
+ assert_equal 10, pdu.broadcast_rep_num
1761
+ assert_equal "01 02 FF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.broadcast_frequency_interval)
1762
+
1763
+ # Check optional fields value
1764
+ assert_equal 1, pdu.alert_on_msg_delivery
1765
+ assert_equal 2, pdu.broadcast_channel_indicator
1766
+ assert_equal "01 FF AA", Majoron::AntHill::ByteBuffer.encode_hex(pdu.broadcast_content_type_info).strip.upcase
1767
+ assert_equal 3, pdu.broadcast_message_class
1768
+ assert_equal "01 FF AA", Majoron::AntHill::ByteBuffer.encode_hex(pdu.broadcast_service_group).strip.upcase
1769
+ assert_equal "10", Majoron::AntHill::ByteBuffer.encode_hex(pdu.callback_num).strip.upcase
1770
+ assert_equal 4, pdu.callback_num_pres_ind
1771
+ assert_equal "01 FF AA", Majoron::AntHill::ByteBuffer.encode_hex(pdu.callback_num_atag).strip.upcase
1772
+ assert_equal "01 FF AA", Majoron::AntHill::ByteBuffer.encode_hex(pdu.dest_subaddress).strip.upcase
1773
+ assert_equal 5, pdu.dest_port
1774
+ assert_equal 6, pdu.display_time
1775
+ assert_equal 7, pdu.language_indicator
1776
+ assert_equal "01 FF AA", Majoron::AntHill::ByteBuffer.encode_hex(pdu.message_payload).strip.upcase
1777
+ assert_equal 8, pdu.ms_validity
1778
+ assert_equal 9, pdu.payload_type
1779
+ assert_equal 10, pdu.privacy_indicator
1780
+ assert_equal 11, pdu.sms_signal
1781
+ assert_equal 12, pdu.source_addr_subunit
1782
+ assert_equal 13, pdu.source_port
1783
+ assert_equal "01 FF AA", Majoron::AntHill::ByteBuffer.encode_hex(pdu.source_subaddress).strip.upcase
1784
+ assert_equal 22, pdu.user_message_reference
1785
+
1786
+ # Check optional fields len value
1787
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.alert_on_msg_delivery_len
1788
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.broadcast_channel_indicator_len
1789
+ assert_equal 3, pdu.broadcast_content_type_info_len
1790
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.broadcast_message_class_len
1791
+ assert_equal 3, pdu.broadcast_service_group_len
1792
+ assert_equal 1, pdu.callback_num_len
1793
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.callback_num_pres_ind_len
1794
+ assert_equal 3, pdu.callback_num_atag_len
1795
+ assert_equal 3, pdu.dest_subaddress_len
1796
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.dest_port_len
1797
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.display_time_len
1798
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.language_indicator_len
1799
+ assert_equal 3, pdu.message_payload_len
1800
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.ms_validity_len
1801
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.privacy_indicator_len
1802
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.sms_signal_len
1803
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.source_addr_subunit_len
1804
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.source_port_len
1805
+ assert_equal 3, pdu.source_subaddress_len
1806
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::WORD_LEN, pdu.user_message_reference_len
1807
+ end
1808
+
1809
+ def test_decode_smpp_broadcast_sm_resp
1810
+ dump = String.new()
1811
+ # read and decode package based on hex dump
1812
+ dump << "00 00 00 2E 80 00 01 11 00 00 00 00 00 00 00 0C 31 32 33 00 06 07 00 "
1813
+ dump << "04 00 00 00 01 06 06 00 02 01 FF 06 06 00 02 01 AF 06 06 00 02 01 DF"
1814
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1815
+
1816
+ # declare variables
1817
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1818
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1819
+
1820
+ # decode package
1821
+ decoder.append_buffer(buffer)
1822
+ pdu = decoder.get_packet()
1823
+ assert_not_nil pdu, "PDU is null"
1824
+ pdu.decode_packet(decoder)
1825
+ pdu.validate_packet(validator)
1826
+ decoder.validate_offset(pdu.command_length())
1827
+
1828
+ # check instanse type and fields value
1829
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPBroadcastSMResp, pdu, "PDU class is invalid" )
1830
+ assert_equal 46, pdu.command_length
1831
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_BROADCAST_SM_RESP, pdu.command_id
1832
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1833
+ assert_equal 12, pdu.sequence_number
1834
+ assert_equal "123", pdu.message_id
1835
+
1836
+ # Check optional fields value
1837
+ assert_equal 1, pdu.broadcast_error_status
1838
+ assert_equal 3, pdu.failed_broadcast_area_identifier.size
1839
+ assert_equal "01 FF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.failed_broadcast_area_identifier[0].value )
1840
+ assert_equal "01 AF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.failed_broadcast_area_identifier[1].value )
1841
+ assert_equal "01 DF", Majoron::AntHill::ByteBuffer.encode_hex(pdu.failed_broadcast_area_identifier[2].value )
1842
+
1843
+ # Check optional fields len value
1844
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::DWORD_LEN, pdu.broadcast_error_status_len
1845
+ assert_equal 3, pdu.failed_broadcast_area_identifier_len.size
1846
+ assert_equal 2, pdu.failed_broadcast_area_identifier_len[0]
1847
+ assert_equal 2, pdu.failed_broadcast_area_identifier_len[1]
1848
+ assert_equal 2, pdu.failed_broadcast_area_identifier_len[2]
1849
+ end
1850
+
1851
+
1852
+
1853
+ def test_decode_smpp_alert_notification
1854
+ dump = String.new()
1855
+ # read and decode package based on hex dump
1856
+ dump << "00 00 00 21 00 00 01 02 00 00 00 00 00 00 00 0C 01 01 31 32 33 00 02 "
1857
+ dump << "02 33 32 31 00 04 22 00 01 01"
1858
+ buffer = Majoron::AntHill::ByteBuffer.decode_hex(dump)
1859
+
1860
+ # declare variables
1861
+ decoder = Majoron::AntHill::SMPP::SMPPDecoder.new()
1862
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1863
+
1864
+ # decode package
1865
+ decoder.append_buffer(buffer)
1866
+ pdu = decoder.get_packet()
1867
+ assert_not_nil pdu, "PDU is null"
1868
+ pdu.decode_packet(decoder)
1869
+ pdu.validate_packet(validator)
1870
+ decoder.validate_offset(pdu.command_length())
1871
+
1872
+ # check instanse type and fields value
1873
+ assert_instance_of(Majoron::AntHill::SMPP::SMPPAlertNotification, pdu, "PDU class is invalid" )
1874
+ assert_equal 33, pdu.command_length
1875
+ assert_equal Majoron::AntHill::SMPP::CommandId::CM_ALERT_NOTIFICATION, pdu.command_id
1876
+ assert_equal Majoron::AntHill::SMPP::ErrorCode::ESME_ROK, pdu.command_status
1877
+ assert_equal 12, pdu.sequence_number
1878
+ assert_equal 1, pdu.source_addr_ton
1879
+ assert_equal 1, pdu.source_addr_npi
1880
+ assert_equal "123", pdu.source_addr
1881
+ assert_equal 2, pdu.esme_addr_ton
1882
+ assert_equal 2, pdu.esme_addr_npi
1883
+ assert_equal "321", pdu.esme_addr
1884
+
1885
+ # check optional fields
1886
+ assert_equal 1, pdu.ms_availability_status
1887
+
1888
+
1889
+ # check optional fields len
1890
+ assert_equal Majoron::AntHill::SMPP::SMPPTLVLen::BYTE_LEN, pdu.ms_availability_status_len
1891
+
1892
+ end
1893
+
1894
+
1895
+
1896
+
1897
+ def test_encode_smpp_bind_receiver
1898
+ # Create new package
1899
+ pdu = Majoron::AntHill::SMPP::SMPPBindReceiver.new()
1900
+ pdu.command_status = Majoron::AntHill::SMPP::ErrorCode::ESME_ROK
1901
+ pdu.sequence_number = 11
1902
+ pdu.system_id = "SystemId"
1903
+ pdu.password = "password"
1904
+ pdu.system_type = "SMSC"
1905
+ pdu.interface_version = Majoron::AntHill::SMPP::InterfaceVersion::SMPP_VER_5_0
1906
+ pdu.addr_ton = Majoron::AntHill::SMPP::TON::INTERNATIONAL
1907
+ pdu.addr_npi = Majoron::AntHill::SMPP::NPI::ISDN
1908
+ pdu.address_range = "123"
1909
+
1910
+ begin
1911
+ encoder = Majoron::AntHill::SMPP::SMPPEncoder.new()
1912
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1913
+
1914
+ # Encode packet
1915
+ encoder.reset_buffer()
1916
+ pdu.validate_packet(validator)
1917
+ pdu.encode_packet(encoder)
1918
+ encoder.encode_command_length()
1919
+ buffer = encoder.get_buffer()
1920
+
1921
+ dump = String.new()
1922
+ # Compare result at hex presentation
1923
+ hex = Majoron::AntHill::ByteBuffer.encode_hex(buffer)
1924
+ dump << "00 00 00 2E 00 00 00 01 00 00 00 00 00 00 00 0B 53 79 73 74 65 6D 49 "
1925
+ dump << "64 00 70 61 73 73 77 6F 72 64 00 53 4D 53 43 00 50 01 01 31 32 33 00 "
1926
+ assert_equal dump.strip.upcase, hex.strip.upcase
1927
+ rescue RuntimeError => e
1928
+ raise
1929
+ end
1930
+ end
1931
+
1932
+ def test_encode_smpp_bind_receiver_resp
1933
+ # Create new package
1934
+ pdu = Majoron::AntHill::SMPP::SMPPBindReceiverResp.new()
1935
+ pdu.command_status = Majoron::AntHill::SMPP::ErrorCode::ESME_ROK
1936
+ pdu.sequence_number = 9402
1937
+ pdu.system_id = "SSSMSC"
1938
+ pdu.sc_interface_version = Majoron::AntHill::SMPP::InterfaceVersion::SMPP_VER_3_3
1939
+
1940
+ begin
1941
+ encoder = Majoron::AntHill::SMPP::SMPPEncoder.new()
1942
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1943
+
1944
+ # Encode packet
1945
+ encoder.reset_buffer()
1946
+ pdu.validate_packet(validator)
1947
+ pdu.encode_packet(encoder)
1948
+ encoder.encode_command_length()
1949
+ buffer = encoder.get_buffer()
1950
+
1951
+ dump = String.new()
1952
+ # Compare result at hex presentation
1953
+ hex = Majoron::AntHill::ByteBuffer.encode_hex(buffer)
1954
+ dump << "00 00 00 1c 80 00 00 01 00 00 00 00 00 00 24 ba 53 53 53 4d "
1955
+ dump << "53 43 00 02 10 00 01 33 "
1956
+ assert_equal dump.strip.upcase, hex.strip.upcase
1957
+ rescue RuntimeError => e
1958
+ raise
1959
+ end
1960
+ end
1961
+
1962
+
1963
+ def test_encode_smpp_bind_transceiver
1964
+ # Create new package
1965
+ pdu = Majoron::AntHill::SMPP::SMPPBindTransceiver.new()
1966
+ pdu.command_status = Majoron::AntHill::SMPP::ErrorCode::ESME_ROK
1967
+ pdu.sequence_number = 11
1968
+ pdu.system_id = "SystemId"
1969
+ pdu.password = "password"
1970
+ pdu.system_type = "SMSC"
1971
+ pdu.interface_version = Majoron::AntHill::SMPP::InterfaceVersion::SMPP_VER_5_0
1972
+ pdu.addr_ton = Majoron::AntHill::SMPP::TON::INTERNATIONAL
1973
+ pdu.addr_npi = Majoron::AntHill::SMPP::NPI::ISDN
1974
+ pdu.address_range = "123"
1975
+
1976
+ begin
1977
+ encoder = Majoron::AntHill::SMPP::SMPPEncoder.new()
1978
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
1979
+
1980
+ # Encode packet
1981
+ encoder.reset_buffer()
1982
+ pdu.validate_packet(validator)
1983
+ pdu.encode_packet(encoder)
1984
+ encoder.encode_command_length()
1985
+ buffer = encoder.get_buffer()
1986
+
1987
+ dump = String.new()
1988
+ # Compare result at hex presentation
1989
+ hex = Majoron::AntHill::ByteBuffer.encode_hex(buffer)
1990
+ dump << "00 00 00 2E 00 00 00 09 00 00 00 00 00 00 00 0B 53 79 73 74 65 6D 49 "
1991
+ dump << "64 00 70 61 73 73 77 6F 72 64 00 53 4D 53 43 00 50 01 01 31 32 33 00 "
1992
+ assert_equal dump.strip.upcase, hex.strip.upcase
1993
+ rescue RuntimeError => e
1994
+ raise
1995
+ end
1996
+ end
1997
+
1998
+ def test_encode_smpp_bind_transceiver_resp
1999
+ # Create new package
2000
+ pdu = Majoron::AntHill::SMPP::SMPPBindTransceiverResp.new()
2001
+ pdu.command_status = Majoron::AntHill::SMPP::ErrorCode::ESME_ROK
2002
+ pdu.sequence_number = 9402
2003
+ pdu.system_id = "SSSMSC"
2004
+ pdu.sc_interface_version = Majoron::AntHill::SMPP::InterfaceVersion::SMPP_VER_3_3
2005
+
2006
+ begin
2007
+ encoder = Majoron::AntHill::SMPP::SMPPEncoder.new()
2008
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
2009
+
2010
+ # Encode packet
2011
+ encoder.reset_buffer()
2012
+ pdu.validate_packet(validator)
2013
+ pdu.encode_packet(encoder)
2014
+ encoder.encode_command_length()
2015
+ buffer = encoder.get_buffer()
2016
+
2017
+ dump = String.new()
2018
+ # Compare result at hex presentation
2019
+ hex = Majoron::AntHill::ByteBuffer.encode_hex(buffer)
2020
+ dump << "00 00 00 1c 80 00 00 09 00 00 00 00 00 00 24 ba 53 53 53 4d "
2021
+ dump << "53 43 00 02 10 00 01 33 "
2022
+ assert_equal dump.strip.upcase, hex.strip.upcase
2023
+ rescue RuntimeError => e
2024
+ raise
2025
+ end
2026
+ end
2027
+
2028
+ def test_encode_smpp_bind_transmitter
2029
+ # Create new package
2030
+ pdu = Majoron::AntHill::SMPP::SMPPBindTransmitter.new()
2031
+ pdu.command_status = Majoron::AntHill::SMPP::ErrorCode::ESME_ROK
2032
+ pdu.sequence_number = 11
2033
+ pdu.system_id = "SystemId"
2034
+ pdu.password = "password"
2035
+ pdu.system_type = "SMSC"
2036
+ pdu.interface_version = Majoron::AntHill::SMPP::InterfaceVersion::SMPP_VER_5_0
2037
+ pdu.addr_ton = Majoron::AntHill::SMPP::TON::INTERNATIONAL
2038
+ pdu.addr_npi = Majoron::AntHill::SMPP::NPI::ISDN
2039
+ pdu.address_range = "123"
2040
+
2041
+ begin
2042
+ encoder = Majoron::AntHill::SMPP::SMPPEncoder.new()
2043
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
2044
+
2045
+ # Encode packet
2046
+ encoder.reset_buffer()
2047
+ pdu.validate_packet(validator)
2048
+ pdu.encode_packet(encoder)
2049
+ encoder.encode_command_length()
2050
+ buffer = encoder.get_buffer()
2051
+
2052
+ dump = String.new()
2053
+ # Compare result at hex presentation
2054
+ hex = Majoron::AntHill::ByteBuffer.encode_hex(buffer)
2055
+ dump << "00 00 00 2E 00 00 00 02 00 00 00 00 00 00 00 0B 53 79 73 74 65 6D 49 "
2056
+ dump << "64 00 70 61 73 73 77 6F 72 64 00 53 4D 53 43 00 50 01 01 31 32 33 00 "
2057
+ assert_equal dump.strip.upcase, hex.strip.upcase
2058
+ rescue RuntimeError => e
2059
+ raise
2060
+ end
2061
+ end
2062
+
2063
+ def test_encode_smpp_bind_transmitter_resp
2064
+ # Create new package
2065
+ pdu = Majoron::AntHill::SMPP::SMPPBindTransmitterResp.new()
2066
+ pdu.command_status = Majoron::AntHill::SMPP::ErrorCode::ESME_ROK
2067
+ pdu.sequence_number = 9402
2068
+ pdu.system_id = "SSSMSC"
2069
+ pdu.sc_interface_version = Majoron::AntHill::SMPP::InterfaceVersion::SMPP_VER_3_3
2070
+
2071
+ begin
2072
+ encoder = Majoron::AntHill::SMPP::SMPPEncoder.new()
2073
+ validator = Majoron::AntHill::SMPP::SMPPValidator.new()
2074
+
2075
+ # Encode packet
2076
+ encoder.reset_buffer()
2077
+ pdu.validate_packet(validator)
2078
+ pdu.encode_packet(encoder)
2079
+ encoder.encode_command_length()
2080
+ buffer = encoder.get_buffer()
2081
+
2082
+ dump = String.new()
2083
+ # Compare result at hex presentation
2084
+ hex = Majoron::AntHill::ByteBuffer.encode_hex(buffer)
2085
+ dump << "00 00 00 1c 80 00 00 02 00 00 00 00 00 00 24 ba 53 53 53 4d "
2086
+ dump << "53 43 00 02 10 00 01 33 "
2087
+ assert_equal dump.strip.upcase, hex.strip.upcase
2088
+ rescue RuntimeError => e
2089
+ raise
2090
+ end
2091
+ end
2092
+
2093
+
2094
+
2095
+ end