source4/torture/rpc/echo.c new idl end TestBytePipeIn
[metze/samba/wip.git] / source4 / torture / rpc / echo.c
index db6d2414a93c3c6669d2de3523b10aef4a05ecaa..eb49aa9eb9a1756f41a305d85bbe8f7301efd7a8 100644 (file)
@@ -236,15 +236,31 @@ static bool test_sleep(struct torture_context *tctx,
        struct timeval snd[ASYNC_COUNT];
        struct timeval rcv[ASYNC_COUNT];
        struct timeval diff[ASYNC_COUNT];
-       struct tevent_context *ctx;
        int total_done = 0;
        struct dcerpc_binding_handle *b = p->binding_handle;
+       enum dcerpc_transport_t transport;
+       uint32_t assoc_group_id;
+       struct dcerpc_pipe *p2 = NULL;
+       NTSTATUS status;
 
        if (torture_setting_bool(tctx, "quick", false)) {
                torture_skip(tctx, "TestSleep disabled - use \"torture:quick=no\" to enable\n");
        }
        torture_comment(tctx, "Testing TestSleep - use \"torture:quick=yes\" to disable\n");
 
+       transport       = dcerpc_binding_get_transport(p->binding);
+       assoc_group_id  = dcerpc_binding_get_assoc_group_id(p->binding);
+
+       torture_comment(tctx, "connect echo connection 2 with "
+                       "DCERPC_CONCURRENT_MULTIPLEX\n");
+       status = torture_rpc_connection_transport(tctx, &p2,
+                                                 &ndr_table_rpcecho,
+                                                 transport,
+                                                 assoc_group_id,
+                                                 DCERPC_CONCURRENT_MULTIPLEX);
+       torture_assert_ntstatus_ok(tctx, status, "opening echo connection 2");
+       b = p2->binding_handle;
+
        for (i=0;i<ASYNC_COUNT;i++) {
                done1[i]        = false;
                done2[i]        = false;
@@ -256,9 +272,8 @@ static bool test_sleep(struct torture_context *tctx,
                tevent_req_set_callback(req[i], test_sleep_done, &done1[i]);
        }
 
-       ctx = dcerpc_event_context(p);
        while (total_done < ASYNC_COUNT) {
-               torture_assert(tctx, tevent_loop_once(ctx) == 0, 
+               torture_assert(tctx, tevent_loop_once(tctx->ev) == 0,
                                           "Event context loop failed");
                for (i=0;i<ASYNC_COUNT;i++) {
                        if (done2[i] == false && done1[i] == true) {
@@ -373,6 +388,60 @@ static bool test_doublepointer(struct torture_context *tctx,
        return true;
 }
 
+static bool test_bytepipein(struct torture_context *tctx,
+                           struct dcerpc_pipe *p)
+{
+       struct dcerpc_binding_handle *b = p->binding_handle;
+       struct echo_TestBytePipeIn r;
+       struct echo_BytePipe_chunk chunk;
+       struct echo_BytePipe *in_pipe;
+       struct tevent_req *subreq1;
+       struct tevent_req *subreq2;
+       size_t i;
+       uint8_t bytes[0x8000];
+       NTSTATUS status;
+
+       in_pipe = dcerpc_echo_BytePipe_create(tctx);
+
+       ZERO_STRUCT(r);
+       r.in.num_chunks = 1;
+       r.in.chunk_size = sizeof(bytes);
+       r.in.in_pipe = in_pipe;
+
+       ZERO_STRUCT(chunk);
+
+       subreq1 = dcerpc_echo_TestBytePipeIn_r_send(tctx, tctx->ev, b, &r);
+       for (i=0; i <= r.in.num_chunks; i++) {
+               struct timeval tv = timeval_current_ofs(0, 100);
+
+               memset(bytes, i, sizeof(bytes));
+               chunk.count = r.in.chunk_size;
+               chunk.array = bytes;
+
+               if (i == r.in.num_chunks) {
+                       chunk.count = 0;
+               }
+
+               subreq2 = tevent_wakeup_send(tctx, tctx->ev, tv);
+               tevent_req_poll(subreq2, tctx->ev);
+               tevent_wakeup_recv(subreq2);
+               TALLOC_FREE(subreq2);
+
+               torture_comment(tctx, "chunk[%u] count[%u]\n", (unsigned)i, (unsigned)chunk.count);
+               subreq2 = dcerpc_echo_BytePipe_chunk_push_send(tctx, tctx->ev, in_pipe, &chunk);
+               tevent_req_poll(subreq2, tctx->ev);
+               status = dcerpc_echo_BytePipe_chunk_push_recv(subreq2);
+               TALLOC_FREE(subreq2);
+               torture_assert_ntstatus_ok(tctx, status, __location__);
+       }
+
+       tevent_req_poll(subreq1, tctx->ev);
+       status = dcerpc_echo_TestBytePipeIn_r_recv(subreq1, tctx);
+       TALLOC_FREE(subreq1);
+       torture_assert_ntstatus_ok(tctx, status, __location__);
+
+       return true;
+}
 
 /*
   test request timeouts
@@ -441,16 +510,17 @@ struct torture_suite *torture_rpc_echo(TALLOC_CTX *mem_ctx)
        tcase = torture_suite_add_rpc_iface_tcase(suite, "echo", 
                                                  &ndr_table_rpcecho);
 
-       torture_rpc_tcase_add_test(tcase, "addone", test_addone);
-       torture_rpc_tcase_add_test(tcase, "sinkdata", test_sinkdata);
-       torture_rpc_tcase_add_test(tcase, "echodata", test_echodata);
-       torture_rpc_tcase_add_test(tcase, "sourcedata", test_sourcedata);
-       torture_rpc_tcase_add_test(tcase, "testcall", test_testcall);
-       torture_rpc_tcase_add_test(tcase, "testcall2", test_testcall2);
-       torture_rpc_tcase_add_test(tcase, "enum", test_enum);
-       torture_rpc_tcase_add_test(tcase, "surrounding", test_surrounding);
-       torture_rpc_tcase_add_test(tcase, "doublepointer", test_doublepointer);
-       torture_rpc_tcase_add_test(tcase, "sleep", test_sleep);
+       //torture_rpc_tcase_add_test(tcase, "addone", test_addone);
+       //torture_rpc_tcase_add_test(tcase, "sinkdata", test_sinkdata);
+       //torture_rpc_tcase_add_test(tcase, "echodata", test_echodata);
+       //torture_rpc_tcase_add_test(tcase, "sourcedata", test_sourcedata);
+       //torture_rpc_tcase_add_test(tcase, "testcall", test_testcall);
+       //torture_rpc_tcase_add_test(tcase, "testcall2", test_testcall2);
+       //torture_rpc_tcase_add_test(tcase, "enum", test_enum);
+       //torture_rpc_tcase_add_test(tcase, "surrounding", test_surrounding);
+       //torture_rpc_tcase_add_test(tcase, "doublepointer", test_doublepointer);
+       //torture_rpc_tcase_add_test(tcase, "sleep", test_sleep);
+       torture_rpc_tcase_add_test(tcase, "bytepipein", test_bytepipein);
 #if 0 /* this test needs fixing to work over ncacn_np */
        torture_rpc_tcase_add_test(tcase, "timeout", test_timeout);
 #endif