linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 1/7] android/tester: Add android-tester
@ 2013-12-11 10:46 Marcin Kraglak
  2013-12-11 10:46 ` [PATCH v4 2/7] android/tester: Add pre-setup and post-teardown routines Marcin Kraglak
                   ` (6 more replies)
  0 siblings, 7 replies; 9+ messages in thread
From: Marcin Kraglak @ 2013-12-11 10:46 UTC (permalink / raw)
  To: linux-bluetooth

This commit add android-tester.c to tree and Makefile.am.
This will contain set of unit tests for testing android daemon.
---
 .gitignore               |  1 +
 android/Makefile.am      |  4 ++++
 android/android-tester.c | 21 +++++++++++++++++++++
 3 files changed, 26 insertions(+)
 create mode 100644 android/android-tester.c

diff --git a/.gitignore b/.gitignore
index 2d3435a..c570728 100644
--- a/.gitignore
+++ b/.gitignore
@@ -107,3 +107,4 @@ unit/test-*.trs
 android/system-emulator
 android/bluetoothd
 android/haltest
+android/android-tester
diff --git a/android/Makefile.am b/android/Makefile.am
index df04762..0768985 100644
--- a/android/Makefile.am
+++ b/android/Makefile.am
@@ -83,6 +83,10 @@ android_haltest_CFLAGS = $(AM_CFLAGS) -I$(srcdir)/android \
 
 android_haltest_LDFLAGS = -pthread
 
+noinst_PROGRAMS += android/android-tester
+
+android_android_tester_SOURCES = android/android-tester.c
+
 endif
 
 EXTRA_DIST += android/Android.mk android/hal-ipc-api.txt android/README \
diff --git a/android/android-tester.c b/android/android-tester.c
new file mode 100644
index 0000000..f5c42b0
--- /dev/null
+++ b/android/android-tester.c
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2013 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+int main(int argc, char *argv[])
+{
+	return 0;
+}
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v4 2/7] android/tester: Add pre-setup and post-teardown routines
  2013-12-11 10:46 [PATCH v4 1/7] android/tester: Add android-tester Marcin Kraglak
@ 2013-12-11 10:46 ` Marcin Kraglak
  2013-12-11 10:46 ` [PATCH v4 3/7] android/tester: Start emulator in new process Marcin Kraglak
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 9+ messages in thread
From: Marcin Kraglak @ 2013-12-11 10:46 UTC (permalink / raw)
  To: linux-bluetooth

This will add hciemu initialization and cleanup. These functions
will be called to create hci emulator and cleanup it.
---
 android/Makefile.am      |  10 ++-
 android/android-tester.c | 183 ++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 191 insertions(+), 2 deletions(-)

diff --git a/android/Makefile.am b/android/Makefile.am
index 0768985..5364c2e 100644
--- a/android/Makefile.am
+++ b/android/Makefile.am
@@ -85,7 +85,15 @@ android_haltest_LDFLAGS = -pthread
 
 noinst_PROGRAMS += android/android-tester
 
-android_android_tester_SOURCES = android/android-tester.c
+android_android_tester_SOURCES = emulator/btdev.h emulator/btdev.c \
+				emulator/bthost.h emulator/bthost.c \
+				src/shared/util.h src/shared/util.c \
+				src/shared/mgmt.h src/shared/mgmt.c \
+				src/shared/hciemu.h src/shared/hciemu.c \
+				src/shared/tester.h src/shared/tester.c \
+				android/android-tester.c
+
+android_android_tester_LDADD = lib/libbluetooth-internal.la @GLIB_LIBS@
 
 endif
 
diff --git a/android/android-tester.c b/android/android-tester.c
index f5c42b0..498da22 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -15,7 +15,188 @@
  *
  */
 
