+
+ /* check for handling of missing "0x" prefix: */
+ odp_cpumask_from_str(&mask, TEST_MASK_CPU_0_NO_PREFIX);
+
+ str_sz = odp_cpumask_to_str(&mask, buf_out,
+ stringlen(TEST_MASK_CPU_0) + 1);
+
+ CU_ASSERT_NSTRING_EQUAL(buf_out, TEST_MASK_CPU_0,
+ stringlen(TEST_MASK_CPU_0) + 1);
+
+ odp_shm_free(shm_in);
+ odp_shm_free(shm_out);
+}
+
+static void test_odp_cpumask_equal(void)
+{
+ odp_cpumask_t mask1;
+ odp_cpumask_t mask2;
+ odp_cpumask_t mask3;
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_CPU_0);
+ odp_cpumask_from_str(&mask2, TEST_MASK_CPU_0);
+ odp_cpumask_from_str(&mask3, TEST_MASK_NO_CPU);
+ CU_ASSERT(odp_cpumask_equal(&mask1, &mask2));
+ CU_ASSERT_FALSE(odp_cpumask_equal(&mask1, &mask3));
+
+ if (get_max_number_of_cpus_in_a_mask() < 4)
+ return;
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_CPU_0_2);
+ odp_cpumask_from_str(&mask2, TEST_MASK_CPU_0_2);
+ odp_cpumask_from_str(&mask3, TEST_MASK_CPU_1_2);
+ CU_ASSERT(odp_cpumask_equal(&mask1, &mask2));
+ CU_ASSERT_FALSE(odp_cpumask_equal(&mask1, &mask3));
+
+ if (get_max_number_of_cpus_in_a_mask() < 8)
+ return;
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_CPU_0_2_4_6);
+ odp_cpumask_from_str(&mask2, TEST_MASK_CPU_0_2_4_6);
+ odp_cpumask_from_str(&mask3, TEST_MASK_CPU_1_2_4_6);
+ CU_ASSERT(odp_cpumask_equal(&mask1, &mask2));
+ CU_ASSERT_FALSE(odp_cpumask_equal(&mask1, &mask3));
+}
+
+static void test_odp_cpumask_zero(void)
+{
+ odp_cpumask_t mask1;
+ odp_cpumask_t mask2;
+ odp_cpumask_from_str(&mask1, TEST_MASK_NO_CPU);
+ odp_cpumask_from_str(&mask2, TEST_MASK_CPU_0);
+ odp_cpumask_zero(&mask2);
+ CU_ASSERT(odp_cpumask_equal(&mask1, &mask2));
+}
+
+static void test_odp_cpumask_set(void)
+{
+ odp_cpumask_t mask1;
+ odp_cpumask_t mask2;
+ odp_cpumask_from_str(&mask1, TEST_MASK_NO_CPU);
+ odp_cpumask_from_str(&mask2, TEST_MASK_CPU_0);
+ odp_cpumask_set(&mask1, 0);
+ CU_ASSERT(odp_cpumask_equal(&mask1, &mask2));
+
+ if (get_max_number_of_cpus_in_a_mask() < 4)
+ return;
+
+ odp_cpumask_from_str(&mask2, TEST_MASK_CPU_0_3);
+ odp_cpumask_set(&mask1, 3);
+ CU_ASSERT(odp_cpumask_equal(&mask1, &mask2));
+
+ /* make sure that re-asserting a cpu has no impact: */
+ odp_cpumask_set(&mask1, 3);
+ CU_ASSERT(odp_cpumask_equal(&mask1, &mask2));
+}
+
+static void test_odp_cpumask_clr(void)
+{
+ odp_cpumask_t mask1;
+ odp_cpumask_t mask2;
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_CPU_0);
+ odp_cpumask_from_str(&mask2, TEST_MASK_NO_CPU);
+ odp_cpumask_clr(&mask1, 0);
+ CU_ASSERT(odp_cpumask_equal(&mask1, &mask2));
+
+ if (get_max_number_of_cpus_in_a_mask() < 4)
+ return;
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_CPU_0_2);
+ odp_cpumask_from_str(&mask2, TEST_MASK_CPU_0);
+ odp_cpumask_clr(&mask1, 2);
+ CU_ASSERT(odp_cpumask_equal(&mask1, &mask2));
+
+ odp_cpumask_from_str(&mask2, TEST_MASK_NO_CPU);
+ odp_cpumask_clr(&mask1, 0);
+ CU_ASSERT(odp_cpumask_equal(&mask1, &mask2));
+
+ /* make sure that re-clearing a cpu has no impact: */
+ odp_cpumask_clr(&mask1, 0);
+ CU_ASSERT(odp_cpumask_equal(&mask1, &mask2));
+}
+
+static void test_odp_cpumask_isset(void)
+{
+ odp_cpumask_t mask1;
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_CPU_0);
+ CU_ASSERT(odp_cpumask_isset(&mask1, 0));
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_NO_CPU);
+ CU_ASSERT_FALSE(odp_cpumask_isset(&mask1, 0));
+
+ if (get_max_number_of_cpus_in_a_mask() < 4)
+ return;
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_CPU_0_2);
+ CU_ASSERT(odp_cpumask_isset(&mask1, 0));
+ CU_ASSERT_FALSE(odp_cpumask_isset(&mask1, 1));
+ CU_ASSERT(odp_cpumask_isset(&mask1, 2));
+ CU_ASSERT_FALSE(odp_cpumask_isset(&mask1, 3));
+}
+
+static void test_odp_cpumask_count(void)
+{
+ odp_cpumask_t mask1;
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_CPU_0);
+ CU_ASSERT(odp_cpumask_count(&mask1) == 1);
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_NO_CPU);
+ CU_ASSERT(odp_cpumask_count(&mask1) == 0);
+
+ if (get_max_number_of_cpus_in_a_mask() < 4)
+ return;
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_CPU_0_2);
+ CU_ASSERT(odp_cpumask_count(&mask1) == 2);
+}
+
+static void test_odp_cpumask_and(void)
+{
+ odp_cpumask_t mask1;
+ odp_cpumask_t mask2;
+ odp_cpumask_t mask3;
+ odp_cpumask_t mask4;
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_CPU_0);
+ odp_cpumask_from_str(&mask2, TEST_MASK_CPU_0);
+ odp_cpumask_from_str(&mask4, TEST_MASK_CPU_0);
+ odp_cpumask_and(&mask3, &mask1, &mask2);
+ CU_ASSERT(odp_cpumask_equal(&mask3, &mask4));
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_NO_CPU);
+ odp_cpumask_from_str(&mask2, TEST_MASK_CPU_0);
+ odp_cpumask_from_str(&mask4, TEST_MASK_NO_CPU);
+ odp_cpumask_and(&mask3, &mask1, &mask2);
+ CU_ASSERT(odp_cpumask_equal(&mask3, &mask4));
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_NO_CPU);
+ odp_cpumask_from_str(&mask2, TEST_MASK_NO_CPU);
+ odp_cpumask_from_str(&mask4, TEST_MASK_NO_CPU);
+ odp_cpumask_and(&mask3, &mask1, &mask2);
+ CU_ASSERT(odp_cpumask_equal(&mask3, &mask4));
+
+ if (get_max_number_of_cpus_in_a_mask() < 4)
+ return;
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_CPU_0_2);
+ odp_cpumask_from_str(&mask2, TEST_MASK_CPU_1_2);
+ odp_cpumask_from_str(&mask4, TEST_MASK_CPU_2);
+ odp_cpumask_and(&mask3, &mask1, &mask2);
+ CU_ASSERT(odp_cpumask_equal(&mask3, &mask4));
+}
+
+static void test_odp_cpumask_or(void)
+{
+ odp_cpumask_t mask1;
+ odp_cpumask_t mask2;
+ odp_cpumask_t mask3;
+ odp_cpumask_t mask4;
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_CPU_0);
+ odp_cpumask_from_str(&mask2, TEST_MASK_CPU_0);
+ odp_cpumask_from_str(&mask4, TEST_MASK_CPU_0);
+ odp_cpumask_or(&mask3, &mask1, &mask2);
+ CU_ASSERT(odp_cpumask_equal(&mask3, &mask4));
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_NO_CPU);
+ odp_cpumask_from_str(&mask2, TEST_MASK_CPU_0);
+ odp_cpumask_from_str(&mask4, TEST_MASK_CPU_0);
+ odp_cpumask_or(&mask3, &mask1, &mask2);
+ CU_ASSERT(odp_cpumask_equal(&mask3, &mask4));
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_NO_CPU);
+ odp_cpumask_from_str(&mask2, TEST_MASK_NO_CPU);
+ odp_cpumask_from_str(&mask4, TEST_MASK_NO_CPU);
+ odp_cpumask_or(&mask3, &mask1, &mask2);
+ CU_ASSERT(odp_cpumask_equal(&mask3, &mask4));
+
+ if (get_max_number_of_cpus_in_a_mask() < 4)
+ return;
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_CPU_0_2);
+ odp_cpumask_from_str(&mask2, TEST_MASK_CPU_1);
+ odp_cpumask_from_str(&mask4, TEST_MASK_CPU_0_1_2);
+ odp_cpumask_or(&mask3, &mask1, &mask2);
+ CU_ASSERT(odp_cpumask_equal(&mask3, &mask4));
+}
+
+static void test_odp_cpumask_xor(void)
+{
+ odp_cpumask_t mask1;
+ odp_cpumask_t mask2;
+ odp_cpumask_t mask3;
+ odp_cpumask_t mask4;
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_CPU_0);
+ odp_cpumask_from_str(&mask2, TEST_MASK_CPU_0);
+ odp_cpumask_from_str(&mask4, TEST_MASK_NO_CPU);
+ odp_cpumask_xor(&mask3, &mask1, &mask2);
+ CU_ASSERT(odp_cpumask_equal(&mask3, &mask4));
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_NO_CPU);
+ odp_cpumask_from_str(&mask2, TEST_MASK_CPU_0);
+ odp_cpumask_from_str(&mask4, TEST_MASK_CPU_0);
+ odp_cpumask_xor(&mask3, &mask1, &mask2);
+ CU_ASSERT(odp_cpumask_equal(&mask3, &mask4));
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_NO_CPU);
+ odp_cpumask_from_str(&mask2, TEST_MASK_NO_CPU);
+ odp_cpumask_from_str(&mask4, TEST_MASK_NO_CPU);
+ odp_cpumask_xor(&mask3, &mask1, &mask2);
+ CU_ASSERT(odp_cpumask_equal(&mask3, &mask4));
+
+ if (get_max_number_of_cpus_in_a_mask() < 4)
+ return;
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_CPU_2);
+ odp_cpumask_from_str(&mask2, TEST_MASK_CPU_1_2);
+ odp_cpumask_from_str(&mask4, TEST_MASK_CPU_1);
+ odp_cpumask_xor(&mask3, &mask1, &mask2);
+ CU_ASSERT(odp_cpumask_equal(&mask3, &mask4));
+}
+
+static void test_odp_cpumask_copy(void)
+{
+ odp_cpumask_t mask1;
+ odp_cpumask_t mask2;
+ odp_cpumask_from_str(&mask1, TEST_MASK_CPU_0);
+ odp_cpumask_copy(&mask2, &mask1);
+ CU_ASSERT(odp_cpumask_equal(&mask1, &mask2));
+}
+
+static void test_odp_cpumask_first(void)
+{
+ odp_cpumask_t mask1;
+
+ /* check when there is no first */
+ odp_cpumask_from_str(&mask1, TEST_MASK_NO_CPU);
+ CU_ASSERT(odp_cpumask_first(&mask1) == -1);
+
+ /* single CPU case: */
+ odp_cpumask_from_str(&mask1, TEST_MASK_CPU_0);
+ CU_ASSERT(odp_cpumask_first(&mask1) == 0);
+
+ if (get_max_number_of_cpus_in_a_mask() < 4)
+ return;
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_CPU_1_3);
+ CU_ASSERT(odp_cpumask_first(&mask1) == 1);
+}
+
+static void test_odp_cpumask_last(void)
+{
+ odp_cpumask_t mask1;
+
+ /* check when there is no last: */
+ odp_cpumask_from_str(&mask1, TEST_MASK_NO_CPU);
+ CU_ASSERT(odp_cpumask_last(&mask1) == -1);
+
+ /* single CPU case: */
+ odp_cpumask_from_str(&mask1, TEST_MASK_CPU_0);
+ CU_ASSERT(odp_cpumask_last(&mask1) == 0);
+
+ if (get_max_number_of_cpus_in_a_mask() < 4)
+ return;
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_CPU_1_3);
+ CU_ASSERT(odp_cpumask_last(&mask1) == 3);
+}
+
+static void test_odp_cpumask_next(void)
+{
+ unsigned int i;
+ int expected[] = {1, 3, 3, -1};
+ odp_cpumask_t mask1;
+
+ /* case when the mask does not contain any CPU: */
+ odp_cpumask_from_str(&mask1, TEST_MASK_NO_CPU);
+ CU_ASSERT(odp_cpumask_next(&mask1, -1) == -1);
+
+ /* case when the mask just contain CPU 0: */
+ odp_cpumask_from_str(&mask1, TEST_MASK_CPU_0);
+ CU_ASSERT(odp_cpumask_next(&mask1, -1) == 0);
+ CU_ASSERT(odp_cpumask_next(&mask1, 0) == -1);
+
+ if (get_max_number_of_cpus_in_a_mask() < 4)
+ return;
+
+ odp_cpumask_from_str(&mask1, TEST_MASK_CPU_1_3);
+
+ for (i = 0; i < sizeof(expected) / sizeof(int); i++)
+ CU_ASSERT(odp_cpumask_next(&mask1, i) == expected[i]);
+}
+
+CU_TestInfo test_odp_cpumask[] = {
+ {"odp_cpumask_to/from_str()", test_odp_cpumask_to_from_str},
+ {"odp_cpumask_equal()" , test_odp_cpumask_equal},
+ {"odp_cpumask_zero()" , test_odp_cpumask_zero},
+ {"odp_cpumask_set()" , test_odp_cpumask_set},
+ {"odp_cpumask_clr()" , test_odp_cpumask_clr},
+ {"odp_cpumask_isset()" , test_odp_cpumask_isset},
+ {"odp_cpumask_count()" , test_odp_cpumask_count},
+ {"odp_cpumask_and()" , test_odp_cpumask_and},
+ {"odp_cpumask_or()" , test_odp_cpumask_or},
+ {"odp_cpumask_xor()" , test_odp_cpumask_xor},
+ {"odp_cpumask_copy()" , test_odp_cpumask_copy},
+ {"odp_cpumask_first()" , test_odp_cpumask_first},
+ {"odp_cpumask_last()" , test_odp_cpumask_last},
+ {"odp_cpumask_next()" , test_odp_cpumask_next},
+ CU_TEST_INFO_NULL,
+};
+
+CU_SuiteInfo odp_testsuites[] = {
+ {"Cpumask", NULL, NULL, NULL, NULL, test_odp_cpumask},
+ CU_SUITE_INFO_NULL,
+};