Merge changes from topic 'bphwfoo'
* changes:
Clean up hard-coded Bp/Bn/Bs/IHw prefixes.
Renamed Interface::getProxyName to getProxyFqName
diff --git a/generateJava.cpp b/generateJava.cpp
index e944431..a4b53b4 100644
--- a/generateJava.cpp
+++ b/generateJava.cpp
@@ -273,7 +273,7 @@
out << "private android.os.IHwBinder mRemote;\n\n";
out << "public Proxy(android.os.IHwBinder remote) {\n";
out.indent();
- out << "mRemote = remote;\n";
+ out << "mRemote = java.util.Objects.requireNonNull(remote);\n";
out.unindent();
out << "}\n\n";
diff --git a/test/Android.bp b/test/Android.bp
index 6c99082..0f783b8 100644
--- a/test/Android.bp
+++ b/test/Android.bp
@@ -5,7 +5,7 @@
cc_test {
name: "hidl_test",
gtest: false,
- srcs: ["main.cpp"],
+ srcs: ["main.cpp", "FooCallback.cpp"],
shared_libs: [
"libbase",
diff --git a/test/FooCallback.cpp b/test/FooCallback.cpp
new file mode 100644
index 0000000..39d540f
--- /dev/null
+++ b/test/FooCallback.cpp
@@ -0,0 +1,134 @@
+
+#define LOG_TAG "hidl_test"
+
+#include "FooCallback.h"
+#include <android/log.h>
+#include <hidl-test/FooHelper.h>
+#include <inttypes.h>
+#include <utils/Timers.h>
+
+namespace android {
+namespace hardware {
+namespace tests {
+namespace foo {
+namespace V1_0 {
+namespace implementation {
+
+enum {
+ NOT_REPORTED = -1LL
+};
+
+FooCallback::FooCallback()
+ : mLock{}, mCond{} {
+ for (size_t i = 0; i < invokeInfo.size(); i++) {
+ invokeInfo[i].invoked = false;
+ invokeInfo[i].timeNs = NOT_REPORTED;
+ invokeInfo[i].callerBlockedNs = NOT_REPORTED;
+ }
+}
+
+Return<void> FooCallback::heyItsYou(
+ const sp<IFooCallback> &_cb) {
+ nsecs_t start = systemTime();
+ ALOGI("SERVER(FooCallback) 1: heyItsYou cb = %p", _cb.get());
+ nsecs_t end = systemTime();
+ {
+ Mutex::Autolock lock(mLock);
+ invokeInfo[0].invoked = true;
+ invokeInfo[0].timeNs = end - start;
+ mCond.signal();
+ }
+ ALOGI("SERVER(FooCallback) 2: heyItsYou returned");
+ return Void();
+}
+
+Return<bool> FooCallback::heyItsYouIsntIt(const sp<IFooCallback> &_cb) {
+ nsecs_t start = systemTime();
+ ALOGI("SERVER(FooCallback) 3: heyItsYouIsntIt cb = %p sleeping for %" PRId64 " seconds", _cb.get(), DELAY_S);
+ sleep(DELAY_S);
+ ALOGI("SERVER(FooCallback) 4: heyItsYouIsntIt cb = %p responding", _cb.get());
+ nsecs_t end = systemTime();
+ {
+ Mutex::Autolock lock(mLock);
+ invokeInfo[1].invoked = true;
+ invokeInfo[1].timeNs = end - start;
+ mCond.signal();
+ }
+ ALOGI("SERVER(FooCallback) 5: heyItsYouIsntIt cb = %p responding", _cb.get());
+ return true;
+}
+
+Return<void> FooCallback::heyItsTheMeaningOfLife(uint8_t tmol) {
+ nsecs_t start = systemTime();
+ ALOGI("SERVER(FooCallback) 6.1: heyItsTheMeaningOfLife = %d sleeping for %" PRId64 " seconds", tmol, DELAY_S);
+ sleep(DELAY_S);
+ ALOGI("SERVER(FooCallback) 6.2: heyItsTheMeaningOfLife = %d done sleeping", tmol);
+ nsecs_t end = systemTime();
+ {
+ Mutex::Autolock lock(mLock);
+ invokeInfo[2].invoked = true;
+ invokeInfo[2].timeNs = end - start;
+ mCond.signal();
+ }
+ ALOGI("SERVER(FooCallback) 6.3: heyItsTheMeaningOfLife returned");
+ return Void();
+}
+
+Return<void> FooCallback::reportResults(int64_t ns, reportResults_cb cb) {
+ ALOGI("SERVER(FooCallback) 8.1: reportResults(%" PRId64 " seconds)", nanoseconds_to_seconds(ns));
+ nsecs_t leftToWaitNs = ns;
+ bool cond;
+ {
+ Mutex::Autolock lock(mLock);
+ while ((cond = ((!invokeInfo[0].invoked ||
+ !invokeInfo[1].invoked ||
+ !invokeInfo[2].invoked ||
+ invokeInfo[0].callerBlockedNs == NOT_REPORTED ||
+ invokeInfo[1].callerBlockedNs == NOT_REPORTED ||
+ invokeInfo[2].callerBlockedNs == NOT_REPORTED) &&
+ leftToWaitNs > 0))) {
+ nsecs_t start = systemTime();
+ ::android::status_t rc = mCond.waitRelative(mLock, leftToWaitNs);
+ if (rc != ::android::OK) {
+ ALOGW("SERVER(FooCallback)::reportResults(%" PRId64 " ns) Condition::waitRelative(%" PRId64 ") returned error (%d)", ns, leftToWaitNs, rc);
+ if (rc == -ETIMEDOUT) {
+ // time's up
+ leftToWaitNs = -INT32_MAX;
+ }
+ break;
+ }
+ ALOGI("SERVER(FooCallback)::reportResults(%" PRId64 " ns) Condition::waitRelative was signalled", ns);
+ leftToWaitNs -= systemTime() - start;
+ }
+ }
+ ALOGI("SERVER(FooCallback) 8.2: reportResults returned;"
+ "invoked? %d, %d, %d; leftToWaitNs = %" PRId64 "; cond = %d",
+ invokeInfo[0].invoked, invokeInfo[1].invoked, invokeInfo[2].invoked,
+ leftToWaitNs, cond);
+ cb(leftToWaitNs, invokeInfo);
+ return Void();
+}
+
+Return<void> FooCallback::youBlockedMeFor(const hidl_array<int64_t, 3> &ns) {
+ ALOGI("SERVER(FooCallback) 7.1: youBlockedMeFor");
+ {
+ Mutex::Autolock lock(mLock);
+ for (size_t i = 0; i < 3; i++) {
+ invokeInfo[i].callerBlockedNs = ns[i];
+ }
+ mCond.signal();
+ }
+ ALOGI("SERVER(FooCallback) 7.2: returned");
+ return Void();
+}
+
+IFooCallback* HIDL_FETCH_IFooCallback(const char* /* name */) {
+ return new FooCallback();
+}
+
+} // namespace implementation
+} // namespace V1_0
+} // namespace foo
+} // namespace tests
+} // namespace hardware
+} // namespace android
diff --git a/test/FooCallback.h b/test/FooCallback.h
new file mode 100644
index 0000000..3164a9d
--- /dev/null
+++ b/test/FooCallback.h
@@ -0,0 +1,46 @@
+#ifndef ANDROID_HARDWARE_TESTS_FOO_V1_0_FOOCALLBACK_H
+#define ANDROID_HARDWARE_TESTS_FOO_V1_0_FOOCALLBACK_H
+
+#include <android/hardware/tests/foo/1.0/IFooCallback.h>
+#include <hidl/Status.h>
+#include <hidl/MQDescriptor.h>
+
+#include <utils/Condition.h>
+namespace android {
+namespace hardware {
+namespace tests {
+namespace foo {
+namespace V1_0 {
+namespace implementation {
+
+using ::android::hardware::tests::foo::V1_0::IFooCallback;
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::hidl_string;
+using ::android::sp;
+
+struct FooCallback : public IFooCallback {
+ FooCallback();
+ // Methods from ::android::hardware::tests::foo::V1_0::IFooCallback follow.
+ Return<void> heyItsYou(const sp<IFooCallback>& cb) override;
+ Return<bool> heyItsYouIsntIt(const sp<IFooCallback>& cb) override;
+ Return<void> heyItsTheMeaningOfLife(uint8_t tmol) override;
+ Return<void> reportResults(int64_t ns, reportResults_cb _hidl_cb) override;
+ Return<void> youBlockedMeFor(const hidl_array<int64_t, 3 /* 3 */>& callerBlockedInfo) override;
+
+ hidl_array<InvokeInfo, 3> invokeInfo;
+ Mutex mLock;
+ Condition mCond;
+};
+
+extern "C" IFooCallback* HIDL_FETCH_IFooCallback(const char* name);
+
+} // namespace implementation
+} // namespace V1_0
+} // namespace foo
+} // namespace tests
+} // namespace hardware
+} // namespace android
+
+#endif // ANDROID_HARDWARE_TESTS_FOO_V1_0_FOOCALLBACK_H
diff --git a/test/main.cpp b/test/main.cpp
index a96bd5e..e437212 100644
--- a/test/main.cpp
+++ b/test/main.cpp
@@ -1,4 +1,7 @@
#define LOG_TAG "hidl_test"
+
+#include "FooCallback.h"
+
#include <android-base/logging.h>
#include <android/hidl/manager/1.0/IServiceManager.h>
@@ -10,13 +13,11 @@
#include <android/hidl/token/1.0/ITokenManager.h>
#include <android/hardware/tests/foo/1.0/IFoo.h>
-#include <android/hardware/tests/foo/1.0/IFooCallback.h>
#include <android/hardware/tests/foo/1.0/BnSimple.h>
// TODO(b/33669138): remove
#include <cutils/trace.h>
#include <android/hardware/tests/foo/1.0/BsSimple.h>
#include <android/hardware/tests/foo/1.0/BpSimple.h>
-
#include <android/hardware/tests/bar/1.0/IBar.h>
#include <android/hardware/tests/bar/1.0/IComplicated.h>
#include <android/hardware/tests/inheritance/1.0/IFetcher.h>
@@ -85,6 +86,7 @@
using ::android::hardware::tests::foo::V1_0::IFoo;
using ::android::hardware::tests::foo::V1_0::IFooCallback;
using ::android::hardware::tests::foo::V1_0::ISimple;
+using ::android::hardware::tests::foo::V1_0::implementation::FooCallback;
using ::android::hardware::tests::bar::V1_0::IBar;
using ::android::hardware::tests::bar::V1_0::IComplicated;
using ::android::hardware::tests::inheritance::V1_0::IFetcher;
@@ -327,7 +329,6 @@
sp<IFoo> foo;
sp<IFoo> dyingFoo;
sp<IBar> bar;
- sp<IFooCallback> fooCb;
sp<IGraph> graphInterface;
sp<IPointer> pointerInterface;
sp<IPointer> validationPointerInterface;
@@ -377,10 +378,6 @@
ASSERT_NE(bar, nullptr);
ASSERT_EQ(bar->isRemote(), gMode == BINDERIZED);
- fooCb = IFooCallback::getService("foo callback", gMode == PASSTHROUGH /* getStub */);
- ASSERT_NE(fooCb, nullptr);
- ASSERT_EQ(fooCb->isRemote(), gMode == BINDERIZED);
-
graphInterface = IGraph::getService("graph", gMode == PASSTHROUGH /* getStub */);
ASSERT_NE(graphInterface, nullptr);
ASSERT_EQ(graphInterface->isRemote(), gMode == BINDERIZED);
@@ -440,7 +437,6 @@
addServer<IFetcher>("fetcher");
addServer<IBar>("foo");
addServer<IFoo>("dyingFoo");
- addServer<IFooCallback>("foo callback");
addServer<IGraph>("graph");
addServer<IPointer>("pointer");
@@ -460,7 +456,6 @@
sp<IFoo> foo;
sp<IFoo> dyingFoo;
sp<IBar> bar;
- sp<IFooCallback> fooCb;
sp<IGraph> graphInterface;
sp<IPointer> pointerInterface;
sp<IPointer> validationPointerInterface;
@@ -491,7 +486,6 @@
foo = env->foo;
dyingFoo = env->dyingFoo;
bar = env->bar;
- fooCb = env->fooCb;
graphInterface = env->graphInterface;
pointerInterface = env->pointerInterface;
validationPointerInterface = env->validationPointerInterface;
@@ -504,7 +498,6 @@
"android.hardware.tests.pointer@1.0::IPointer/pointer",
"android.hardware.tests.bar@1.0::IBar/foo",
"android.hardware.tests.inheritance@1.0::IFetcher/fetcher",
- "android.hardware.tests.foo@1.0::IFooCallback/foo callback",
"android.hardware.tests.inheritance@1.0::IParent/parent",
"android.hardware.tests.inheritance@1.0::IParent/child",
"android.hardware.tests.inheritance@1.0::IChild/child",
@@ -807,8 +800,10 @@
EXPECT_LT(systemTime() - now, 1000) << " for nothing";
}
-// TODO: b/31819198
TEST_F(HidlTest, FooCallMeTest) {
+
+ sp<IFooCallback> fooCb = new FooCallback();
+
ALOGI("CLIENT call callMe.");
// callMe is oneway, should return instantly.
nsecs_t now;
@@ -816,10 +811,6 @@
EXPECT_OK(foo->callMe(fooCb));
EXPECT_LT(systemTime() - now, ONEWAY_TOLERANCE_NS);
ALOGI("CLIENT callMe returned.");
-}
-
-// TODO: b/31819198
-TEST_F(HidlTest, ForReportResultsTest) {
// Bar::callMe will invoke three methods on FooCallback; one will return
// right away (even though it is a two-way method); the second one will
@@ -837,21 +828,27 @@
// verify that eachof them executed, as expected, and took the length of
// time to execute that we also expect.
+ const nsecs_t waitNs =
+ 3 * DELAY_NS + TOLERANCE_NS;
const nsecs_t reportResultsNs =
2 * DELAY_NS + TOLERANCE_NS;
ALOGI("CLIENT: Waiting for up to %" PRId64 " seconds.",
- nanoseconds_to_seconds(reportResultsNs));
+ nanoseconds_to_seconds(waitNs));
- fooCb->reportResults(reportResultsNs,
+ fooCb->reportResults(waitNs,
[&](int64_t timeLeftNs,
const hidl_array<IFooCallback::InvokeInfo, 3> &invokeResults) {
ALOGI("CLIENT: FooCallback::reportResults() is returning data.");
ALOGI("CLIENT: Waited for %" PRId64 " milliseconds.",
- nanoseconds_to_milliseconds(reportResultsNs - timeLeftNs));
+ nanoseconds_to_milliseconds(waitNs - timeLeftNs));
- EXPECT_LE(0, timeLeftNs);
- EXPECT_LE(timeLeftNs, reportResultsNs);
+ EXPECT_LE(waitNs - timeLeftNs, reportResultsNs)
+ << "waited for "
+ << (timeLeftNs >= 0 ? "" : "more than ")
+ << (timeLeftNs >= 0 ? (waitNs - timeLeftNs) : waitNs)
+ << "ns, expect to finish in "
+ << reportResultsNs << " ns";
// two-way method, was supposed to return right away
EXPECT_TRUE(invokeResults[0].invoked);