+#include <unistd.h>
+
+#include <glib.h>
+
+#include "lib/bluetooth.h"
+#include "lib/mgmt.h"
+
+#include "src/shared/tester.h"
+#include "src/shared/mgmt.h"
+#include "src/shared/hciemu.h"
+
+struct generic_data {
+};
+
+struct test_data {
+	struct mgmt *mgmt;
+	uint16_t mgmt_index;
+	struct hciemu *hciemu;
+	enum hciemu_type hciemu_type;
+	const struct generic_data *test_data;
+};
+
+static void read_info_callback(uint8_t status, uint16_t length,
+					const void *param, void *user_data)
+{
+	struct test_data *data = tester_get_data();
+	const struct mgmt_rp_read_info *rp = param;
+	char addr[18];
+	uint16_t manufacturer;
+	uint32_t supported_settings, current_settings;
+
+	tester_print("Read Info callback");
+	tester_print("  Status: 0x%02x", status);
+
+	if (status || !param) {
+		tester_pre_setup_failed();
+		return;
+	}
+
+	ba2str(&rp->bdaddr, addr);
+	manufacturer = btohs(rp->manufacturer);
+	supported_settings = btohl(rp->supported_settings);
+	current_settings = btohl(rp->current_settings);
+
+	tester_print("  Address: %s", addr);
+	tester_print("  Version: 0x%02x", rp->version);
+	tester_print("  Manufacturer: 0x%04x", manufacturer);
+	tester_print("  Supported settings: 0x%08x", supported_settings);
+	tester_print("  Current settings: 0x%08x", current_settings);
+	tester_print("  Class: 0x%02x%02x%02x",
+			rp->dev_class[2], rp->dev_class[1], rp->dev_class[0]);
+	tester_print("  Name: %s", rp->name);
+	tester_print("  Short name: %s", rp->short_name);
+
+	if (strcmp(hciemu_get_address(data->hciemu), addr)) {
+		tester_pre_setup_failed();
+		return;
+	}
+
+	tester_pre_setup_complete();
+}
+
+static void index_added_callback(uint16_t index, uint16_t length,
+					const void *param, void *user_data)
+{
+	struct test_data *data = tester_get_data();
+
+	tester_print("Index Added callback");
+	tester_print("  Index: 0x%04x", index);
+
+	data->mgmt_index = index;
+
+	mgmt_send(data->mgmt, MGMT_OP_READ_INFO, data->mgmt_index, 0, NULL,
+					read_info_callback, NULL, NULL);
+}
+
+static void index_removed_callback(uint16_t index, uint16_t length,
+					const void *param, void *user_data)
+{
+	struct test_data *data = tester_get_data();
+
+	tester_print("Index Removed callback");
+	tester_print("  Index: 0x%04x", index);
+
+	if (index != data->mgmt_index)
+		return;
+
+	mgmt_unregister_index(data->mgmt, data->mgmt_index);
+
+	mgmt_unref(data->mgmt);
+	data->mgmt = NULL;
+
+	tester_post_teardown_complete();
+}
+
+static void read_index_list_callback(uint8_t status, uint16_t length,
+					const void *param, void *user_data)
+{
+	struct test_data *data = tester_get_data();
+
+	tester_print("Read Index List callback");
+	tester_print("  Status: 0x%02x", status);
+
+	if (status || !param) {
+		tester_pre_setup_failed();
+		return;
+	}
+
+	mgmt_register(data->mgmt, MGMT_EV_INDEX_ADDED, MGMT_INDEX_NONE,
+					index_added_callback, NULL, NULL);
+
+	mgmt_register(data->mgmt, MGMT_EV_INDEX_REMOVED, MGMT_INDEX_NONE,
+					index_removed_callback, NULL, NULL);
+
+	data->hciemu = hciemu_new(data->hciemu_type);
+	if (!data->hciemu) {
+		tester_warn("Failed to setup HCI emulation");
+		tester_pre_setup_failed();
+		return;
+	}
+
+	tester_print("New hciemu instance created");
+}
+
+static void test_pre_setup(const void *test_data)
+{
+	struct test_data *data = tester_get_data();
+
+	if (!tester_use_debug())
+		fclose(stderr);
+
+	data->mgmt = mgmt_new_default();
+	if (!data->mgmt) {
+		tester_warn("Failed to setup management interface");
+		tester_pre_setup_failed();
+		return;
+	}
+
+	mgmt_send(data->mgmt, MGMT_OP_READ_INDEX_LIST, MGMT_INDEX_NONE, 0,
+				NULL, read_index_list_callback, NULL, NULL);
+}
+
+static void test_post_teardown(const void *test_data)
+{
+	struct test_data *data = tester_get_data();
+
+	hciemu_unref(data->hciemu);
+	data->hciemu = NULL;
+}
+
+static void setup_base(const void *test_data)
+{
+	tester_setup_failed();
+}
+
+static void teardown(const void *test_data)
+{
+	tester_teardown_complete();
+}
+
+static void controller_setup(const void *test_data)
+{
+}
+
+#define test_bredrle(name, data, test_setup, test, test_teardown) \
+	do { \
+		struct test_data *user; \
+		user = g_malloc0(sizeof(struct test_data)); \
+		if (!user) \
+			break; \
+		user->hciemu_type = HCIEMU_TYPE_BREDRLE; \
+		user->test_data = data; \
+		tester_add_full(name, data, test_pre_setup, test_setup, \
+				test, test_teardown, test_post_teardown, \
+							3, user, g_free); \
+	} while (0)
+
 int main(int argc, char *argv[])
 {
-	return 0;
+	tester_init(&argc, &argv);
+
+	test_bredrle("Test Init", NULL, setup_base, controller_setup, teardown);
+
+	return tester_run();
 }
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v4 3/7] android/tester: Start emulator in new process
  2013-12-11 10:46 [PATCH v4 1/7] android/tester: Add android-tester Marcin Kraglak
  2013-12-11 10:46 ` [PATCH v4 2/7] android/tester: Add pre-setup and post-teardown routines Marcin Kraglak
@ 2013-12-11 10:46 ` Marcin Kraglak
  2013-12-11 11:10   ` Andrei Emeltchenko
  2013-12-11 10:46 ` [PATCH v4 4/7] android/tester: Add stack initialization of stack in setup Marcin Kraglak
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 9+ messages in thread
From: Marcin Kraglak @ 2013-12-11 10:46 UTC (permalink / raw)
  To: linux-bluetooth

This is needed because bluetooth->init call is blocking,
and we have to emulate normal behaviour of android environment.
That process will exit if it won't receive any message in 2 sec
or when bluetoothd will exit. Main tester thread will wait for
this process in teardown method.
---
 android/android-tester.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 131 insertions(+), 1 deletion(-)

diff --git a/android/android-tester.c b/android/android-tester.c
index 498da22..ad7aa39 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -15,9 +15,15 @@
  *
  */
 
+#include <stdlib.h>
 #include <unistd.h>
 
 #include <glib.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/un.h>
+#include <libgen.h>
 
 #include "lib/bluetooth.h"
 #include "lib/mgmt.h"
@@ -29,14 +35,20 @@
 struct generic_data {
 };
 
+#define WAIT_FOR_SIGNAL_TIME 2 /* in seconds */
+#define EMULATOR_SIGNAL "emulator_started"
+
 struct test_data {
 	struct mgmt *mgmt;
 	uint16_t mgmt_index;
 	struct hciemu *hciemu;
 	enum hciemu_type hciemu_type;
 	const struct generic_data *test_data;
+	pid_t bluetoothd_pid;
 };
 
+static char exec_dir[PATH_MAX + 1];
+
 static void read_info_callback(uint8_t status, uint16_t length,
 					const void *param, void *user_data)
 {
@@ -165,13 +177,129 @@ static void test_post_teardown(const void *test_data)
 	data->hciemu = NULL;
 }
 
