summaryrefslogtreecommitdiff
path: root/src/mongo/db/keypattern_test.cpp
diff options
context:
space:
mode:
authorGreg Studer <greg@10gen.com>2014-09-19 13:30:00 -0400
committerGreg Studer <greg@10gen.com>2014-10-16 18:38:12 -0400
commit22f8b6259602a76f8d22cba8b1098f9e3c90a36f (patch)
tree7cf4bd3d8b5439c4e42ca1be7ee6161a69af73a2 /src/mongo/db/keypattern_test.cpp
parent02c1c52514c7d6b54ff2d6dd6a3c564c3543f0a5 (diff)
downloadmongo-22f8b6259602a76f8d22cba8b1098f9e3c90a36f.tar.gz
SERVER-14973 consolidate shard key parsing, cleanup shard key patterns
Diffstat (limited to 'src/mongo/db/keypattern_test.cpp')
-rw-r--r--src/mongo/db/keypattern_test.cpp142
1 files changed, 142 insertions, 0 deletions
diff --git a/src/mongo/db/keypattern_test.cpp b/src/mongo/db/keypattern_test.cpp
new file mode 100644
index 00000000000..63b9b325d75
--- /dev/null
+++ b/src/mongo/db/keypattern_test.cpp
@@ -0,0 +1,142 @@
+/* Copyright 2014 MongoDB Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * As a special exception, the copyright holders give permission to link the
+ * code of portions of this program with the OpenSSL library under certain
+ * conditions as described in each individual source file and distribute
+ * linked combinations including the program with the OpenSSL library. You
+ * must comply with the GNU Affero General Public License in all respects
+ * for all of the code used other than as permitted herein. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you do not
+ * wish to do so, delete this exception statement from your version. If you
+ * delete this exception statement from all source files in the program,
+ * then also delete it in the license file.
+ */
+
+#include "mongo/db/keypattern.h"
+
+#include "mongo/unittest/unittest.h"
+
+namespace {
+
+ using namespace mongo;
+
+ TEST(KeyPattern, ExtendRangeBound) {
+
+ BSONObj bound = BSON("a" << 55);
+ BSONObj longBound = BSON("a" << 55 << "b" << 66);
+
+ //test keyPattern shorter than bound, should fail
+ {
+ KeyPattern keyPat(BSON("a" << 1));
+ ASSERT_THROWS(keyPat.extendRangeBound(longBound, false), MsgAssertionException);
+ }
+
+ //test keyPattern doesn't match bound, should fail
+ {
+ KeyPattern keyPat(BSON("b" << 1));
+ ASSERT_THROWS(keyPat.extendRangeBound(bound, false), MsgAssertionException);
+ }
+ {
+ KeyPattern keyPat(BSON("a" << 1 << "c" << 1));
+ ASSERT_THROWS(keyPat.extendRangeBound(longBound, false), MsgAssertionException);
+ }
+
+ //test keyPattern same as bound
+ {
+ KeyPattern keyPat(BSON("a" << 1));
+ BSONObj newB = keyPat.extendRangeBound(bound, false);
+ ASSERT_EQUALS(newB, BSON("a" << 55));
+ }
+ {
+ KeyPattern keyPat(BSON("a" << 1));
+ BSONObj newB = keyPat.extendRangeBound(bound, false);
+ ASSERT_EQUALS(newB, BSON("a" << 55));
+ }
+
+ //test keyPattern longer than bound, simple
+ {
+ KeyPattern keyPat(BSON("a" << 1 << "b" << 1));
+ BSONObj newB = keyPat.extendRangeBound(bound, false);
+ ASSERT_EQUALS(newB, BSON("a" << 55 << "b" << MINKEY));
+ }
+ {
+ KeyPattern keyPat(BSON("a" << 1 << "b" << 1));
+ BSONObj newB = keyPat.extendRangeBound(bound, true);
+ ASSERT_EQUALS(newB, BSON("a" << 55 << "b" << MAXKEY));
+ }
+
+ //test keyPattern longer than bound, more complex pattern directions
+ {
+ KeyPattern keyPat(BSON("a" << 1 << "b" << -1));
+ BSONObj newB = keyPat.extendRangeBound(bound, false);
+ ASSERT_EQUALS(newB, BSON("a" << 55 << "b" << MAXKEY));
+ }
+ {
+ KeyPattern keyPat(BSON("a" << 1 << "b" << -1));
+ BSONObj newB = keyPat.extendRangeBound(bound, true);
+ ASSERT_EQUALS(newB, BSON("a" << 55 << "b" << MINKEY));
+ }
+ {
+
+ KeyPattern keyPat(BSON("a" << 1 << "b" << -1 << "c" << 1));
+ BSONObj newB = keyPat.extendRangeBound(bound, false);
+ ASSERT_EQUALS(newB, BSON("a" << 55 << "b" << MAXKEY << "c" << MINKEY));
+ }
+ {
+ KeyPattern keyPat(BSON("a" << 1 << "b" << -1 << "c" << 1));
+ BSONObj newB = keyPat.extendRangeBound(bound, true);
+ ASSERT_EQUALS(newB, BSON("a" << 55 << "b" << MINKEY << "c" << MAXKEY));
+ }
+ }
+
+ TEST(KeyPattern, GlobalMinMax) {
+
+ //
+ // Simple KeyPatterns
+ //
+
+ ASSERT_EQUALS(KeyPattern(BSON("a" << 1)).globalMin(), BSON("a" << MINKEY));
+ ASSERT_EQUALS(KeyPattern(BSON("a" << 1)).globalMax(), BSON("a" << MAXKEY));
+
+ ASSERT_EQUALS(KeyPattern(BSON("a" << -1)).globalMin(), BSON("a" << MAXKEY));
+ ASSERT_EQUALS(KeyPattern(BSON("a" << -1)).globalMax(), BSON("a" << MINKEY));
+
+ ASSERT_EQUALS(KeyPattern(BSON("a" << 1 << "b" << 1.0)).globalMin(),
+ BSON("a" << MINKEY << "b" << MINKEY));
+ ASSERT_EQUALS(KeyPattern(BSON("a" << 1 << "b" << 1.0)).globalMax(),
+ BSON("a" << MAXKEY << "b" << MAXKEY));
+
+ ASSERT_EQUALS(KeyPattern(BSON("a" << 1 << "b" << -1.0f)).globalMin(),
+ BSON("a" << MINKEY << "b" << MAXKEY));
+ ASSERT_EQUALS(KeyPattern(BSON("a" << 1 << "b" << -1.0f)).globalMax(),
+ BSON("a" << MAXKEY << "b" << MINKEY));
+
+ ASSERT_EQUALS(KeyPattern(BSON("a" << "hashed")).globalMin(), BSON("a" << MINKEY));
+ ASSERT_EQUALS(KeyPattern(BSON("a" << "hashed")).globalMax(), BSON("a" << MAXKEY));
+
+ //
+ // Nested KeyPatterns
+ //
+
+ ASSERT_EQUALS(KeyPattern(BSON("a.b" << 1)).globalMin(), BSON("a.b" << MINKEY));
+ ASSERT_EQUALS(KeyPattern(BSON("a.b" << 1)).globalMax(), BSON("a.b" << MAXKEY));
+
+ ASSERT_EQUALS(KeyPattern(BSON("a.b.c" << -1)).globalMin(), BSON("a.b.c" << MAXKEY));
+ ASSERT_EQUALS(KeyPattern(BSON("a.b.c" << -1)).globalMax(), BSON("a.b.c" << MINKEY));
+ }
+
+}
+