Commit 320b6ffb authored by Greg Williams's avatar Greg Williams
Browse files

Stubbed out GET operation at system level.

Created system test fixture to expedite creation of many system tests to come.
Refactored KineticExchange into KineticConnection. Should rename KineticConnection to KineticSession at some point.
parent 2fa71509
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -186,6 +186,7 @@ namespace :java_sim do
    java_sim_shutdown
  end

  desc "Erase Java simulator contents"
  task :erase do
    java_sim_erase_drive
  end
@@ -222,7 +223,7 @@ Dir['test/integration/test_*.c'].each do |test_file|
  task test_file => ['java_sim:shutdown', 'ruby_sim:start']
end
Dir['test/system/test_*.c'].each do |test_file|
  task test_file => ['ruby_sim:shutdown', 'java_sim:start']
  task test_file => ['ruby_sim:shutdown', 'java_sim:erase', 'java_sim:start']
end

namespace :system do
@@ -304,12 +305,27 @@ namespace :test do
  task :system => ['java_sim:start'] do
    report_banner "Running System Tests"
    shutdown_ruby_server
    java_sim_erase_drive
    java_sim_start
    Rake::Task['test:path'].reenable
    Rake::Task['test:path'].invoke('test/system')
    java_sim_shutdown
  end

  namespace :system do
    FileList['test/system/test_*.c'].each do |test|
      basename = File.basename(test, '.*')
      desc "Run system test #{basename}"
      task basename do
        shutdown_ruby_server
        java_sim_erase_drive
        java_sim_start
        Rake::Task[test].reenable
        Rake::Task[test].invoke
      end
    end
  end

  desc "Run Kinetic Client Utility tests"
  task :utility => [
    'release',
+2 −2
Original line number Diff line number Diff line
@@ -87,7 +87,7 @@
      - -D"$": COLLECTION_DEFINES_TEST_AND_VENDOR
      - -D"$": DEFINES_TEST_PREPROCESS
      - -DGNU_COMPILER
      # - -std=c99
      - -std=c99
      - -Wall
      - ${1}
  :test_linker:
@@ -112,7 +112,7 @@
      - -I"$": 'COLLECTION_PATHS_RELEASE_TOOLCHAIN_INCLUDE'
      - -D"$": 'COLLECTION_DEFINES_RELEASE_AND_VENDOR'
      - -DGNU_COMPILER
      # - -std=c99
      - -std=c99
      - -Wall
      - "-c \"${1}\""
      - "-o \"${2}\""
+50 −59
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@

#include "kinetic_client.h"
#include "kinetic_connection.h"
#include "kinetic_message.h"
#include "kinetic_pdu.h"
#include "kinetic_logger.h"
#include <stdio.h>
@@ -33,103 +34,96 @@ bool KineticClient_Connect(
    KineticConnection* connection,
    const char* host,
    int port,
    bool blocking)
    bool nonBlocking,
    int64_t clusterVersion,
    int64_t identity,
    const char* key)
{
    KineticConnection_Init(connection);

    if (!KineticConnection_Connect(connection, host, port, blocking))
    if (connection == NULL)
    {
        connection->connected = false;
        connection->socketDescriptor = -1;
        char message[64];
        sprintf(message, "Failed creating connection to %s:%d", host, port);
        LOG(message);
        LOG("Specified KineticConnection is NULL!");
        return false;
    }

    connection->connected = true;

    return true;
}

void KineticClient_Disconnect(
    KineticConnection* connection)
    if (host == NULL)
    {
   KineticConnection_Disconnect(connection);
        LOG("Specified host is NULL!");
        return false;
    }

bool KineticClient_ConfigureExchange(
    KineticExchange* exchange,
    KineticConnection* connection,
    int64_t clusterVersion,
    int64_t identity,
    const char* key,
    size_t keyLength)
{
    if (exchange == NULL)
    if (key == NULL)
    {
        LOG("Specified KineticExchange is NULL!");
        LOG("Specified HMAC key is NULL!");
        return false;
    }

    if (key == NULL)
    if (strlen(key) < 1)
    {
        LOG("Specified Kinetic Protocol key is NULL!");
        LOG("Specified HMAC key is empty!");
        return false;
    }

    if (keyLength == 0)
    if (!KineticConnection_Connect(connection, host, port, nonBlocking,
        clusterVersion, identity, key))
    {
        LOG("Specified Kinetic Protocol key length is NULL!");
        connection->connected = false;
        connection->socketDescriptor = -1;
        char message[64];
        sprintf(message, "Failed creating connection to %s:%d", host, port);
        LOG(message);
        return false;
    }

    KineticExchange_Init(exchange, identity, key, keyLength, connection);
    KineticExchange_SetClusterVersion(exchange, clusterVersion);
    KineticExchange_ConfigureConnectionID(exchange);
    connection->connected = true;

    return true;
}

void KineticClient_Disconnect(
    KineticConnection* connection)
{
   KineticConnection_Disconnect(connection);
}

