Folly is an open source library of C++14 components designed by Facebook with practicality and efficiency in their mind. Folly provides support for writing asynchronous code in C++ using Future and Promise pattern. They also support locks for dealing with synchronization.
Nekara is a language-agnostic concurrency testing framework for finding concurrency bugs that occur infrequently in normal executions. Nekara provides a set of APIs and requires the programmers to call them before the appropriate statements. Subsequently, Nekara takes over the scheduling of concurrent Tasks and systematically explores the various interleavings of Threads. Its server-client architecture allows the decoupling of the testing logic and the programming interface.
This repository contains the C++ implementation of the Nekara client.
ControlledFolly is a "mock library" that implements Folly's API using Nekara concurrency testing framework. It allows applications using Folly to be tested with Nekara in a controlled manner. It consists of the following:
-
NekaraCppClient
: NekaraCppClient is a C++ implementation of the Nekara client, which is a thin proxy stub that makes remote procedure calls (RPC) to the Nekara testing service. It provides the same set of APIs as the Nekara testing service and communicates with it using HTTP calls. One can include "NekaraCppClient.h", start the client, and include API calls to allow the testing service to control the scheduling of threads. -
Wrappers for
Future
,Promise
andLock
s: A wrapper is provided on top of Future, Promise and Lock, which call the testing API methods under the hood and consequently reduce the effort required to instrument a test program using the low-level APIs.ControlledFuture
- wrapper on top of Future.ControlledPromise
- wrapper on top of Promise.ControlledMicroLock, ControlledMicroSpinLock, and ControlledPicoSpinLock
- wrapper on top of Locks.
One can use these wrappers by including them in the headers (
ControlledFuture.h
,ControlledPromise.h
, andControlledMicroLock.h
) for testing. For production execution, usetypedef
to replaceControlledFuture
byFuture
. As of now the wrappers implement the basic APIs for writing asynchronous code and the complete wrapper (supporting all Folly APIs) will be made public in the upcoming days.
- ControlledFolly is written in C++ 14 standard. Dependency: Folly.
- Start the Nekara Testing service.
- Just include
NekaraCppClient.h
,ControlledFuture.h
,ControlledPromise.h
andControlledMicroLock.h
(as required) into your headers. - Instrument the test program using the Nekara API and execute the program.
-
Consider a sample code FollyAccEx.cpp which uses
Future
andLock
of Folly. There are three Future objects trying to access the two shared variablessh_t1
andsh_t2
. It uses locks to avoid race condition during concurrent execution. -
Test-FollyAccEx.cpp shows the instrumented testing code.
Helpers::CreateTestingServices(HTTP, "localhost", 8080, "")
starts the HTTP NekaraCppClient._client->CreateThread()
,_client->StartThread(id)
and_client->EndThread(id)
are the API calls made to Testing services.
-
Wrapper-FollyAccEx.cpp shows the functionality of wrapper code (
ControlledFuture.h
,ControlledPromise.h
, andControlledMicroLock.h
) where the API callsCreateThread
,StartThread
andEndThread
were made by the wrapper itself.