@Test
  public void testIteratable() throws IOException {
    final List<String> values = new ArrayList<String>();
    values.add("iterItem1");
    values.add("iterItem2");

    UpdateRequest updateRequest = new UpdateRequest();
    updateRequest.deleteByQuery("*:*");

    SolrInputDocument doc = new SolrInputDocument();
    doc.addField("id", 1);
    doc.addField("desc", "one", 2.0f);
    // imagine someone adding a custom Bean that implements Iterable
    // but is not a Collection
    doc.addField(
        "iter",
        new Iterable<String>() {
          @Override
          public Iterator<String> iterator() {
            return values.iterator();
          }
        });
    doc.addField("desc", "1");
    updateRequest.add(doc);

    JavaBinUpdateRequestCodec codec = new JavaBinUpdateRequestCodec();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    codec.marshal(updateRequest, baos);
    final List<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
    JavaBinUpdateRequestCodec.StreamingUpdateHandler handler =
        new JavaBinUpdateRequestCodec.StreamingUpdateHandler() {
          @Override
          public void update(SolrInputDocument document, UpdateRequest req) {
            Assert.assertNotNull(req.getParams());
            docs.add(document);
          }
        };

    UpdateRequest updateUnmarshalled =
        codec.unmarshal(new ByteArrayInputStream(baos.toByteArray()), handler);
    Assert.assertNull(updateUnmarshalled.getDocuments());
    for (SolrInputDocument document : docs) {
      updateUnmarshalled.add(document);
    }

    SolrInputDocument outDoc = updateUnmarshalled.getDocuments().get(0);
    SolrInputField iter = outDoc.getField("iter");
    Assert.assertNotNull("iter field is null", iter);
    Object iterVal = iter.getValue();
    Assert.assertTrue("iterVal is not a Collection", iterVal instanceof Collection);
    Assert.assertEquals("iterVal contents", values, iterVal);
  }
  @Test
  public void simple() throws IOException {
    UpdateRequest updateRequest = new UpdateRequest();
    updateRequest.deleteById("*:*");
    updateRequest.deleteById("id:5");
    updateRequest.deleteByQuery("2*");
    updateRequest.deleteByQuery("1*");
    updateRequest.setParam("a", "b");
    SolrInputDocument doc = new SolrInputDocument();
    doc.addField("id", 1);
    doc.addField("desc", "one", 2.0f);
    doc.addField("desc", "1");
    updateRequest.add(doc);

    doc = new SolrInputDocument();
    doc.addField("id", 2);
    doc.setDocumentBoost(10.0f);
    doc.addField("desc", "two", 3.0f);
    doc.addField("desc", "2");
    updateRequest.add(doc);

    doc = new SolrInputDocument();
    doc.addField("id", 3);
    doc.addField("desc", "three", 3.0f);
    doc.addField("desc", "3");
    updateRequest.add(doc);

    doc = new SolrInputDocument();
    Collection<String> foobar = new HashSet<String>();
    foobar.add("baz1");
    foobar.add("baz2");
    doc.addField("foobar", foobar);
    updateRequest.add(doc);

    //    updateRequest.setWaitFlush(true);
    updateRequest.deleteById("2");
    updateRequest.deleteByQuery("id:3");
    JavaBinUpdateRequestCodec codec = new JavaBinUpdateRequestCodec();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    codec.marshal(updateRequest, baos);
    final List<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
    JavaBinUpdateRequestCodec.StreamingUpdateHandler handler =
        new JavaBinUpdateRequestCodec.StreamingUpdateHandler() {
          @Override
          public void update(SolrInputDocument document, UpdateRequest req) {
            Assert.assertNotNull(req.getParams());
            docs.add(document);
          }
        };

    UpdateRequest updateUnmarshalled =
        codec.unmarshal(new ByteArrayInputStream(baos.toByteArray()), handler);
    Assert.assertNull(updateUnmarshalled.getDocuments());
    for (SolrInputDocument document : docs) {
      updateUnmarshalled.add(document);
    }
    for (int i = 0; i < updateRequest.getDocuments().size(); i++) {
      SolrInputDocument inDoc = updateRequest.getDocuments().get(i);
      SolrInputDocument outDoc = updateUnmarshalled.getDocuments().get(i);
      compareDocs("doc#" + i, inDoc, outDoc);
    }
    Assert.assertEquals(
        updateUnmarshalled.getDeleteById().get(0), updateRequest.getDeleteById().get(0));
    Assert.assertEquals(
        updateUnmarshalled.getDeleteQuery().get(0), updateRequest.getDeleteQuery().get(0));

    assertEquals("b", updateUnmarshalled.getParams().get("a"));
  }