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 10KB

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