KineticOperation KineticClient_CreateOperation(
    KineticExchange* exchange,
    KineticConnection* connection,
    KineticPDU* request,
    KineticMessage* requestMsg,
    KineticPDU* response)
{
    KineticOperation op;

    if (exchange == NULL)
    if (connection == NULL)
    {
        LOG("Specified KineticExchange is NULL!");
        assert(exchange != NULL);
        LOG("Specified KineticConnection is NULL!");
        assert(connection != NULL);
    }

    if (request == NULL)
    {
        LOG("Specified request KineticPDU is NULL!");
        LOG("Specified KineticPDU request is NULL!");
        assert(request != NULL);
    }

    if (requestMsg == NULL)
    {
        LOG("Specified request KineticMessage is NULL!");
        LOG("Specified KineticMessage request is NULL!");
        assert(requestMsg != NULL);
    }

    if (response == NULL)
    {
        LOG("Specified response KineticPDU is NULL!");
        LOG("Specified KineticPDU response is NULL!");
        assert(response != NULL);
    }

    KineticMessage_Init(requestMsg);
    KineticPDU_Init(request, exchange, requestMsg, NULL, 0);
    KineticPDU_Init(request, connection, requestMsg, NULL, 0);

    // KineticMessage_Init(responseMsg);
    KineticPDU_Init(response, exchange, NULL, NULL, 0);
    KineticPDU_Init(response, connection, NULL, NULL, 0);

    op.exchange = exchange;
    op.connection = connection;
    op.request = request;
    op.request->message = requestMsg;
    op.response = response;
@@ -144,34 +138,32 @@ KineticProto_Status_StatusCode KineticClient_NoOp(KineticOperation* operation)
    KineticProto_Status_StatusCode status =
        KINETIC_PROTO_STATUS_STATUS_CODE_INVALID_STATUS_CODE;

    assert(operation->exchange != NULL);
    assert(operation->exchange->connection != NULL);
    assert(operation->connection != NULL);
    assert(operation->request != NULL);
    assert(operation->request->message != NULL);
    assert(operation->response != NULL);
    assert(operation->response->message == NULL);

    // Initialize request
    KineticExchange_IncrementSequence(operation->exchange);
    KineticConnection_IncrementSequence(operation->connection);
    KineticOperation_BuildNoop(operation);

    // Send the request
    KineticPDU_Send(operation->request);

    // Associate response with same exchange as request
    operation->response->exchange = operation->request->exchange;
    operation->response->connection = operation->request->connection;

    // Receive the response
    if (KineticPDU_Receive(operation->response))
    {
        status = operation->response->proto->command->status->code;
        status = KineticPDU_Status(operation->response);
    }

	return status;
}

