/** @throws Exception */
  @Test
  public void testSerialization() throws Exception {
    // a simple worker that acquires a lock on page 5
    class Locker extends Thread {
      private final PageAccessSynchronizer sync;

      public Locker(PageAccessSynchronizer sync) {
        this.sync = sync;
      }

      @Override
      public void run() {
        sync.lockPage(5);
      }
    }

    // set up a synchronizer and lock page 5 with locker1
    final Duration timeout = Duration.seconds(30);
    final PageAccessSynchronizer sync = new PageAccessSynchronizer(timeout);
    Locker locker1 = new Locker(sync);

    final long start = System.currentTimeMillis();
    locker1.run();

    // make sure we can serialize the synchronizer

    final PageAccessSynchronizer sync2 = WicketObjects.cloneObject(sync);
    assertTrue(sync != sync2);

    // make sure the clone does not retain locks by attempting to lock page locked by locker1 in
    // locker2
    Locker locker2 = new Locker(sync2);
    locker2.run();
    assertTrue(Duration.milliseconds(System.currentTimeMillis() - start).lessThan(timeout));
  }
 /** https://issues.apache.org/jira/browse/WICKET-6279 */
 @Test
 public void deserializeRemove() {
   AttributeModifier appender =
       AttributeModifier.append("class", AttributeModifier.VALUELESS_ATTRIBUTE_REMOVE);
   final AttributeModifier copy = WicketObjects.cloneObject(appender);
   final IModel<?> replaceModel = copy.getReplaceModel();
   assertThat(
       replaceModel.getObject(), is(sameInstance(AttributeModifier.VALUELESS_ATTRIBUTE_REMOVE)));
 }
  @Test
  public void ensureSerializationDeserializationWorks() {
    WebMarkupContainer wmc = new WebMarkupContainer("id");

    Iterator<Component> iterator = wmc.iterator();

    addNChildren(wmc, NUMBER_OF_CHILDREN_FOR_A_MAP);
    assertThat(wmc.size(), is(NUMBER_OF_CHILDREN_FOR_A_MAP));

    assertThat(WicketObjects.cloneObject(wmc), is(not(nullValue())));

    removeNChildren(iterator, 1);
    assertThat(wmc.size(), is(NUMBER_OF_CHILDREN_FOR_A_MAP - 1));
    assertThat(WicketObjects.cloneObject(wmc), is(not(nullValue())));

    removeNChildren(iterator, NUMBER_OF_CHILDREN_FOR_A_MAP - 2);
    assertThat(WicketObjects.cloneObject(wmc), is(not(nullValue())));

    assertThat(wmc.size(), is(1));
    removeNChildren(iterator, 1);
    assertThat(wmc.size(), is(0));
    assertThat(WicketObjects.cloneObject(wmc), is(not(nullValue())));
  }