diff options
author | Dan Albert <danalbert@google.com> | 2015-02-25 19:06:39 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2015-02-25 19:06:39 +0000 |
commit | 948ae1b9353545119a89b6fb8fe8380d4039a366 (patch) | |
tree | 84b403be1e935b8bbf1676c90c4b1663e17a549b /adb | |
parent | a82f2b259076135017a2665bfbc3344826e9112f (diff) | |
parent | 055f1aa4ff58ba71133d506b202ad46612758ded (diff) | |
download | system_core-948ae1b9353545119a89b6fb8fe8380d4039a366.zip system_core-948ae1b9353545119a89b6fb8fe8380d4039a366.tar.gz system_core-948ae1b9353545119a89b6fb8fe8380d4039a366.tar.bz2 |
Merge "Add some basic tests to adb."
Diffstat (limited to 'adb')
-rw-r--r-- | adb/Android.mk | 32 | ||||
-rw-r--r-- | adb/transport.c | 40 | ||||
-rw-r--r-- | adb/transport_test.cpp | 53 |
3 files changed, 107 insertions, 18 deletions
diff --git a/adb/Android.mk b/adb/Android.mk index da5015a..94cd88d 100644 --- a/adb/Android.mk +++ b/adb/Android.mk @@ -26,7 +26,9 @@ LIBADB_SRC_FILES := \ transport_usb.c \ LIBADB_CFLAGS := \ - -Wall -Werror -Wno-unused-parameter \ + -Wall -Werror \ + -Wno-unused-parameter \ + -Wno-missing-field-initializers \ -D_XOPEN_SOURCE -D_GNU_SOURCE \ -fvisibility=hidden \ @@ -67,6 +69,34 @@ endif include $(BUILD_HOST_STATIC_LIBRARY) +LIBADB_TEST_SRCS := \ + transport_test.cpp \ + +include $(CLEAR_VARS) +LOCAL_CLANG := $(ADB_CLANG) +LOCAL_MODULE := adbd_test +LOCAL_CFLAGS := -DADB_HOST=0 $(LIBADB_CFLAGS) +LOCAL_SRC_FILES := $(LIBADB_TEST_SRCS) +LOCAL_STATIC_LIBRARIES := libadbd +LOCAL_SHARED_LIBRARIES := liblog +include $(BUILD_NATIVE_TEST) + +include $(CLEAR_VARS) +LOCAL_CLANG := $(ADB_CLANG) +LOCAL_MODULE := adb_test +LOCAL_CFLAGS := -DADB_HOST=1 $(LIBADB_CFLAGS) +LOCAL_SRC_FILES := $(LIBADB_TEST_SRCS) services.c +LOCAL_STATIC_LIBRARIES := \ + libadb \ + libcrypto_static \ + libcutils \ + +ifeq ($(HOST_OS),linux) + LOCAL_LDLIBS += -lrt -ldl -lpthread +endif + +include $(BUILD_HOST_NATIVE_TEST) + # adb host tool # ========================================================= include $(CLEAR_VARS) diff --git a/adb/transport.c b/adb/transport.c index 4904cd0..1951595 100644 --- a/adb/transport.c +++ b/adb/transport.c @@ -18,6 +18,7 @@ #include "transport.h" +#include <ctype.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> @@ -69,8 +70,7 @@ static void dump_hex( const unsigned char* ptr, size_t len ) } #endif -void -kick_transport(atransport* t) +void kick_transport(atransport* t) { if (t && !t->kicked) { @@ -87,8 +87,25 @@ kick_transport(atransport* t) } } -void -run_transport_disconnects(atransport* t) +// Each atransport contains a list of adisconnects (t->disconnects). +// An adisconnect contains a link to the next/prev adisconnect, a function +// pointer to a disconnect callback which takes a void* piece of user data and +// the atransport, and some user data for the callback (helpfully named +// "opaque"). +// +// The list is circular. New items are added to the entry member of the list +// (t->disconnects) by add_transport_disconnect. +// +// run_transport_disconnects invokes each function in the list. +// +// Gotchas: +// * run_transport_disconnects assumes that t->disconnects is non-null, so +// this can't be run on a zeroed atransport. +// * The callbacks in this list are not removed when called, and this function +// is not guarded against running more than once. As such, ensure that this +// function is not called multiple times on the same atransport. +// TODO(danalbert): Just fix this so that it is guarded once you have tests. +void run_transport_disconnects(atransport* t) { adisconnect* dis = t->disconnects.next; @@ -753,17 +770,6 @@ void remove_transport_disconnect(atransport* t, adisconnect* dis) dis->next = dis->prev = dis; } -static int qual_char_is_invalid(char ch) -{ - if ('A' <= ch && ch <= 'Z') - return 0; - if ('a' <= ch && ch <= 'z') - return 0; - if ('0' <= ch && ch <= '9') - return 0; - return 1; -} - static int qual_match(const char *to_test, const char *prefix, const char *qual, int sanitize_qual) { @@ -783,7 +789,7 @@ static int qual_match(const char *to_test, while (*qual) { char ch = *qual++; - if (sanitize_qual && qual_char_is_invalid(ch)) + if (sanitize_qual && isalnum(ch)) ch = '_'; if (ch != *to_test++) return 0; @@ -923,7 +929,7 @@ static void add_qual(char **buf, size_t *buf_size, if (sanitize_qual) { char *cp; for (cp = *buf + prefix_len; cp < *buf + len; cp++) { - if (qual_char_is_invalid(*cp)) + if (isalnum(*cp)) *cp = '_'; } } diff --git a/adb/transport_test.cpp b/adb/transport_test.cpp new file mode 100644 index 0000000..2b3fe3c --- /dev/null +++ b/adb/transport_test.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * 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. + */ + +#include "transport.h" + +#include <gtest/gtest.h> + +#include "adb.h" + +TEST(transport, kick_transport) { + atransport t = {}; + // Mutate some member so we can test that the function is run. + t.kick = [](atransport* trans) { trans->fd = 42; }; + atransport expected = t; + expected.fd = 42; + expected.kicked = 1; + kick_transport(&t); + ASSERT_EQ(42, t.fd); + ASSERT_EQ(1, t.kicked); + ASSERT_EQ(0, memcmp(&expected, &t, sizeof(atransport))); +} + +TEST(transport, kick_transport_already_kicked) { + // Ensure that the transport is not modified if the transport has already been + // kicked. + atransport t = {}; + t.kicked = 1; + t.kick = [](atransport*) { FAIL() << "Kick should not have been called"; }; + atransport expected = t; + kick_transport(&t); + ASSERT_EQ(0, memcmp(&expected, &t, sizeof(atransport))); +} + +// Disabled because the function currently segfaults for a zeroed atransport. I +// want to make sure I understand how this is working at all before I try fixing +// that. +TEST(transport, DISABLED_run_transport_disconnects_zeroed_atransport) { + atransport t = {}; + run_transport_disconnects(&t); +} |