anthill_smpp_ruby 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
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