+static void bluetoothd_start(int hci_index)
+{
+	char prg_name[PATH_MAX + 1];
+	char index[8];
+	char *prg_argv[4];
+
+	snprintf(prg_name, sizeof(prg_name), "%s/%s", exec_dir, "bluetoothd");
+	snprintf(index, sizeof(index), "%d", hci_index);
+
+	prg_argv[0] = prg_name;
+	prg_argv[1] = "-i";
+	prg_argv[2] = index;
+	prg_argv[3] = NULL;
+
+	if (!tester_use_debug())
+		fclose(stderr);
+
+	execve(prg_argv[0], prg_argv, NULL);
+}
+
+static void emulator(int pipe, int hci_index)
+{
+	static const char SYSTEM_SOCKET_PATH[] = "\0android_system";
+	char buf[1024];
+	struct sockaddr_un addr;
+	struct timeval tv;
+	int fd;
+	ssize_t len;
+
+	fd = socket(PF_LOCAL, SOCK_DGRAM | SOCK_CLOEXEC, 0);
+	if (fd < 0)
+		goto failed;
+
+	tv.tv_sec = WAIT_FOR_SIGNAL_TIME;
+	tv.tv_usec = 0;
+	setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv));
+
+	memset(&addr, 0, sizeof(addr));
+	addr.sun_family = AF_UNIX;
+	memcpy(addr.sun_path, SYSTEM_SOCKET_PATH, sizeof(SYSTEM_SOCKET_PATH));
+
+	if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+		perror("Failed to bind system socket");
+		goto failed;
+	}
+
+	len = write(pipe, EMULATOR_SIGNAL, sizeof(EMULATOR_SIGNAL));
+
+	if (len != sizeof(EMULATOR_SIGNAL))
+		goto failed;
+
+	memset(buf, 0, sizeof(buf));
+
+	len = read(fd, buf, sizeof(buf));
+	if (len <= 0 || (strcmp(buf, "ctl.start=bluetoothd")))
+		goto failed;
+
+	close(pipe);
+	close(fd);
+	bluetoothd_start(hci_index);
+
+failed:
+	close(pipe);
+	close(fd);
+}
+
+static void setup(struct test_data *data)
+{
+	int signal_fd[2];
+	char buf[1024];
+	pid_t pid;
+	int len;
+
+	if (pipe(signal_fd)) {
+		tester_setup_failed();
+		return;
+	}
+
+	pid = fork();
+
+	if (pid < 0) {
+		close(signal_fd[0]);
+		close(signal_fd[1]);
+		tester_setup_failed();
+		return;
+	}
+
+	if (pid == 0) {
+		if (!tester_use_debug())
+			fclose(stderr);
+
+		close(signal_fd[0]);
+		emulator(signal_fd[1], data->mgmt_index);
+		exit(0);
+	}
+
+	close(signal_fd[1]);
+	data->bluetoothd_pid = pid;
+
+	len = read(signal_fd[0], buf, sizeof(buf));
+	if (len <= 0 || (strcmp(buf, EMULATOR_SIGNAL))) {
+		close(signal_fd[0]);
+		tester_setup_failed();
+		return;
+	}
+}
+
 static void setup_base(const void *test_data)
 {
-	tester_setup_failed();
+	struct test_data *data = tester_get_data();
+
+	setup(data);
+
+	tester_setup_complete();
 }
 
 static void teardown(const void *test_data)
 {
+	struct test_data *data = tester_get_data();
+
+	if (data->bluetoothd_pid)
+		waitpid(data->bluetoothd_pid, NULL, 0);
+
 	tester_teardown_complete();
 }
 
@@ -194,6 +322,8 @@ static void controller_setup(const void *test_data)
 
 int main(int argc, char *argv[])
 {
+	snprintf(exec_dir, sizeof(exec_dir), "%s", dirname(argv[0]));
+
 	tester_init(&argc, &argv);
 
 	test_bredrle("Test Init", NULL, setup_base, controller_setup, teardown);
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v4 4/7] android/tester: Add stack initialization of stack in setup
  2013-12-11 10:46 [PATCH v4 1/7] android/tester: Add android-tester Marcin Kraglak
  2013-12-11 10:46 ` [PATCH v4 2/7] android/tester: Add pre-setup and post-teardown routines Marcin Kraglak
  2013-12-11 10:46 ` [PATCH v4 3/7] android/tester: Start emulator in new process Marcin Kraglak
@ 2013-12-11 10:46 ` Marcin Kraglak
  2013-12-11 10:46 ` [PATCH v4 5/7] android/tester: Make HAL logging wrapper print to stderr instead of stdout Marcin Kraglak
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 9+ messages in thread
From: Marcin Kraglak @ 2013-12-11 10:46 UTC (permalink / raw)
  To: linux-bluetooth

This add stack initialization and cleanup in setup/teardown.
---
 android/Makefile.am      | 10 +++++++--
 android/android-tester.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 65 insertions(+), 2 deletions(-)

diff --git a/android/Makefile.am b/android/Makefile.am
index 5364c2e..f3e77c3 100644
--- a/android/Makefile.am
+++ b/android/Makefile.am
@@ -91,9 +91,15 @@ android_android_tester_SOURCES = emulator/btdev.h emulator/btdev.c \
 				src/shared/mgmt.h src/shared/mgmt.c \
 				src/shared/hciemu.h src/shared/hciemu.c \
 				src/shared/tester.h src/shared/tester.c \
-				android/android-tester.c
+				android/hal-utils.h android/hal-utils.c \
+				android/client/hwmodule.c android/android-tester.c
 
-android_android_tester_LDADD = lib/libbluetooth-internal.la @GLIB_LIBS@
+android_android_tester_CFLAGS = $(AM_CFLAGS) -I$(srcdir)/android
+
+android_android_tester_LDADD = lib/libbluetooth-internal.la \
+				android/libhal-internal.la @GLIB_LIBS@
+
+android_android_tester_LDFLAGS = -pthread
 
 endif
 
diff --git a/android/android-tester.c b/android/android-tester.c
index ad7aa39..15f8c61 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -32,6 +32,9 @@
 #include "src/shared/mgmt.h"
 #include "src/shared/hciemu.h"
 
+#include <hardware/hardware.h>
+#include <hardware/bluetooth.h>
+
 struct generic_data {
 };
 
@@ -45,6 +48,7 @@ struct test_data {
 	enum hciemu_type hciemu_type;
 	const struct generic_data *test_data;
 	pid_t bluetoothd_pid;
+	const bt_interface_t *if_bluetooth;
 };
 
 static char exec_dir[PATH_MAX + 1];
@@ -243,12 +247,32 @@ failed:
 	close(fd);
 }
 
