예제 #1
0
  /**
   * Creates a new Insert.
   *
   * @param header The header proceeding the insert message. This is used to locate the end of the
   *     insert.
   * @param in The stream to read the insert message from.
   * @throws IOException On a failure reading the insert message.
   */
  public Insert(final Header header, final BsonInputStream in) throws IOException {

    final long position = in.getBytesRead();
    final long end = (position + header.getLength()) - Header.SIZE;

    final int flags = in.readInt();
    init(in.readCString());

    // Read the documents to the end of the message.
    myDocuments = new ArrayList<Document>();
    while (in.getBytesRead() < end) {
      myDocuments.add(in.readDocument());
    }

    myContinueOnError = (flags & CONTINUE_ON_ERROR_BIT) == CONTINUE_ON_ERROR_BIT;
    myDocumentsSize = -1;
  }
  /**
   * Test method for {@link Query#Query(Header,BsonInputStream)}.
   *
   * @throws IOException On a test failure.
   */
  @SuppressWarnings("boxing")
  @Test
  public void testQueryHeaderBsonInputStream() throws IOException {
    final Random random = new Random(System.currentTimeMillis());

    final List<Message> objs1 = new ArrayList<Message>();

    final Document doc1 = BuilderFactory.start().addInteger("1", 0).build();
    final Document doc2 = BuilderFactory.start().addInteger("1", 1).build();
    final Document doc3 = BuilderFactory.start().addInteger("1", 2).build();
    for (final String databaseName : Arrays.asList("n1", "n2", "n3")) {
      for (final String collectionName : Arrays.asList("c1", "c2", "c3")) {
        for (final Document query : Arrays.asList(doc1, doc2, doc3)) {
          for (final Document returnFields : Arrays.asList(doc1, doc2, doc3, null)) {
            for (final int batchSize : Arrays.asList(0)) {
              for (final int limit : Arrays.asList(0)) {
                for (final int numberToSkip : Arrays.asList(0, 1, 2, 0xFFF)) {
                  final boolean tailable = random.nextBoolean();
                  final ReadPreference readPreference =
                      random.nextBoolean() ? ReadPreference.PRIMARY : ReadPreference.SECONDARY;
                  final boolean noCursorTimeout = random.nextBoolean();
                  final boolean awaitData = random.nextBoolean();
                  final boolean exhaust = random.nextBoolean();
                  final boolean partial = random.nextBoolean();

                  objs1.add(
                      new Query(
                          databaseName,
                          collectionName,
                          query,
                          returnFields,
                          batchSize,
                          limit,
                          numberToSkip,
                          tailable,
                          readPreference,
                          noCursorTimeout,
                          awaitData,
                          exhaust,
                          partial));
                }
              }
            }
          }
        }
      }
    }

    for (final Message message : objs1) {

      final ByteArrayOutputStream out = new ByteArrayOutputStream();
      final BsonOutputStream bOut = new BsonOutputStream(out);

      message.write(1234, bOut);

      final byte[] bytes = out.toByteArray();
      assertThat(message.size(), is(bytes.length));

      final ByteArrayInputStream in = new ByteArrayInputStream(bytes);
      final BsonInputStream bIn = new BsonInputStream(in);

      final Header header = new Header(bIn);

      assertEquals(Operation.QUERY, header.getOperation());
      assertEquals(1234, header.getRequestId());
      assertEquals(0, header.getResponseId());
      assertEquals(out.size(), header.getLength());

      final Query read = new Query(header, bIn);
      if (message.getReadPreference() == ReadPreference.PRIMARY) {
        assertEquals(message, read);
      }
    }
  }