You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

main.cpp 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. #include <gtest/gtest.h>
  2. #include <QByteArray>
  3. #include <QString>
  4. #include "dns/QDnsHeader.h"
  5. struct DNSHeaderTestParams
  6. {
  7. bool isValid;
  8. const char* hexData;
  9. quint16 id;
  10. quint16 flags;
  11. bool flagQuery;
  12. quint8 flagOpcode;
  13. bool flagAuthoritative;
  14. bool flagTruncated;
  15. bool flagRecursionDesired;
  16. bool flagRecursionAvailable;
  17. bool flagReserved0;
  18. bool flagAnswerAuthenticated;
  19. bool flagNonAuthenticatedAcceptable;
  20. quint8 flagReplyCode;
  21. quint16 questionCount;
  22. quint16 answerCount;
  23. quint16 authorityCount;
  24. quint16 additionalCount;
  25. };
  26. class DNSHeaderTest : public ::testing::TestWithParam<DNSHeaderTestParams>
  27. {
  28. };
  29. TEST_P(DNSHeaderTest, parseAndGetters)
  30. {
  31. auto params = GetParam();
  32. auto data = QByteArray::fromHex(params.hexData);
  33. auto header = QDNS::QDnsHeader::parse(data);
  34. ASSERT_EQ(header.isValid(), params.isValid);
  35. if (header.isValid())
  36. {
  37. ASSERT_EQ(header.getId(), params.id);
  38. ASSERT_EQ(header.getFlags(), params.flags);
  39. ASSERT_EQ(header.isQuery(), params.flagQuery);
  40. ASSERT_EQ(header.getOpcode(), params.flagOpcode);
  41. ASSERT_EQ(header.isAuthoritative(), params.flagAuthoritative);
  42. ASSERT_EQ(header.isTruncated(), params.flagTruncated);
  43. ASSERT_EQ(header.isRecursionDesired(), params.flagRecursionDesired);
  44. ASSERT_EQ(header.isRecursionAvailable(), params.flagRecursionAvailable);
  45. ASSERT_EQ(header.isAnswerAuthenticated(), params.flagAnswerAuthenticated);
  46. ASSERT_EQ(header.isNonAuthenticatedAcceptable(), params.flagNonAuthenticatedAcceptable);
  47. ASSERT_EQ(header.getReplyCode(), params.flagReplyCode);
  48. ASSERT_EQ(header.getQuestionCount(), params.questionCount);
  49. ASSERT_EQ(header.getAnswerCount(), params.answerCount);
  50. ASSERT_EQ(header.getAuthorityCount(), params.authorityCount);
  51. ASSERT_EQ(header.getAdditionalCount(), params.additionalCount);
  52. ASSERT_EQ(header.serialize().toHex(), QString(params.hexData).remove(" "));
  53. }
  54. else
  55. {
  56. ASSERT_EQ(header.serialize().size(), 0);
  57. }
  58. }
  59. TEST_P(DNSHeaderTest, settersAndGetters1)
  60. {
  61. auto params = GetParam();
  62. if (!params.isValid)
  63. {
  64. return;
  65. }
  66. auto data = QByteArray::fromHex(params.hexData);
  67. QDNS::QDnsHeader header;
  68. header.setId(params.id);
  69. header.setFlags(params.flags);
  70. header.setQuestionCount(params.questionCount);
  71. header.setAnswerCount(params.answerCount);
  72. header.setAuthorityCount(params.authorityCount);
  73. header.setAdditionalCount(params.additionalCount);
  74. ASSERT_EQ(header.getId(), params.id);
  75. ASSERT_EQ(header.getFlags(), params.flags);
  76. ASSERT_EQ(header.isQuery(), params.flagQuery);
  77. ASSERT_EQ(header.getOpcode(), params.flagOpcode);
  78. ASSERT_EQ(header.isAuthoritative(), params.flagAuthoritative);
  79. ASSERT_EQ(header.isTruncated(), params.flagTruncated);
  80. ASSERT_EQ(header.isRecursionDesired(), params.flagRecursionDesired);
  81. ASSERT_EQ(header.isRecursionAvailable(), params.flagRecursionAvailable);
  82. ASSERT_EQ(header.isAnswerAuthenticated(), params.flagAnswerAuthenticated);
  83. ASSERT_EQ(header.isNonAuthenticatedAcceptable(), params.flagNonAuthenticatedAcceptable);
  84. ASSERT_EQ(header.getReplyCode(), params.flagReplyCode);
  85. ASSERT_EQ(header.getQuestionCount(), params.questionCount);
  86. ASSERT_EQ(header.getAnswerCount(), params.answerCount);
  87. ASSERT_EQ(header.getAuthorityCount(), params.authorityCount);
  88. ASSERT_EQ(header.getAdditionalCount(), params.additionalCount);
  89. ASSERT_EQ(header.serialize().toHex(), QString(params.hexData).remove(" "));
  90. }
  91. TEST_P(DNSHeaderTest, settersAndGetters2)
  92. {
  93. auto params = GetParam();
  94. if (!params.isValid)
  95. {
  96. return;
  97. }
  98. auto data = QByteArray::fromHex(params.hexData);
  99. QDNS::QDnsHeader header;
  100. header.setId(params.id);
  101. header.setIsQuery(params.flagQuery);
  102. header.setOpcode(params.flagOpcode);
  103. header.setIsAuthoritative(params.flagAuthoritative);
  104. header.setIsTruncated(params.flagTruncated);
  105. header.setIsRecursionDesired(params.flagRecursionDesired);
  106. header.setIsRecursionAvailable(params.flagRecursionAvailable);
  107. header.setFlagBits(9, (quint16) params.flagReserved0, 1);
  108. header.setIsAnswerAuthenticated(params.flagAnswerAuthenticated);
  109. header.setNonAuthenticatedAcceptable(params.flagNonAuthenticatedAcceptable);
  110. header.setReplyCode(params.flagReplyCode);
  111. header.setQuestionCount(params.questionCount);
  112. header.setAnswerCount(params.answerCount);
  113. header.setAuthorityCount(params.authorityCount);
  114. header.setAdditionalCount(params.additionalCount);
  115. ASSERT_EQ(header.getId(), params.id);
  116. ASSERT_EQ(header.getFlags(), params.flags);
  117. ASSERT_EQ(header.isQuery(), params.flagQuery);
  118. ASSERT_EQ(header.getOpcode(), params.flagOpcode);
  119. ASSERT_EQ(header.isAuthoritative(), params.flagAuthoritative);
  120. ASSERT_EQ(header.isTruncated(), params.flagTruncated);
  121. ASSERT_EQ(header.isRecursionDesired(), params.flagRecursionDesired);
  122. ASSERT_EQ(header.isRecursionAvailable(), params.flagRecursionAvailable);
  123. ASSERT_EQ(header.isAnswerAuthenticated(), params.flagAnswerAuthenticated);
  124. ASSERT_EQ(header.isNonAuthenticatedAcceptable(), params.flagNonAuthenticatedAcceptable);
  125. ASSERT_EQ(header.getReplyCode(), params.flagReplyCode);
  126. ASSERT_EQ(header.getQuestionCount(), params.questionCount);
  127. ASSERT_EQ(header.getAnswerCount(), params.answerCount);
  128. ASSERT_EQ(header.getAuthorityCount(), params.authorityCount);
  129. ASSERT_EQ(header.getAdditionalCount(), params.additionalCount);
  130. ASSERT_EQ(header.serialize().toHex(), QString(params.hexData).remove(" "));
  131. }
  132. INSTANTIATE_TEST_CASE_P(DNSHeaderTestInst,
  133. DNSHeaderTest,
  134. ::testing::Values(
  135. DNSHeaderTestParams {false, ""},
  136. DNSHeaderTestParams {false, "00"},
  137. DNSHeaderTestParams {true,
  138. "3c dc 01 00 00 01 00 00 00 00 00 00",
  139. 0x3cdc,
  140. 0x0100,
  141. false,
  142. 0,
  143. false,
  144. false,
  145. true,
  146. false,
  147. false,
  148. false,
  149. false,
  150. 0,
  151. 1,
  152. 0,
  153. 0,
  154. 0
  155. },
  156. DNSHeaderTestParams {true,
  157. "3c dc 81 80 00 01 00 01 00 00 00 00",
  158. 0x3cdc,
  159. 0x8180,
  160. true,
  161. 0,
  162. false,
  163. false,
  164. true,
  165. true,
  166. false,
  167. false,
  168. false,
  169. 0,
  170. 1,
  171. 1,
  172. 0,
  173. 0
  174. },
  175. DNSHeaderTestParams {true,
  176. "3c dc aa aa aa aa 55 55 55 ff ff 55",
  177. 0x3cdc,
  178. 0xaaaa,
  179. true,
  180. 5,
  181. false,
  182. true,
  183. false,
  184. true,
  185. false,
  186. true,
  187. false,
  188. 10,
  189. 43690,
  190. 21845,
  191. 22015,
  192. 65365
  193. },
  194. DNSHeaderTestParams {true,
  195. "3c dc 55 55 55 ff aa aa ff 55 55 55",
  196. 0x3cdc,
  197. 0x5555,
  198. false,
  199. 10,
  200. true,
  201. false,
  202. true,
  203. false,
  204. true,
  205. false,
  206. true,
  207. 5,
  208. 22015,
  209. 43690,
  210. 65365,
  211. 21845
  212. }
  213. ));
  214. TEST(DNSHeaderTest, getFlagBits)
  215. {
  216. QDNS::QDnsHeader header;
  217. header.setFlags(0x5555);
  218. ASSERT_EQ(header.getFlagBits(0, 1), 0);
  219. ASSERT_EQ(header.getFlagBits(3, 4), 5);
  220. }
  221. TEST(DNSHeaderTest, getFlagBitIndex)
  222. {
  223. ASSERT_EQ(QDNS::QDnsHeader::getFlagBitIndex(0), 15);
  224. ASSERT_EQ(QDNS::QDnsHeader::getFlagBitIndex(1), 14);
  225. ASSERT_EQ(QDNS::QDnsHeader::getFlagBitIndex(14), 1);
  226. ASSERT_EQ(QDNS::QDnsHeader::getFlagBitIndex(15), 0);
  227. }
  228. int main(int argc, char* argv[])
  229. {
  230. ::testing::InitGoogleTest(&argc, argv);
  231. return RUN_ALL_TESTS();
  232. }