Skip to content

Commit

Permalink
Merge branch 'develop' into switchjenkins
Browse files Browse the repository at this point in the history
  • Loading branch information
dcristoloveanu committed Aug 5, 2016
2 parents 2fb1182 + a2d317b commit 10ea02b
Show file tree
Hide file tree
Showing 11 changed files with 537 additions and 308 deletions.
20 changes: 16 additions & 4 deletions bindings/dotnet/src/dotnet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -378,16 +378,28 @@ bool buildMessageObject(MESSAGE_HANDLE messageHandle, _AssemblyPtr spAzureIoTGat
SAFEARRAY *psaAzureIoTGatewayMessageConstructorArgs = NULL;
bool returnResult = false;
int32_t msg_size;
unsigned char*msgByteArray = NULL;


try
{
const unsigned char*msgByteArray = Message_ToByteArray(messageHandle, &msg_size);
msg_size = Message_ToByteArray(messageHandle, NULL, 0);
SAFEARRAYBOUND rgsabound[1];

if (msg_size > 0)
{
msgByteArray = (unsigned char*)malloc(msg_size);
if (msgByteArray != NULL)
{
Message_ToByteArray(messageHandle, msgByteArray, msg_size);
rgsabound[0].cElements = msg_size;
rgsabound[0].lLbound = 0;
}
}

variant_t msgContentInByteArray;
V_VT(&msgContentInByteArray) = VT_ARRAY | VT_UI1;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].cElements = msg_size;
rgsabound[0].lLbound = 0;

HRESULT hrResult;
void * pArrayData = NULL;

Expand Down
84 changes: 67 additions & 17 deletions bindings/dotnet/tests/dotnet_unittests/dotnet_unittests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1462,9 +1462,8 @@ TYPED_MOCK_CLASS(CDOTNETMocks, CGlobalMock)
MOCK_METHOD_END(HRESULT, S_OK);

//Message Mocks
MOCK_STATIC_METHOD_2(, const unsigned char*, Message_ToByteArray, MESSAGE_HANDLE, messageHandle, int32_t *, size)
*size = 11;
MOCK_METHOD_END(const unsigned char*, (const unsigned char*)"AnyContent");
MOCK_STATIC_METHOD_3(, int32_t, Message_ToByteArray, MESSAGE_HANDLE, messageHandle, unsigned char*, buf, int32_t , size)
MOCK_METHOD_END( int32_t, (int32_t)11);


MOCK_STATIC_METHOD_2(, MESSAGE_HANDLE, Message_CreateFromByteArray, const unsigned char*, source, int32_t, size)
Expand Down Expand Up @@ -1532,7 +1531,7 @@ extern "C"
DECLARE_GLOBAL_MOCK_METHOD_1(CDOTNETMocks, HRESULT, __stdcall, myTest_SafeArrayUnaccessData, SAFEARRAY *, psa)

//Message Mocks
DECLARE_GLOBAL_MOCK_METHOD_2(CDOTNETMocks, , const unsigned char*, Message_ToByteArray, MESSAGE_HANDLE, messageHandle, int32_t *, size);
DECLARE_GLOBAL_MOCK_METHOD_3(CDOTNETMocks, , int32_t, Message_ToByteArray, MESSAGE_HANDLE, messageHandle, unsigned char*, buf, int32_t, size);

DECLARE_GLOBAL_MOCK_METHOD_2(CDOTNETMocks, , MESSAGE_HANDLE, Message_CreateFromByteArray, const unsigned char*, source, int32_t, size);

Expand Down Expand Up @@ -3046,9 +3045,38 @@ BEGIN_TEST_SUITE(dotnet_unittests)

mocks.ResetAllCalls();

STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, IGNORED_PTR_ARG))
.IgnoreArgument(2)
.SetFailReturn((const unsigned char*)NULL);
STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, NULL, 0))
.SetFailReturn(-1);


///act
theAPIS->Module_Receive((MODULE_HANDLE)result, (MESSAGE_HANDLE)0x42);

///assert
mocks.AssertActualAndExpectedCalls();

///cleanup
}

TEST_FUNCTION(DotNET_Receive__does_nothing_when_Message_alloc_fails)
{
///arrage
CDOTNETMocks mocks;
const MODULE_APIS* theAPIS = Module_GetAPIS();
bstr_t bstrAzureIoTGatewayMessageClassName(L"Microsoft.Azure.IoT.Gateway.Message");
DOTNET_HOST_CONFIG dotNetConfig;
dotNetConfig.dotnet_module_path = "/path/to/csharp_module.dll";
dotNetConfig.dotnet_module_entry_class = "mycsharpmodule.classname";
dotNetConfig.dotnet_module_args = "module configuration";

auto result = theAPIS->Module_Create((MESSAGE_BUS_HANDLE)0x42, &dotNetConfig);

mocks.ResetAllCalls();

STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, NULL, 0));
STRICT_EXPECTED_CALL(mocks, gballoc_malloc(11))
.SetFailReturn(nullptr);


