This is an example of BLE GATT Client, which receives broadcast data from BLE_Server_BME280 ( a GATT server) , then transfers values up to mbed Device Connector (cloud).

Please refer details about BLEClient_mbedDevConn below. https://github.com/soramame21/BLEClient_mbedDevConn

The location of required BLE GATT server, BLE_Server_BME280, is at here. https://developer.mbed.org/users/edamame22/code/BLE_Server_BME280/

pal/Test/Readme.md

Committer:
Ren Boting
Date:
2017-09-05
Revision:
2:b894b3508057
Parent:
0:29983394c6b6

File content as of revision 2:b894b3508057:

# PAL Test Guide
## Environment Setup
Python 2.7.11
If you cannot find Python 2.7.11 for your linux you can get it here [Python 2.7.11](https://launchpad.net/~fkrull/+archive/ubuntu/deadsnakes-python2.7)
Install the needed Python modules on Windows like this:
```
python -m pip install tabulate
python -m pip install pyserial
python -m pip install -U mbed-ls
python -m pip install shell
python -m pip install pypiwin32
```
On Linux you install the same modules like this:
```
sudo pip install <module>
```

##Test Code files
Each API has three files under Test/Unitest or Test/Conformance:

* **pal_socket_test.c** 	Contains the test code in the form of functions. One function per test.
* **pal_ socket _test_runner.c** 	Runs the test functions defined above.
* **pal_ socket _test_main_mbedos.c** 	Main application that runs all the tests. May also have test specific initializations for the given target platform.

Each API can also have a common utilities file under Test/Common
**pal_socket_test_utils.c/.h**	 Utility functions that can be used in various pal_socket test apps.
**pal_socket_test.c**
Contains tests of the form:

```
#include "pal_socket.h"
#include "unity.h"
#include "unity_fixture.h"

TEST(pal_socket, FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue)
{
    //This should be true because setUp set this up for us before this test
    TEST_ASSERT_EQUAL_HEX(0x5a5a, FunctionWhichReturnsLocalVariable());

    //This should be true because we can still change our answer
    Counter = 0x1234;
    TEST_ASSERT_EQUAL_HEX(0x1234, FunctionWhichReturnsLocalVariable());
}
```
**pal_ socket _test_runner.c**
Looks like  this:
```
#include "unity.h"
#include "unity_fixture.h" // pal Socket API tests

TEST_GROUP_RUNNER(pal_socket)
{
#if (PAL_INCLUDE || FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode)
  RUN_TEST_CASE(pal_socket, FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode);
#endif
#if (PAL_INCLUDE || FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken)
  RUN_TEST_CASE(pal_socket, FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken);
#endif
#if (PAL_INCLUDE || FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue)
  RUN_TEST_CASE(pal_socket, FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValue);
#endif
#if (PAL_INCLUDE || FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain)
  RUN_TEST_CASE(pal_socket, FunctionWhichReturnsLocalVariable_ShouldReturnTheCurrentCounterValueAgain);
#endif
#if (PAL_INCLUDE || FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed)
  RUN_TEST_CASE(pal_socket, FunctionWhichReturnsLocalVariable_ShouldReturnCurrentCounter_ButFailsBecauseThisTestIsActuallyFlawed);
#endif}
```


**pal_ socket _test_main_mbedos.c**
This can vary a lot from platform to platform and test to test, but will contain lines like the following to run the tests:
```
extern "C" int UnityMain(int argc, const char* argv[], void (*runAllTests)(void));
extern "C" void TEST_pal_socket_GROUP_RUNNER(void);

	// Run a group of tests
    	UnityMain(0, argv, TEST_pal_socket_GROUP_RUNNER);
```

 
## Test makefile framework
**makefile** – Master make file. It has an entry for each platform target. Includes all_tests.mk.
Configuration specific defines are declared as follows and converted to compilation defines on the compilation command line.
**TARGET_CONFIGURATION_DEFINES:= HAS_RTOS    HAS_FS**
They can be also be used to as conditionals in the make file as shown in all_tests.mk
```
include make_platform.mk 


.PHONY: all clean check

#====================================================
# Platform mbed-os
TARGET_PLATFORM:=mbedosClassic
TARGET_CONFIGURATION_DEFINES:=  HAS_RTOS
all: mbedosClassic_all
check: mbedosClassic_check
clean: mbedosClassic_clean 
include all_tests.mk
#====================================================
# Platform morpheus
TARGET_PLATFORM:=mbedOS
TARGET_CONFIGURATION_DEFINES:=  HAS_RTOS
all: mbedOS_all
check: mbedOS_check
clean: mbedOS_clean 
include all_tests.mk
#====================================================
```
**make_platform.mk** – Detects the make platform (Windows, Linux) and sets various definitions accordingly. These are referred to by other make files in order to keep them platform independent.
**all_tests.mk** – contains an entry for each test application to be built. Included by all target platform make files. It looks like this:
```
#====================================================
PROJECT=pal_socket
TYPE=Unity

$(PROJECT)_ADDITIONAL_ SOURCES:=

include BUILD_TEST.mk
#====================================================
ifeq ($(findstring HAS_RTOS,$(TARGET_CONFIGURATION_DEFINES)),HAS_RTOS)
PROJECT=pal_rtos
TYPE=Unitest

$(PROJECT)_ADDITIONAL_SOURCES:=Source/PAL-Impl/Modules/RTOS/$(PROJECT).c \
				Source/PAL-Impl/Modules/RTOS/$(PROJECT)_static_definitions_sample.c \
				Source/Port/Reference-Impl/mbedOS/pal_plat_rtos.c


include BUILD_TEST_$(TARGET_PLATFORM).mk
endif
#====================================================
```
**BUILD_TEST_BUILD_TEST_mbedOS.mk, BUILD_TEST_FreeRTOS.mk** – Target platform specific make definitions and rules. Defines targets for building the tests. Included for each test that is to be built.
##Usage:
###Make all tests for all platforms:
**make** 
or make all tests for a specific platform:
**make mbedOS_all**
**make FreeRTOS_all**

### To make and run one set of tests:
**make mbedOS_pal_socket**

### To make and run only one test from a set:
**make mbedOS_pal_socket** PAL_TEST=”FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode”
To make a binary that just runs two tests from a set:
**make  mbedOS_pal_socket PAL_TEST=”FindFunction_WhichIsBroken_ShouldReturnZeroIfItemIsNotInList_WhichWorksEvenInOurBrokenCode  FindFunction_WhichIsBroken_ShouldReturnTheIndexForItemsInList_WhichWillFailBecauseOurFunctionUnderTestIsBroken”**
Note: If you change the argument PAL_TEST, then you will need to force a rebuild with  –B.

### To run all tests:
**make mbedOS_check**
### Run a specific test:
**make mbedOS_check_pal_socket**
 
## Eclipse
It is possible to use the Build command from eclipse. 
First set it up to run make as follows. Note that the build directory points to Test:

![ARMGCC_DIR](eclipseBuildDialog.png)
 
You can control which target you build in the next tab by changing all and clean.

![ARMGCC_DIR](eclipseBuildDialog2.png)