+static bt_callbacks_t bt_callbacks = {
+	.size = sizeof(bt_callbacks),
+	.adapter_state_changed_cb = NULL,
+	.adapter_properties_cb = NULL,
+	.remote_device_properties_cb = NULL,
+	.device_found_cb = NULL,
+	.discovery_state_changed_cb = NULL,
+	.pin_request_cb = NULL,
+	.ssp_request_cb = NULL,
+	.bond_state_changed_cb = NULL,
+	.acl_state_changed_cb = NULL,
+	.thread_evt_cb = NULL,
+	.dut_mode_recv_cb = NULL,
+	.le_test_mode_cb = NULL
+};
+
 static void setup(struct test_data *data)
 {
+	const hw_module_t *module;
+	hw_device_t *device;
+	bt_status_t status;
 	int signal_fd[2];
 	char buf[1024];
 	pid_t pid;
 	int len;
+	int err;
 
 	if (pipe(signal_fd)) {
 		tester_setup_failed();
@@ -282,6 +306,33 @@ static void setup(struct test_data *data)
 		tester_setup_failed();
 		return;
 	}
+
+	close(signal_fd[0]);
+
+	err = hw_get_module(BT_HARDWARE_MODULE_ID, &module);
+	if (err) {
+		tester_setup_failed();
+		return;
+	}
+
+	err = module->methods->open(module, BT_HARDWARE_MODULE_ID, &device);
+	if (err) {
+		tester_setup_failed();
+		return;
+	}
+
+	data->if_bluetooth = ((bluetooth_device_t *)
+					device)->get_bluetooth_interface();
+	if (!data->if_bluetooth) {
+		tester_setup_failed();
+		return;
+	}
+
+	status = data->if_bluetooth->init(&bt_callbacks);
+	if (status != BT_STATUS_SUCCESS) {
+		data->if_bluetooth = NULL;
+		tester_setup_failed();
+	}
 }
 
 static void setup_base(const void *test_data)
@@ -297,6 +348,11 @@ static void teardown(const void *test_data)
 {
 	struct test_data *data = tester_get_data();
 
+	if (data->if_bluetooth) {
+		data->if_bluetooth->cleanup();
+		data->if_bluetooth = NULL;
+	}
+
 	if (data->bluetoothd_pid)
 		waitpid(data->bluetoothd_pid, NULL, 0);
 
@@ -305,6 +361,7 @@ static void teardown(const void *test_data)
 
 static void controller_setup(const void *test_data)
 {
+	tester_test_passed();
 }
 
 #define test_bredrle(name, data, test_setup, test, test_teardown) \
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v4 5/7] android/tester: Make HAL logging wrapper print to stderr instead of stdout
  2013-12-11 10:46 [PATCH v4 1/7] android/tester: Add android-tester Marcin Kraglak
                   ` (2 preceding siblings ...)
  2013-12-11 10:46 ` [PATCH v4 4/7] android/tester: Add stack initialization of stack in setup Marcin Kraglak
@ 2013-12-11 10:46 ` Marcin Kraglak
  2013-12-11 10:46 ` [PATCH v4 6/7] android/tester: Add basic enable test Marcin Kraglak
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 9+ messages in thread
From: Marcin Kraglak @ 2013-12-11 10:46 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

From: Szymon Janc <szymon.janc@tieto.com>

This is used for testing and for user it makes no difference. This
will allow to switch on/off verbose logging from automated android
tester.

---
 android/hal-log.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/android/hal-log.h b/android/hal-log.h
index 9bd024d..63ff61b 100644
--- a/android/hal-log.h
+++ b/android/hal-log.h
@@ -25,7 +25,7 @@
 #define LOG_WARN " W"
 #define LOG_ERROR " E"
 #define LOG_DEBUG " D"
-#define ALOG(pri, tag, fmt, arg...) printf(tag pri": " fmt"\n", ##arg)
+#define ALOG(pri, tag, fmt, arg...) fprintf(stderr, tag pri": " fmt"\n", ##arg)
 #endif
 
 #define info(fmt, arg...) ALOG(LOG_INFO, LOG_TAG, fmt, ##arg)
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v4 6/7] android/tester: Add basic enable test
  2013-12-11 10:46 [PATCH v4 1/7] android/tester: Add android-tester Marcin Kraglak
                   ` (3 preceding siblings ...)
  2013-12-11 10:46 ` [PATCH v4 5/7] android/tester: Make HAL logging wrapper print to stderr instead of stdout Marcin Kraglak
