keyring_test.cc 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. // Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
  2. //
  3. // Permission to use, copy, modify, and/or distribute this software for any
  4. // purpose with or without fee is hereby granted, provided that the above
  5. // copyright notice and this permission notice appear in all copies.
  6. //
  7. // THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
  8. // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  9. // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
  10. // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  11. // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  12. // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  13. // PERFORMANCE OF THIS SOFTWARE.
  14. #include <server_common/keyring.h>
  15. #include <server_common/tests/data_path.h>
  16. #include <config/tests/fake_session.h>
  17. #include <config/ccsession.h>
  18. #include <dns/name.h>
  19. #include <gtest/gtest.h>
  20. #include <memory>
  21. #include <string>
  22. using namespace isc::data;
  23. using namespace isc::config;
  24. using namespace isc::server_common;
  25. using namespace isc::dns;
  26. namespace {
  27. class KeyringTest : public ::testing::Test {
  28. public:
  29. KeyringTest() :
  30. session(ElementPtr(new ListElement), ElementPtr(new ListElement),
  31. ElementPtr(new ListElement)),
  32. specfile(std::string(TEST_DATA_PATH) + "/spec.spec")
  33. {
  34. session.getMessages()->add(createAnswer());
  35. mccs.reset(new ModuleCCSession(specfile, session, NULL, NULL));
  36. }
  37. isc::cc::FakeSession session;
  38. std::auto_ptr<ModuleCCSession> mccs;
  39. std::string specfile;
  40. void doInit() {
  41. // Prepare the module specification for it and the config
  42. session.getMessages()->
  43. add(createAnswer(0,
  44. moduleSpecFromFile(std::string(PLUGIN_DATA_PATH) +
  45. "/tsig_keys.spec").
  46. getFullSpec()));
  47. session.getMessages()->add(createAnswer(0, Element::fromJSON(
  48. "{\"keys\": [\"key:MTIzNAo=:hmac-sha1\"]}")));
  49. // Now load it
  50. EXPECT_NO_THROW(initKeyring(*mccs));
  51. EXPECT_NE(keyring, boost::shared_ptr<TSIGKeyRing>()) <<
  52. "No keyring even after init";
  53. }
  54. };
  55. // Test usual use - init, using the keyring, update, deinit
  56. TEST_F(KeyringTest, keyring) {
  57. // First, initialize it
  58. {
  59. SCOPED_TRACE("Init");
  60. doInit();
  61. // Make sure it contains the correct key
  62. TSIGKeyRing::FindResult result(keyring->find(Name("key"),
  63. TSIGKey::HMACSHA1_NAME()));
  64. EXPECT_EQ(TSIGKeyRing::SUCCESS, result.code);
  65. }
  66. {
  67. SCOPED_TRACE("Update");
  68. session.addMessage(createCommand("config_update", Element::fromJSON(
  69. "{\"keys\": [\"another:MTIzNAo=:hmac-sha256\"]}")),
  70. "tsig_keys", "*");
  71. mccs->checkCommand();
  72. // Make sure it no longer contains the original key
  73. TSIGKeyRing::FindResult result(keyring->find(Name("key"),
  74. TSIGKey::HMACSHA1_NAME()));
  75. EXPECT_EQ(TSIGKeyRing::NOTFOUND, result.code);
  76. // but it does contain the new one
  77. TSIGKeyRing::FindResult result2 = keyring->find(Name("another"),
  78. TSIGKey::HMACSHA256_NAME());
  79. EXPECT_EQ(TSIGKeyRing::SUCCESS, result2.code);
  80. }
  81. {
  82. SCOPED_TRACE("Deinit");
  83. deinitKeyring(*mccs);
  84. EXPECT_EQ(keyring, boost::shared_ptr<TSIGKeyRing>()) <<
  85. "The keyring didn't disappear";
  86. }
  87. }
  88. // Init twice
  89. TEST_F(KeyringTest, initTwice) {
  90. // It is NULL before
  91. EXPECT_EQ(keyring, boost::shared_ptr<TSIGKeyRing>()) <<
  92. "Someone forgot to deinit it before";
  93. {
  94. SCOPED_TRACE("First init");
  95. doInit();
  96. }
  97. boost::shared_ptr<TSIGKeyRing> backup(keyring);
  98. {
  99. SCOPED_TRACE("Second init");
  100. EXPECT_NO_THROW(initKeyring(*mccs)) <<
  101. "It not only does something when it is already initialized, "
  102. "it even throws at it";
  103. }
  104. EXPECT_EQ(backup, keyring) << "The second init replaced the data";
  105. deinitKeyring(*mccs);
  106. }
  107. // deinit when not initialized
  108. TEST_F(KeyringTest, extraDeinit) {
  109. // It is NULL before
  110. EXPECT_EQ(boost::shared_ptr<TSIGKeyRing>(), keyring) <<
  111. "Someone forgot to deinit it before";
  112. // Check that it doesn't get confused when we do not have it initialized
  113. EXPECT_NO_THROW(deinitKeyring(*mccs));
  114. // It is still NULL
  115. EXPECT_EQ(keyring, boost::shared_ptr<TSIGKeyRing>()) <<
  116. "Where did it get something after deinit?";
  117. }
  118. }