Skip to main content
Version: 2.5.0

Running Tests

ChronoLog's test suite covers four broad categories: unit, integration, communication/overhead, and system/workload tests. The full suite is registered with CMake's CTest framework except for a handful of Python system scripts and shell workload drivers that live outside the CTest tree.

A debug build exposes the largest set of tests (~133 CTest entries). Some entries are DISABLED in the default run; others are marked MANUAL because they require a live multi-process ChronoLog deployment before they can succeed.


How to Run Tests

CTest (automated)

From your CMake build directory:

# List all registered tests without running them
ctest -N

# Run all enabled tests (parallel, verbose)
ctest --output-on-failure -j$(nproc)

# Run a specific subset by name regex
ctest -R "Unit_ChronoCommon_StoryChunk" --output-on-failure

# Run including DISABLED tests
ctest -R "." --output-on-failure
info

ctest -N is the authoritative source of truth for test counts and names in a given build. Debug builds include extra GTest cases (e.g. TRACE/DEBUG macro tests) that are absent from release builds.

Manual Tests

Tests labelled MANUAL require ChronoVisor, ChronoKeeper, and the client library to be running before execution. Start the deployment first (see the Docker tutorials), then invoke the binary directly:

# Example — client connectivity test
./test/integration/client/client_connect_rpc_test

# Shell-based communication protocol test
bash test/communication/thallium_protocol_test.sh

Disabled Tests

The following tests are registered with CTest but excluded from the default run. They can be forced with ctest -R <name>:

CTest NameSource FileReason
Unit_ChronoCommon_ExtractionChaintest/unit/chrono-common/chrono_common_extraction_chain_test.cppUnder active development
Unit_ChronoCommon_ChunkConsumerServicetest/unit/chrono-common/chrono_common_chunk_consumer_service_test.cppUnder active development
Unit_ChronoPlayer_StoryChunkTransferAgenttest/unit/chrono-player/chrono_player_transfer_agent_test.cppUnder active development
Unit_ChronoPlayer_PlaybackServiceLifecycletest/unit/chrono-player/chrono_player_playback_service_test.cppUnder active development

Server Tests

info

The three GTest suites below (story_chunk_test, story_pipeline_test, chronokvs_logger_test) are discovered at runtime by GTest. CTest registers each individual test case as a separate entry, so a single ctest -R Unit_ChronoCommon_StoryChunk run executes all 47 cases.

Unit Tests – StoryChunk

47 GTest cases. CTest name prefix: Unit_ChronoCommon_StoryChunk_

TestConstructors

Test NameTypeFrameworkSource FileDescription
testEmptyConstructorUnitGTesttest/unit/chrono-common/story_chunk_test.cppEmpty StoryChunk has no events
testNormalCtorInitUnitGTesttest/unit/chrono-common/story_chunk_test.cppStart/end times set correctly
testBoundaryCtorInitUnitGTesttest/unit/chrono-common/story_chunk_test.cppendTime < startTime is auto-corrected to startTime + 5000

TestInsertEvent

Test NameTypeFrameworkSource FileDescription
testNormalInsertEventUnitGTesttest/unit/chrono-common/story_chunk_test.cppSingle event inserted and retrieved
testInsertAtEndTimeUnitGTesttest/unit/chrono-common/story_chunk_test.cppEvent at endTime boundary rejected
testInsertBeforeStartUnitGTesttest/unit/chrono-common/story_chunk_test.cppEvent before startTime rejected
testInsertAtStartTimeUnitGTesttest/unit/chrono-common/story_chunk_test.cppEvent at startTime accepted
testOutOfOrderInsertUnitGTesttest/unit/chrono-common/story_chunk_test.cpp6 out-of-order events stored chronologically
testDuplicateKeyCombinationsUnitGTesttest/unit/chrono-common/story_chunk_test.cppSame timestamp with different client/index accepted; true duplicate rejected
testStressInsertUnitGTesttest/unit/chrono-common/story_chunk_test.cpp100 000 events inserted and verified
testIncorrectEventIdUnitGTesttest/unit/chrono-common/story_chunk_test.cppEvent with wrong storyId rejected
testInsertLargeEventRecordUnitGTesttest/unit/chrono-common/story_chunk_test.cpp20 KB payload event accepted

