xpcom/tests/TestPipe.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/xpcom/tests/TestPipe.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,116 @@
     1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
     1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public
     1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.8 +
     1.9 +#include "TestHarness.h"
    1.10 +
    1.11 +#include "nsIPipe.h"
    1.12 +#include "nsIMemory.h"
    1.13 +#include "mozilla/Attributes.h"
    1.14 +#include "nsIAsyncInputStream.h"
    1.15 +#include "nsIAsyncOutputStream.h"
    1.16 +
    1.17 +/** NS_NewPipe2 reimplemented, because it's not exported by XPCOM */
    1.18 +nsresult TP_NewPipe2(nsIAsyncInputStream** input,
    1.19 +                     nsIAsyncOutputStream** output,
    1.20 +                     bool nonBlockingInput,
    1.21 +                     bool nonBlockingOutput,
    1.22 +                     uint32_t segmentSize,
    1.23 +                     uint32_t segmentCount)
    1.24 +{
    1.25 +  nsCOMPtr<nsIPipe> pipe = do_CreateInstance("@mozilla.org/pipe;1");
    1.26 +  if (!pipe)
    1.27 +    return NS_ERROR_OUT_OF_MEMORY;
    1.28 +
    1.29 +  nsresult rv = pipe->Init(nonBlockingInput,
    1.30 +                           nonBlockingOutput,
    1.31 +                           segmentSize,
    1.32 +                           segmentCount);
    1.33 +
    1.34 +  if (NS_FAILED(rv))
    1.35 +    return rv;
    1.36 +
    1.37 +  pipe->GetInputStream(input);
    1.38 +  pipe->GetOutputStream(output);
    1.39 +  return NS_OK;
    1.40 +}
    1.41 +
    1.42 +nsresult TestPipe()
    1.43 +{
    1.44 +  const uint32_t SEGMENT_COUNT = 10;
    1.45 +  const uint32_t SEGMENT_SIZE = 10;
    1.46 +
    1.47 +  nsCOMPtr<nsIAsyncInputStream> input;
    1.48 +  nsCOMPtr<nsIAsyncOutputStream> output;
    1.49 +  nsresult rv = TP_NewPipe2(getter_AddRefs(input),
    1.50 +                   getter_AddRefs(output),
    1.51 +                   false,
    1.52 +                   false,
    1.53 +                   SEGMENT_SIZE, SEGMENT_COUNT); 
    1.54 +  if (NS_FAILED(rv))
    1.55 +  {
    1.56 +    fail("TP_NewPipe2 failed: %x", rv);
    1.57 +    return rv;
    1.58 +  }
    1.59 +
    1.60 +  const uint32_t BUFFER_LENGTH = 100;
    1.61 +  const char written[] =
    1.62 +    "0123456789"
    1.63 +    "1123456789"
    1.64 +    "2123456789"
    1.65 +    "3123456789"
    1.66 +    "4123456789"
    1.67 +    "5123456789"
    1.68 +    "6123456789"
    1.69 +    "7123456789"
    1.70 +    "8123456789"
    1.71 +    "9123456789"; // not just a memset, to ensure the allocator works correctly
    1.72 +  if (sizeof(written) < BUFFER_LENGTH)
    1.73 +  {
    1.74 +    fail("test error with string size");
    1.75 +    return NS_ERROR_FAILURE;
    1.76 +  }
    1.77 +
    1.78 +  uint32_t writeCount;
    1.79 +  rv = output->Write(written, BUFFER_LENGTH, &writeCount);
    1.80 +  if (NS_FAILED(rv) || writeCount != BUFFER_LENGTH)
    1.81 +  {
    1.82 +    fail("writing %d bytes (wrote %d bytes) to output failed: %x",
    1.83 +         BUFFER_LENGTH, writeCount, rv);
    1.84 +    return rv;
    1.85 +  }
    1.86 +
    1.87 +  char read[BUFFER_LENGTH];
    1.88 +  uint32_t readCount;
    1.89 +  rv = input->Read(read, BUFFER_LENGTH, &readCount);
    1.90 +  if (NS_FAILED(rv) || readCount != BUFFER_LENGTH)
    1.91 +  {
    1.92 +    fail("reading %d bytes (got %d bytes) from input failed: %x",
    1.93 +         BUFFER_LENGTH, readCount,  rv);
    1.94 +    return rv;
    1.95 +  }
    1.96 +
    1.97 +  if (0 != memcmp(written, read, BUFFER_LENGTH))
    1.98 +  {
    1.99 +    fail("didn't read the written data correctly!");
   1.100 +    return NS_ERROR_FAILURE;
   1.101 +  }
   1.102 +
   1.103 +  passed("TestPipe");
   1.104 +  return NS_OK;
   1.105 +}
   1.106 +
   1.107 +int main(int argc, char** argv)
   1.108 +{
   1.109 +  ScopedXPCOM xpcom("nsPipe");
   1.110 +  if (xpcom.failed())
   1.111 +    return 1;
   1.112 +
   1.113 +  int rv = 0;
   1.114 +
   1.115 +  if (NS_FAILED(TestPipe()))
   1.116 +    rv = 1;
   1.117 +
   1.118 +  return rv;
   1.119 +}

mercurial