| | |
| | | // load historical from the entry |
| | | EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); |
| | | |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000003000000000000:attrDel"); |
| | | Attribute attrDel = builder.toAttribute(); |
| | | |
| | | /* |
| | | * simulate a replace with null done at time t3 |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.REPLACE, null, 3, |
| | | true); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | |
| | | /* |
| | | * Now simulate an add at an earlier date that the previous replace. The |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.ADD, |
| | | "older value", 1, false); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | |
| | | /* |
| | | * Now simulate an add at an earlier date that the previous delete. The |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.ADD, |
| | | "older value", 2, false); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | |
| | | /* |
| | | * Now simulate an add at a later date that the previous delete. |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.ADD, "new value", |
| | | 4, true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000004000000000000:add:new value"); |
| | | builder.add(DISPLAYNAME + ":0000000000000003000000000000:attrDel"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.ADD, |
| | | "init value", 10, true); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":000000000000000a000000000000:add:init value"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * Now simulate a replace at an earlier date that the previous replace |
| | |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.REPLACE, |
| | | "older value", 1, true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":000000000000000a000000000000:add:init value"); |
| | | builder.add(DESCRIPTION + ":0000000000000001000000000000:repl:older value"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * Now simulate a replace at an earlier date that the previous replace |
| | |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.REPLACE, |
| | | "older value", 2, true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":000000000000000a000000000000:add:init value"); |
| | | builder.add(DESCRIPTION + ":0000000000000002000000000000:repl:older value"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * Now simulate a replace at a later date that the previous replace. |
| | |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.REPLACE, |
| | | "new value", 11, true); |
| | | |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":000000000000000b000000000000:repl:new value"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.ADD, |
| | | "init value", 2, true); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000002000000000000:add:init value"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * Now simulate a replace at an earlier date that the previous replace |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.REPLACE, |
| | | "older value", 1, true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:repl:older value"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | List<Attribute> attrs = entry.getAttribute(DISPLAYNAME); |
| | | Attribute attr = attrs.get(0); |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.REPLACE, |
| | | "newer value", 3, true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000003000000000000:repl:newer value"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | attrs = entry.getAttribute(DISPLAYNAME); |
| | | attr = attrs.get(0); |
| | |
| | | // load historical from the entry |
| | | EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); |
| | | |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":000000000000000a000000000000:attrDel"); |
| | | Attribute attrDel = builder.toAttribute(); |
| | | |
| | | /* |
| | | * simulate a delete of the whole description attribute done at time |
| | | * t10 |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.DELETE, null, 10, |
| | | true); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | |
| | | /* |
| | | * Now simulate an add at an earlier date that the previous delete. The |
| | |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.ADD, |
| | | "older value", 1, false); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | |
| | | /* |
| | | * Now simulate an add at an earlier date that the previous delete. The |
| | |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.ADD, |
| | | "older value", 2, false); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | |
| | | /* |
| | | * Now simulate an add at a later date that the previous delete. |
| | |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.ADD, "new value", |
| | | 11, true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":000000000000000b000000000000:add:new value"); |
| | | builder.add(DESCRIPTION + ":000000000000000a000000000000:attrDel"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | } |
| | | |
| | | /** |
| | |
| | | * This test was created to reproduce issue 3392. |
| | | */ |
| | | @Test() |
| | | public void delValueAndAddvalue() throws Exception |
| | | public void delValueAndAddValue() throws Exception |
| | | { |
| | | // create an entry to use with conflicts tests. |
| | | Entry entry = initializeEntry(); |
| | |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.DELETE, "value1", |
| | | 1, true); |
| | | |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":0000000000000001000000000000:del:value1"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * Now simulate an add of "value3" at time t2 |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.ADD, |
| | | "value3", 2, true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":0000000000000001000000000000:del:value1"); |
| | | builder.add(DESCRIPTION + ":0000000000000002000000000000:add:value3"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * Now simulate a delete of value "value1" at time t3 |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.DELETE, "value1", |
| | | 3, false); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":0000000000000002000000000000:add:value3"); |
| | | builder.add(DESCRIPTION + ":0000000000000003000000000000:del:value1"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * Now simulate an add of "value4" at time t4 |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.ADD, |
| | | "value4", 4, true); |
| | | |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":0000000000000002000000000000:add:value3"); |
| | | builder.add(DESCRIPTION + ":0000000000000003000000000000:del:value1"); |
| | | builder.add(DESCRIPTION + ":0000000000000004000000000000:add:value4"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | } |
| | | |
| | | /** |
| | |
| | | buildModWith2Vals(DESCRIPTION, ModificationType.DELETE, |
| | | "value1", "value2"), |
| | | 1, true); |
| | | |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":0000000000000001000000000000:del:value1"); |
| | | builder.add(DESCRIPTION + ":0000000000000001000000000000:del:value2"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * simulate a delete of the description attribute values |
| | |
| | | buildModWith2Vals(DESCRIPTION, ModificationType.DELETE, |
| | | "value2", "value3"), |
| | | 2, true); |
| | | |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":0000000000000001000000000000:del:value1"); |
| | | builder.add(DESCRIPTION + ":0000000000000002000000000000:del:value2"); |
| | | builder.add(DESCRIPTION + ":0000000000000002000000000000:del:value3"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | // Check that entry now only contains 1 attribute value : "value1" |
| | | List<Attribute> attrs = entry.getAttribute(DESCRIPTION); |
| | |
| | | */ |
| | | testModify( |
| | | entry, hist, EMPLOYEENUMBER, ModificationType.DELETE, null, 1, true); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(EMPLOYEENUMBER + ":0000000000000001000000000000:attrDel"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * now simulate a delete of value "value1" |
| | |
| | | testModify( |
| | | entry, hist, EMPLOYEENUMBER, ModificationType.DELETE, |
| | | "value1", 2, false); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(EMPLOYEENUMBER + ":0000000000000002000000000000:attrDel"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | } |
| | | |
| | | /** |
| | |
| | | testModify( |
| | | entry, hist, EMPLOYEENUMBER, ModificationType.DELETE, |
| | | "value1", 1, true); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(EMPLOYEENUMBER + ":0000000000000001000000000000:attrDel"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * simulate a delete of attribute employeenumber. |
| | | */ |
| | | testModify( |
| | | entry, hist, EMPLOYEENUMBER, ModificationType.DELETE, null, 2, false); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(EMPLOYEENUMBER + ":0000000000000002000000000000:attrDel"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | } |
| | | |
| | | /** |
| | |
| | | * This test was created to reproduce issue 3392. |
| | | */ |
| | | @Test() |
| | | public void delValueAndAddvalueDisordered() throws Exception |
| | | public void delValueAndAddValueDisordered() throws Exception |
| | | { |
| | | // create an entry to use with conflicts tests. |
| | | Entry entry = initializeEntry(); |
| | |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.DELETE, "value1", |
| | | 3, true); |
| | | |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":0000000000000003000000000000:del:value1"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * Now simulate an add of "value3" at time t4 |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.ADD, |
| | | "value3", 4, true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":0000000000000003000000000000:del:value1"); |
| | | builder.add(DESCRIPTION + ":0000000000000004000000000000:add:value3"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * Now simulate a delete of value "value1" at time t1 |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.DELETE, "value1", |
| | | 1, false); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":0000000000000003000000000000:del:value1"); |
| | | builder.add(DESCRIPTION + ":0000000000000004000000000000:add:value3"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * Now simulate an add of "value4" at time t2 |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.ADD, |
| | | "value4", 2, true); |
| | | |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":0000000000000003000000000000:del:value1"); |
| | | builder.add(DESCRIPTION + ":0000000000000004000000000000:add:value3"); |
| | | builder.add(DESCRIPTION + ":0000000000000002000000000000:add:value4"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | } |
| | | |
| | | /** |
| | |
| | | List<AttributeValue> duplicateValues = new LinkedList<AttributeValue>(); |
| | | Attribute attribute = Attributes.create(DISPLAYNAME, "value1"); |
| | | entry.addAttribute(attribute, duplicateValues); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000003000000000000:attrDel"); |
| | | Attribute attrDel = builder.toAttribute(); |
| | | |
| | | // load historical from the entry |
| | | EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.DELETE, null, 3, |
| | | true); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | |
| | | /* |
| | | * Now simulate an add at an earlier date that the previous delete. The |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.ADD, |
| | | "older value", 1, false); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | |
| | | /* |
| | | * Now simulate an add at an earlier date that the previous delete. The |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.ADD, |
| | | "older value", 2, false); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | |
| | | /* |
| | | * Now simulate an add at a later date that the previous delete. |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.ADD, "new value", |
| | | 4, true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000003000000000000:attrDel"); |
| | | builder.add(DISPLAYNAME + ":0000000000000004000000000000:add:new value"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | } |
| | | |
| | | /** |
| | |
| | | |
| | | // load historical from the entry |
| | | EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":0000000000000004000000000000:attrDel"); |
| | | Attribute attrDel = builder.toAttribute(); |
| | | |
| | | /* |
| | | * simulate a delete of the whole description attribute done at time |
| | |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.DELETE, null, 4, |
| | | true); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | |
| | | /* |
| | | * Now simulate a replace at an earlier date that the previous delete. The |
| | |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.REPLACE, |
| | | "new value", 3, false); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | } |
| | | |
| | | /** |
| | |
| | | @Test() |
| | | public void replaceAndDelete() throws Exception |
| | | { |
| | | AttributeType descriptionAttrType = |
| | | DirectoryServer.getSchema().getAttributeType(DESCRIPTION); |
| | | |
| | | // create an entry to use with conflicts tests. |
| | | Entry entry = initializeEntry(); |
| | | |
| | |
| | | |
| | | // load historical from the entry |
| | | EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000004000000000000:attrDel"); |
| | | Attribute attrDel = builder.toAttribute(); |
| | | |
| | | /* |
| | | * simulate a delete of the whole description attribute done at time |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.DELETE, null, 4, |
| | | true); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | |
| | | /* |
| | | * Now simulate a replace at an earlier date that the previous delete. The |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.REPLACE, |
| | | "new value", 3, false); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.ADD, |
| | | "init value", 10, true); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":000000000000000a000000000000:add:init value"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * Now simulate an add at an earlier date that the previous add. The |
| | | * conflict resolution should detect that this add must be kept. |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.ADD, |
| | | "older value", 1, true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":000000000000000a000000000000:add:init value"); |
| | | builder.add(DESCRIPTION + ":0000000000000001000000000000:add:older value"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * Now simulate an add with a value already existing. |
| | |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.ADD, |
| | | "init value", 13, false); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":0000000000000001000000000000:add:older value"); |
| | | builder.add(DESCRIPTION + ":000000000000000d000000000000:add:init value"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * Now simulate an add at a later date that the previous add. conflict |
| | |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.ADD, "new value", |
| | | 14, true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":0000000000000001000000000000:add:older value"); |
| | | builder.add(DESCRIPTION + ":000000000000000d000000000000:add:init value"); |
| | | builder.add(DESCRIPTION + ":000000000000000e000000000000:add:new value"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.ADD, |
| | | "init value", 10, true); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":000000000000000a000000000000:add:init value"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * Now simulate a del and a add in the same operation |
| | | */ |
| | |
| | | "DEL and ADD of the same attribute same value was not correct"); |
| | | assertEquals(mods.get(1), mod2, |
| | | "DEL and ADD of the same attribute same value was not correct"); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":000000000000000b000000000000:add:Init Value"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | } |
| | | |
| | | /** |
| | |
| | | * the conflict resolution code. |
| | | */ |
| | | @Test() |
| | | public void DelAndReplaceSameOp() throws Exception |
| | | public void delAndReplaceSameOp() throws Exception |
| | | { |
| | | Entry entry = initializeEntry(); |
| | | |
| | | // load historical from the entry |
| | | EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":000000000000000c000000000000:attrDel"); |
| | | Attribute attrDel = builder.toAttribute(); |
| | | |
| | | /* |
| | | * simulate a add of the description attribute done at time t10 |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.ADD, |
| | | "init value", 10, true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":000000000000000a000000000000:add:init value"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * simulate a add of the description attribute done at time t10 |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.ADD, |
| | | "second value", 11, true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":000000000000000a000000000000:add:init value"); |
| | | builder.add(DESCRIPTION + ":000000000000000b000000000000:add:second value"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * Now simulate a delete of one value and a replace with no value |
| | | * in the same operation |
| | |
| | | |
| | | List<Modification> mods2 = new LinkedList<Modification>(mods); |
| | | replayModifies(entry, hist, mods, 12); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | assertEquals(mods.size(), 2, |
| | | "DEL one value, del by Replace of the same attribute was not correct"); |
| | | assertEquals(mods.get(0), mod1, |
| | |
| | | |
| | | // Replay the same modifs again |
| | | replayModifies(entry, hist, mods2, 12); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | assertEquals(mods2.size(), 2, |
| | | "DEL one value, del by Replace of the same attribute was not correct"); |
| | | |
| | | } |
| | | |
| | | /** |
| | |
| | | * the conflict resolution code. |
| | | */ |
| | | @Test() |
| | | public void AddAndDelSameOp() throws Exception |
| | | public void addAndDelSameOp() throws Exception |
| | | { |
| | | Entry entry = initializeEntry(); |
| | | |
| | |
| | | mods.add(mod2); |
| | | |
| | | replayModifies(entry, hist, mods, 11); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":000000000000000b000000000000:del:Init Value"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | assertEquals(mods.size(), 2, |
| | | "DEL and ADD of the same attribute same value was not correct"); |
| | | assertEquals(mods.get(0), mod1, |
| | |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.ADD, |
| | | "value1", 1, true); |
| | | |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":0000000000000001000000000000:add:value1"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * simulate an add of the description attribute values |
| | |
| | | buildModWith2Vals(DESCRIPTION, ModificationType.ADD, "value1", |
| | | "value2"), |
| | | 2, true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":0000000000000002000000000000:add:value1"); |
| | | builder.add(DESCRIPTION + ":0000000000000002000000000000:add:value2"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | // Check that entry now only contains the 2 attribute values |
| | | List<Attribute> attrs = entry.getAttribute(DESCRIPTION); |
| | |
| | | buildModWith2Vals(DESCRIPTION, ModificationType.ADD, "value1", |
| | | "value2"), |
| | | 1, true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":0000000000000001000000000000:add:value1"); |
| | | builder.add(DESCRIPTION + ":0000000000000001000000000000:add:value2"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * simulate a add of the description attribute done at time 1 |
| | | */ |
| | | testModify(entry, hist, DESCRIPTION, ModificationType.ADD, |
| | | "value1", 2, false); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DESCRIPTION + ":0000000000000001000000000000:add:value2"); |
| | | builder.add(DESCRIPTION + ":0000000000000002000000000000:add:value1"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | // Check that entry now only contains the 2 attribute values |
| | | attrs = entry.getAttribute(DESCRIPTION); |
| | |
| | | |
| | | // load historical from the entry |
| | | EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:add:older value"); |
| | | Attribute olderValue = builder.toAttribute(); |
| | | |
| | | /* |
| | | * simulate a add of the displayName attribute done at time t10 |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.ADD, |
| | | "init value", 10, true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":000000000000000a000000000000:add:init value"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * Now simulate an add at an earlier date that the previous add. The |
| | | * conflict resolution should detect that this add must be kept. |
| | |
| | | Modification mod = buildMod(DISPLAYNAME, ModificationType.ADD, |
| | | "older value"); |
| | | List<Modification> mods = replayModify(entry, hist, mod, 1); |
| | | assertEquals(hist.encodeAndPurge(), olderValue); |
| | | |
| | | /* |
| | | * After replay the mods should contain only one mod, |
| | |
| | | */ |
| | | mod = buildMod(DISPLAYNAME, ModificationType.ADD, "new value"); |
| | | mods = replayModify(entry, hist, mod, 2); |
| | | assertEquals(hist.encodeAndPurge(), olderValue); |
| | | assertTrue(mods.isEmpty()); |
| | | } |
| | | |
| | |
| | | |
| | | // load historical from the entry |
| | | EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000003000000000000:attrDel"); |
| | | Attribute attrDel = builder.toAttribute(); |
| | | |
| | | /* |
| | | * simulate a add of the displayName attribute done at time t1 |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.ADD, |
| | | "init value", 1, true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:add:init value"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * simulate a del of the displayName attribute done at time t3 |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.DELETE, |
| | | "init value", 3, true); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | |
| | | /* |
| | | * Now simulate another add, that would come from another master |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.ADD, |
| | | "second value", 2, false); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | } |
| | | |
| | | /** |
| | |
| | | |
| | | // load historical from the entry |
| | | EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:add:first value"); |
| | | Attribute firstValue = builder.toAttribute(); |
| | | |
| | | /* |
| | | * simulate a add of the displayName attribute done at time t1 |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.ADD, |
| | | "first value", 1, true); |
| | | assertEquals(hist.encodeAndPurge(), firstValue); |
| | | |
| | | /* |
| | | * simulate a add of the displayName attribute done at time t2 |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.ADD, |
| | | "second value", 2, false); |
| | | assertEquals(hist.encodeAndPurge(), firstValue); |
| | | |
| | | /* |
| | | * Now simulate a delete of the second value. |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.DELETE, |
| | | "second value", 2, false); |
| | | assertEquals(hist.encodeAndPurge(), firstValue); |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.ADD, |
| | | "aValue", 1, true); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:add:aValue"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * simulate a delete of the attribute in the same operation done at time |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.DELETE, null, 1, |
| | | true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:attrDel"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* The entry should have no value */ |
| | | List<Attribute> attrs = entry.getAttribute(DISPLAYNAME); |
| | |
| | | |
| | | // load historical from the entry |
| | | EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000002000000000000:attrDel"); |
| | | Attribute attrDel = builder.toAttribute(); |
| | | |
| | | /* |
| | | * Add at time t1 that the previous delete. The |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.ADD, |
| | | "aValue", 2, true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000002000000000000:add:aValue"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * simulate a delete of the attribute in the same operation done at time |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.DELETE, "aValue", 2, |
| | | true); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | |
| | | /* |
| | | * Redo the same operations. This time, we expect them not to be applied. |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.ADD, |
| | | "aValue", 2, true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000002000000000000:add:aValue"); |
| | | builder.add(DISPLAYNAME + ":0000000000000002000000000000:attrDel"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * simulate a delete of the attribute in the same operation done at time |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.DELETE, "aValue", 2, |
| | | true); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | |
| | | /* The entry should have no value */ |
| | | List<Attribute> attrs = entry.getAttribute(DISPLAYNAME); |
| | |
| | | |
| | | // load historical from the entry |
| | | EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:attrDel"); |
| | | Attribute attrDel = builder.toAttribute(); |
| | | |
| | | /* |
| | | * Add at time t1 that the previous delete. The |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.ADD, |
| | | "aValue", 1, true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:add:aValue"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * simulate a delete of the attribute in the same operation done at time |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.DELETE, null, 1, |
| | | true); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | |
| | | /* |
| | | * Redo the same operations. This time, we expect them not to be applied. |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.ADD, |
| | | "aValue", 1, true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:add:aValue"); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:attrDel"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * simulate a delete of the attribute in the same operation done at time |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.DELETE, null, 1, |
| | | true); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | |
| | | /* The entry should have no value */ |
| | | List<Attribute> attrs = entry.getAttribute(DISPLAYNAME); |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.REPLACE, |
| | | "aValue", 1, true); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:repl:aValue"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * simulate a delete of same value in the same operation done at time |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.DELETE, "aValue", 1, |
| | | true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:attrDel"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* The entry should have no value */ |
| | | List<Attribute> attrs = entry.getAttribute(DISPLAYNAME); |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.REPLACE, |
| | | "aValue", 1, true); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:repl:aValue"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * simulate a delete of the attribute in the same operation done at time |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.DELETE, null, 1, |
| | | true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:attrDel"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* The entry should have no value */ |
| | | List<Attribute> attrs = entry.getAttribute(DISPLAYNAME); |
| | |
| | | |
| | | // load historical from the entry |
| | | EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000002000000000000:repl:aValue"); |
| | | Attribute repl = builder.toAttribute(); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000002000000000000:attrDel"); |
| | | Attribute attrDel = builder.toAttribute(); |
| | | |
| | | /* |
| | | * Add at time t1 that the previous delete. The |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.REPLACE, |
| | | "aValue", 2, true); |
| | | assertEquals(hist.encodeAndPurge(), repl); |
| | | |
| | | /* |
| | | * simulate a delete of the attribute in the same operation done at time |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.DELETE, "aValue", 2, |
| | | true); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | |
| | | /* |
| | | * Redo the same operations. This time, we expect them not to be applied. |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.REPLACE, |
| | | "aValue", 2, true); |
| | | assertEquals(hist.encodeAndPurge(), repl); |
| | | |
| | | /* |
| | | * simulate a delete of the attribute in the same operation done at time |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.DELETE, "aValue", 2, |
| | | true); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | |
| | | /* The entry should have no value */ |
| | | List<Attribute> attrs = entry.getAttribute(DISPLAYNAME); |
| | |
| | | |
| | | // load historical from the entry |
| | | EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:repl:aValue"); |
| | | Attribute repl = builder.toAttribute(); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:attrDel"); |
| | | Attribute attrDel = builder.toAttribute(); |
| | | |
| | | /* |
| | | * Add at time t1 that the previous delete. The |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.REPLACE, |
| | | "aValue", 1, true); |
| | | assertEquals(hist.encodeAndPurge(), repl); |
| | | |
| | | /* |
| | | * simulate a delete of the attribute in the same operation done at time |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.DELETE, null, 1, |
| | | true); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | |
| | | /* |
| | | * Redo the same operations. This time, we expect them not to be applied. |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.REPLACE, |
| | | "aValue", 1, true); |
| | | assertEquals(hist.encodeAndPurge(), repl); |
| | | |
| | | /* |
| | | * simulate a delete of the attribute in the same operation done at time |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.DELETE, null, 1, |
| | | true); |
| | | assertEquals(hist.encodeAndPurge(), attrDel); |
| | | |
| | | /* The entry should have no value */ |
| | | List<Attribute> attrs = entry.getAttribute(DISPLAYNAME); |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.REPLACE, |
| | | "aValue", 1, true); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:repl:aValue"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * simulate a delete of same value in the same operation done at time |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.DELETE, "aValue", 1, |
| | | true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:attrDel"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * simulate an add of new value in the same operation done at time |
| | | * t1 |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.ADD, "NewValue", 1, |
| | | true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:add:NewValue"); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:attrDel"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* The entry should have one value */ |
| | | List<Attribute> attrs = entry.getAttribute(DISPLAYNAME); |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.REPLACE, |
| | | "aValue", 1, true); |
| | | AttributeBuilder builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:repl:aValue"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * simulate a delete of same value in the same operation done at time |
| | |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.DELETE, null, 1, |
| | | true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:attrDel"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* |
| | | * simulate an add of new value in the same operation done at time |
| | | * t1 |
| | | */ |
| | | testModify(entry, hist, DISPLAYNAME, ModificationType.ADD, "NewValue", 1, |
| | | true); |
| | | builder = new AttributeBuilder(SYNCHIST); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:add:NewValue"); |
| | | builder.add(DISPLAYNAME + ":0000000000000001000000000000:attrDel"); |
| | | assertEquals(hist.encodeAndPurge(), builder.toAttribute()); |
| | | |
| | | /* The entry should have no value */ |
| | | List<Attribute> attrs = entry.getAttribute(DISPLAYNAME); |