TestMergeEvents

Test NameTypeFrameworkSource FileDescription
testEmptyInputMapUnitGTesttest/unit/chrono-common/story_chunk_test.cppMerge of empty map does nothing
testStartBeforeWindowUnitGTesttest/unit/chrono-common/story_chunk_test.cppOnly in-window events merged from map
testValidMergeUnitGTesttest/unit/chrono-common/story_chunk_test.cpp2 valid events merged and map emptied
testAllInvalidMergesUnitGTesttest/unit/chrono-common/story_chunk_test.cppAll out-of-window events rejected
testDuplicateTimestampsUnitGTesttest/unit/chrono-common/story_chunk_test.cpp3 events at same timestamp all merged
testHugeMergeUnitGTesttest/unit/chrono-common/story_chunk_test.cpp1 000 events merged at once
BoundaryEndTimeExclusionUnitGTesttest/unit/chrono-common/story_chunk_test.cppEvent at endTime excluded; endTime-1 included
testMergeFromMiddleUnitGTesttest/unit/chrono-common/story_chunk_test.cppMerge starts from arbitrary iterator position
testMergeEmptyChunkUnitGTesttest/unit/chrono-common/story_chunk_test.cppMerging empty StoryChunk changes nothing
testMergeWithinWindowUnitGTesttest/unit/chrono-common/story_chunk_test.cpp2 in-window events merged from other chunk
testMergeOutsideWindowUnitGTesttest/unit/chrono-common/story_chunk_test.cppOnly in-window subset merged
testMixedChunkMergeUnitGTesttest/unit/chrono-common/story_chunk_test.cppOverlap events from differently-windowed chunk
testMergeStartTimeIncorrectUnitGTesttest/unit/chrono-common/story_chunk_test.cppmergeStart before/after window still bounded by chunk window
testMergeMapThenChunkUnitGTesttest/unit/chrono-common/story_chunk_test.cppSequential map-merge then chunk-merge both succeed
testIncorrectStoryIdUnitGTesttest/unit/chrono-common/story_chunk_test.cppWrong storyId event rejected
testEmptyAndHugePayloadsUnitGTesttest/unit/chrono-common/story_chunk_test.cppEmpty-record and 5 KB payload handled
testMergeStartBeforeEndInsideUnitGTesttest/unit/chrono-common/story_chunk_test.cppOther chunk starts before, ends inside
testMergeStartInsideEndAfterUnitGTesttest/unit/chrono-common/story_chunk_test.cppOther chunk starts inside, ends after
testMergeExactBoundaryNoOverlapUnitGTesttest/unit/chrono-common/story_chunk_test.cppNo overlap at exact boundary

TestEraseEvents

Test NameTypeFrameworkSource FileDescription
testValidEraseUnitGTesttest/unit/chrono-common/story_chunk_test.cppErase single event by timestamp range
testNonExistingTimestampUnitGTesttest/unit/chrono-common/story_chunk_test.cppErase non-existent timestamp is no-op
testEraseDuplicateTimestampsUnitGTesttest/unit/chrono-common/story_chunk_test.cppBoth events at same timestamp erased
testEraseInRangeUnitGTesttest/unit/chrono-common/story_chunk_test.cppRange erase removes all events in [120, 160)
testEraseOutOfTimeUnitGTesttest/unit/chrono-common/story_chunk_test.cppRange outside chunk window is no-op
testEraseInvalidTimeUnitGTesttest/unit/chrono-common/story_chunk_test.cppstart > end is no-op
testEraseAllEventsUnitGTesttest/unit/chrono-common/story_chunk_test.cppErase [10, 2000) removes all events
testStressEraseUnitGTesttest/unit/chrono-common/story_chunk_test.cppErase 20 000 events from a 100 000-event chunk
testEraseEndTimeMinusOneUnitGTesttest/unit/chrono-common/story_chunk_test.cppendTime-1 erased; others kept
testZeroRangeUnitGTesttest/unit/chrono-common/story_chunk_test.cppErase [x, x) is no-op

