12c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich/*
22c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich * Copyright (C) 2013 The Android Open Source Project
32c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich *
42c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich * Licensed under the Apache License, Version 2.0 (the "License");
52c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich * you may not use this file except in compliance with the License.
62c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich * You may obtain a copy of the License at
72c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich *
82c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich *      http://www.apache.org/licenses/LICENSE-2.0
92c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich *
102c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich * Unless required by applicable law or agreed to in writing, software
112c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich * distributed under the License is distributed on an "AS IS" BASIS,
122c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich * See the License for the specific language governing permissions and
142c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich * limitations under the License.
152c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich */
162c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich
172c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich#include <sys/cdefs.h>
182c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich#include <features.h>
192c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich#include <gtest/gtest.h>
202c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich
212c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich// getauxval() was only added as of glibc version 2.16.
222c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich// See: http://lwn.net/Articles/519085/
232c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich// Don't try to compile this code on older glibc versions.
242c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich
252c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich#if defined(__BIONIC__)
262c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich  #define GETAUXVAL_CAN_COMPILE 1
272c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich#elif defined(__GLIBC_PREREQ)
282c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich  #if __GLIBC_PREREQ(2, 16)
292c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich    #define GETAUXVAL_CAN_COMPILE 1
302c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich  #endif
312c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich#endif
322c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich
332c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich#if defined(GETAUXVAL_CAN_COMPILE)
342c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich#include <sys/auxv.h>
35f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#endif
362c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich
372c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick KralevichTEST(getauxval, expected_values) {
38f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#if defined(GETAUXVAL_CAN_COMPILE)
392c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich  ASSERT_EQ((unsigned long int) 0, getauxval(AT_SECURE));
402c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich  ASSERT_EQ(getuid(), getauxval(AT_UID));
412c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich  ASSERT_EQ(geteuid(), getauxval(AT_EUID));
422c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich  ASSERT_EQ(getgid(), getauxval(AT_GID));
432c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich  ASSERT_EQ(getegid(), getauxval(AT_EGID));
442c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich  ASSERT_EQ((unsigned long int) getpagesize(), getauxval(AT_PAGESZ));
452c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich
462c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich  ASSERT_NE((unsigned long int) 0, getauxval(AT_PHDR));
472c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich  ASSERT_NE((unsigned long int) 0, getauxval(AT_PHNUM));
482c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich  ASSERT_NE((unsigned long int) 0, getauxval(AT_ENTRY));
492c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich  ASSERT_NE((unsigned long int) 0, getauxval(AT_PAGESZ));
50f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#else
51f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris  GTEST_LOG_(INFO) << "This test does nothing.\n";
52f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#endif
532c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich}
542c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich
552c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick KralevichTEST(getauxval, unexpected_values) {
56f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#if defined(GETAUXVAL_CAN_COMPILE)
572c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich  ASSERT_EQ((unsigned long int) 0, getauxval(0xdeadbeef));
58f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#else
59f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris  GTEST_LOG_(INFO) << "This test does nothing.\n";
60f04935c85e0b466f0d30d2cd4c0fa2fff62e7d6dChristopher Ferris#endif
612c5153b043b44e9935a334ae9b2d5a4bc5258b40Nick Kralevich}
62