Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright (C) 2013 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 <errno.h>
     20 #include <sched.h>
     21 #include <sys/types.h>
     22 #include <sys/wait.h>
     23 
     24 #if defined(__BIONIC__)
     25 static int child_fn(void* i_ptr) {
     26   *reinterpret_cast<int*>(i_ptr) = 42;
     27   return 123;
     28 }
     29 
     30 TEST(sched, clone) {
     31   void* child_stack[1024];
     32 
     33   int i = 0;
     34   pid_t tid = clone(child_fn, &child_stack[1024], CLONE_VM, &i);
     35 
     36   int status;
     37   ASSERT_EQ(tid, TEMP_FAILURE_RETRY(waitpid(tid, &status, __WCLONE)));
     38 
     39   ASSERT_EQ(42, i);
     40 
     41   ASSERT_TRUE(WIFEXITED(status));
     42   ASSERT_EQ(123, WEXITSTATUS(status));
     43 }
     44 #else
     45 // For glibc, any call to clone with CLONE_VM set will cause later pthread
     46 // calls in the same process to misbehave.
     47 // See https://sourceware.org/bugzilla/show_bug.cgi?id=10311 for more details.
     48 TEST(sched, clone) {
     49   // In order to enumerate all possible tests for CTS, create an empty test.
     50   GTEST_LOG_(INFO) << "This test does nothing.\n";
     51 }
     52 #endif
     53 
     54 TEST(sched, clone_errno) {
     55   // Check that our hand-written clone assembler sets errno correctly on failure.
     56   uintptr_t fake_child_stack[16];
     57   errno = 0;
     58   ASSERT_EQ(-1, clone(NULL, &fake_child_stack[16], CLONE_THREAD, NULL));
     59   ASSERT_EQ(EINVAL, errno);
     60 }
     61 
     62 TEST(sched, cpu_set) {
     63   cpu_set_t set;
     64 
     65   CPU_ZERO(&set);
     66   CPU_SET(0, &set);
     67   CPU_SET(17, &set);
     68   for (int i = 0; i < CPU_SETSIZE; i++) {
     69     ASSERT_EQ(i == 0 || i == 17, CPU_ISSET(i, &set));
     70   }
     71 
     72   // We should fail silently if we try to set/test outside the range.
     73   CPU_SET(CPU_SETSIZE, &set);
     74   ASSERT_FALSE(CPU_ISSET(CPU_SETSIZE, &set));
     75 }
     76 
     77 TEST(sched, cpu_count) {
     78   cpu_set_t set;
     79 
     80   CPU_ZERO(&set);
     81   ASSERT_EQ(0, CPU_COUNT(&set));
     82   CPU_SET(2, &set);
     83   CPU_SET(10, &set);
     84   ASSERT_EQ(2, CPU_COUNT(&set));
     85   CPU_CLR(10, &set);
     86   ASSERT_EQ(1, CPU_COUNT(&set));
     87 }
     88 
     89 TEST(sched, cpu_zero) {
     90   cpu_set_t set;
     91 
     92   CPU_ZERO(&set);
     93   ASSERT_EQ(0, CPU_COUNT(&set));
     94   for (int i = 0; i < CPU_SETSIZE; i++) {
     95     ASSERT_FALSE(CPU_ISSET(i, &set));
     96   }
     97 }
     98 
     99 TEST(sched, cpu_clr) {
    100   cpu_set_t set;
    101 
    102   CPU_ZERO(&set);
    103   CPU_SET(0, &set);
    104   CPU_SET(1, &set);
    105   for (int i = 0; i < CPU_SETSIZE; i++) {
    106     ASSERT_EQ(i == 0 || i == 1, CPU_ISSET(i, &set));
    107   }
    108   CPU_CLR(1, &set);
    109   for (int i = 0; i < CPU_SETSIZE; i++) {
    110     ASSERT_EQ(i == 0, CPU_ISSET(i, &set));
    111   }
    112 
    113   // We should fail silently if we try to clear/test outside the range.
    114   CPU_CLR(CPU_SETSIZE, &set);
    115   ASSERT_FALSE(CPU_ISSET(CPU_SETSIZE, &set));
    116 }
    117 
    118 TEST(sched, cpu_equal) {
    119   cpu_set_t set1;
    120   cpu_set_t set2;
    121 
    122   CPU_ZERO(&set1);
    123   CPU_ZERO(&set2);
    124   CPU_SET(1, &set1);
    125   ASSERT_FALSE(CPU_EQUAL(&set1, &set2));
    126   CPU_SET(1, &set2);
    127   ASSERT_TRUE(CPU_EQUAL(&set1, &set2));
    128 }
    129 
    130 TEST(sched, cpu_op) {
    131   cpu_set_t set1;
    132   cpu_set_t set2;
    133   cpu_set_t set3;
    134 
    135   CPU_ZERO(&set1);
    136   CPU_ZERO(&set2);
    137   CPU_ZERO(&set3);
    138   CPU_SET(0, &set1);
    139   CPU_SET(0, &set2);
    140   CPU_SET(1, &set2);
    141 
    142   CPU_AND(&set3, &set1, &set2);
    143   for (int i = 0; i < CPU_SETSIZE; i++) {
    144     ASSERT_EQ(i == 0, CPU_ISSET(i, &set3));
    145   }
    146 
    147   CPU_XOR(&set3, &set1, &set2);
    148   for (int i = 0; i < CPU_SETSIZE; i++) {
    149     ASSERT_EQ(i == 1, CPU_ISSET(i, &set3));
    150   }
    151 
    152   CPU_OR(&set3, &set1, &set2);
    153   for (int i = 0; i < CPU_SETSIZE; i++) {
    154     ASSERT_EQ(i == 0 || i == 1, CPU_ISSET(i, &set3));
    155   }
    156 }
    157 
    158 
    159 TEST(sched, cpu_alloc_small) {
    160   cpu_set_t* set = CPU_ALLOC(17);
    161   size_t size = CPU_ALLOC_SIZE(17);
    162 
    163   CPU_ZERO_S(size, set);
    164   ASSERT_EQ(0, CPU_COUNT_S(size, set));
    165   CPU_SET_S(16, size, set);
    166   ASSERT_TRUE(CPU_ISSET_S(16, size, set));
    167 
    168   CPU_FREE(set);
    169 }
    170 
    171 TEST(sched, cpu_alloc_big) {
    172   cpu_set_t* set = CPU_ALLOC(10 * CPU_SETSIZE);
    173   size_t size = CPU_ALLOC_SIZE(10 * CPU_SETSIZE);
    174 
    175   CPU_ZERO_S(size, set);
    176   ASSERT_EQ(0, CPU_COUNT_S(size, set));
    177   CPU_SET_S(CPU_SETSIZE, size, set);
    178   ASSERT_TRUE(CPU_ISSET_S(CPU_SETSIZE, size, set));
    179 
    180   CPU_FREE(set);
    181 }
    182 
    183 TEST(sched, cpu_s_macros) {
    184   int set_size = 64;
    185   size_t size = CPU_ALLOC_SIZE(set_size);
    186   cpu_set_t* set = CPU_ALLOC(set_size);
    187 
    188   CPU_ZERO_S(size, set);
    189   for (int i = 0; i < set_size; i++) {
    190     ASSERT_FALSE(CPU_ISSET_S(i, size, set));
    191     CPU_SET_S(i, size, set);
    192     ASSERT_TRUE(CPU_ISSET_S(i, size, set));
    193     ASSERT_EQ(i + 1, CPU_COUNT_S(size, set));
    194   }
    195 
    196   for (int i = 0; i < set_size; i++) {
    197     CPU_CLR_S(i, size, set);
    198     ASSERT_FALSE(CPU_ISSET_S(i, size, set));
    199     ASSERT_EQ(set_size - i - 1, CPU_COUNT_S(size, set));
    200   }
    201 
    202   CPU_FREE(set);
    203 }
    204 
    205 TEST(sched, cpu_op_s_macros) {
    206   int set_size1 = 64;
    207   int set_size2 = set_size1 * 2;
    208   int set_size3 = set_size1 * 3;
    209   size_t size1 = CPU_ALLOC_SIZE(set_size1);
    210   size_t size2 = CPU_ALLOC_SIZE(set_size2);
    211   size_t size3 = CPU_ALLOC_SIZE(set_size3);
    212 
    213   cpu_set_t* set1 = CPU_ALLOC(set_size1);
    214   cpu_set_t* set2 = CPU_ALLOC(set_size2);
    215   cpu_set_t* set3 = CPU_ALLOC(set_size3);
    216   CPU_ZERO_S(size1, set1);
    217   CPU_ZERO_S(size2, set2);
    218   CPU_ZERO_S(size3, set3);
    219 
    220   CPU_SET_S(0, size1, set1);
    221   CPU_SET_S(0, size2, set2);
    222   CPU_SET_S(1, size3, set2);
    223 
    224   CPU_AND_S(size1, set3, set1, set2);
    225   for (int i = 0; i < set_size3; i++) {
    226     ASSERT_EQ(i == 0, CPU_ISSET_S(i, size3, set3));
    227   }
    228 
    229   CPU_OR_S(size1, set3, set1, set2);
    230   for (int i = 0; i < set_size3; i++) {
    231     ASSERT_EQ(i == 0 || i == 1, CPU_ISSET_S(i, size3, set3));
    232   }
    233 
    234   CPU_XOR_S(size1, set3, set1, set2);
    235   for (int i = 0; i < set_size3; i++) {
    236     ASSERT_EQ(i == 1, CPU_ISSET_S(i, size3, set3));
    237   }
    238 
    239   CPU_FREE(set1);
    240   CPU_FREE(set2);
    241   CPU_FREE(set3);
    242 }
    243 
    244 TEST(sched, cpu_equal_s) {
    245   int set_size1 = 64;
    246   int set_size2 = set_size1 * 2;
    247   size_t size1 = CPU_ALLOC_SIZE(set_size1);
    248   size_t size2 = CPU_ALLOC_SIZE(set_size2);
    249 
    250   cpu_set_t* set1 = CPU_ALLOC(set_size1);
    251   cpu_set_t* set2 = CPU_ALLOC(set_size2);
    252 
    253   CPU_ZERO_S(size1, set1);
    254   CPU_ZERO_S(size2, set2);
    255 
    256   CPU_SET_S(0, size1, set1);
    257   ASSERT_TRUE(CPU_EQUAL_S(size1, set1, set1));
    258   ASSERT_FALSE(CPU_EQUAL_S(size1, set1, set2));
    259   CPU_SET_S(0, size2, set2);
    260   ASSERT_TRUE(CPU_EQUAL_S(size1, set1, set2));
    261 
    262   CPU_FREE(set1);
    263   CPU_FREE(set2);
    264 }
    265