TestExtractEventSeries

Test NameTypeFrameworkSource FileDescription
testExtractEmptyChunkUnitGTesttest/unit/chrono-common/story_chunk_test.cppExtract from empty chunk returns empty vector
testExtractSingleEventUnitGTesttest/unit/chrono-common/story_chunk_test.cppSingle event extracted with correct fields
testExtractEventsSortedUnitGTesttest/unit/chrono-common/story_chunk_test.cpp7 events extracted in ascending order
testExtractTwiceUnitGTesttest/unit/chrono-common/story_chunk_test.cppSecond extract returns empty after chunk cleared
testExtractAfterReinsertUnitGTesttest/unit/chrono-common/story_chunk_test.cppInsert → extract → insert → extract cycle
testExtractLargePayloadUnitGTesttest/unit/chrono-common/story_chunk_test.cpp5 KB payload preserved after extract

Unit Tests – StoryPipeline

28 GTest cases. CTest name prefix: Unit_ChronoCommon_StoryPipeline_

TestConstructors

Test NameTypeFrameworkSource FileDescription
testValidEmptyInitUnitGTesttest/unit/chrono-common/story_pipeline_test.cppPipeline created with zero startTime
testOnBoundaryStartTimeUnitGTesttest/unit/chrono-common/story_pipeline_test.cppGranularity-aligned start kept; 3 chunks allocated
testNonBoundaryRoundingUnitGTesttest/unit/chrono-common/story_pipeline_test.cppNon-aligned start rounded to previous boundary
testHugeStoryStartTimeNoOverflowUnitGTesttest/unit/chrono-common/story_pipeline_test.cppNear-max startTime with no uint64 overflow

TestGetActiveIngestionHandle

Test NameTypeFrameworkSource FileDescription
testNonNullHandleEmptyDequesUnitGTesttest/unit/chrono-common/story_pipeline_test.cppHandle non-null; active and passive deques empty

TestCollectIngestedEvents

Test NameTypeFrameworkSource FileDescription
testNoChunkValidUnitGTesttest/unit/chrono-common/story_pipeline_test.cppNo chunk → collect is no-op
testSingleEmptyChunkUnitGTesttest/unit/chrono-common/story_pipeline_test.cppEmpty chunk removed; deques stay empty
testSingleNonEmptyChunkUnitGTesttest/unit/chrono-common/story_pipeline_test.cppNon-empty chunk merged and deleted
testNullptrInActiveDequeUnitGTesttest/unit/chrono-common/story_pipeline_test.cppnullptr entry skipped without crash

TestExtractDecayedChunks

Test NameTypeFrameworkSource FileDescription
testEmptyExtractUnitGTesttest/unit/chrono-common/story_pipeline_test.cppExtract before decay threshold extracts nothing
testExtractSmallAfterDecayUnitGTesttest/unit/chrono-common/story_pipeline_test.cppNon-empty chunk stashed after decay
testExtractMultipleUnitGTesttest/unit/chrono-common/story_pipeline_test.cppTwo chunks stashed past both decay points
testNoAppendAfterSingleDecayUnitGTesttest/unit/chrono-common/story_pipeline_test.cppTimeline shrinks; no append when ≥2 chunks remain
testAppendBehaviorAfterMultiDecayUnitGTesttest/unit/chrono-common/story_pipeline_test.cppNew chunk appended when only 1 chunk left
testExtractLeavesTwoUnitGTesttest/unit/chrono-common/story_pipeline_test.cppEmpty head chunks removed; future non-empty chunk preserved

MergeEvents

