You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by th...@apache.org on 2011/08/19 12:08:08 UTC
svn commit: r1159568 - in /jackrabbit/sandbox/microkernel/src:
main/java/org/apache/jackrabbit/mk/json/
main/java/org/apache/jackrabbit/mk/util/ test/java/org/apache/jackrabbit/mk/
test/java/org/apache/jackrabbit/mk/json/ test/java/org/apache/jackrabbi...
Author: thomasm
Date: Fri Aug 19 10:08:07 2011
New Revision: 1159568
URL: http://svn.apache.org/viewvc?rev=1159568&view=rev
Log:
Moved and improved utility tests.
Added:
jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/IOUtilsTest.java
- copied, changed from r1155401, jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/UtilsTest.java
jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/NonDescendingClockTest.java
- copied, changed from r1153492, jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/ClockTest.java
jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/StringUtilsTest.java
Removed:
jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/ClockTest.java
jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/UtilsTest.java
Modified:
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopBuilder.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/NonDescendingClock.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/StringUtils.java
jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/HelloWorld.java
jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopBuilder.java?rev=1159568&r1=1159567&r2=1159568&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopBuilder.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopBuilder.java Fri Aug 19 10:08:07 2011
@@ -261,7 +261,7 @@ public class JsopBuilder {
buff.append('0');
}
buff.append(hex);
- } else if (ch > 127) {
+ } else if (ch >= 127) {
// ascii only mode
buff.append("\\u");
String hex = Integer.toHexString(c);
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java?rev=1159568&r1=1159567&r2=1159568&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/json/JsopTokenizer.java Fri Aug 19 10:08:07 2011
@@ -82,6 +82,7 @@ public class JsopTokenizer {
* Read a token which must match a given token type.
*
* @param type the token type
+ * @return the token (a null object when reading a null value)
* @throws IllegalStateException if the token type doesn't match
*/
public String read(int type) {
@@ -94,6 +95,7 @@ public class JsopTokenizer {
/**
* Read a string.
*
+ * @return the de-escaped string
* @throws IllegalStateException if the token type doesn't match
*/
public String readString() {
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/NonDescendingClock.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/NonDescendingClock.java?rev=1159568&r1=1159567&r2=1159568&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/NonDescendingClock.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/NonDescendingClock.java Fri Aug 19 10:08:07 2011
@@ -51,7 +51,7 @@ public class NonDescendingClock {
long now = System.currentTimeMillis();
if (now > last) {
last = now;
- count = 0;
+ count = MAX_REPEAT;
} else {
if (count-- <= 0) {
last++;
@@ -61,4 +61,13 @@ public class NonDescendingClock {
return last;
}
+ /**
+ * Get the maximum number of times the same time is returned.
+ *
+ * @return the count
+ */
+ int getRemainingCount() {
+ return count;
+ }
+
}
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/StringUtils.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/StringUtils.java?rev=1159568&r1=1159567&r2=1159568&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/StringUtils.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/util/StringUtils.java Fri Aug 19 10:08:07 2011
@@ -43,16 +43,6 @@ public class StringUtils {
}
/**
- * Append a number as two hex digits to the string builder.
- *
- * @param buff the string builder
- * @param x the number to append
- */
- public static void appendHex(StringBuilder buff, int x) {
- buff.append(HEX[x >> 4]).append(HEX[x & 0xf]);
- }
-
- /**
* Convert a hex encoded string to a byte array.
*
* @param s the hex encoded string
@@ -78,7 +68,7 @@ public class StringUtils {
* @param i the index
* @return the number
*/
- public static int getHexDigit(String s, int i) {
+ private static int getHexDigit(String s, int i) {
char c = s.charAt(i);
if (c >= '0' && c <= '9') {
return c - '0';
Modified: jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/HelloWorld.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/HelloWorld.java?rev=1159568&r1=1159567&r2=1159568&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/HelloWorld.java (original)
+++ jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/HelloWorld.java Fri Aug 19 10:08:07 2011
@@ -16,19 +16,24 @@
*/
package org.apache.jackrabbit.mk;
+import java.util.ArrayList;
import org.apache.jackrabbit.mk.api.MicroKernel;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
/**
* A simple hello world app.
*/
public class HelloWorld {
- public static void main(String... args) {
- test("mem:");
- test("fs:{homeDir};clean");
+ public static void main(String... args) throws ParseException {
+ // test("mem:");
+ test("fs:{homeDir};clean");
}
- private static void test(String url) {
+ private static void test(String url) throws ParseException {
MicroKernel mk = MicroKernelFactory.getInstance(url);
@@ -42,26 +47,30 @@ public class HelloWorld {
head = mk.commit("/", "-\"test\"", head, null);
}
- head = mk.commit("/", "+\"foo\" : {\"bar\":{\"x\":\"100\"}}", head, null);
- String s = mk.getNodes("/foo/bar", head);
- System.out.println(s);
-
- // head = mk.commit(null, "+\"/test\" : {\"name\":\"hello\"}", head);
- head = mk.commit("/", "+\"test\" : {\"y\":\"true\", \"text\":[\"hello\", \"world\", true]}", head, null);
-
- // head = mk.commit(null, "+\"/test\" : {\"name\":\"hello\"}", head);
- head = mk.commit("/", "^\"test/x\" : false", head, null);
- head = mk.commit("/", "^\"test/x\" : null", head, null);
-
- // head = mk.getHeadRevision();
- s = mk.getNodes("/test", head);
- // {":name":"test","name":"hello",":childNodeCount":0}
+ head = mk.commit("/", "+\"test\" : {\"x\":\"1\"}", head, null);
+ head = mk.commit("/", "-\"test\"", head, null);
+ head = mk.commit("/", "+\"test\" : {\"x\":\"1\"}", head, null);
+ head = mk.commit("/", "-\"test\" +\"test\" : {\"x\":\"2\"}", head, null);
- System.out.println(s);
+ String revs = mk.getRevisions(0, 100);
- head = mk.commit("/", "-\"test\"", head, null);
- s = mk.getNodes("/", head);
- System.out.println(s);
+ ArrayList<String> revList = new ArrayList<String>();
+ JSONParser p = new JSONParser();
+ JSONArray a = (JSONArray) p.parse(revs);
+ for (int i=0; i<a.size(); i++) {
+ JSONObject o = (JSONObject) a.get(i);
+ revList.add(o.get("id").toString());
+ }
+
+ String j;
+ j = mk.getJournal(revList.get(0), revList.get(revList.size() - 1));
+ System.out.println(j);
+ j = mk.getJournal(revList.get(0), revList.get(1));
+ System.out.println(j);
+ j = mk.getJournal(revList.get(1), revList.get(revList.size() - 1));
+ System.out.println(j);
+ j = mk.getJournal(revList.get(2), revList.get(revList.size() - 1));
+ System.out.println(j);
mk.dispose();
Modified: jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java?rev=1159568&r1=1159567&r2=1159568&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java (original)
+++ jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/json/JsopTest.java Fri Aug 19 10:08:07 2011
@@ -45,6 +45,26 @@ public class JsopTest extends TestCase {
assertEquals("\\/Date(0)\\/", t.getEscapedToken());
}
+ public void testNull() {
+ JsopTokenizer t = new JsopTokenizer("null");
+ assertEquals(null, t.read(JsopTokenizer.NULL));
+ }
+
+ public void testNumber() {
+ JsopTokenizer t = new JsopTokenizer("9/3:-3-:-/- 3");
+ assertEquals("9", t.read(JsopTokenizer.NUMBER));
+ t.read('/');
+ assertEquals("3", t.read(JsopTokenizer.NUMBER));
+ t.read(':');
+ assertEquals("-3", t.read(JsopTokenizer.NUMBER));
+ t.read('-');
+ t.read(':');
+ t.read('-');
+ t.read('/');
+ t.read('-');
+ t.read(JsopTokenizer.NUMBER);
+ }
+
public void testRawValue() {
JsopTokenizer t = new JsopTokenizer("{\"x\": [1], null, true, {\"y\": 1}, error}");
t.read('{');
@@ -109,6 +129,8 @@ public class JsopTest extends TestCase {
test(" {\n\n}\n", "{}");
test(" {\n\"a\": /* test */ 10\n}\n", "{ \"a\": /* test */ 10}");
test("+ - / ^ ", "+ - / ^");
+ test("/*/ comment /*/ ", "/*/ comment /*/");
+ test("/**/ /error//**/ ", "/**/ comment /**/");
JsopTokenizer t = new JsopTokenizer("{}123");
assertFalse(t.matches('+'));
@@ -228,8 +250,13 @@ public class JsopTest extends TestCase {
key("boolean").value(true).
key("null").value(null).
key("arr").array().
- value(1).
- value("42").
+ array().
+ value(1).
+ value("\u001f ~ \u007f \u0080").
+ value("42").
+ endArray().
+ array().
+ endArray().
endArray().
endObject().
key("some").value("more").
@@ -238,9 +265,9 @@ public class JsopTest extends TestCase {
String json = buff.toString();
assertEquals("+ {\"foo\":\"bar\",\"int\":3,\"decimal\":3.0," +
"\"obj\":{\"boolean\":true,\"null\":null," +
- "\"arr\":[1,\"42\"]},\"some\":\"more\"}", json);
+ "\"arr\":[[1,\"\\u001f ~ \\u007f \\u0080\",\"42\"],[]]},\"some\":\"more\"}", json);
- buff = new JsopBuilder();
+ buff.reset();
buff.array().
object().key("x").value("1").endObject().appendWhitespace("\n").
object().key("y").value("2").endObject().appendWhitespace("\n").
Copied: jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/IOUtilsTest.java (from r1155401, jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/UtilsTest.java)
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/IOUtilsTest.java?p2=jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/IOUtilsTest.java&p1=jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/UtilsTest.java&r1=1155401&r2=1159568&rev=1159568&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/UtilsTest.java (original)
+++ jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/IOUtilsTest.java Fri Aug 19 10:08:07 2011
@@ -18,14 +18,69 @@ package org.apache.jackrabbit.mk.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
+import java.io.EOFException;
+import java.io.FilterInputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.util.Random;
+import java.util.concurrent.atomic.AtomicInteger;
import junit.framework.TestCase;
/**
* Test the utility classes.
*/
-public class UtilsTest extends TestCase {
+public class IOUtilsTest extends TestCase {
+
+ public void testReadFully() throws IOException {
+ final Random r = new Random(1);
+ byte[] data = new byte[1000];
+ final AtomicInteger readCount = new AtomicInteger();
+ r.nextBytes(data);
+ FilterInputStream in = new FilterInputStream(new ByteArrayInputStream(data)) {
+ public int read(byte[] buffer, int off, int max) throws IOException {
+ readCount.incrementAndGet();
+ if (r.nextInt(10) == 0) {
+ return 0;
+ }
+ return in.read(buffer, off, Math.min(10, max));
+ }
+ };
+ in.mark(10000);
+ byte[] test = new byte[1000];
+
+ // readFully is not supposed to call read when reading 0 bytes
+ assertEquals(0, IOUtils.readFully(in, test, 0, 0));
+ assertEquals(0, readCount.get());
+
+ assertEquals(1000, IOUtils.readFully(in, test, 0, 1000));
+ StringUtilsTest.assertEquals(data, test);
+ test = new byte[1001];
+ in.reset();
+ in.mark(10000);
+ assertEquals(1000, IOUtils.readFully(in, test, 0, 1001));
+ assertEquals(0, IOUtils.readFully(in, test, 0, 0));
+ }
+
+ public void testSkipFully() throws IOException {
+ final Random r = new Random(1);
+ byte[] data = new byte[1000];
+ r.nextBytes(data);
+ FilterInputStream in = new FilterInputStream(new ByteArrayInputStream(data)) {
+ public int read(byte[] buffer, int off, int max) throws IOException {
+ return in.read(buffer, off, Math.min(10, max));
+ }
+ };
+ in.mark(10000);
+ IOUtils.skipFully(in, 1000);
+ assertEquals(-1, in.read());
+ in.reset();
+ try {
+ IOUtils.skipFully(in, 1001);
+ fail();
+ } catch (EOFException e) {
+ // expected
+ }
+ }
public void testStringReadWrite() throws IOException {
final Random r = new Random(1);
@@ -50,6 +105,13 @@ public class UtilsTest extends TestCase
assertEquals(s, t);
assertEquals(-1, in.read());
}
+ try {
+ InputStream in = new ByteArrayInputStream(new byte[]{1});
+ IOUtils.readString(in);
+ fail();
+ } catch (EOFException e) {
+ // expected
+ }
}
public void testVarInt() throws IOException {
@@ -71,10 +133,15 @@ public class UtilsTest extends TestCase
testVarInt(0x10000000 + x - 100, 0);
}
Random r = new Random(1);
- for (int i=0; i < 100000; i++) {
+ for (int i = 0; i < 100000; i++) {
testVarInt(r.nextInt(), 0);
testVarInt(r.nextInt(10000000), 0);
}
+
+ // trailing 0s are never written, but are an alternative way to encode a value
+ InputStream in = new ByteArrayInputStream(new byte[]{(byte) 0x80, 0});
+ assertEquals(0, IOUtils.readVarInt(in));
+ assertEquals(-1, in.read());
}
public void testVarLong() throws IOException {
@@ -108,6 +175,11 @@ public class UtilsTest extends TestCase
testVarLong(r.nextLong(), 0);
testVarLong(r.nextInt(Integer.MAX_VALUE), 0);
}
+
+ // trailing 0s are never written, but are an alternative way to encode a value
+ InputStream in = new ByteArrayInputStream(new byte[]{(byte) 0x80, 0});
+ assertEquals(0, IOUtils.readVarLong(in));
+ assertEquals(-1, in.read());
}
Copied: jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/NonDescendingClockTest.java (from r1153492, jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/ClockTest.java)
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/NonDescendingClockTest.java?p2=jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/NonDescendingClockTest.java&p1=jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/ClockTest.java&r1=1153492&r2=1159568&rev=1159568&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/ClockTest.java (original)
+++ jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/NonDescendingClockTest.java Fri Aug 19 10:08:07 2011
@@ -14,30 +14,35 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.jackrabbit.mk;
+package org.apache.jackrabbit.mk.util;
import org.apache.jackrabbit.mk.util.NonDescendingClock;
import junit.framework.TestCase;
-public class ClockTest extends TestCase {
+public class NonDescendingClockTest extends TestCase {
public void test() throws InterruptedException {
long last = System.currentTimeMillis() + 10000;
NonDescendingClock c = new NonDescendingClock(last);
for (int i = 0; i < 1000; i++) {
+ assertEquals(1000 - i, c.getRemainingCount());
long n = c.time();
assertEquals(last + 1, n);
}
+ assertEquals(0, c.getRemainingCount());
for (int i = 0; i < 1000; i++) {
long n = c.time();
assertEquals(last + 2, n);
+ assertEquals(1000 - i, c.getRemainingCount());
}
+ assertEquals(1, c.getRemainingCount());
long now = System.currentTimeMillis();
c = new NonDescendingClock(now);
for (int i = 0; i < 10; i++) {
Thread.sleep(10);
long x = c.time();
assertTrue(x > now);
+ assertEquals(1000, c.getRemainingCount());
now = x;
}
}
Added: jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/StringUtilsTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/StringUtilsTest.java?rev=1159568&view=auto
==============================================================================
--- jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/StringUtilsTest.java (added)
+++ jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/util/StringUtilsTest.java Fri Aug 19 10:08:07 2011
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.mk.util;
+
+import junit.framework.TestCase;
+
+/**
+ * Test the string utilities.
+ */
+public class StringUtilsTest extends TestCase {
+
+ public void testHex() {
+ assertEquals("0123", StringUtils.convertBytesToHex(new byte[] { (byte) 0x01, (byte) 0x23 }));
+ assertEquals("89bd", StringUtils.convertBytesToHex(new byte[] { (byte) 0x89, (byte) 0xbd }));
+ assertEquals("face", StringUtils.convertBytesToHex(new byte[] { (byte) 0xfa, (byte) 0xce }));
+ assertEquals(new byte[] { (byte) 0xfa, (byte) 0xce }, StringUtils.convertHexToBytes("face"));
+ assertEquals(new byte[] { (byte) 0xfa, (byte) 0xce }, StringUtils.convertHexToBytes("fAcE"));
+ assertEquals(new byte[] { (byte) 0xfa, (byte) 0xce }, StringUtils.convertHexToBytes("FaCe"));
+ assertEquals(new byte[] { (byte) 0x09, (byte) 0xaf }, StringUtils.convertHexToBytes("09af"));
+ for (String s : new String[]{"120", "1/", "9:", "fast", "a`", "ag", "0@", "aG"}) {
+ try {
+ StringUtils.convertHexToBytes(s);
+ fail();
+ } catch (IllegalArgumentException e) {
+ // expected
+ }
+ }
+ }
+
+ public static void assertEquals(byte[] expected, byte[] got) {
+ assertEquals(expected.length, got.length);
+ for (int i = 0; i < got.length; i++) {
+ assertEquals(expected[i], got[i]);
+ }
+ }
+
+}