Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <gtest/gtest.h>
     18 
     19 #include <sys/types.h>
     20 #include <sys/xattr.h>
     21 
     22 #include "TemporaryFile.h"
     23 
     24 TEST(sys_xattr, setxattr) {
     25   TemporaryFile tf;
     26   char buf[10];
     27   ASSERT_EQ(0, setxattr(tf.filename, "user.foo", "bar", 4, 0));
     28   ASSERT_EQ(4, getxattr(tf.filename, "user.foo", buf, sizeof(buf)));
     29   ASSERT_STREQ("bar", buf);
     30   buf[0] = '\0';
     31   ASSERT_EQ(4, lgetxattr(tf.filename, "user.foo", buf, sizeof(buf)));
     32   ASSERT_STREQ("bar", buf);
     33 }
     34 
     35 TEST(sys_xattr, fsetxattr) {
     36   TemporaryFile tf;
     37   char buf[10];
     38   ASSERT_EQ(0, fsetxattr(tf.fd, "user.foo", "bar", 4, 0));
     39   ASSERT_EQ(4, fgetxattr(tf.fd, "user.foo", buf, sizeof(buf)));
     40   ASSERT_STREQ("bar", buf);
     41 }
     42 
     43 TEST(sys_xattr, fsetxattr_zerobuf) {
     44   TemporaryFile tf;
     45   char buf[10];
     46   ASSERT_EQ(0, fsetxattr(tf.fd, "user.foo", "", 0, 0));
     47   ASSERT_EQ(0, fgetxattr(tf.fd, "user.foo", buf, sizeof(buf)));
     48 }
     49 
     50 TEST(sys_xattr, fsetxattr_toosmallbuf) {
     51   TemporaryFile tf;
     52   char buf[10];
     53   ASSERT_EQ(0, fsetxattr(tf.fd, "user.foo", "01234567890123456789", 21, 0));
     54   ASSERT_EQ(-1, fgetxattr(tf.fd, "user.foo", buf, sizeof(buf)));
     55   ASSERT_EQ(ERANGE, errno);
     56 }
     57 
     58 TEST(sys_xattr, fsetxattr_invalidfd) {
     59   char buf[10];
     60   errno = 0;
     61   ASSERT_EQ(-1, fsetxattr(65535, "user.foo", "0123", 5, 0));
     62   ASSERT_EQ(EBADF, errno);
     63   errno = 0;
     64   ASSERT_EQ(-1, fgetxattr(65535, "user.foo", buf, sizeof(buf)));
     65   ASSERT_EQ(EBADF, errno);
     66 }
     67 
     68 TEST(sys_xattr, fsetxattr_with_opath) {
     69   TemporaryFile tf;
     70   int fd = open(tf.filename, O_PATH);
     71   ASSERT_NE(-1, fd);
     72 
     73   int res = fsetxattr(fd, "user.foo", "bar", 4, 0);
     74 #if defined(__BIONIC__)
     75   char buf[10];
     76   ASSERT_EQ(0, res);
     77   ASSERT_EQ(4, fgetxattr(fd, "user.foo", buf, sizeof(buf)));
     78   ASSERT_STREQ("bar", buf);
     79 #else
     80   ASSERT_EQ(-1, res);
     81   ASSERT_EQ(EBADF, errno);
     82 #endif
     83   close(fd);
     84 }
     85 
     86 TEST(sys_xattr, fsetxattr_with_opath_toosmall) {
     87   TemporaryFile tf;
     88   int fd = open(tf.filename, O_PATH);
     89   ASSERT_NE(-1, fd);
     90 
     91   int res = fsetxattr(fd, "user.foo", "01234567890123456789", 21, 0);
     92 #if defined(__BIONIC__)
     93   char buf[10];
     94   ASSERT_EQ(0, res);
     95   ASSERT_EQ(-1, fgetxattr(fd, "user.foo", buf, sizeof(buf)));
     96   ASSERT_EQ(ERANGE, errno);
     97 #else
     98   ASSERT_EQ(-1, res);
     99   ASSERT_EQ(EBADF, errno);
    100 #endif
    101   close(fd);
    102 }
    103 
    104 TEST(sys_xattr, flistattr) {
    105   TemporaryFile tf;
    106   char buf[65536];  // 64kB is max possible xattr list size. See "man 7 xattr".
    107   ASSERT_EQ(0, fsetxattr(tf.fd, "user.foo", "bar", 4, 0));
    108   ssize_t result = flistxattr(tf.fd, buf, sizeof(buf));
    109   ASSERT_TRUE(result >= 9);
    110   ASSERT_TRUE(memmem(buf, sizeof(buf), "user.foo", 9) != NULL);
    111 }
    112 
    113 TEST(sys_xattr, flistattr_opath) {
    114   TemporaryFile tf;
    115   char buf[65536];  // 64kB is max possible xattr list size. See "man 7 xattr".
    116   ASSERT_EQ(0, fsetxattr(tf.fd, "user.foo", "bar", 4, 0));
    117   int fd = open(tf.filename, O_PATH);
    118   ASSERT_NE(-1, fd);
    119   ssize_t res = flistxattr(fd, buf, sizeof(buf));
    120 #if defined(__BIONIC__)
    121   ASSERT_TRUE(res >= 9);
    122   ASSERT_TRUE(static_cast<size_t>(res) <= sizeof(buf));
    123   ASSERT_TRUE(memmem(buf, res, "user.foo", 9) != NULL);
    124 #else
    125   ASSERT_EQ(-1, res);
    126   ASSERT_EQ(EBADF, errno);
    127 #endif
    128   close(fd);
    129 }
    130