Test NameTypeFrameworkSource FileDescription
testEmptyMergeUnitGTesttest/unit/chrono-common/story_pipeline_test.cppMerging empty chunk is no-op
testPrependSuccessUnitGTesttest/unit/chrono-common/story_pipeline_test.cppEvent before TimelineStart causes prepend
testSingleAppendUnitGTesttest/unit/chrono-common/story_pipeline_test.cppEvent after TimelineEnd extends timeline by 1 chunk
testMultipleAppendUnitGTesttest/unit/chrono-common/story_pipeline_test.cppFar-future event extends timeline multiple chunks

TestPrependStoryChunk

Test NameTypeFrameworkSource FileDescription
testSuccessUnitGTesttest/unit/chrono-common/story_pipeline_test.cppPrepend moves TimelineStart back by 1 granularity

TestAppendStoryChunk

Test NameTypeFrameworkSource FileDescription
testSuccessUnitGTesttest/unit/chrono-common/story_pipeline_test.cppAppend moves TimelineEnd forward by 1 granularity

TestFinalize

Test NameTypeFrameworkSource FileDescription
testNoPendingChunksUnitGTesttest/unit/chrono-common/story_pipeline_test.cppFinalize on empty pipeline does nothing
testOnlyPassiveDequeUnitGTesttest/unit/chrono-common/story_pipeline_test.cppPassive-deque chunk stashed
testOnlyActiveDequeUnitGTesttest/unit/chrono-common/story_pipeline_test.cppActive-deque chunk stashed
testMixedDequesUnitGTesttest/unit/chrono-common/story_pipeline_test.cppPassive then active chunks stashed in FIFO order
testEmptyVsNonTimelineUnitGTesttest/unit/chrono-common/story_pipeline_test.cppEmpty head chunks skipped; non-empty stashed
testFinalizeDoubleCallUnitGTesttest/unit/chrono-common/story_pipeline_test.cppSecond finalize is a safe no-op
testFinalizeWithMixedTimelineUnitGTesttest/unit/chrono-common/story_pipeline_test.cpp3 non-empty chunks in pipeline all stashed

Unit Tests – ChronoKVS Logger

25 GTest cases in a debug build (22 in release). CTest name prefix: Unit_ChronoKVS_ChronoKVSLogger_

Test NameTypeFrameworkSource FileDescription
LogLevel_EnumOrderingUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppLog-level enum ordering is correct
LogLevel_ExactValuesUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppLog-level enum exact integer values
DefaultLevel_ReturnsExpectedUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppgetDefaultLogLevel() returns DEBUG (debug build) or ERROR (release)
LogLevelToString_AllLevelsUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppAll 7 levels convert to correct string
LogLevelToString_UnknownUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppUnknown level returns fallback string
FormatMessage_SingleStringUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppFormat with a single string argument
FormatMessage_OneIntArgUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppFormat with one integer argument
FormatMessage_StringArgUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppFormat with one string argument
FormatMessage_MultipleArgsUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppFormat with multiple mixed arguments
Macros_InfoEnabledUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppINFO macro fires when level ≤ INFO
Macros_InfoDisabledUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppINFO macro suppressed when level > INFO
Macros_WarningEnabledUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppWARNING macro fires when level ≤ WARNING
Macros_WarningDisabledUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppWARNING macro suppressed when level > WARNING
Macros_ErrorEnabledUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppERROR macro fires when level ≤ ERROR
Macros_ErrorDisabledUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppERROR macro suppressed when level > ERROR
Macros_CriticalEnabledUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppCRITICAL macro fires when level ≤ CRITICAL
Macros_CriticalDisabledUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppCRITICAL macro suppressed when level > CRITICAL
Macros_OffDisablesAllUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppOFF level suppresses all macros
DebugMacros_TraceEnabledUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppTRACE macro fires at TRACE level (debug build only)
DebugMacros_TraceDisabledUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppTRACE macro suppressed above TRACE level (debug build only)
DebugMacros_DebugEnabledUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppDEBUG macro fires at DEBUG level (debug build only)
DebugMacros_DebugDisabledUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppDEBUG macro suppressed above DEBUG level (debug build only)
DebugMacros_AllLevelsWithTraceUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppAll levels produce output with TRACE active (debug build only)
ReleaseMacros_TraceDebugAreNoopsUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppTRACE/DEBUG are no-ops in release builds (release build only)
ReleaseMacros_InfoStillWorksUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppINFO still works after TRACE/DEBUG no-op (release build only)
LogMessage_DirectCallUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppDirect log_message() call at each level
LogMessage_AllLevelsDirectUnitGTesttest/unit/chronokvs/chronokvs_logger_test.cppAll levels exercised via log_message()