@ 2013-12-11 10:46 ` Marcin Kraglak
  2013-12-11 10:46 ` [PATCH v4 7/7] android/tester: Add status check and adapter enable, disable test cases Marcin Kraglak
  2013-12-11 11:15 ` [PATCH v4 1/7] android/tester: Add android-tester Luiz Augusto von Dentz
  6 siblings, 0 replies; 9+ messages in thread
From: Marcin Kraglak @ 2013-12-11 10:46 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Grzegorz Kolodziejczyk

From: Grzegorz Kolodziejczyk <grzegorz.kolodziejczyk@tieto.com>

---
 android/android-tester.c | 227 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 225 insertions(+), 2 deletions(-)

diff --git a/android/android-tester.c b/android/android-tester.c
index 15f8c61..0dc1edf 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -35,7 +35,32 @@
 #include <hardware/hardware.h>
 #include <hardware/bluetooth.h>
 
+#define adapter_props adapter_prop_bdaddr, adapter_prop_bdname, \
+			adapter_prop_uuids, adapter_prop_cod, \
+			adapter_prop_scan_mode, adapter_prop_disc_timeout
+
+/*
+ * those are assigned to HAL methods and callbacks, we use ID later
+ * on mapped in switch-case due to different functions prototypes.
+ */
+
+enum hal_bluetooth_callbacks_id {
+	adapter_test_end,
+	adapter_state_changed_on,
+	adapter_state_changed_off,
+	adapter_prop_bdaddr,
+	adapter_prop_bdname,
+	adapter_prop_uuids,
+	adapter_prop_cod,
+	adapter_prop_scan_mode,
+	adapter_prop_disc_timeout,
+	adapter_prop_service_record,
+	adapter_prop_bonded_devices
+};
+
 struct generic_data {
+	uint32_t expect_settings_set;
+	uint8_t expected_hal_callbacks[];
 };
 
 #define WAIT_FOR_SIGNAL_TIME 2 /* in seconds */
@@ -44,15 +69,100 @@ struct generic_data {
 struct test_data {
 	struct mgmt *mgmt;
 	uint16_t mgmt_index;
+	unsigned int mgmt_settings_id;
 	struct hciemu *hciemu;
 	enum hciemu_type hciemu_type;
 	const struct generic_data *test_data;
 	pid_t bluetoothd_pid;
 	const bt_interface_t *if_bluetooth;
+
+	bool mgmt_settings_set;
+	bool hal_cb_called;
+
+	GSList *expected_callbacks;
 };
 
 static char exec_dir[PATH_MAX + 1];
 
+static void test_update_state(void)
+{
+	struct test_data *data = tester_get_data();
+
+	if (data->mgmt_settings_set && data->hal_cb_called)
+		tester_test_passed();
+}
+
+static void test_mgmt_settings_set(struct test_data *data)
+{
+	data->mgmt_settings_set = true;
+
+	test_update_state();
+}
+
+static void command_generic_new_settings(uint16_t index, uint16_t length,
+					const void *param, void *user_data)
+{
+	struct test_data *data = tester_get_data();
+	uint32_t settings;
+
+	if (length != 4) {
+		tester_warn("Invalid parameter size for new settings event");
+		tester_test_failed();
+		return;
+	}
+
+	settings = bt_get_le32(param);
+
+	if ((settings & data->test_data->expect_settings_set) !=
+					data->test_data->expect_settings_set)
+		return;
+
+	test_mgmt_settings_set(data);
+	mgmt_unregister(data->mgmt, data->mgmt_settings_id);
+}
+
+static void hal_cb_init(struct test_data *data)
+{
+	unsigned int i = 0;
+
+	while (data->test_data->expected_hal_callbacks[i]) {
+						data->expected_callbacks =
+				g_slist_append(data->expected_callbacks,
+		GINT_TO_POINTER(data->test_data->expected_hal_callbacks[i]));
+		i++;
+	}
+}
+
+static void mgmt_cb_init(struct test_data *data)
+{
+	if (!data->test_data->expect_settings_set)
+		test_mgmt_settings_set(data);
+	else
+		data->mgmt_settings_id = mgmt_register(data->mgmt,
+					MGMT_EV_NEW_SETTINGS, data->mgmt_index,
+				command_generic_new_settings, NULL, NULL);
+}
+
+static int get_expected_hal_cb(void)
+{
+	struct test_data *data = tester_get_data();
+
+	return GPOINTER_TO_INT(data->expected_callbacks->data);
+}
+
+static void remove_expected_hal_cb(void)
+{
+	struct test_data *data = tester_get_data();
+
+	data->expected_callbacks = g_slist_remove(data->expected_callbacks,
+						data->expected_callbacks->data);
+
+	if (!data->expected_callbacks)
+		data->hal_cb_called = true;
+
+	test_update_state();
+}
+
 static void read_info_callback(uint8_t status, uint16_t length,
 					const void *param, void *user_data)
 {
@@ -247,10 +357,107 @@ failed:
 	close(fd);
 }
 
+static void adapter_state_changed_cb(bt_state_t state)
+{
+	switch (get_expected_hal_cb()) {
+	case adapter_state_changed_on:
+		if (state == BT_STATE_ON)
+			remove_expected_hal_cb();
+		else
+			tester_test_failed();
+		break;
+	default:
+		break;
+	}
+}
+
+static void adapter_properties_cb(bt_status_t status, int num_properties,
+						bt_property_t *properties)
+{
+	enum hal_bluetooth_callbacks_id hal_cb;
+	int i;
+
+	for (i = 0; i < num_properties; i++) {
+		hal_cb = get_expected_hal_cb();
+		switch (properties[i].type) {
+		case BT_PROPERTY_BDADDR:
+			if (hal_cb != adapter_prop_bdaddr) {
+				tester_test_failed();
+				return;
+			}
+			remove_expected_hal_cb();
+			break;
+		case BT_PROPERTY_BDNAME:
+			if (hal_cb != adapter_prop_bdname) {
+				tester_test_failed();
+				return;
+			}
+			remove_expected_hal_cb();
+			break;
+		case BT_PROPERTY_UUIDS:
+			if (hal_cb != adapter_prop_uuids) {
+				tester_test_failed();
+				return;
+			}
+			remove_expected_hal_cb();
+			break;
+		case BT_PROPERTY_CLASS_OF_DEVICE:
+			if (hal_cb != adapter_prop_cod) {
+				tester_test_failed();
+				return;
+			}
+			remove_expected_hal_cb();
+			break;
+		case BT_PROPERTY_TYPE_OF_DEVICE:
+			if (hal_cb != adapter_prop_bdaddr) {
+				tester_test_failed();
+				return;
+			}
+			remove_expected_hal_cb();
+			break;
+		case BT_PROPERTY_SERVICE_RECORD:
+			if (hal_cb != adapter_prop_service_record) {
+				tester_test_failed();
+				return;
+			}
+			remove_expected_hal_cb();
+			break;
+		case BT_PROPERTY_ADAPTER_SCAN_MODE:
+			if (hal_cb != adapter_prop_scan_mode) {
+				tester_test_failed();
+				return;
+			}
+			remove_expected_hal_cb();
+			break;
+		case BT_PROPERTY_ADAPTER_BONDED_DEVICES:
+			if (hal_cb != adapter_prop_bonded_devices) {
+				tester_test_failed();
+				return;
+			}
+			remove_expected_hal_cb();
+			break;
+		case BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT:
+			if (hal_cb != adapter_prop_disc_timeout) {
+				tester_test_failed();
+				return;
+			}
+			remove_expected_hal_cb();
+			break;
+		default:
+			break;
+		}
+	}
+}
+
+static const struct generic_data bluetooth_enable_success_test = {
+	.expected_hal_callbacks = {adapter_props, adapter_state_changed_on,
+							adapter_test_end}
+};
+
 static bt_callbacks_t bt_callbacks = {
 	.size = sizeof(bt_callbacks),
-	.adapter_state_changed_cb = NULL,
-	.adapter_properties_cb = NULL,
+	.adapter_state_changed_cb = adapter_state_changed_cb,
+	.adapter_properties_cb = adapter_properties_cb,
 	.remote_device_properties_cb = NULL,
 	.device_found_cb = NULL,
 	.discovery_state_changed_cb = NULL,
@@ -356,9 +563,22 @@ static void teardown(const void *test_data)
 	if (data->bluetoothd_pid)
 		waitpid(data->bluetoothd_pid, NULL, 0);
 
+	if (data->expected_callbacks)
+		g_slist_free(data->expected_callbacks);
+
 	tester_teardown_complete();
 }
 
+static void test_enable(const void *test_data)
+{
+	struct test_data *data = tester_get_data();
+
+	hal_cb_init(data);
+	mgmt_cb_init(data);
+
+	data->if_bluetooth->enable();
+}
+
 static void controller_setup(const void *test_data)
 {
 	tester_test_passed();
@@ -385,5 +605,8 @@ int main(int argc, char *argv[])
 
 	test_bredrle("Test Init", NULL, setup_base, controller_setup, teardown);
 
+	test_bredrle("Test Enable - Success", &bluetooth_enable_success_test,
+					setup_base, test_enable, teardown);
+
 	return tester_run();
 }
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v4 7/7] android/tester: Add status check and adapter enable, disable test cases
  2013-12-11 10:46 [PATCH v4 1/7] android/tester: Add android-tester Marcin Kraglak
                   ` (4 preceding siblings ...)
  2013-12-11 10:46 ` [PATCH v4 6/7] android/tester: Add basic enable test Marcin Kraglak
@ 2013-12-11 10:46 ` Marcin Kraglak
  2013-12-11 11:15 ` [PATCH v4 1/7] android/tester: Add android-tester Luiz Augusto von Dentz
  6 siblings, 0 replies; 9+ messages in thread
From: Marcin Kraglak @ 2013-12-11 10:46 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Grzegorz Kolodziejczyk

From: Grzegorz Kolodziejczyk <grzegorz.kolodziejczyk@tieto.com>

This adds handling of status check, enabled adapter setup method,
disable and enable fail test case.

---
 android/android-tester.c | 108 ++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 103 insertions(+), 5 deletions(-)

diff --git a/android/android-tester.c b/android/android-tester.c
index 0dc1edf..09c76c9 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -46,6 +46,7 @@
 
 enum hal_bluetooth_callbacks_id {
 	adapter_test_end,
+	adapter_test_setup_mode,
 	adapter_state_changed_on,
 	adapter_state_changed_off,
 	adapter_prop_bdaddr,
@@ -59,6 +60,7 @@ enum hal_bluetooth_callbacks_id {
 };
 
 struct generic_data {
+	uint8_t expected_adapter_status;
 	uint32_t expect_settings_set;
 	uint8_t expected_hal_callbacks[];
 };
@@ -78,6 +80,7 @@ struct test_data {
 
 	bool mgmt_settings_set;
 	bool hal_cb_called;
+	bool status_checked;
 
 	GSList *expected_callbacks;
 };
@@ -88,8 +91,13 @@ static void test_update_state(void)
 {
 	struct test_data *data = tester_get_data();
 
-	if (data->mgmt_settings_set && data->hal_cb_called)
-		tester_test_passed();
+	if (!(data->mgmt_settings_set))
+		return;
+	if (!(data->hal_cb_called))
+		return;
+	if (!(data->status_checked))
+		return;
+	tester_test_passed();
 }
 
 static void test_mgmt_settings_set(struct test_data *data)
@@ -143,10 +151,38 @@ static void mgmt_cb_init(struct test_data *data)
 				command_generic_new_settings, NULL, NULL);
 }
 
+static void expected_status_init(struct test_data *data)
+{
+	if (!(data->test_data->expected_adapter_status))
+		data->status_checked = true;
+}
+
+static void init_test_conditions(struct test_data *data)
+{
+	hal_cb_init(data);
+	mgmt_cb_init(data);
+	expected_status_init(data);
+}
+
+static void check_expected_status(uint8_t status)
+{
+	struct test_data *data = tester_get_data();
+
+	if (data->test_data->expected_adapter_status == status)
+		data->status_checked = true;
+	else
+		tester_test_failed();
+
+	test_update_state();
+}
+
 static int get_expected_hal_cb(void)
 {
 	struct test_data *data = tester_get_data();
 
+	if (!(g_slist_length(data->expected_callbacks)))
+		return adapter_test_setup_mode;
+
 	return GPOINTER_TO_INT(data->expected_callbacks->data);
 }
 
@@ -359,13 +395,28 @@ failed:
 
 static void adapter_state_changed_cb(bt_state_t state)
 {
-	switch (get_expected_hal_cb()) {
+	enum hal_bluetooth_callbacks_id hal_cb;
+
+	hal_cb = get_expected_hal_cb();
+
+	switch (hal_cb) {
 	case adapter_state_changed_on:
 		if (state == BT_STATE_ON)
 			remove_expected_hal_cb();
 		else
 			tester_test_failed();
 		break;
+	case adapter_state_changed_off:
+		if (state == BT_STATE_OFF)
+			remove_expected_hal_cb();
+		else
+			tester_test_failed();
+		break;
+	case adapter_test_setup_mode:
+		if (state == BT_STATE_ON)
+			tester_setup_complete();
+		else
+			tester_setup_failed();
 	default:
 		break;
 	}
@@ -379,6 +430,10 @@ static void adapter_properties_cb(bt_status_t status, int num_properties,
 
 	for (i = 0; i < num_properties; i++) {
 		hal_cb = get_expected_hal_cb();
+
+		if (hal_cb == adapter_test_setup_mode)
+			break;
+
 		switch (properties[i].type) {
 		case BT_PROPERTY_BDADDR:
 			if (hal_cb != adapter_prop_bdaddr) {
@@ -454,6 +509,15 @@ static const struct generic_data bluetooth_enable_success_test = {
 							adapter_test_end}
 };
 
+static const struct generic_data bluetooth_enable_done_test = {
+	.expected_hal_callbacks = {adapter_props, adapter_test_end},
+	.expected_adapter_status = BT_STATUS_DONE
+};
+
+static const struct generic_data bluetooth_disable_success_test = {
+	.expected_hal_callbacks = {adapter_state_changed_off, adapter_test_end}
+};
+
 static bt_callbacks_t bt_callbacks = {
 	.size = sizeof(bt_callbacks),
 	.adapter_state_changed_cb = adapter_state_changed_cb,
@@ -551,6 +615,15 @@ static void setup_base(const void *test_data)
 	tester_setup_complete();
 }
 
+static void setup_enabled_adapter(const void *test_data)
+{
+	struct test_data *data = tester_get_data();
+
+	setup(data);
+
+	data->if_bluetooth->enable();
+}
+
 static void teardown(const void *test_data)
 {
 	struct test_data *data = tester_get_data();
@@ -573,12 +646,31 @@ static void test_enable(const void *test_data)
 {
 	struct test_data *data = tester_get_data();
 
-	hal_cb_init(data);
-	mgmt_cb_init(data);
+	init_test_conditions(data);
 
 	data->if_bluetooth->enable();
 }
 
+static void test_enable_done(const void *test_data)
+{
+	struct test_data *data = tester_get_data();
+	bt_status_t adapter_status;
+
+	init_test_conditions(data);
+
+	adapter_status = data->if_bluetooth->enable();
+	check_expected_status(adapter_status);
+}
+
+static void test_disable(const void *test_data)
+{
+	struct test_data *data = tester_get_data();
+
+	init_test_conditions(data);
+
+	data->if_bluetooth->disable();
+}
+
 static void controller_setup(const void *test_data)
 {
 	tester_test_passed();
@@ -608,5 +700,11 @@ int main(int argc, char *argv[])
 	test_bredrle("Test Enable - Success", &bluetooth_enable_success_test,
 					setup_base, test_enable, teardown);
 
+	test_bredrle("Test Enable - Done", &bluetooth_enable_done_test,
+			setup_enabled_adapter, test_enable_done, teardown);
+
+	test_bredrle("Test Disable - Success", &bluetooth_disable_success_test,
+			setup_enabled_adapter, test_disable, teardown);
+
 	return tester_run();
 }
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH v4 3/7] android/tester: Start emulator in new process
  2013-12-11 10:46 ` [PATCH v4 3/7] android/tester: Start emulator in new process Marcin Kraglak