KineticProto_Status_StatusCode KineticClient_Put(
    KineticOperation* operation,
KineticProto_Status_StatusCode KineticClient_Put(KineticOperation* operation,
    char* newVersion,
    char* key,
    char* dbVersion,
@@ -182,17 +174,16 @@ KineticProto_Status_StatusCode KineticClient_Put(
    KineticProto_Status_StatusCode status =
        KINETIC_PROTO_STATUS_STATUS_CODE_INVALID_STATUS_CODE;

    assert(operation->exchange != NULL);
    assert(operation->exchange->connection != NULL);
    assert(operation->connection != NULL);
    assert(operation->request != NULL);
    assert(operation->request->message != NULL);
    assert(operation->response != NULL);
    assert(operation->response->message == NULL);
    assert(value != NULL);
    assert(len <= 1024*1024);
    assert(len <= PDU_VALUE_MAX_LEN);

    // Initialize request
    KineticExchange_IncrementSequence(operation->exchange);
    KineticConnection_IncrementSequence(operation->connection);
    KineticOperation_BuildPut(operation, value, len);
    KineticMessage_ConfigureKeyValue(operation->request->message, newVersion, key, dbVersion, tag);

@@ -200,12 +191,12 @@ KineticProto_Status_StatusCode KineticClient_Put(
    KineticPDU_Send(operation->request);

    // Associate response with same exchange as request
    operation->response->exchange = operation->request->exchange;
    operation->response->connection = operation->request->connection;

    // Receive the response
    if (KineticPDU_Receive(operation->response))
    {
        status = operation->response->proto->command->status->code;
        status = KineticPDU_Status(operation->response);
    }

    return status;
+15 −37
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@
#define _KINETIC_CLIENT_H

#include "kinetic_types.h"
#include "kinetic_exchange.h"
#include "kinetic_pdu.h"
#include "kinetic_operation.h"

@@ -34,20 +33,25 @@
void KineticClient_Init(const char* logFile);

/**
 * @brief Establishes a Kinetic protocol socket connection to a host.
 * @brief Configures the session and establishes a socket connection to a Kinetic Device
 *
 * @param connection        KineticConnection instance to configure with connection info
 * @param host              Host name or IP address to connect to
 * @param port              Port to establish socket connection on
 * @param blocking          Set to true for blocking or false for non-bloocking I/O
 * @param nonBlocking       Set to true for non-blocking or false for blocking I/O
 * @param clusterVersion    Cluster version to use for the session
 * @param identity          Identity to use for the session
 * @param key               Key to use for HMAC calculations (NULL-terminated string)
 *
 * @return                  Returns true if connection succeeded
 */
bool KineticClient_Connect(
    KineticConnection* connection,
bool KineticClient_Connect(KineticConnection* connection,
    const char* host,
    int port,
    bool blocking);
    bool nonBlocking,
    int64_t clusterVersion,
    int64_t identity,
    const char* key);

/**
 * @brief Closes the socket connection to a host.
@@ -56,30 +60,10 @@ bool KineticClient_Connect(
 */
void KineticClient_Disconnect(KineticConnection* connection);

/**
 * @brief Initializes and configures a Kinetic exchange.
 *
 * @param exchange          KineticExchange instance to configure with exchange info
 * @param connection        KineticConnection to associate with exchange
 * @param clusterVersion    Cluster version for the exchange
 * @param identity          Identity to use for the exchange
 * @param key               Key to use for HMAC calculations
 * @param keyLength         Length of HMAC key
 *
 * @return                  Returns true if configuration succeeded
 */
bool KineticClient_ConfigureExchange(
    KineticExchange* exchange,
    KineticConnection* connection,
    int64_t clusterVersion,
    int64_t identity,
    const char* key,
    size_t keyLength);

/**
 * @brief Creates and initializes a Kinetic operation.
 *
 * @param exchange          KineticExchange instance to populate with exchange info
 * @param connection        KineticConnection instance to associate with operation
 * @param request           KineticPDU instance to use for request
 * @param requestMsg        KineticMessage instance to use for request
 * @param response          KineticPDU instance to use for reponse
@@ -87,7 +71,7 @@ bool KineticClient_ConfigureExchange(
 * @return                  Returns a configured operation instance
 */
KineticOperation KineticClient_CreateOperation(
    KineticExchange* exchange,
    KineticConnection* connection,
    KineticPDU* request,
    KineticMessage* requestMsg,
    KineticPDU* response);
@@ -99,27 +83,21 @@ KineticOperation KineticClient_CreateOperation(
 *
 * @return                  Returns the resultant status code
 */
KineticProto_Status_StatusCode KineticClient_NoOp(
    KineticOperation* operation
    );
KineticProto_Status_StatusCode KineticClient_NoOp(KineticOperation* operation);

/**
 * @brief Executes a PUT command to write data to the Kinetic Device
 *
 * @param operation         KineticOperation instance to use for the operation
 * @param value             Value payload buffer
 * @param valueLength       Value payload length (in bytes)
 *
 * @return                  Returns the resultant status code
 */
KineticProto_Status_StatusCode KineticClient_Put(
    KineticOperation* operation,
KineticProto_Status_StatusCode KineticClient_Put(KineticOperation* operation,
    char* newVersion,
    char* key,
    char* dbVersion,
    char* tag,
    uint8_t* value,
    int64_t len
    );
    int64_t len);

#endif // _KINETIC_CLIENT_H
+27 −10
Original line number Diff line number Diff line
@@ -19,27 +19,26 @@
*/

#include "kinetic_connection.h"
#include "kinetic_proto.h"
#include "kinetic_socket.h"
#include "kinetic_pdu.h"
#include <string.h>

void KineticConnection_Init(KineticConnection* connection)
{
    KINETIC_CONNECTION_INIT(connection);
}

bool KineticConnection_Connect(
    KineticConnection* const connection,
    const char* host, int port, bool blocking)
bool KineticConnection_Connect(KineticConnection* const connection,
    const char* host, int port, bool nonBlocking,
    int64_t clusterVersion, int64_t identity, const char* key)
{
    connection->connected = false;
    connection->blocking = blocking;
    connection->nonBlocking = nonBlocking;
    connection->port = port;
    connection->socketDescriptor = -1;
    connection->clusterVersion = clusterVersion;
    connection->identity = identity;
    strcpy(connection->host, host);
    strcpy(connection->key, key);

    connection->socketDescriptor = KineticSocket_Connect(
        connection->host, connection->port, blocking);
        connection->host, connection->port, nonBlocking);
    connection->connected = (connection->socketDescriptor >= 0);

    return connection->connected;
@@ -53,3 +52,21 @@ void KineticConnection_Disconnect(KineticConnection* connection)
        connection->socketDescriptor = -1;
    }
}

void KineticConnection_IncrementSequence(KineticConnection* const connection)
{
    connection->sequence++;
}

void KineticConnection_ConfigureHeader(KineticConnection* const connection,
    KineticProto_Header* const header)
{
    header->has_clusterversion = true;
    header->clusterversion = connection->clusterVersion;
    header->has_identity = true;
    header->identity = connection->identity;
    header->has_connectionid = true;
    header->connectionid = connection->connectionID;
    header->has_sequence = true;
    header->sequence = connection->sequence;
}
Loading