Unit Tests – ChronoStore

2 standalone CTest entries.

Test NameTypeFrameworkSource FileDescription
Unit_ChronoStore_HDF5ArchiverWriteReadRoundtripUnitCustomtest/unit/chrono-store/chrono_store_hdf5_archiver_test.cppWrite events to HDF5 archive and read back with matching content
Unit_ChronoStore_VlenBytesVsBlobMapComparisonUnitCustomtest/unit/chrono-store/chrono_store_vlen_bytes_vs_blob_map_test.cppCompare variable-length bytes and blob-map HDF5 storage strategies

Unit Tests – ChronoPlayer

4 standalone CTest entries; 2 are disabled in the default run.

Test NameTypeFrameworkSource FileDescription
Unit_ChronoPlayer_HDF5ArchiveReadingAgentUnitCustomtest/unit/chrono-player/chrono_player_hdf5_archive_reader_test.cppHDF5 reading agent retrieves story chunks from archive
Unit_ChronoPlayer_FileSystemMonitoringUnitCustomtest/unit/chrono-player/chrono_player_fs_monitoring_test.cppFile-system watcher detects new archive files
Unit_ChronoPlayer_StoryChunkTransferAgent (DISABLED)UnitCustomtest/unit/chrono-player/chrono_player_transfer_agent_test.cppTransfer agent lifecycle (under development)
Unit_ChronoPlayer_PlaybackServiceLifecycle (DISABLED)UnitCustomtest/unit/chrono-player/chrono_player_playback_service_test.cppPlayback service start/stop lifecycle (under development)

Integration Tests – Keeper-Grapher

Test NameTypeFrameworkSource FileDescription
Integration_KeeperGrapher_StoryChunkIngestIntegrationCustomtest/integration/keeper-grapher/keeper_grapher_ingest_test.cppChronoKeeper ingest pipeline stores chunks in ChronoGrapher
Integration_KeeperGrapher_StoryChunkExtractIntegrationCustomtest/integration/keeper-grapher/keeper_grapher_extract_test.cppDecay-triggered extraction delivers chunks from Keeper to Grapher

Integration Tests – Package Discovery

Test NameTypeFrameworkSource FileDescription
PackageDiscovery_CMakeFindPackageIntegrationCMaketest/integration/package-discovery/package_discovery_cmake_test.cppfind_package(ChronoLog) locates headers and libraries in-tree
PackageDiscovery_PkgConfigIntegrationCMaketest/integration/package-discovery/package_discovery_pkgconfig_test.cpppkg-config --cflags chronolog returns correct flags in-tree
PackageDiscovery_Installed_CMakeFindPackageIntegrationCMake script(CMake script)find_package(ChronoLog) succeeds after cmake --install
PackageDiscovery_Installed_PkgConfigIntegrationCMake script(CMake script)pkg-config succeeds after cmake --install

Communication Tests

Test NameTypeFrameworkSource FileDescription
Communication_Thallium_ServerRepeaterRpcCommunicationCustomtest/communication/thallium_server_test.cppThallium RPC server accepts and echoes RPCs
Communication_Thallium_ClientMpiCommunicationMPItest/communication/thallium_client_mpi_test.cppMPI-launched client exchanges RPCs with server
Communication_Thallium_ClientSendRecvOrRdma (MANUAL)CommunicationCustomtest/communication/thallium_client_test.cppSend/recv and RDMA paths tested with live server
Communication_Thallium_ProtocolScript (MANUAL)CommunicationShelltest/communication/thallium_protocol_test.shShell script probes all supported Thallium transports

