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 }
     84 
     85 TEST(sys_xattr, fsetxattr_with_opath_toosmall) {
     86   TemporaryFile tf;
     87   int fd = open(tf.filename, O_PATH);
     88   ASSERT_NE(-1, fd);
     89 
     90   int res = fsetxattr(fd, "user.foo", "01234567890123456789", 21, 0);
     91 #if defined(__BIONIC__)
     92   char buf[10];
     93   ASSERT_EQ(0, res);
     94   ASSERT_EQ(-1, fgetxattr(fd, "user.foo", buf, sizeof(buf)));
     95   ASSERT_EQ(ERANGE, errno);
     96 #else
     97   ASSERT_EQ(-1, res);
     98   ASSERT_EQ(EBADF, errno);
     99 #endif
    100 }
    101