/** * Check client got operations from the server with the version before the first op and * the given number of ops. */ public TestConfig checkClientGotOps(int startVersion, int numOps) { clientReceiveOpFromCC(numOps != 0); ArrayList<WaveletOperation> clientGot = clientMock.getServerOperations(); assertEquals(numOps, clientGot.size()); for (int i = 0; i < numOps; i++) { assertEquals(1, clientGot.get(i).getContext().getVersionIncrement()); } // Clear the client recieved ops in clientMock clientGot.clear(); return this; }
TestConfig t = new TestConfig(); t.init(0); t.clientDoOps(1).checkClientSentOps(0).checkClientGotOps(); t.serverAck(1).checkClientSentOps().checkClientGotOps(0); t.clientDoOps(2).checkClientSentOps(1, 2).checkClientGotOps(); t.serverAck(3, 2).checkClientSentOps().checkClientGotOps(1, 2); t.clientDoOps(1).checkClientSentOps(3).checkClientGotOps(); t.clientDoOps(1).checkClientSentOps().checkClientGotOps(); t.disconnectFromServer(); t.clientDoOps(1).checkClientSentOps().checkClientGotOps(); t.reconnectToServer().checkClientSentOpen(0, 1, 3); t.serverDoOpen(1, 3).checkClientSentOps(1, 2); t.init(0); t.clientDoOps(1).checkClientSentOps(0).checkClientGotOps(); t.serverAck(1).checkClientSentOps().checkClientGotOps(0); t.clientDoOps(1).checkClientSentOps(1).checkClientGotOps(); t.serverAck(2).checkClientSentOps().checkClientGotOps(1); t.clientDoOps(1).checkClientSentOps(2).checkClientGotOps(); t.clientDoOps(1).checkClientSentOps().checkClientGotOps(); t.reconnectToServer().checkClientSentOpen(0, 1, 2); t.serverDoOpen(2, 2).checkClientSentOps(2, 1);
TestConfig t = new TestConfig(); t.init(0); t.clientDoOps(1).checkClientSentOps(0).checkClientGotOps(); t.serverAck(1).checkClientSentOps().checkClientGotOps(0); t.clientDoOps(2).checkClientSentOps(1, 2).checkClientGotOps(); t.serverAck(3, 2).checkClientSentOps().checkClientGotOps(1, 2); t.clientDoOps(1).checkClientSentOps(3).checkClientGotOps(); t.clientDoOps(1).checkClientSentOps().checkClientGotOps(); t.disconnectFromServer(); t.clientDoOps(1).checkClientSentOps().checkClientGotOps(); t.reconnectToServer().checkClientSentOpen(0, 1, 3); t.serverDoOpen(1, 3).checkClientSentOps(1, 2); t.init(0); t.clientDoOps(1).checkClientSentOps(0).checkClientGotOps(); t.serverAck(1).checkClientSentOps().checkClientGotOps(0); t.clientDoOps(1).checkClientSentOps(1).checkClientGotOps(); t.serverAck(2).checkClientSentOps().checkClientGotOps(1); t.clientDoOps(1).checkClientSentOps(2).checkClientGotOps(); t.clientDoOps(1).checkClientSentOps().checkClientGotOps(); t.reconnectToServer().checkClientSentOpen(0, 1, 2); t.serverDoOpen(2, 2).checkClientSentOps(2, 1);
TestConfig t = new TestConfig(); t.init(0); t.checkClientGotOps().checkClientSentOps(); t.init(0, "<blip><p>abc</p></blip>"); t.clientDoInsert(2, "X"); t.checkClientGotOps().checkClientSentOps(0).checkClientDoc("<blip><p>Xabc</p></blip>"); t.init(0, "<blip><p>abc</p></blip>"); t.serverDoInsert(0, 2, "X", 5); t.checkClientGotOps(0).checkClientSentOps().checkClientDoc("<blip><p>Xabc</p></blip>"); t.init(0, "<blip><p>abc</p></blip>"); t.clientDoInsert(2, "X").serverDoInsert(0, 3, "Y", 4); t.checkClientGotOps(0).checkClientSentOps(0).checkClientDoc("<blip><p>XaYbc</p></blip>"); t.init(0, "<blip><p>abc</p></blip>"); t.clientDoInsert(2, "X").clientDoInsert(3, "Y"); t.serverDoInsert(0, 3, "A", 4); t.checkClientGotOps(0).checkClientSentOps(0).checkClientDoc("<blip><p>XYaAbc</p></blip>"); t.init(0, "<blip><p>abc</p></blip>"); t.clientDoInsert(2, "X", false).clientDoInsert(4, "Y").clientDoInsert(6, "Z"); t.serverDoInsert(0, 3, "A", 5); t.checkClientGotOps(0).checkClientSentOps(0, 1).checkClientDoc("<blip><p>XaYAbZc</p></blip>"); t.init(0, "<blip><p>abc</p></blip>"); t.clientDoInsert(2, "X").serverDoInsert(0, 3, "Y", 4).serverDoInsert(1, 4, "Z", 4);
TestConfig t = new TestConfig(); t.init(0); t.checkClientGotOps().checkClientSentOps(); t.init(0, "<blip><p>abc</p></blip>"); t.clientDoInsert(2, "X"); t.checkClientGotOps().checkClientSentOps(0).checkClientDoc("<blip><p>Xabc</p></blip>"); t.init(0, "<blip><p>abc</p></blip>"); t.serverDoInsert(0, 2, "X", 5); t.checkClientGotOps(0).checkClientSentOps().checkClientDoc("<blip><p>Xabc</p></blip>"); t.init(0, "<blip><p>abc</p></blip>"); t.clientDoInsert(2, "X").serverDoInsert(0, 3, "Y", 4); t.checkClientGotOps(0).checkClientSentOps(0).checkClientDoc("<blip><p>XaYbc</p></blip>"); t.init(0, "<blip><p>abc</p></blip>"); t.clientDoInsert(2, "X").clientDoInsert(3, "Y"); t.serverDoInsert(0, 3, "A", 4); t.checkClientGotOps(0).checkClientSentOps(0).checkClientDoc("<blip><p>XYaAbc</p></blip>"); t.init(0, "<blip><p>abc</p></blip>"); t.clientDoInsert(2, "X", false).clientDoInsert(4, "Y").clientDoInsert(6, "Z"); t.serverDoInsert(0, 3, "A", 5); t.checkClientGotOps(0).checkClientSentOps(0, 1).checkClientDoc("<blip><p>XaYAbZc</p></blip>"); t.init(0, "<blip><p>abc</p></blip>"); t.clientDoInsert(2, "X").serverDoInsert(0, 3, "Y", 4).serverDoInsert(1, 4, "Z", 4);
TestConfig t = new TestConfig(); t.init(0); t.clientDoOps(1).checkClientSentOps(0); t.serverAck(1).checkClientSentOps(); t.init(0); t.serverDoOps(0).checkClientGotOps(0).checkClientSentOps(); t.init(0); t.clientDoOps(1).checkClientSentOps(0).checkClientGotOps(); t.serverAck(1).checkClientSentOps().checkClientGotOps(0); // Expect a version update op here. t.serverDoOps(1).checkClientSentOps().checkClientGotOps(1); t.clientDoOps(1).clientDoOps(1).checkClientSentOps(2).checkClientGotOps(); t.serverAck(3).checkClientSentOps(3).checkClientGotOps(2); t.serverAck(4).checkClientSentOps().checkClientGotOps(3); t.serverDoOps(4).checkClientSentOps().checkClientGotOps(4); t.init(0); t.clientDoOps(1).checkClientSentOps(0).checkClientGotOps(); t.serverAck(1).checkClientSentOps().checkClientGotOps(0); t.serverDoOps(1).checkClientSentOps().checkClientGotOps(1); t.clientDoOps(1).clientDoOps(1).clientDoOps(1).serverDoOps(2) .checkClientSentOps(2).checkClientGotOps(2); t.serverAck(4).checkClientSentOps(4, 2).checkClientGotOps(3); t.clientDoOps(1).checkClientSentOps().checkClientGotOps();
TestConfig t = new TestConfig(); t.init(0); t.clientDoOps(1).checkClientSentOps(0); t.serverAck(1).checkClientSentOps(); t.init(0); t.serverDoOps(0).checkClientGotOps(0).checkClientSentOps(); t.init(0); t.clientDoOps(1).checkClientSentOps(0).checkClientGotOps(); t.serverAck(1).checkClientSentOps().checkClientGotOps(0); // Expect a version update op here. t.serverDoOps(1).checkClientSentOps().checkClientGotOps(1); t.clientDoOps(1).clientDoOps(1).checkClientSentOps(2).checkClientGotOps(); t.serverAck(3).checkClientSentOps(3).checkClientGotOps(2); t.serverAck(4).checkClientSentOps().checkClientGotOps(3); t.serverDoOps(4).checkClientSentOps().checkClientGotOps(4); t.init(0); t.clientDoOps(1).checkClientSentOps(0).checkClientGotOps(); t.serverAck(1).checkClientSentOps().checkClientGotOps(0); t.serverDoOps(1).checkClientSentOps().checkClientGotOps(1); t.clientDoOps(1).clientDoOps(1).clientDoOps(1).serverDoOps(2) .checkClientSentOps(2).checkClientGotOps(2); t.serverAck(4).checkClientSentOps(4, 2).checkClientGotOps(3); t.clientDoOps(1).checkClientSentOps().checkClientGotOps();
TestConfig t = new TestConfig(); t.init(0); t.clientDoDocOps("blip1").checkClientSentOps(0).checkClientGotOps(); t.clientDoDocOps("blip2").checkClientSentOps().checkClientGotOps(); t.reconnectToServer().checkClientSentOpen(0); t.serverDoOpen(0, 0).checkClientSentOps(0); t.serverDoEchoBackDocOp(0, "blip1").checkClientSentOps().checkClientGotOps(0); t.serverAck(1, 0).checkClientSentOps(1).checkClientGotOps(); t.init(0); t.clientDoDocOps("blip1").checkClientSentOps(0).checkClientGotOps(); t.clientDoDocOps("blip2").checkClientSentOps().checkClientGotOps(); t.serverAck(1).checkClientSentOps(1).checkClientGotOps(0); t.clientDoDocOps("blip3").checkClientSentOps().checkClientGotOps(); t.reconnectToServer().checkClientSentOpen(0, 1); t.serverDoOpen(1, 1).checkClientSentOps(1); t.serverDoEchoBackDocOp(1, "blip2").checkClientSentOps().checkClientGotOps(1); t.serverAck(2, 0).checkClientSentOps(2).checkClientGotOps(); t.reconnectToServer().checkClientSentOpen(2);
TestConfig t = new TestConfig(); t.init(0, "<blip><p>abc</p></blip>"); t.clientDoInsert(2, "X").clientDoInsert(3, "Y", false).checkClientSentOps(0); t.checkClientDoc("<blip><p>XYabc</p></blip>"); t.serverDoInsert(0, 3, "A", 4).serverDoInsert(1, 4, "B", 4); t.clientMock.flush(); t.checkClientGotOps(0, 2).checkClientSentOps().checkClientDoc("<blip><p>XYaABbc</p></blip>"); t.init(0, "<blip><p>abc</p></blip>"); t.clientDoInsert(2, "X").clientDoInsert(3, "Y", false).checkClientSentOps(0); t.checkClientDoc("<blip><p>XYabc</p></blip>"); t.serverDoInsert(0, 3, "A", 4); try { t.checkClientGotOps(0, 2).checkClientSentOps().checkClientDoc("<blip><p>XYABabc</p></blip>"); fail("Expected a runtime exception"); } catch (RuntimeException expected) {
TestConfig t = new TestConfig(); t.init(0); t.clientDoDocOps("blip1").checkClientSentOps(0).checkClientGotOps(); t.clientDoDocOps("blip2").checkClientSentOps().checkClientGotOps(); t.reconnectToServer().checkClientSentOpen(0); t.serverDoOpen(0, 0).checkClientSentOps(0); t.serverDoEchoBackDocOp(0, "blip1").checkClientSentOps().checkClientGotOps(0); t.serverAck(1, 0).checkClientSentOps(1).checkClientGotOps(); t.init(0); t.clientDoDocOps("blip1").checkClientSentOps(0).checkClientGotOps(); t.clientDoDocOps("blip2").checkClientSentOps().checkClientGotOps(); t.serverAck(1).checkClientSentOps(1).checkClientGotOps(0); t.clientDoDocOps("blip3").checkClientSentOps().checkClientGotOps(); t.reconnectToServer().checkClientSentOpen(0, 1); t.serverDoOpen(1, 1).checkClientSentOps(1); t.serverDoEchoBackDocOp(1, "blip2").checkClientSentOps().checkClientGotOps(1); t.serverAck(2, 0).checkClientSentOps(2).checkClientGotOps(); t.reconnectToServer().checkClientSentOpen(2);
TestConfig t = new TestConfig(); t.init(0, "<blip><p>abc</p></blip>"); t.clientDoInsert(2, "X").clientDoInsert(3, "Y", false).checkClientSentOps(0); t.checkClientDoc("<blip><p>XYabc</p></blip>"); t.serverDoInsert(0, 3, "A", 4).serverDoInsert(1, 4, "B", 4); t.clientMock.flush(); t.checkClientGotOps(0, 2).checkClientSentOps().checkClientDoc("<blip><p>XYaABbc</p></blip>"); t.init(0, "<blip><p>abc</p></blip>"); t.clientDoInsert(2, "X").clientDoInsert(3, "Y", false).checkClientSentOps(0); t.checkClientDoc("<blip><p>XYabc</p></blip>"); t.serverDoInsert(0, 3, "A", 4); try { t.checkClientGotOps(0, 2).checkClientSentOps().checkClientDoc("<blip><p>XYABabc</p></blip>"); fail("Expected a runtime exception"); } catch (RuntimeException expected) {
/** * Test errors in the protocol. */ public void testErrorConditions() throws TransformException, OperationException { TestConfig t = new TestConfig(); // Missing ack // c1 /\ s1 // s1' \ // \ s2 t.init(0); t.clientDoOps(1).serverDoOps(0).checkClientSentOps(0).checkClientGotOps(0); try { t.serverDoOps(2); fail("Suppose to fail with unexpected version"); } catch (TransformException ex) { } // Wrong ack // c1 / // // | ack c2 t.init(0); t.clientDoOps(1).checkClientSentOps(0).checkClientGotOps(); try { t.serverAck(2); fail("Suppose to fail with unexpected version"); } catch (TransformException ex) { } }
/** * Tests bundling of operations into deltas and queuing of operations while * others are in flight. */ public void testClientOperationQueuing() throws TransformException, OperationException { TestConfig t = new TestConfig(); // Tests queuing of a delta until one which is in flight has been acked, at // which point the waiting delta should be sent. t.init(1); t.clientDoOps(1).checkClientSentOps(1).checkClientGotOps(); t.clientDoOps(1).checkClientSentOps().checkClientGotOps(); t.serverAck(2).checkClientSentOps(2).checkClientGotOps(1); t.serverAck(3).checkClientSentOps().checkClientGotOps(2); // Tests bundling of operations by the one author into a single delta. t.init(1); t.clientDoOps(new WaveletOperation[] {CLIENT_UTIL.noOp(), CLIENT_UTIL.noOp()}); t.checkClientSentOps(1, 2).checkClientGotOps(); t.serverAck(3, 2).checkClientSentOps().checkClientGotOps(1, 2); // Tests that two operations from differing creators are sent as separate // deltas. In the process, checks again that only one delta is in flight at // a time and that the acking of the first causes the second to be sent. t.init(1); t.clientDoOps(new WaveletOperation[] {CLIENT_UTIL.noOp(), EXTRA_UTIL.noOp()}); t.checkClientSentOps(1, 1).checkClientGotOps(); t.serverAck(2, 1).checkClientSentOps(2, 1).checkClientGotOps(1, 1); t.serverAck(3, 1).checkClientSentOps().checkClientGotOps(2, 1); }
TestConfig t = new TestConfig(); t.init(0); t.clientDoOps(1).checkClientSentOps(0).checkClientGotOps(); t.serverAck(1).checkClientSentOps().checkClientGotOps(0); t.clientDoOps(2).checkClientSentOps(1, 2).checkClientGotOps(); t.serverAck(3, 2).checkClientSentOps().checkClientGotOps(1, 2); t.clientDoOps(1).checkClientSentOps(3).checkClientGotOps(); t.clientDoOps(1).checkClientSentOps().checkClientGotOps(); t.disconnectFromServer(); t.clientDoOps(1).checkClientSentOps().checkClientGotOps(); t.reconnectToServer().checkClientSentOpen(0, 1, 3); t.serverDoOpen(1, 1).checkClientSentOps(1, 2); t.disconnectFromServer(); t.reconnectToServer().checkClientSentOpen(0, 1); t.serverDoOpen(1, 1).checkClientSentOps(1, 2);
TestConfig t = new TestConfig(); t.init(0); t.clientDoOps(1).checkClientSentOps(0).checkClientGotOps(); t.serverAck(1).checkClientSentOps().checkClientGotOps(0); t.clientDoOps(2).checkClientSentOps(1, 2).checkClientGotOps(); t.serverAck(3, 2).checkClientSentOps().checkClientGotOps(1, 2); t.clientDoOps(1).checkClientSentOps(3).checkClientGotOps(); t.clientDoOps(1).checkClientSentOps().checkClientGotOps(); t.disconnectFromServer(); t.clientDoOps(1).checkClientSentOps().checkClientGotOps(); t.reconnectToServer().checkClientSentOpen(0, 1, 3); t.serverDoOpen(1, 1).checkClientSentOps(1, 2); t.disconnectFromServer(); t.reconnectToServer().checkClientSentOpen(0, 1); t.serverDoOpen(1, 1).checkClientSentOps(1, 2);
/** * Test errors in the protocol. */ public void testErrorConditions() throws TransformException, OperationException { TestConfig t = new TestConfig(); // Missing ack // c1 /\ s1 // s1' \ // \ s2 t.init(0); t.clientDoOps(1).serverDoOps(0).checkClientSentOps(0).checkClientGotOps(0); try { t.serverDoOps(2); fail("Suppose to fail with unexpected version"); } catch (TransformException ex) { } // Wrong ack // c1 / // // | ack c2 t.init(0); t.clientDoOps(1).checkClientSentOps(0).checkClientGotOps(); try { t.serverAck(2); fail("Suppose to fail with unexpected version"); } catch (TransformException ex) { } }
/** * Mainly to test that we are doing comparison for doc op. */ public void testEchoBackDocumentEquality() throws Exception { TestConfig t = new TestConfig(); // Simple case // c1 / ack c1 // c2 / ack c2 // c3 (ack lost) / ack c3 <-- connection broken, <-- recover from here // c4 (cached) / t.init(0); // Use different blip ids so that we don't merge ops t.clientDoDocOps("blip1").checkClientSentOps(0).checkClientGotOps(); t.serverAck(1).checkClientSentOps().checkClientGotOps(0); t.clientDoDocOps("blip2").checkClientSentOps(1).checkClientGotOps(); t.serverAck(2).checkClientSentOps().checkClientGotOps(1); t.clientDoDocOps("blip3").checkClientSentOps(2).checkClientGotOps(); t.clientDoDocOps("blip4").checkClientSentOps().checkClientGotOps(); // Reconnect t.reconnectToServer().checkClientSentOpen(0, 1, 2); t.serverDoOpen(2, 3).checkClientSentOps(); // Client interprets the echo-back as an ack, which we test by // seeing that it goes on to send c4 t.serverDoEchoBackDocOp(2, "blip3").checkClientSentOps(3); }
/** * Tests bundling of operations into deltas and queuing of operations while * others are in flight. */ public void testClientOperationQueuing() throws TransformException, OperationException { TestConfig t = new TestConfig(); // Tests queuing of a delta until one which is in flight has been acked, at // which point the waiting delta should be sent. t.init(1); t.clientDoOps(1).checkClientSentOps(1).checkClientGotOps(); t.clientDoOps(1).checkClientSentOps().checkClientGotOps(); t.serverAck(2).checkClientSentOps(2).checkClientGotOps(1); t.serverAck(3).checkClientSentOps().checkClientGotOps(2); // Tests bundling of operations by the one author into a single delta. t.init(1); t.clientDoOps(new WaveletOperation[] {CLIENT_UTIL.noOp(), CLIENT_UTIL.noOp()}); t.checkClientSentOps(1, 2).checkClientGotOps(); t.serverAck(3, 2).checkClientSentOps().checkClientGotOps(1, 2); // Tests that two operations from differing creators are sent as separate // deltas. In the process, checks again that only one delta is in flight at // a time and that the acking of the first causes the second to be sent. t.init(1); t.clientDoOps(new WaveletOperation[] {CLIENT_UTIL.noOp(), EXTRA_UTIL.noOp()}); t.checkClientSentOps(1, 1).checkClientGotOps(); t.serverAck(2, 1).checkClientSentOps(2, 1).checkClientGotOps(1, 1); t.serverAck(3, 1).checkClientSentOps().checkClientGotOps(2, 1); }
/** * Mainly to test that we are doing comparison for doc op. */ public void testEchoBackDocumentEquality() throws Exception { TestConfig t = new TestConfig(); // Simple case // c1 / ack c1 // c2 / ack c2 // c3 (ack lost) / ack c3 <-- connection broken, <-- recover from here // c4 (cached) / t.init(0); // Use different blip ids so that we don't merge ops t.clientDoDocOps("blip1").checkClientSentOps(0).checkClientGotOps(); t.serverAck(1).checkClientSentOps().checkClientGotOps(0); t.clientDoDocOps("blip2").checkClientSentOps(1).checkClientGotOps(); t.serverAck(2).checkClientSentOps().checkClientGotOps(1); t.clientDoDocOps("blip3").checkClientSentOps(2).checkClientGotOps(); t.clientDoDocOps("blip4").checkClientSentOps().checkClientGotOps(); // Reconnect t.reconnectToServer().checkClientSentOpen(0, 1, 2); t.serverDoOpen(2, 3).checkClientSentOps(); // Client interprets the echo-back as an ack, which we test by // seeing that it goes on to send c4 t.serverDoEchoBackDocOp(2, "blip3").checkClientSentOps(3); }
/** * Test that the client ignores the timestamp in the echo back op from the server. */ public void testEchobackWithDifferentTimeStamp() throws Exception { TestConfig t = new TestConfig(); // Simple case // c1 / ack c1 <-- recover from here // c2 / ack c2 // c3 (ack lost) / ack c3 <-- connection broken // c4 (cached) / t.init(0); t.clientDoOps(1).checkClientSentOps(0).checkClientGotOps(); t.serverAck(1).checkClientSentOps().checkClientGotOps(0); t.clientDoOps(1).checkClientSentOps(1).checkClientGotOps(); t.serverAck(2).checkClientSentOps().checkClientGotOps(1); t.clientDoOps(1).checkClientSentOps(2).checkClientGotOps(); t.clientDoOps(1).checkClientSentOps().checkClientGotOps(); // Reconnect t.reconnectToServer().checkClientSentOpen(0, 1, 2); t.serverDoOpen(2, 3).checkClientSentOps(); // Using a different timestamp. The client should not care about the timestamp. t.serverDoEchoBack(2, 12345L).checkClientSentOps(3); }