Commit 2fa71509 authored by Greg Williams's avatar Greg Williams
Browse files

Got Put working, but the Java simulator is currently rejecting a seemingly...

Got Put working, but the Java simulator is currently rejecting a seemingly valid request which should update the dbVersion of a previously stored object
parent 3d95beef
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -8,17 +8,21 @@ This repo contains code for producing C Kinetic clients which use the Seagate Ki

Getting Started
================

**Clone the repo**

    > git clone --recursive https://github.com/atomicobject/kinetic-c.git
    > cd kinetic-c
    > bundle install # Ensure you have all RubyGems at the proper versions

**Update to the latest version (previously cloned)**

    > git pull
    > git submodule update --init # Ensure submodules are up to date
    > bundle install # Ensure you have all RubyGems at the proper versions

**Build Kinetic-C and run all tests**

    > bundle exec rake

API Documentation
@@ -71,7 +75,7 @@ Examples
The following examples are provided for development reference and as utilities to aid development. In order to execute a given example, you must first do:

```
> cd build/artifacts/release`
> cd build/artifacts/release
```

You can then execute `kinetic-c` with a valid example name, optionally preceeded with any of the optional arguments.
+72 −30
Original line number Diff line number Diff line
TEAMCITY_BUILD = !ENV['TEAMCITY_PROJECT_NAME'].nil?

require 'kinetic-ruby'
KineticRuby::Rake::load_tasks()

KineticRuby::Rake::load_tasks
require 'ceedling'
Ceedling.load_project(config: './project.yml')

@@ -22,6 +19,7 @@ def execute_command(cmd, banner=nil)
  report_banner banner unless banner.nil?
  report "Executing: #{cmd}"
  sh cmd
  report
  report unless banner.nil?
end

@@ -124,6 +122,8 @@ end

namespace :java_sim do

  JAVA_HOME = ENV.fetch('JAVA_HOME', '/usr')
  JAVA_BIN = File.join(JAVA_HOME, 'bin/java')
  $java_sim = nil

  def java_sim_start
@@ -134,19 +134,15 @@ namespace :java_sim do

    java_sim_cleanup

    # Validate JAVA_HOME
    java_home = ENV.fetch('JAVA_HOME', '/usr')
    java = File.join(java_home, 'bin/java')

    # Find the java simulator jar
    jars = Dir["vendor/kinetic-java/kinetic-simulator*.jar"]
    raise "No Kinetic Java simulator .jar files found!" if jars.empty?

    # Configure the classpath
    ENV['CLASSPATH'] = '' unless ENV['CLASSPATH']
    jars += [File.join(java_home, 'lib/tools.jar')]
    jars += [File.join(JAVA_HOME, 'lib/tools.jar')]
    jars.each {|jar| ENV['CLASSPATH'] += ':' + jar }
    $java_sim = spawn("#{java} -classpath #{ENV['CLASSPATH']} com.seagate.kinetic.simulator.internal.SimulatorRunner")
    $java_sim = spawn("#{JAVA_BIN} -classpath #{ENV['CLASSPATH']} com.seagate.kinetic.simulator.internal.SimulatorRunner")
    sleep 5 # wait for simulator to start up and server ready to receive connections
    # TODO: use netstat or something to just wait until the server opens the port
    #       since it might take longer than the hardcoded sleep(x) above :-/
@@ -163,6 +159,11 @@ namespace :java_sim do
    end
  end

  def java_sim_erase_drive
    java_sim_start
    sh "#{JAVA_BIN} -classpath #{ENV['CLASSPATH']} com.seagate.kinetic.admin.cli.KineticAdminCLI -setup -erase true"
  end

  def java_sim_cleanup
    # Ensure stray simulators are not still running
    `ps -ef | grep kinetic-simulator`.each_line do |l|
@@ -185,6 +186,10 @@ namespace :java_sim do
    java_sim_shutdown
  end

  task :erase do
    java_sim_erase_drive
  end

end

namespace :ruby_sim do
@@ -212,8 +217,13 @@ namespace :ruby_sim do
  end
end

task 'test/integration/test_kinetic_socket.c' => ['ruby_sim:start']
task 'test/system/test_kinetic_api_system.c' => ['ruby_sim:shutdown', 'java_sim:start']
# Setup ruby and java simulators for integration and system tests
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']
end

namespace :system do
  desc "Run system tests w/KineticRuby for message inspection"
@@ -226,11 +236,10 @@ namespace :system do
      Rake::Task[task].invoke
    end

    [
      'test/system/test_kinetic_api_system.c'
    ].each do |task|
      Rake::Task[task].clear_prerequisites
      Rake::Task[task].invoke
    Dir['test/system/test_*.c'].each do |test_task|
      p test_task
      Rake::Task[test_task].clear_prerequisites
      Rake::Task[test_task].invoke
    end

  end
@@ -267,6 +276,7 @@ task :default => [


namespace :test do

  desc "Run unit tests"
  task :unit do
    report_banner "Running Unit Tests"
@@ -284,6 +294,12 @@ namespace :test do
    shutdown_ruby_server
  end

  namespace :integration do
    task :noop do
      ####### ???
    end
  end

  desc "Run system tests"
  task :system => ['java_sim:start'] do
    report_banner "Running System Tests"
@@ -295,24 +311,50 @@ namespace :test do
  end

  desc "Run Kinetic Client Utility tests"
  task :utility => ['ruby_sim:shutdown'] do
    report_banner "Running Kinetic Client Utility Tests"
  task :utility => [
    'release',
    'ruby_sim:shutdown',
    'test:utility:noop',
    'test:utility:put',
  ]

  namespace :utility do

    def with_test_server(banner)
      report_banner(banner)
      shutdown_ruby_server
      java_sim_start
    Rake::Task['release'].invoke
      cd "./build/artifacts/release/" do
        yield if block_given?
      end
    end

    task :noop => ['release', 'ruby_sim:shutdown'] do
      with_test_server("Testing NoOp Operation") do
        execute_command "./kinetic-c noop"
        execute_command "./kinetic-c --host localhost noop"
        execute_command "./kinetic-c --host 127.0.0.1 noop"
        execute_command "./kinetic-c --blocking --host 127.0.0.1 noop"
      end
    end

    task :put => ['release', 'ruby_sim:shutdown'] do
      with_test_server("Testing Put operation") do
        execute_command "./kinetic-c put"
      end
    end

task :test_all => ['test:unit', 'test:integration', 'test:system', 'test:utility'] do
  report_banner "Finished executing all test suites!"
  end

end

task :test_all => [
  'test:unit',
  'test:integration',
  'test:system',
  'test:utility'
]

desc "Build all and run test utility"
task :all => [
  'cppcheck',
+3 −3
Original line number Diff line number Diff line
@@ -21,10 +21,10 @@
#ifndef KINETIC_H_
#define KINETIC_H_

#include "kinetic_types.h"
#include "kinetic_api.h"
#include "protobuf-c.h"
#include "kinetic_proto.h"
#include "kinetic_logger.h"
#include "kinetic_connection.h"
#include "protobuf-c.h"
#include "kinetic_client.h"

#endif /* KINETIC_H_ */
+34 −9
Original line number Diff line number Diff line
@@ -18,18 +18,18 @@
*
*/

#include "kinetic_api.h"
#include "kinetic_client.h"
#include "kinetic_connection.h"
#include "kinetic_pdu.h"
#include "kinetic_logger.h"
#include <stdio.h>

void KineticApi_Init(const char* logFile)
void KineticClient_Init(const char* logFile)
{
    KineticLogger_Init(logFile);
}

bool KineticApi_Connect(
bool KineticClient_Connect(
    KineticConnection* connection,
    const char* host,
    int port,
@@ -52,7 +52,13 @@ bool KineticApi_Connect(
    return true;
}

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

bool KineticClient_ConfigureExchange(
    KineticExchange* exchange,
    KineticConnection* connection,
    int64_t clusterVersion,
@@ -85,7 +91,7 @@ bool KineticApi_ConfigureExchange(
    return true;
}

KineticOperation KineticApi_CreateOperation(
KineticOperation KineticClient_CreateOperation(
    KineticExchange* exchange,
    KineticPDU* request,
    KineticMessage* requestMsg,
@@ -133,7 +139,7 @@ KineticOperation KineticApi_CreateOperation(
    return op;
}

KineticProto_Status_StatusCode KineticApi_NoOp(KineticOperation* operation)
KineticProto_Status_StatusCode KineticClient_NoOp(KineticOperation* operation)
{
    KineticProto_Status_StatusCode status =
        KINETIC_PROTO_STATUS_STATUS_CODE_INVALID_STATUS_CODE;
@@ -164,8 +170,12 @@ KineticProto_Status_StatusCode KineticApi_NoOp(KineticOperation* operation)
	return status;
}

KineticProto_Status_StatusCode KineticApi_Put(
KineticProto_Status_StatusCode KineticClient_Put(
    KineticOperation* operation,
    char* newVersion,
    char* key,
    char* dbVersion,
    char* tag,
    uint8_t* value,
    int64_t len)
{
@@ -179,9 +189,24 @@ KineticProto_Status_StatusCode KineticApi_Put(
    assert(operation->response != NULL);
    assert(operation->response->message == NULL);
    assert(value != NULL);
    assert(len < 1024*1024);
    assert(len <= 1024*1024);

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

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

    // TODO: Make it happen!!!
    // Associate response with same exchange as request
    operation->response->exchange = operation->request->exchange;

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

    return status;
}
+20 −10
Original line number Diff line number Diff line
@@ -18,8 +18,8 @@
*
*/

#ifndef _KINETIC_API_H
#define _KINETIC_API_H
#ifndef _KINETIC_CLIENT_H
#define _KINETIC_CLIENT_H

#include "kinetic_types.h"
#include "kinetic_exchange.h"
@@ -31,8 +31,7 @@
 *
 * @param logFile Path to log file. Specify NULL to log to STDOUT.
 */
void KineticApi_Init(
    const char* logFile);
void KineticClient_Init(const char* logFile);

/**
 * @brief Establishes a Kinetic protocol socket connection to a host.
@@ -44,12 +43,19 @@ void KineticApi_Init(
 *
 * @return                  Returns true if connection succeeded
 */
bool KineticApi_Connect(
bool KineticClient_Connect(
    KineticConnection* connection,
    const char* host,
    int port,
    bool blocking);

/**
 * @brief Closes the socket connection to a host.
 *
 * @param connection        KineticConnection instance
 */
void KineticClient_Disconnect(KineticConnection* connection);

/**
 * @brief Initializes and configures a Kinetic exchange.
 *
@@ -62,7 +68,7 @@ bool KineticApi_Connect(
 *
 * @return                  Returns true if configuration succeeded
 */
bool KineticApi_ConfigureExchange(
bool KineticClient_ConfigureExchange(
    KineticExchange* exchange,
    KineticConnection* connection,
    int64_t clusterVersion,
@@ -80,7 +86,7 @@ bool KineticApi_ConfigureExchange(
 *
 * @return                  Returns a configured operation instance
 */
KineticOperation KineticApi_CreateOperation(
KineticOperation KineticClient_CreateOperation(
    KineticExchange* exchange,
    KineticPDU* request,
    KineticMessage* requestMsg,
@@ -93,7 +99,7 @@ KineticOperation KineticApi_CreateOperation(
 *
 * @return                  Returns the resultant status code
 */
KineticProto_Status_StatusCode KineticApi_NoOp(
KineticProto_Status_StatusCode KineticClient_NoOp(
    KineticOperation* operation
    );

@@ -106,10 +112,14 @@ KineticProto_Status_StatusCode KineticApi_NoOp(
 *
 * @return                  Returns the resultant status code
 */
KineticProto_Status_StatusCode KineticApi_Put(
KineticProto_Status_StatusCode KineticClient_Put(
    KineticOperation* operation,
    char* newVersion,
    char* key,
    char* dbVersion,
    char* tag,
    uint8_t* value,
    int64_t len
    );

#endif // _KINETIC_API_H
#endif // _KINETIC_CLIENT_H
Loading