示例#1
0
KineticStatus KineticController_ExecuteOperation(KineticOperation* operation, KineticCompletionClosure* const closure)
{
    KINETIC_ASSERT(operation != NULL);
    KINETIC_ASSERT(operation->session != NULL);
    KineticStatus status = KINETIC_STATUS_INVALID;
    KineticSession *session = operation->session;

    if (KineticSession_GetTerminationStatus(operation->session) != KINETIC_STATUS_SUCCESS) {
        return KINETIC_STATUS_SESSION_TERMINATED;
    }

    if (closure != NULL) {
        operation->closure = *closure;
        return KineticOperation_SendRequest(operation);
    }
    else {
        DefaultCallbackData data;
        pthread_mutex_init(&data.receiveCompleteMutex, NULL);
        pthread_cond_init(&data.receiveComplete, NULL);
        data.status = KINETIC_STATUS_INVALID;
        data.completed = false;

        operation->closure = DefaultClosure(&data);

        // Send the request
        status = KineticOperation_SendRequest(operation);

        if (status == KINETIC_STATUS_SUCCESS) {
            pthread_mutex_lock(&data.receiveCompleteMutex);
            while(data.completed == false) {
                pthread_cond_wait(&data.receiveComplete, &data.receiveCompleteMutex);
            }
            status = data.status;
            pthread_mutex_unlock(&data.receiveCompleteMutex);
        }

        pthread_cond_destroy(&data.receiveComplete);
        pthread_mutex_destroy(&data.receiveCompleteMutex);

        if (status != KINETIC_STATUS_SUCCESS) {
            if (KineticSession_GetTerminationStatus(session) != KINETIC_STATUS_SUCCESS) {
                (void)KineticSession_Disconnect(session);
                if (status == KINETIC_STATUS_SOCKET_ERROR) {
                    status = KINETIC_STATUS_SESSION_TERMINATED;
                }
            }
        }

        return status;
    }
}
示例#2
0
static KineticStatus KineticClient_ExecuteOperation(KineticOperation* operation)
{
    assert(operation != NULL);
    KineticStatus status = KINETIC_STATUS_INVALID;

    LOGF1("Executing operation: 0x%llX", operation);
    if (operation->entry != NULL &&
        operation->entry->value.array.data != NULL &&
        operation->entry->value.bytesUsed > 0)
    {
        LOGF1("  Sending PDU (0x%0llX) w/value (%zu bytes)",
            operation->request, operation->entry->value.bytesUsed);
    }
    else {
        LOGF1("  Sending PDU (0x%0llX) w/o value", operation->request);
    }

    // Send the request
    status = KineticOperation_SendRequest(operation);
    if (status != KINETIC_STATUS_SUCCESS) {
        return status;
    }

    return KineticOperation_ReceiveAsync(operation);
}
示例#3
0
void test_KineticOperation_SendRequest_should_return_MEMORY_ERROR_on_command_pack_failure(void)
{
    KineticRequest_LockSend_ExpectAndReturn(Operation.session, true);
    KineticSession *session = Operation.session;
    KineticSession_GetNextSequenceCount_ExpectAndReturn(session, 12345);

    KineticRequest_PackCommand_ExpectAndReturn(Operation.request, KINETIC_REQUEST_PACK_FAILURE);
    KineticRequest_UnlockSend_ExpectAndReturn(Operation.session, true);

    KineticStatus status = KineticOperation_SendRequest(&Operation);
    TEST_ASSERT_EQUAL(KINETIC_STATUS_MEMORY_ERROR, status);
}
示例#4
0
void test_KineticOperation_SendRequest_should_return_error_status_on_authentication_failure(void)
{
    KineticRequest_LockSend_ExpectAndReturn(Operation.session, true);
    KineticSession *session = Operation.session;
    KineticSession_GetNextSequenceCount_ExpectAndReturn(session, 12345);

    KineticRequest_PackCommand_ExpectAndReturn(Operation.request, 100);
    KineticRequest_PopulateAuthentication_ExpectAndReturn(&session->config,
        Operation.request, NULL, KINETIC_STATUS_HMAC_REQUIRED);
    KineticRequest_UnlockSend_ExpectAndReturn(Operation.session, true);

    KineticStatus status = KineticOperation_SendRequest(&Operation);
    TEST_ASSERT_EQUAL(KINETIC_STATUS_HMAC_REQUIRED, status);
}
示例#5
0
void test_KineticOperation_SendRequest_should_acquire_and_increment_sequence_count_and_send_PDU_to_bus(void)
{
    KineticRequest_LockSend_ExpectAndReturn(Operation.session, true);
    KineticSession *session = Operation.session;
    KineticSession_GetNextSequenceCount_ExpectAndReturn(session, 12345);

    KineticRequest_PackCommand_ExpectAndReturn(Operation.request, 100);
    KineticRequest_PopulateAuthentication_ExpectAndReturn(&session->config,
        Operation.request, NULL, KINETIC_STATUS_SUCCESS);

    KineticRequest_PackMessage_ExpectAndReturn(&Operation, &msg, &msgSize, KINETIC_STATUS_SUCCESS);

    KineticCountingSemaphore_Take_Expect(Operation.session->outstandingOperations);

    KineticRequest_SendRequest_ExpectAndReturn(&Operation, msg, msgSize, true);
    KineticRequest_UnlockSend_ExpectAndReturn(Operation.session, true);

    KineticStatus status = KineticOperation_SendRequest(&Operation);
    TEST_ASSERT_EQUAL(KINETIC_STATUS_SUCCESS, status);
}
示例#6
0
void test_KineticOperation_SendRequest_should_return_REQUEST_REJECTED_if_SendRequest_fails(void)
{
    KineticRequest_LockSend_ExpectAndReturn(Operation.session, true);
    KineticSession *session = Operation.session;
    KineticSession_GetNextSequenceCount_ExpectAndReturn(session, 12345);

    KineticRequest_PackCommand_ExpectAndReturn(Operation.request, 100);
    KineticRequest_PopulateAuthentication_ExpectAndReturn(&session->config,
        Operation.request, NULL, KINETIC_STATUS_SUCCESS);

    KineticRequest_PackMessage_ExpectAndReturn(&Operation, &msg, &msgSize, KINETIC_STATUS_SUCCESS);

    KineticCountingSemaphore_Take_Expect(Operation.session->outstandingOperations);

    KineticRequest_SendRequest_ExpectAndReturn(&Operation, msg, msgSize, false);
    KineticCountingSemaphore_Give_Expect(Operation.session->outstandingOperations);
    KineticRequest_UnlockSend_ExpectAndReturn(Operation.session, true);

    KineticStatus status = KineticOperation_SendRequest(&Operation);
    TEST_ASSERT_EQUAL(KINETIC_STATUS_REQUEST_REJECTED, status);
}
示例#7
0
void test_KineticOperation_SendRequest_should_error_out_on_lock_failure(void)
{
    KineticRequest_LockSend_ExpectAndReturn(Operation.session, false);
    KineticStatus status = KineticOperation_SendRequest(&Operation);
    TEST_ASSERT_EQUAL(KINETIC_STATUS_CONNECTION_ERROR, status);
}