@ 2013-12-11 11:10   ` Andrei Emeltchenko
  0 siblings, 0 replies; 9+ messages in thread
From: Andrei Emeltchenko @ 2013-12-11 11:10 UTC (permalink / raw)
  To: Marcin Kraglak; +Cc: linux-bluetooth

Hi Marcin,

On Wed, Dec 11, 2013 at 11:46:33AM +0100, Marcin Kraglak wrote:
> This is needed because bluetooth->init call is blocking,
> and we have to emulate normal behaviour of android environment.
> That process will exit if it won't receive any message in 2 sec
> or when bluetoothd will exit. Main tester thread will wait for
> this process in teardown method.
> ---
>  android/android-tester.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 131 insertions(+), 1 deletion(-)
> 
> diff --git a/android/android-tester.c b/android/android-tester.c
> index 498da22..ad7aa39 100644
> --- a/android/android-tester.c
> +++ b/android/android-tester.c
> @@ -15,9 +15,15 @@
>   *
>   */
>  
> +#include <stdlib.h>
>  #include <unistd.h>
>  
>  #include <glib.h>
> +#include <sys/socket.h>
> +#include <sys/types.h>
> +#include <sys/wait.h>
> +#include <sys/un.h>
> +#include <libgen.h>
>  
>  #include "lib/bluetooth.h"
>  #include "lib/mgmt.h"
> @@ -29,14 +35,20 @@
>  struct generic_data {
>  };
>  
> +#define WAIT_FOR_SIGNAL_TIME 2 /* in seconds */
> +#define EMULATOR_SIGNAL "emulator_started"
> +
>  struct test_data {
>  	struct mgmt *mgmt;
>  	uint16_t mgmt_index;
>  	struct hciemu *hciemu;
>  	enum hciemu_type hciemu_type;
>  	const struct generic_data *test_data;
> +	pid_t bluetoothd_pid;
>  };
>  
> +static char exec_dir[PATH_MAX + 1];
> +
>  static void read_info_callback(uint8_t status, uint16_t length,
>  					const void *param, void *user_data)
>  {
> @@ -165,13 +177,129 @@ static void test_post_teardown(const void *test_data)
>  	data->hciemu = NULL;
>  }
>  
> +static void bluetoothd_start(int hci_index)
> +{
> +	char prg_name[PATH_MAX + 1];
> +	char index[8];
> +	char *prg_argv[4];
> +
> +	snprintf(prg_name, sizeof(prg_name), "%s/%s", exec_dir, "bluetoothd");
> +	snprintf(index, sizeof(index), "%d", hci_index);
> +
> +	prg_argv[0] = prg_name;
> +	prg_argv[1] = "-i";
> +	prg_argv[2] = index;
> +	prg_argv[3] = NULL;
> +
> +	if (!tester_use_debug())
> +		fclose(stderr);
> +
> +	execve(prg_argv[0], prg_argv, NULL);
> +}
> +
> +static void emulator(int pipe, int hci_index)
> +{
> +	static const char SYSTEM_SOCKET_PATH[] = "\0android_system";
> +	char buf[1024];
> +	struct sockaddr_un addr;
> +	struct timeval tv;
> +	int fd;
> +	ssize_t len;
> +
> +	fd = socket(PF_LOCAL, SOCK_DGRAM | SOCK_CLOEXEC, 0);
> +	if (fd < 0)
> +		goto failed;

return? otherwise you close invalid fd, or check fd in failed 

> +
> +	tv.tv_sec = WAIT_FOR_SIGNAL_TIME;
> +	tv.tv_usec = 0;
> +	setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv));
> +
> +	memset(&addr, 0, sizeof(addr));
> +	addr.sun_family = AF_UNIX;
> +	memcpy(addr.sun_path, SYSTEM_SOCKET_PATH, sizeof(SYSTEM_SOCKET_PATH));
> +
> +	if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
> +		perror("Failed to bind system socket");
> +		goto failed;
> +	}
> +
> +	len = write(pipe, EMULATOR_SIGNAL, sizeof(EMULATOR_SIGNAL));
> +

we do not need here empty space

Best regards 
Andrei Emeltchenko 
> +	if (len != sizeof(EMULATOR_SIGNAL))
> +		goto failed;
> +
> +	memset(buf, 0, sizeof(buf));
> +
> +	len = read(fd, buf, sizeof(buf));
> +	if (len <= 0 || (strcmp(buf, "ctl.start=bluetoothd")))
> +		goto failed;
> +
> +	close(pipe);
> +	close(fd);
> +	bluetoothd_start(hci_index);
> +
> +failed:
> +	close(pipe);
> +	close(fd);
> +}
> +
> +static void setup(struct test_data *data)
> +{
> +	int signal_fd[2];
> +	char buf[1024];
> +	pid_t pid;
> +	int len;
> +
> +	if (pipe(signal_fd)) {
> +		tester_setup_failed();
> +		return;
> +	}
> +
> +	pid = fork();
> +
> +	if (pid < 0) {
> +		close(signal_fd[0]);
> +		close(signal_fd[1]);
> +		tester_setup_failed();
> +		return;
> +	}
> +
> +	if (pid == 0) {
> +		if (!tester_use_debug())
> +			fclose(stderr);
> +
> +		close(signal_fd[0]);
> +		emulator(signal_fd[1], data->mgmt_index);
> +		exit(0);
> +	}
> +
> +	close(signal_fd[1]);
> +	data->bluetoothd_pid = pid;
> +
> +	len = read(signal_fd[0], buf, sizeof(buf));
> +	if (len <= 0 || (strcmp(buf, EMULATOR_SIGNAL))) {
> +		close(signal_fd[0]);
> +		tester_setup_failed();
> +		return;
> +	}
> +}
> +
>  static void setup_base(const void *test_data)
>  {
> -	tester_setup_failed();
> +	struct test_data *data = tester_get_data();
> +
> +	setup(data);
> +
> +	tester_setup_complete();
>  }
>  
>  static void teardown(const void *test_data)
>  {
> +	struct test_data *data = tester_get_data();
> +
> +	if (data->bluetoothd_pid)
> +		waitpid(data->bluetoothd_pid, NULL, 0);
> +
>  	tester_teardown_complete();
>  }
>  
> @@ -194,6 +322,8 @@ static void controller_setup(const void *test_data)
>  
>  int main(int argc, char *argv[])
>  {
> +	snprintf(exec_dir, sizeof(exec_dir), "%s", dirname(argv[0]));
> +
>  	tester_init(&argc, &argv);
>  
>  	test_bredrle("Test Init", NULL, setup_base, controller_setup, teardown);
> -- 
> 1.8.3.1
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v4 1/7] android/tester: Add android-tester
  2013-12-11 10:46 [PATCH v4 1/7] android/tester: Add android-tester Marcin Kraglak
                   ` (5 preceding siblings ...)
  2013-12-11 10:46 ` [PATCH v4 7/7] android/tester: Add status check and adapter enable, disable test cases Marcin Kraglak
@ 2013-12-11 11:15 ` Luiz Augusto von Dentz
  6 siblings, 0 replies; 9+ messages in thread
