Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5bae1b86 authored by Elliott Hughes's avatar Elliott Hughes
Browse files

Make __android_log_assert behave more like libc asserts.

If we don't output to stderr too, not only is it annoying to shell users (who
won't see anything), it prevents us from writing better gtests that actually
make assertions about the assert message.

Bug: http://b/23675822
Test: libutils tests still pass
Change-Id: I62b3144c385cba4dde485f0b0f9b42aeaef51e9a
parent 01b25ab1
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -514,6 +514,14 @@ LIBLOG_ABI_PUBLIC void __android_log_assert(const char *cond, const char *tag,
            strcpy(buf, "Unspecified assertion failed");
    }

    // Log assertion failures to stderr for the benefit of "adb shell" users
    // and gtests (http://b/23675822).
    struct iovec iov[2] = {
        { buf, strlen(buf) },
        { (char*) "\n", 1 },
    };
    TEMP_FAILURE_RETRY(writev(2, iov, 2));

    __android_log_write(ANDROID_LOG_FATAL, tag, buf);
    abort(); /* abort so we have a chance to debug the situation */
    /* NOTREACHED */
+4 −18
Original line number Diff line number Diff line
@@ -74,12 +74,9 @@ TEST_F(VectorTest, CopyOnWrite_CopyAndAddElements) {
    EXPECT_EQ(other[3], 5);
}

// TODO: gtest isn't capable of parsing Abort messages formatted by
// Android (fails differently on host and target), so we always need to
// use an empty error message for death tests.
TEST_F(VectorTest, SetCapacity_Overflow) {
  Vector<int> vector;
  EXPECT_DEATH(vector.setCapacity(SIZE_MAX / sizeof(int) + 1), "");
  EXPECT_DEATH(vector.setCapacity(SIZE_MAX / sizeof(int) + 1), "Assertion failed");
}

TEST_F(VectorTest, SetCapacity_ShrinkBelowSize) {
@@ -95,20 +92,13 @@ TEST_F(VectorTest, SetCapacity_ShrinkBelowSize) {
  ASSERT_EQ(8U, vector.capacity());
}

// NOTE: All of the tests below are useless because of the "TODO" above.
// We have no way of knowing *why* the process crashed. Given that we're
// inserting a NULL array, we'll fail with a SIGSEGV eventually. We need
// the ability to make assertions on the abort message to make sure we're
// failing for the right reasons.
TEST_F(VectorTest, _grow_OverflowSize) {
  Vector<int> vector;
  vector.add(1);

  // Checks that the size calculation (not the capacity calculation) doesn't
  // overflow : the size here will be (1 + SIZE_MAX).
  //
  // EXPECT_DEATH(vector.insertArrayAt(NULL, 0, SIZE_MAX), "new_size_overflow");
  EXPECT_DEATH(vector.insertArrayAt(NULL, 0, SIZE_MAX), "");
  EXPECT_DEATH(vector.insertArrayAt(NULL, 0, SIZE_MAX), "new_size overflow");
}

TEST_F(VectorTest, _grow_OverflowCapacityDoubling) {
@@ -116,18 +106,14 @@ TEST_F(VectorTest, _grow_OverflowCapacityDoubling) {

  // This should fail because the calculated capacity will overflow even though
  // the size of the vector doesn't.
  //
  // EXPECT_DEATH(vector.insertArrayAt(NULL, 0, (SIZE_MAX - 1)), "new_capacity_overflow");
  EXPECT_DEATH(vector.insertArrayAt(NULL, 0, (SIZE_MAX - 1)), "");
  EXPECT_DEATH(vector.insertArrayAt(NULL, 0, (SIZE_MAX - 1)), "new_capacity overflow");
}

TEST_F(VectorTest, _grow_OverflowBufferAlloc) {
  Vector<int> vector;
  // This should fail because the capacity * sizeof(int) overflows, even
  // though the capacity itself doesn't.
  //
  // EXPECT_DEATH(vector.insertArrayAt(NULL, 0, (SIZE_MAX / 2)), "new_alloc_size overflow");
  EXPECT_DEATH(vector.insertArrayAt(NULL, 0, (SIZE_MAX / 2)), "");
  EXPECT_DEATH(vector.insertArrayAt(NULL, 0, (SIZE_MAX / 2)), "new_alloc_size overflow");
}

TEST_F(VectorTest, editArray_Shared) {