///act
theAPIS->Module_Receive((MODULE_HANDLE)result, (MESSAGE_HANDLE)0x42);
Expand All @@ -3075,9 +3103,13 @@ BEGIN_TEST_SUITE(dotnet_unittests)

mocks.ResetAllCalls();

STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, IGNORED_PTR_ARG))
STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, NULL, 0));
STRICT_EXPECTED_CALL(mocks, gballoc_malloc(11));
STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, IGNORED_PTR_ARG, 11))
.IgnoreArgument(2);



STRICT_EXPECTED_CALL(mocks, myTest_SafeArrayCreate(VT_UI1, 1, IGNORED_PTR_ARG))
.IgnoreArgument(3)
.SetFailReturn((SAFEARRAY*)NULL);
Expand Down Expand Up @@ -3109,7 +3141,9 @@ BEGIN_TEST_SUITE(dotnet_unittests)

mocks.ResetAllCalls();

STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, IGNORED_PTR_ARG))
STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, NULL, 0));
STRICT_EXPECTED_CALL(mocks, gballoc_malloc(11));
STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, IGNORED_PTR_ARG, 11))
.IgnoreArgument(2);

STRICT_EXPECTED_CALL(mocks, myTest_SafeArrayCreate(VT_UI1, 1, IGNORED_PTR_ARG))
Expand Down Expand Up @@ -3146,7 +3180,9 @@ BEGIN_TEST_SUITE(dotnet_unittests)

mocks.ResetAllCalls();

STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, IGNORED_PTR_ARG))
STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, NULL, 0));
STRICT_EXPECTED_CALL(mocks, gballoc_malloc(11));
STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, IGNORED_PTR_ARG, 11))
.IgnoreArgument(2);

STRICT_EXPECTED_CALL(mocks, myTest_SafeArrayCreate(VT_UI1, 1, IGNORED_PTR_ARG))
Expand Down Expand Up @@ -3186,7 +3222,9 @@ BEGIN_TEST_SUITE(dotnet_unittests)

mocks.ResetAllCalls();

STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, IGNORED_PTR_ARG))
STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, NULL, 0));
STRICT_EXPECTED_CALL(mocks, gballoc_malloc(11));
STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, IGNORED_PTR_ARG, 11))
.IgnoreArgument(2);

STRICT_EXPECTED_CALL(mocks, myTest_SafeArrayCreate(VT_UI1, 1, IGNORED_PTR_ARG))
Expand Down Expand Up @@ -3228,7 +3266,9 @@ BEGIN_TEST_SUITE(dotnet_unittests)

mocks.ResetAllCalls();

STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, IGNORED_PTR_ARG))
STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, NULL, 0));
STRICT_EXPECTED_CALL(mocks, gballoc_malloc(11));
STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, IGNORED_PTR_ARG, 11))
.IgnoreArgument(2);

STRICT_EXPECTED_CALL(mocks, myTest_SafeArrayCreate(VT_UI1, 1, IGNORED_PTR_ARG))
Expand Down Expand Up @@ -3276,7 +3316,9 @@ BEGIN_TEST_SUITE(dotnet_unittests)

mocks.ResetAllCalls();

STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, IGNORED_PTR_ARG))
STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, NULL, 0));
STRICT_EXPECTED_CALL(mocks, gballoc_malloc(11));
STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, IGNORED_PTR_ARG, 11))
.IgnoreArgument(2);

STRICT_EXPECTED_CALL(mocks, myTest_SafeArrayCreate(VT_UI1, 1, IGNORED_PTR_ARG))
Expand Down Expand Up @@ -3327,7 +3369,9 @@ BEGIN_TEST_SUITE(dotnet_unittests)

mocks.ResetAllCalls();

STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, IGNORED_PTR_ARG))
STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, NULL, 0));
STRICT_EXPECTED_CALL(mocks, gballoc_malloc(11));
STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, IGNORED_PTR_ARG, 11))
.IgnoreArgument(2);

STRICT_EXPECTED_CALL(mocks, myTest_SafeArrayCreate(VT_UI1, 1, IGNORED_PTR_ARG))
Expand Down Expand Up @@ -3380,7 +3424,9 @@ BEGIN_TEST_SUITE(dotnet_unittests)

mocks.ResetAllCalls();

STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, IGNORED_PTR_ARG))
STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, NULL, 0));
STRICT_EXPECTED_CALL(mocks, gballoc_malloc(11));
STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, IGNORED_PTR_ARG, 11))
.IgnoreArgument(2);

STRICT_EXPECTED_CALL(mocks, myTest_SafeArrayCreate(VT_UI1, 1, IGNORED_PTR_ARG))
Expand Down Expand Up @@ -3441,7 +3487,9 @@ BEGIN_TEST_SUITE(dotnet_unittests)

mocks.ResetAllCalls();

STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, IGNORED_PTR_ARG))
STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, NULL, 0));
STRICT_EXPECTED_CALL(mocks, gballoc_malloc(11));
STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, IGNORED_PTR_ARG, 11))
.IgnoreArgument(2);

STRICT_EXPECTED_CALL(mocks, myTest_SafeArrayCreate(VT_UI1, 1, IGNORED_PTR_ARG))
Expand Down Expand Up @@ -3507,7 +3555,9 @@ BEGIN_TEST_SUITE(dotnet_unittests)

mocks.ResetAllCalls();

STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, IGNORED_PTR_ARG))
STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, NULL, 0));
STRICT_EXPECTED_CALL(mocks, gballoc_malloc(11));
STRICT_EXPECTED_CALL(mocks, Message_ToByteArray((MESSAGE_HANDLE)0x42, IGNORED_PTR_ARG, 11))
.IgnoreArgument(2);

STRICT_EXPECTED_CALL(mocks, myTest_SafeArrayCreate(VT_UI1, 1, IGNORED_PTR_ARG))
Expand Down
90 changes: 49 additions & 41 deletions bindings/java/src/java_module_host.c
Original file line number Diff line number Diff line change
Expand Up @@ -349,82 +349,90 @@ static void JavaModuleHost_Receive(MODULE_HANDLE module, MESSAGE_HANDLE message)
JAVA_MODULE_HANDLE_DATA* moduleHandle = (JAVA_MODULE_HANDLE_DATA*)module;

/*Codes_SRS_JAVA_MODULE_HOST_14_023: [This function shall serialize message.]*/
int32_t size;
unsigned char* serialized_message = (unsigned char*)Message_ToByteArray(message, &size);
int32_t size = Message_ToByteArray(message, NULL, 0);