From: Luiz Augusto von Dentz @ 2013-12-11 11:15 UTC (permalink / raw)
  To: Marcin Kraglak; +Cc: linux-bluetooth@vger.kernel.org

Hi Marcin,

On Wed, Dec 11, 2013 at 12:46 PM, Marcin Kraglak
<marcin.kraglak@tieto.com> wrote:
> This commit add android-tester.c to tree and Makefile.am.
> This will contain set of unit tests for testing android daemon.
> ---
>  .gitignore               |  1 +
>  android/Makefile.am      |  4 ++++
>  android/android-tester.c | 21 +++++++++++++++++++++
>  3 files changed, 26 insertions(+)
>  create mode 100644 android/android-tester.c
>
> diff --git a/.gitignore b/.gitignore
> index 2d3435a..c570728 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -107,3 +107,4 @@ unit/test-*.trs
>  android/system-emulator
>  android/bluetoothd
>  android/haltest
> +android/android-tester
> diff --git a/android/Makefile.am b/android/Makefile.am
> index df04762..0768985 100644
> --- a/android/Makefile.am
> +++ b/android/Makefile.am
> @@ -83,6 +83,10 @@ android_haltest_CFLAGS = $(AM_CFLAGS) -I$(srcdir)/android \
>
>  android_haltest_LDFLAGS = -pthread
>
> +noinst_PROGRAMS += android/android-tester
> +
> +android_android_tester_SOURCES = android/android-tester.c
> +
>  endif
>
>  EXTRA_DIST += android/Android.mk android/hal-ipc-api.txt android/README \
> diff --git a/android/android-tester.c b/android/android-tester.c
> new file mode 100644
> index 0000000..f5c42b0
> --- /dev/null
> +++ b/android/android-tester.c
> @@ -0,0 +1,21 @@
> +/*
> + * Copyright (C) 2013 Intel Corporation
> + *
> + * Licensed under the Apache License, Version 2.0 (the "License");
> + * you may not use this file except in compliance with the License.
> + * You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + *
> + */
> +
> +int main(int argc, char *argv[])
> +{
> +       return 0;
> +}
> --
> 1.8.3.1

Applied, thanks.


-- 
Luiz Augusto von Dentz

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2013-12-11 11:15 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-12-11 10:46 [PATCH v4 1/7] android/tester: Add android-tester Marcin Kraglak
2013-12-11 10:46 ` [PATCH v4 2/7] android/tester: Add pre-setup and post-teardown routines Marcin Kraglak
2013-12-11 10:46 ` [PATCH v4 3/7] android/tester: Start emulator in new process Marcin Kraglak
2013-12-11 11:10   ` Andrei Emeltchenko
2013-12-11 10:46 ` [PATCH v4 4/7] android/tester: Add stack initialization of stack in setup Marcin Kraglak
2013-12-11 10:46 ` [PATCH v4 5/7] android/tester: Make HAL logging wrapper print to stderr instead of stdout Marcin Kraglak
2013-12-11 10:46 ` [PATCH v4 6/7] android/tester: Add basic enable test Marcin Kraglak
2013-12-11 10:46 ` [PATCH v4 7/7] android/tester: Add status check and adapter enable, disable test cases Marcin Kraglak
2013-12-11 11:15 ` [PATCH v4 1/7] android/tester: Add android-tester Luiz Augusto von Dentz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).