diff options
author | Michael Cahill <michael.cahill@mongodb.com> | 2016-01-25 15:09:24 +1100 |
---|---|---|
committer | Michael Cahill <michael.cahill@mongodb.com> | 2016-01-25 15:09:24 +1100 |
commit | d3f0af2aaa9ae0b624193ee314287f1b2490bb71 (patch) | |
tree | ddf17480e2fe043301d8381abfc85fb174da711c | |
parent | 0f710425ba5ad4a37cda70f19954f1113531f7c3 (diff) | |
parent | 2f23a5e4e667298b0e7b3d1dc23b6606a6649111 (diff) | |
download | mongo-d3f0af2aaa9ae0b624193ee314287f1b2490bb71.tar.gz |
Merge pull request #2459 from wiredtiger/WT-2347-java-schema-format
WT-2347 Java fix for unsized 's' schema format
-rw-r--r-- | lang/java/Makefile.am | 1 | ||||
-rw-r--r-- | lang/java/src/com/wiredtiger/db/PackOutputStream.java | 5 | ||||
-rw-r--r-- | test/java/com/wiredtiger/test/ConfigTest.java | 192 | ||||
-rw-r--r-- | test/java/com/wiredtiger/test/WiredTigerSuite.java | 1 |
4 files changed, 195 insertions, 4 deletions
diff --git a/lang/java/Makefile.am b/lang/java/Makefile.am index b9871cf2599..192e44a05d2 100644 --- a/lang/java/Makefile.am +++ b/lang/java/Makefile.am @@ -45,6 +45,7 @@ JAVA_JUNIT = \ $(JAVATEST)/AutoCloseTest.java \ $(JAVATEST)/AsyncTest.java \ $(JAVATEST)/BackupCursorTest.java \ + $(JAVATEST)/ConfigTest.java \ $(JAVATEST)/CursorTest.java \ $(JAVATEST)/CursorTest02.java \ $(JAVATEST)/ExceptionTest.java \ diff --git a/lang/java/src/com/wiredtiger/db/PackOutputStream.java b/lang/java/src/com/wiredtiger/db/PackOutputStream.java index b7a79295d73..805e34f6ca8 100644 --- a/lang/java/src/com/wiredtiger/db/PackOutputStream.java +++ b/lang/java/src/com/wiredtiger/db/PackOutputStream.java @@ -206,14 +206,11 @@ public class PackOutputStream { } else { stringLen = value.length(); } - if (havesize) { + if (havesize || fieldFormat == 's') { size = format.getLengthFromFormat(true); if (stringLen > size) { stringLen = size; } - } else if (fieldFormat == 's') { - havesize = true; - size = 1; } if (fieldFormat == 'S' && !havesize) { diff --git a/test/java/com/wiredtiger/test/ConfigTest.java b/test/java/com/wiredtiger/test/ConfigTest.java new file mode 100644 index 00000000000..2afde7df2dc --- /dev/null +++ b/test/java/com/wiredtiger/test/ConfigTest.java @@ -0,0 +1,192 @@ +/*- + * Public Domain 2014-2016 MongoDB, Inc. + * Public Domain 2008-2014 WiredTiger, Inc. + * + * This is free and unencumbered software released into the public domain. + * + * Anyone is free to copy, modify, publish, use, compile, sell, or + * distribute this software, either in source code form or as a compiled + * binary, for any purpose, commercial or non-commercial, and by any + * means. + * + * In jurisdictions that recognize copyright laws, the author or authors + * of this software dedicate any and all copyright interest in the + * software to the public domain. We make this dedication for the benefit + * of the public at large and to the detriment of our heirs and + * successors. We intend this dedication to be an overt act of + * relinquishment in perpetuity of all present and future rights to this + * software under copyright law. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +package com.wiredtiger.test; + +import com.wiredtiger.db.Connection; +import com.wiredtiger.db.Cursor; +import com.wiredtiger.db.Session; +import com.wiredtiger.db.WiredTigerException; +import com.wiredtiger.db.wiredtiger; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.junit.Assert; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +public class ConfigTest { + Connection conn; + Session session; + + public static final String uri = "table:test_config06"; + public static final String key = "keyABCDEFGHIJKLMNOPQRSTUVWXYZ"; + public static final String value = "valueABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + public void session_config(String config) { + Exception e = null; + + try { + session.create(uri, config); + } + catch (WiredTigerException wte) { + e = wte; + } + + Assert.assertTrue(e != null && + e.toString().indexOf("Invalid argument") >= 0); + } + + // Edge cases for key/value formats. + @Test + public void test_session_config() + throws WiredTigerException { + setup(); + System.err.println("\n-- expect error output --"); + session_config("key_format=A,value_format=S"); + session_config("key_format=S,value_format=A"); + session_config("key_format=0s,value_format=s"); + session_config("key_format=s,value_format=0s"); + session_config("key_format=0t,value_format=4t"); + session_config("key_format=4t,value_format=0t"); + System.err.println("-- end expected error output --"); + teardown(); + } + + // Smoke-test the string formats with length specifiers; both formats should + // ignore trailing bytes, verify that. + public void format_string(String fmt, int len) + throws WiredTigerException { + setup(); + session.create(uri, "key_format=" + len + fmt + + ",value_format=" + len + fmt); + Cursor cursor = session.open_cursor(uri, null, null); + cursor.putKeyString(key); + cursor.putValueString(value); + cursor.insert(); + cursor.putKeyString(key.substring(0,len)); + assertEquals(0, cursor.search()); + assertEquals(value.substring(0,len), cursor.getValueString()); + cursor.close(); + session.drop(uri, null); + teardown(); + } + + @Test + public void test_format_string_S_1() + throws WiredTigerException { + format_string("S", 1); + } + @Test + public void test_format_string_S_4() + throws WiredTigerException { + format_string("S", 4); + } + @Test + public void test_format_string_S_10() + throws WiredTigerException { + format_string("S", 10); + } + @Test + public void test_format_string_s_1() + throws WiredTigerException { + format_string("s", 1); + } + @Test + public void test_format_string_s_4() + throws WiredTigerException { + format_string("s", 4); + } + @Test + public void test_format_string_s_10() + throws WiredTigerException { + format_string("s", 10); + } + + @Test + public void test_format_string_S_default() + throws WiredTigerException { + setup(); + session.create(uri, "key_format=S,value_format=S"); + Cursor cursor = session.open_cursor(uri, null, null); + cursor.putKeyString(key); + cursor.putValueString(value); + cursor.insert(); + cursor.putKeyString(key); + assertEquals(0, cursor.search()); + assertEquals(value, cursor.getValueString()); + cursor.close(); + session.drop(uri, null); + teardown(); + } + + @Test + public void test_format_string_s_default() + throws WiredTigerException { + setup(); + session.create(uri, "key_format=s,value_format=s"); + Cursor cursor = session.open_cursor(uri, null, null); + cursor.putKeyString(key); + cursor.putValueString(value); + cursor.insert(); + cursor.putKeyString(key.substring(0,1)); + assertEquals(0, cursor.search()); + assertEquals(value.substring(0,1), cursor.getValueString()); + cursor.close(); + session.drop(uri, null); + teardown(); + } + + public static void main(String[] args) { + ConfigTest tester = new ConfigTest(); + try { + tester.test_session_config(); + tester.test_format_string_S_1(); + tester.test_format_string_S_4(); + tester.test_format_string_S_10(); + tester.test_format_string_s_1(); + tester.test_format_string_s_4(); + tester.test_format_string_s_10(); + tester.test_format_string_S_default(); + tester.test_format_string_s_default(); + } catch (WiredTigerException wte) { + System.err.println("WiredTigerException: " + wte); + } + } + + private void setup() { + conn = wiredtiger.open("WT_HOME", "create"); + session = conn.open_session(null); + } + + private void teardown() { + session.close(""); + conn.close(""); + } + +} diff --git a/test/java/com/wiredtiger/test/WiredTigerSuite.java b/test/java/com/wiredtiger/test/WiredTigerSuite.java index a0d002f2c3c..5bd98d53fac 100644 --- a/test/java/com/wiredtiger/test/WiredTigerSuite.java +++ b/test/java/com/wiredtiger/test/WiredTigerSuite.java @@ -35,6 +35,7 @@ import org.junit.runners.Suite; AsyncTest.class, AutoCloseTest.class, BackupCursorTest.class, + ConfigTest.class, CursorTest.class, CursorTest02.class, ExceptionTest.class, |