Overhead / Benchmark Tests

Test NameTypeFrameworkSource FileDescription
Overhead_Clock_HighResolutionClockOverheadCustomtest/overhead/clock/clock_high_resolution_test.cppclock_gettime resolution and monotonicity
Overhead_Clock_TimestampCollectionOverheadCustomtest/overhead/clock/clock_timestamp_collection_test.cppThroughput of timestamp-collection in a tight loop
Overhead_Clock_TimestampCollisionDetectionOverheadCustomtest/overhead/clock/clock_timestamp_collision_test.cppCollision-detection logic under concurrent timestamp pressure
Overhead_Clock_Script (MANUAL)OverheadShelltest/overhead/clock/clock_cset_shield_test.shCPU-set shielding effect on clock overhead
Overhead_Lock_ContentionBenchmarkOverheadCustomtest/overhead/lock/lock_overhead_test.cppMutex vs. spinlock contention benchmark

System & Workload Scripts

These scripts are not registered with CTest. Run them directly after a full deployment.

ScriptTypeDescription
test/system/fidelity_test_01.pySystemPython fidelity test — scenario 01
test/system/fidelity_test_02.pySystemPython fidelity test — scenario 02
test/system/fidelity_test_03.pySystemPython fidelity test — scenario 03
test/system/fidelity_test_all.pySystemDrives all three fidelity scenarios in sequence
test/synthetic_workload/perf_test.shWorkloadMPI-launched performance benchmark
test/synthetic_workload/distributed_syslog.shWorkloadDistributed syslog simulation across multiple nodes

Client Tests

warning

All client integration tests require a live ChronoLog deployment (ChronoVisor + ChronoKeeper + ChronoGrapher) before they will succeed. Start the system first — see the Docker tutorials — then run these tests manually.

Integration Tests

Test NameTypeFrameworkSource FileDescription
Integration_Client_ConnectRpcIntegrationCustomtest/integration/client/client_connect_rpc_test.cppClient connects to ChronoVisor via RPC
Integration_Client_MetadataRpcIntegrationCustomtest/integration/client/client_metadata_rpc_test.cppCreate/destroy chronicle and story metadata RPCs
Integration_Client_MultiPthreadIntegrationCustomtest/integration/client/client_multi_pthread_test.cppMultiple POSIX threads sharing a single client handle
Integration_Client_ThreadInterdependencyIntegrationCustomtest/integration/client/client_thread_interdependency_test.cppThreads depend on each other's story events
Integration_Client_MultiStorytellersIntegrationCustomtest/integration/client/client_multi_storytellers_test.cppMultiple storyteller handles writing concurrently
Integration_Client_StoryReaderIntegrationCustomtest/integration/client/client_story_reader_test.cppReader API retrieves events written by a storyteller
Integration_Client_MultiArgobotsIntegrationCustomtest/integration/client/client_multi_argobots_test.cppMultiple Argobots ULTs sharing a client
Integration_Client_MultiOpenmpIntegrationCustomtest/integration/client/client_multi_openmp_test.cppOpenMP threads writing events in parallel
Integration_Client_HybridArgobotsIntegrationCustomtest/integration/client/client_hybrid_argobots_test.cppHybrid Argobots + POSIX thread concurrency

Communication Tests – Client

Test NameTypeFrameworkSource FileDescription
Communication_Thallium_ClientSendRecvOrRdma (MANUAL)CommunicationCustomtest/communication/thallium_client_test.cppClient-side send/recv and RDMA paths with live server

ChronoKVS Integration

Test NameTypeFrameworkSource FileDescription
Integration_ChronoKVS_PluginIntegration (MANUAL)IntegrationCustomtest/integration/chronokvs/chronokvs_integration_test.cppChronoKVS plugin end-to-end write/read with live deployment
info

Integration_ChronoKVS_PluginIntegration has a 300-second CTest timeout. It exercises the full ChronoKVS write and read path, so a running ChronoLog system and a populated KVS store are required.