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; } }
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); }
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); }
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); }
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); }
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); }
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); }