if (serialized_message == NULL)
if (size < 0)
{
/*Codes_SRS_JAVA_MODULE_HOST_14_047: [This function shall exit if any underlying function fails.]*/
LogError("Could not serialize the message to a byte array.");
}
else
{
/*Codes_SRS_JAVA_MODULE_HOST_14_042: [This function shall attach the JVM to the current thread.]*/
jint jni_result = JNIFunc(moduleHandle->jvm, AttachCurrentThread, (void**)(&(moduleHandle->env)), NULL);

if (jni_result == JNI_OK)
unsigned char* serialized_message = (unsigned char*)malloc(size);
if (serialized_message == NULL)
{
/*Codes_SRS_JAVA_MODULE_HOST_14_043: [This function shall create a new jbyteArray for the serialized message.]*/
jbyteArray arr = JNIFunc(moduleHandle->env, NewByteArray, size);
if (arr == NULL)
{
/*Codes_SRS_JAVA_MODULE_HOST_14_047: [This function shall exit if any underlying function fails.]*/
LogError("New jbyteArray could not be constructed.");
}
else
LogError("Could not allocate byte array for message.");
}
else
{
Message_ToByteArray(message, serialized_message, size);

/*Codes_SRS_JAVA_MODULE_HOST_14_042: [This function shall attach the JVM to the current thread.]*/
jint jni_result = JNIFunc(moduleHandle->jvm, AttachCurrentThread, (void**)(&(moduleHandle->env)), NULL);

if (jni_result == JNI_OK)
{
/*Codes_SRS_JAVA_MODULE_HOST_14_044: [This function shall set the contents of the jbyteArray to the serialized_message.]*/
JNIFunc(moduleHandle->env, SetByteArrayRegion, arr, 0, size, serialized_message);
jthrowable exception = JNIFunc(moduleHandle->env, ExceptionOccurred);
if (exception)
/*Codes_SRS_JAVA_MODULE_HOST_14_043: [This function shall create a new jbyteArray for the serialized message.]*/
jbyteArray arr = JNIFunc(moduleHandle->env, NewByteArray, size);
if (arr == NULL)
{
/*Codes_SRS_JAVA_MODULE_HOST_14_047: [This function shall exit if any underlying function fails.]*/
LogError("Exception occurred in SetByteArrayRegion.");
JNIFunc(moduleHandle->env, ExceptionDescribe);
JNIFunc(moduleHandle->env, ExceptionClear);
LogError("New jbyteArray could not be constructed.");
}
else
{
/*Codes_SRS_JAVA_MODULE_HOST_14_045: [This function shall get the user - defined Java module class using the module parameter and get the receive() method.]*/
jclass jModule_class = JNIFunc(moduleHandle->env, GetObjectClass, moduleHandle->module);
if (jModule_class == NULL)
/*Codes_SRS_JAVA_MODULE_HOST_14_044: [This function shall set the contents of the jbyteArray to the serialized_message.]*/
JNIFunc(moduleHandle->env, SetByteArrayRegion, arr, 0, size, serialized_message);
jthrowable exception = JNIFunc(moduleHandle->env, ExceptionOccurred);
if (exception)
{
/*Codes_SRS_JAVA_MODULE_HOST_14_047: [This function shall exit if any underlying function fails.]*/
LogError("Could not find class (%s) for the module Java object. destroy() will not be called on this object.", moduleHandle->moduleName);
LogError("Exception occurred in SetByteArrayRegion.");
JNIFunc(moduleHandle->env, ExceptionDescribe);
JNIFunc(moduleHandle->env, ExceptionClear);
}
else
{
jmethodID jModule_receive = JNIFunc(moduleHandle->env, GetMethodID, jModule_class, MODULE_RECEIVE_METHOD_NAME, MODULE_RECEIVE_DESCRIPTOR);
exception = JNIFunc(moduleHandle->env, ExceptionOccurred);
if (jModule_receive == NULL || exception)
/*Codes_SRS_JAVA_MODULE_HOST_14_045: [This function shall get the user - defined Java module class using the module parameter and get the receive() method.]*/
jclass jModule_class = JNIFunc(moduleHandle->env, GetObjectClass, moduleHandle->module);
if (jModule_class == NULL)
{
/*Codes_SRS_JAVA_MODULE_HOST_14_047: [This function shall exit if any underlying function fails.]*/
LogError("Failed to find the %s destroy() method. destroy() will not be called on this object.", moduleHandle->moduleName);
JNIFunc(moduleHandle->env, ExceptionDescribe);
JNIFunc(moduleHandle->env, ExceptionClear);
LogError("Could not find class (%s) for the module Java object. destroy() will not be called on this object.", moduleHandle->moduleName);
}
else
{
/*Codes_SRS_JAVA_MODULE_HOST_14_024: [This function shall call the void receive(byte[] source) method of the Java module object passing the serialized message.]*/
CallVoidMethodInternal(moduleHandle->env, moduleHandle->module, jModule_receive, 1, arr);
jmethodID jModule_receive = JNIFunc(moduleHandle->env, GetMethodID, jModule_class, MODULE_RECEIVE_METHOD_NAME, MODULE_RECEIVE_DESCRIPTOR);
exception = JNIFunc(moduleHandle->env, ExceptionOccurred);
if (exception)
if (jModule_receive == NULL || exception)
{
/*Codes_SRS_JAVA_MODULE_HOST_14_047: [This function shall exit if any underlying function fails.]*/
LogError("Exception occurred in receive() of %s.", moduleHandle->moduleName);
LogError("Failed to find the %s destroy() method. destroy() will not be called on this object.", moduleHandle->moduleName);
JNIFunc(moduleHandle->env, ExceptionDescribe);
JNIFunc(moduleHandle->env, ExceptionClear);
}
else
{
/*Codes_SRS_JAVA_MODULE_HOST_14_024: [This function shall call the void receive(byte[] source) method of the Java module object passing the serialized message.]*/
CallVoidMethodInternal(moduleHandle->env, moduleHandle->module, jModule_receive, 1, arr);
exception = JNIFunc(moduleHandle->env, ExceptionOccurred);
if (exception)
{
/*Codes_SRS_JAVA_MODULE_HOST_14_047: [This function shall exit if any underlying function fails.]*/
LogError("Exception occurred in receive() of %s.", moduleHandle->moduleName);
JNIFunc(moduleHandle->env, ExceptionDescribe);
JNIFunc(moduleHandle->env, ExceptionClear);
}
}
}
}
JNIFunc(moduleHandle->env, DeleteLocalRef, arr);
}
JNIFunc(moduleHandle->env, DeleteLocalRef, arr);
/*Codes_SRS_JAVA_MODULE_HOST_14_046: [This function shall detach the JVM from the current thread.]*/
JNIFunc(moduleHandle->jvm, DetachCurrentThread);
}
/*Codes_SRS_JAVA_MODULE_HOST_14_046: [This function shall detach the JVM from the current thread.]*/
JNIFunc(moduleHandle->jvm, DetachCurrentThread);
free(serialized_message);
}

free(serialized_message);
}
}

Expand Down
Loading

0 comments on commit 10ea02b

Please sign in to comment.