162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * KUnit test for the Kernel Linked-list structures. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2019, Google LLC. 662306a36Sopenharmony_ci * Author: David Gow <davidgow@google.com> 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci#include <kunit/test.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/list.h> 1162306a36Sopenharmony_ci#include <linux/klist.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_cistruct list_test_struct { 1462306a36Sopenharmony_ci int data; 1562306a36Sopenharmony_ci struct list_head list; 1662306a36Sopenharmony_ci}; 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cistatic void list_test_list_init(struct kunit *test) 1962306a36Sopenharmony_ci{ 2062306a36Sopenharmony_ci /* Test the different ways of initialising a list. */ 2162306a36Sopenharmony_ci struct list_head list1 = LIST_HEAD_INIT(list1); 2262306a36Sopenharmony_ci struct list_head list2; 2362306a36Sopenharmony_ci LIST_HEAD(list3); 2462306a36Sopenharmony_ci struct list_head *list4; 2562306a36Sopenharmony_ci struct list_head *list5; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci INIT_LIST_HEAD(&list2); 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci list4 = kzalloc(sizeof(*list4), GFP_KERNEL | __GFP_NOFAIL); 3062306a36Sopenharmony_ci INIT_LIST_HEAD(list4); 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci list5 = kmalloc(sizeof(*list5), GFP_KERNEL | __GFP_NOFAIL); 3362306a36Sopenharmony_ci memset(list5, 0xFF, sizeof(*list5)); 3462306a36Sopenharmony_ci INIT_LIST_HEAD(list5); 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci /* list_empty_careful() checks both next and prev. */ 3762306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, list_empty_careful(&list1)); 3862306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, list_empty_careful(&list2)); 3962306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, list_empty_careful(&list3)); 4062306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, list_empty_careful(list4)); 4162306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, list_empty_careful(list5)); 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci kfree(list4); 4462306a36Sopenharmony_ci kfree(list5); 4562306a36Sopenharmony_ci} 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_cistatic void list_test_list_add(struct kunit *test) 4862306a36Sopenharmony_ci{ 4962306a36Sopenharmony_ci struct list_head a, b; 5062306a36Sopenharmony_ci LIST_HEAD(list); 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci list_add(&a, &list); 5362306a36Sopenharmony_ci list_add(&b, &list); 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci /* should be [list] -> b -> a */ 5662306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, list.next, &b); 5762306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, b.prev, &list); 5862306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, b.next, &a); 5962306a36Sopenharmony_ci} 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_cistatic void list_test_list_add_tail(struct kunit *test) 6262306a36Sopenharmony_ci{ 6362306a36Sopenharmony_ci struct list_head a, b; 6462306a36Sopenharmony_ci LIST_HEAD(list); 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci list_add_tail(&a, &list); 6762306a36Sopenharmony_ci list_add_tail(&b, &list); 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci /* should be [list] -> a -> b */ 7062306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, list.next, &a); 7162306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, a.prev, &list); 7262306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, a.next, &b); 7362306a36Sopenharmony_ci} 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cistatic void list_test_list_del(struct kunit *test) 7662306a36Sopenharmony_ci{ 7762306a36Sopenharmony_ci struct list_head a, b; 7862306a36Sopenharmony_ci LIST_HEAD(list); 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci list_add_tail(&a, &list); 8162306a36Sopenharmony_ci list_add_tail(&b, &list); 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci /* before: [list] -> a -> b */ 8462306a36Sopenharmony_ci list_del(&a); 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci /* now: [list] -> b */ 8762306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, list.next, &b); 8862306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, b.prev, &list); 8962306a36Sopenharmony_ci} 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_cistatic void list_test_list_replace(struct kunit *test) 9262306a36Sopenharmony_ci{ 9362306a36Sopenharmony_ci struct list_head a_old, a_new, b; 9462306a36Sopenharmony_ci LIST_HEAD(list); 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci list_add_tail(&a_old, &list); 9762306a36Sopenharmony_ci list_add_tail(&b, &list); 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci /* before: [list] -> a_old -> b */ 10062306a36Sopenharmony_ci list_replace(&a_old, &a_new); 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci /* now: [list] -> a_new -> b */ 10362306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, list.next, &a_new); 10462306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, b.prev, &a_new); 10562306a36Sopenharmony_ci} 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cistatic void list_test_list_replace_init(struct kunit *test) 10862306a36Sopenharmony_ci{ 10962306a36Sopenharmony_ci struct list_head a_old, a_new, b; 11062306a36Sopenharmony_ci LIST_HEAD(list); 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci list_add_tail(&a_old, &list); 11362306a36Sopenharmony_ci list_add_tail(&b, &list); 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci /* before: [list] -> a_old -> b */ 11662306a36Sopenharmony_ci list_replace_init(&a_old, &a_new); 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci /* now: [list] -> a_new -> b */ 11962306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, list.next, &a_new); 12062306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, b.prev, &a_new); 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci /* check a_old is empty (initialized) */ 12362306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, list_empty_careful(&a_old)); 12462306a36Sopenharmony_ci} 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_cistatic void list_test_list_swap(struct kunit *test) 12762306a36Sopenharmony_ci{ 12862306a36Sopenharmony_ci struct list_head a, b; 12962306a36Sopenharmony_ci LIST_HEAD(list); 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci list_add_tail(&a, &list); 13262306a36Sopenharmony_ci list_add_tail(&b, &list); 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci /* before: [list] -> a -> b */ 13562306a36Sopenharmony_ci list_swap(&a, &b); 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci /* after: [list] -> b -> a */ 13862306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, &b, list.next); 13962306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, &a, list.prev); 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, &a, b.next); 14262306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, &list, b.prev); 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, &list, a.next); 14562306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, &b, a.prev); 14662306a36Sopenharmony_ci} 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_cistatic void list_test_list_del_init(struct kunit *test) 14962306a36Sopenharmony_ci{ 15062306a36Sopenharmony_ci struct list_head a, b; 15162306a36Sopenharmony_ci LIST_HEAD(list); 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci list_add_tail(&a, &list); 15462306a36Sopenharmony_ci list_add_tail(&b, &list); 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci /* before: [list] -> a -> b */ 15762306a36Sopenharmony_ci list_del_init(&a); 15862306a36Sopenharmony_ci /* after: [list] -> b, a initialised */ 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, list.next, &b); 16162306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, b.prev, &list); 16262306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, list_empty_careful(&a)); 16362306a36Sopenharmony_ci} 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_cistatic void list_test_list_del_init_careful(struct kunit *test) 16662306a36Sopenharmony_ci{ 16762306a36Sopenharmony_ci /* NOTE: This test only checks the behaviour of this function in 16862306a36Sopenharmony_ci * isolation. It does not verify memory model guarantees. 16962306a36Sopenharmony_ci */ 17062306a36Sopenharmony_ci struct list_head a, b; 17162306a36Sopenharmony_ci LIST_HEAD(list); 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci list_add_tail(&a, &list); 17462306a36Sopenharmony_ci list_add_tail(&b, &list); 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci /* before: [list] -> a -> b */ 17762306a36Sopenharmony_ci list_del_init_careful(&a); 17862306a36Sopenharmony_ci /* after: [list] -> b, a initialised */ 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, list.next, &b); 18162306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, b.prev, &list); 18262306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, list_empty_careful(&a)); 18362306a36Sopenharmony_ci} 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_cistatic void list_test_list_move(struct kunit *test) 18662306a36Sopenharmony_ci{ 18762306a36Sopenharmony_ci struct list_head a, b; 18862306a36Sopenharmony_ci LIST_HEAD(list1); 18962306a36Sopenharmony_ci LIST_HEAD(list2); 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci list_add_tail(&a, &list1); 19262306a36Sopenharmony_ci list_add_tail(&b, &list2); 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci /* before: [list1] -> a, [list2] -> b */ 19562306a36Sopenharmony_ci list_move(&a, &list2); 19662306a36Sopenharmony_ci /* after: [list1] empty, [list2] -> a -> b */ 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, list_empty(&list1)); 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, &a, list2.next); 20162306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, &b, a.next); 20262306a36Sopenharmony_ci} 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_cistatic void list_test_list_move_tail(struct kunit *test) 20562306a36Sopenharmony_ci{ 20662306a36Sopenharmony_ci struct list_head a, b; 20762306a36Sopenharmony_ci LIST_HEAD(list1); 20862306a36Sopenharmony_ci LIST_HEAD(list2); 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci list_add_tail(&a, &list1); 21162306a36Sopenharmony_ci list_add_tail(&b, &list2); 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci /* before: [list1] -> a, [list2] -> b */ 21462306a36Sopenharmony_ci list_move_tail(&a, &list2); 21562306a36Sopenharmony_ci /* after: [list1] empty, [list2] -> b -> a */ 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, list_empty(&list1)); 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, &b, list2.next); 22062306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, &a, b.next); 22162306a36Sopenharmony_ci} 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_cistatic void list_test_list_bulk_move_tail(struct kunit *test) 22462306a36Sopenharmony_ci{ 22562306a36Sopenharmony_ci struct list_head a, b, c, d, x, y; 22662306a36Sopenharmony_ci struct list_head *list1_values[] = { &x, &b, &c, &y }; 22762306a36Sopenharmony_ci struct list_head *list2_values[] = { &a, &d }; 22862306a36Sopenharmony_ci struct list_head *ptr; 22962306a36Sopenharmony_ci LIST_HEAD(list1); 23062306a36Sopenharmony_ci LIST_HEAD(list2); 23162306a36Sopenharmony_ci int i = 0; 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci list_add_tail(&x, &list1); 23462306a36Sopenharmony_ci list_add_tail(&y, &list1); 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci list_add_tail(&a, &list2); 23762306a36Sopenharmony_ci list_add_tail(&b, &list2); 23862306a36Sopenharmony_ci list_add_tail(&c, &list2); 23962306a36Sopenharmony_ci list_add_tail(&d, &list2); 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci /* before: [list1] -> x -> y, [list2] -> a -> b -> c -> d */ 24262306a36Sopenharmony_ci list_bulk_move_tail(&y, &b, &c); 24362306a36Sopenharmony_ci /* after: [list1] -> x -> b -> c -> y, [list2] -> a -> d */ 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci list_for_each(ptr, &list1) { 24662306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, ptr, list1_values[i]); 24762306a36Sopenharmony_ci i++; 24862306a36Sopenharmony_ci } 24962306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, i, 4); 25062306a36Sopenharmony_ci i = 0; 25162306a36Sopenharmony_ci list_for_each(ptr, &list2) { 25262306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, ptr, list2_values[i]); 25362306a36Sopenharmony_ci i++; 25462306a36Sopenharmony_ci } 25562306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, i, 2); 25662306a36Sopenharmony_ci} 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_cistatic void list_test_list_is_head(struct kunit *test) 25962306a36Sopenharmony_ci{ 26062306a36Sopenharmony_ci struct list_head a, b, c; 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci /* Two lists: [a] -> b, [c] */ 26362306a36Sopenharmony_ci INIT_LIST_HEAD(&a); 26462306a36Sopenharmony_ci INIT_LIST_HEAD(&c); 26562306a36Sopenharmony_ci list_add_tail(&b, &a); 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci KUNIT_EXPECT_TRUE_MSG(test, list_is_head(&a, &a), 26862306a36Sopenharmony_ci "Head element of same list"); 26962306a36Sopenharmony_ci KUNIT_EXPECT_FALSE_MSG(test, list_is_head(&a, &b), 27062306a36Sopenharmony_ci "Non-head element of same list"); 27162306a36Sopenharmony_ci KUNIT_EXPECT_FALSE_MSG(test, list_is_head(&a, &c), 27262306a36Sopenharmony_ci "Head element of different list"); 27362306a36Sopenharmony_ci} 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_cistatic void list_test_list_is_first(struct kunit *test) 27762306a36Sopenharmony_ci{ 27862306a36Sopenharmony_ci struct list_head a, b; 27962306a36Sopenharmony_ci LIST_HEAD(list); 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci list_add_tail(&a, &list); 28262306a36Sopenharmony_ci list_add_tail(&b, &list); 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, list_is_first(&a, &list)); 28562306a36Sopenharmony_ci KUNIT_EXPECT_FALSE(test, list_is_first(&b, &list)); 28662306a36Sopenharmony_ci} 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_cistatic void list_test_list_is_last(struct kunit *test) 28962306a36Sopenharmony_ci{ 29062306a36Sopenharmony_ci struct list_head a, b; 29162306a36Sopenharmony_ci LIST_HEAD(list); 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci list_add_tail(&a, &list); 29462306a36Sopenharmony_ci list_add_tail(&b, &list); 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci KUNIT_EXPECT_FALSE(test, list_is_last(&a, &list)); 29762306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, list_is_last(&b, &list)); 29862306a36Sopenharmony_ci} 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_cistatic void list_test_list_empty(struct kunit *test) 30162306a36Sopenharmony_ci{ 30262306a36Sopenharmony_ci struct list_head a; 30362306a36Sopenharmony_ci LIST_HEAD(list1); 30462306a36Sopenharmony_ci LIST_HEAD(list2); 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci list_add_tail(&a, &list1); 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci KUNIT_EXPECT_FALSE(test, list_empty(&list1)); 30962306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, list_empty(&list2)); 31062306a36Sopenharmony_ci} 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_cistatic void list_test_list_empty_careful(struct kunit *test) 31362306a36Sopenharmony_ci{ 31462306a36Sopenharmony_ci /* This test doesn't check correctness under concurrent access */ 31562306a36Sopenharmony_ci struct list_head a; 31662306a36Sopenharmony_ci LIST_HEAD(list1); 31762306a36Sopenharmony_ci LIST_HEAD(list2); 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci list_add_tail(&a, &list1); 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ci KUNIT_EXPECT_FALSE(test, list_empty_careful(&list1)); 32262306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, list_empty_careful(&list2)); 32362306a36Sopenharmony_ci} 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_cistatic void list_test_list_rotate_left(struct kunit *test) 32662306a36Sopenharmony_ci{ 32762306a36Sopenharmony_ci struct list_head a, b; 32862306a36Sopenharmony_ci LIST_HEAD(list); 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ci list_add_tail(&a, &list); 33162306a36Sopenharmony_ci list_add_tail(&b, &list); 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci /* before: [list] -> a -> b */ 33462306a36Sopenharmony_ci list_rotate_left(&list); 33562306a36Sopenharmony_ci /* after: [list] -> b -> a */ 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, list.next, &b); 33862306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, b.prev, &list); 33962306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, b.next, &a); 34062306a36Sopenharmony_ci} 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_cistatic void list_test_list_rotate_to_front(struct kunit *test) 34362306a36Sopenharmony_ci{ 34462306a36Sopenharmony_ci struct list_head a, b, c, d; 34562306a36Sopenharmony_ci struct list_head *list_values[] = { &c, &d, &a, &b }; 34662306a36Sopenharmony_ci struct list_head *ptr; 34762306a36Sopenharmony_ci LIST_HEAD(list); 34862306a36Sopenharmony_ci int i = 0; 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci list_add_tail(&a, &list); 35162306a36Sopenharmony_ci list_add_tail(&b, &list); 35262306a36Sopenharmony_ci list_add_tail(&c, &list); 35362306a36Sopenharmony_ci list_add_tail(&d, &list); 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_ci /* before: [list] -> a -> b -> c -> d */ 35662306a36Sopenharmony_ci list_rotate_to_front(&c, &list); 35762306a36Sopenharmony_ci /* after: [list] -> c -> d -> a -> b */ 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci list_for_each(ptr, &list) { 36062306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, ptr, list_values[i]); 36162306a36Sopenharmony_ci i++; 36262306a36Sopenharmony_ci } 36362306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, i, 4); 36462306a36Sopenharmony_ci} 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_cistatic void list_test_list_is_singular(struct kunit *test) 36762306a36Sopenharmony_ci{ 36862306a36Sopenharmony_ci struct list_head a, b; 36962306a36Sopenharmony_ci LIST_HEAD(list); 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ci /* [list] empty */ 37262306a36Sopenharmony_ci KUNIT_EXPECT_FALSE(test, list_is_singular(&list)); 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci list_add_tail(&a, &list); 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci /* [list] -> a */ 37762306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, list_is_singular(&list)); 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_ci list_add_tail(&b, &list); 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci /* [list] -> a -> b */ 38262306a36Sopenharmony_ci KUNIT_EXPECT_FALSE(test, list_is_singular(&list)); 38362306a36Sopenharmony_ci} 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_cistatic void list_test_list_cut_position(struct kunit *test) 38662306a36Sopenharmony_ci{ 38762306a36Sopenharmony_ci struct list_head entries[3], *cur; 38862306a36Sopenharmony_ci LIST_HEAD(list1); 38962306a36Sopenharmony_ci LIST_HEAD(list2); 39062306a36Sopenharmony_ci int i = 0; 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ci list_add_tail(&entries[0], &list1); 39362306a36Sopenharmony_ci list_add_tail(&entries[1], &list1); 39462306a36Sopenharmony_ci list_add_tail(&entries[2], &list1); 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci /* before: [list1] -> entries[0] -> entries[1] -> entries[2] */ 39762306a36Sopenharmony_ci list_cut_position(&list2, &list1, &entries[1]); 39862306a36Sopenharmony_ci /* after: [list2] -> entries[0] -> entries[1], [list1] -> entries[2] */ 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_ci list_for_each(cur, &list2) { 40162306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 40262306a36Sopenharmony_ci i++; 40362306a36Sopenharmony_ci } 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, i, 2); 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci list_for_each(cur, &list1) { 40862306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 40962306a36Sopenharmony_ci i++; 41062306a36Sopenharmony_ci } 41162306a36Sopenharmony_ci} 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_cistatic void list_test_list_cut_before(struct kunit *test) 41462306a36Sopenharmony_ci{ 41562306a36Sopenharmony_ci struct list_head entries[3], *cur; 41662306a36Sopenharmony_ci LIST_HEAD(list1); 41762306a36Sopenharmony_ci LIST_HEAD(list2); 41862306a36Sopenharmony_ci int i = 0; 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_ci list_add_tail(&entries[0], &list1); 42162306a36Sopenharmony_ci list_add_tail(&entries[1], &list1); 42262306a36Sopenharmony_ci list_add_tail(&entries[2], &list1); 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_ci /* before: [list1] -> entries[0] -> entries[1] -> entries[2] */ 42562306a36Sopenharmony_ci list_cut_before(&list2, &list1, &entries[1]); 42662306a36Sopenharmony_ci /* after: [list2] -> entries[0], [list1] -> entries[1] -> entries[2] */ 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci list_for_each(cur, &list2) { 42962306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 43062306a36Sopenharmony_ci i++; 43162306a36Sopenharmony_ci } 43262306a36Sopenharmony_ci 43362306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, i, 1); 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_ci list_for_each(cur, &list1) { 43662306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 43762306a36Sopenharmony_ci i++; 43862306a36Sopenharmony_ci } 43962306a36Sopenharmony_ci} 44062306a36Sopenharmony_ci 44162306a36Sopenharmony_cistatic void list_test_list_splice(struct kunit *test) 44262306a36Sopenharmony_ci{ 44362306a36Sopenharmony_ci struct list_head entries[5], *cur; 44462306a36Sopenharmony_ci LIST_HEAD(list1); 44562306a36Sopenharmony_ci LIST_HEAD(list2); 44662306a36Sopenharmony_ci int i = 0; 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_ci list_add_tail(&entries[0], &list1); 44962306a36Sopenharmony_ci list_add_tail(&entries[1], &list1); 45062306a36Sopenharmony_ci list_add_tail(&entries[2], &list2); 45162306a36Sopenharmony_ci list_add_tail(&entries[3], &list2); 45262306a36Sopenharmony_ci list_add_tail(&entries[4], &list1); 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_ci /* before: [list1]->e[0]->e[1]->e[4], [list2]->e[2]->e[3] */ 45562306a36Sopenharmony_ci list_splice(&list2, &entries[1]); 45662306a36Sopenharmony_ci /* after: [list1]->e[0]->e[1]->e[2]->e[3]->e[4], [list2] uninit */ 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_ci list_for_each(cur, &list1) { 45962306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 46062306a36Sopenharmony_ci i++; 46162306a36Sopenharmony_ci } 46262306a36Sopenharmony_ci 46362306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, i, 5); 46462306a36Sopenharmony_ci} 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_cistatic void list_test_list_splice_tail(struct kunit *test) 46762306a36Sopenharmony_ci{ 46862306a36Sopenharmony_ci struct list_head entries[5], *cur; 46962306a36Sopenharmony_ci LIST_HEAD(list1); 47062306a36Sopenharmony_ci LIST_HEAD(list2); 47162306a36Sopenharmony_ci int i = 0; 47262306a36Sopenharmony_ci 47362306a36Sopenharmony_ci list_add_tail(&entries[0], &list1); 47462306a36Sopenharmony_ci list_add_tail(&entries[1], &list1); 47562306a36Sopenharmony_ci list_add_tail(&entries[2], &list2); 47662306a36Sopenharmony_ci list_add_tail(&entries[3], &list2); 47762306a36Sopenharmony_ci list_add_tail(&entries[4], &list1); 47862306a36Sopenharmony_ci 47962306a36Sopenharmony_ci /* before: [list1]->e[0]->e[1]->e[4], [list2]->e[2]->e[3] */ 48062306a36Sopenharmony_ci list_splice_tail(&list2, &entries[4]); 48162306a36Sopenharmony_ci /* after: [list1]->e[0]->e[1]->e[2]->e[3]->e[4], [list2] uninit */ 48262306a36Sopenharmony_ci 48362306a36Sopenharmony_ci list_for_each(cur, &list1) { 48462306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 48562306a36Sopenharmony_ci i++; 48662306a36Sopenharmony_ci } 48762306a36Sopenharmony_ci 48862306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, i, 5); 48962306a36Sopenharmony_ci} 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_cistatic void list_test_list_splice_init(struct kunit *test) 49262306a36Sopenharmony_ci{ 49362306a36Sopenharmony_ci struct list_head entries[5], *cur; 49462306a36Sopenharmony_ci LIST_HEAD(list1); 49562306a36Sopenharmony_ci LIST_HEAD(list2); 49662306a36Sopenharmony_ci int i = 0; 49762306a36Sopenharmony_ci 49862306a36Sopenharmony_ci list_add_tail(&entries[0], &list1); 49962306a36Sopenharmony_ci list_add_tail(&entries[1], &list1); 50062306a36Sopenharmony_ci list_add_tail(&entries[2], &list2); 50162306a36Sopenharmony_ci list_add_tail(&entries[3], &list2); 50262306a36Sopenharmony_ci list_add_tail(&entries[4], &list1); 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_ci /* before: [list1]->e[0]->e[1]->e[4], [list2]->e[2]->e[3] */ 50562306a36Sopenharmony_ci list_splice_init(&list2, &entries[1]); 50662306a36Sopenharmony_ci /* after: [list1]->e[0]->e[1]->e[2]->e[3]->e[4], [list2] empty */ 50762306a36Sopenharmony_ci 50862306a36Sopenharmony_ci list_for_each(cur, &list1) { 50962306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 51062306a36Sopenharmony_ci i++; 51162306a36Sopenharmony_ci } 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, i, 5); 51462306a36Sopenharmony_ci 51562306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, list_empty_careful(&list2)); 51662306a36Sopenharmony_ci} 51762306a36Sopenharmony_ci 51862306a36Sopenharmony_cistatic void list_test_list_splice_tail_init(struct kunit *test) 51962306a36Sopenharmony_ci{ 52062306a36Sopenharmony_ci struct list_head entries[5], *cur; 52162306a36Sopenharmony_ci LIST_HEAD(list1); 52262306a36Sopenharmony_ci LIST_HEAD(list2); 52362306a36Sopenharmony_ci int i = 0; 52462306a36Sopenharmony_ci 52562306a36Sopenharmony_ci list_add_tail(&entries[0], &list1); 52662306a36Sopenharmony_ci list_add_tail(&entries[1], &list1); 52762306a36Sopenharmony_ci list_add_tail(&entries[2], &list2); 52862306a36Sopenharmony_ci list_add_tail(&entries[3], &list2); 52962306a36Sopenharmony_ci list_add_tail(&entries[4], &list1); 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_ci /* before: [list1]->e[0]->e[1]->e[4], [list2]->e[2]->e[3] */ 53262306a36Sopenharmony_ci list_splice_tail_init(&list2, &entries[4]); 53362306a36Sopenharmony_ci /* after: [list1]->e[0]->e[1]->e[2]->e[3]->e[4], [list2] empty */ 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_ci list_for_each(cur, &list1) { 53662306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 53762306a36Sopenharmony_ci i++; 53862306a36Sopenharmony_ci } 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, i, 5); 54162306a36Sopenharmony_ci 54262306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, list_empty_careful(&list2)); 54362306a36Sopenharmony_ci} 54462306a36Sopenharmony_ci 54562306a36Sopenharmony_cistatic void list_test_list_entry(struct kunit *test) 54662306a36Sopenharmony_ci{ 54762306a36Sopenharmony_ci struct list_test_struct test_struct; 54862306a36Sopenharmony_ci 54962306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, &test_struct, list_entry(&(test_struct.list), 55062306a36Sopenharmony_ci struct list_test_struct, list)); 55162306a36Sopenharmony_ci} 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_cistatic void list_test_list_entry_is_head(struct kunit *test) 55462306a36Sopenharmony_ci{ 55562306a36Sopenharmony_ci struct list_test_struct test_struct1, test_struct2, test_struct3; 55662306a36Sopenharmony_ci 55762306a36Sopenharmony_ci INIT_LIST_HEAD(&test_struct1.list); 55862306a36Sopenharmony_ci INIT_LIST_HEAD(&test_struct3.list); 55962306a36Sopenharmony_ci 56062306a36Sopenharmony_ci list_add_tail(&test_struct2.list, &test_struct1.list); 56162306a36Sopenharmony_ci 56262306a36Sopenharmony_ci KUNIT_EXPECT_TRUE_MSG(test, 56362306a36Sopenharmony_ci list_entry_is_head((&test_struct1), &test_struct1.list, list), 56462306a36Sopenharmony_ci "Head element of same list"); 56562306a36Sopenharmony_ci KUNIT_EXPECT_FALSE_MSG(test, 56662306a36Sopenharmony_ci list_entry_is_head((&test_struct2), &test_struct1.list, list), 56762306a36Sopenharmony_ci "Non-head element of same list"); 56862306a36Sopenharmony_ci KUNIT_EXPECT_FALSE_MSG(test, 56962306a36Sopenharmony_ci list_entry_is_head((&test_struct3), &test_struct1.list, list), 57062306a36Sopenharmony_ci "Head element of different list"); 57162306a36Sopenharmony_ci} 57262306a36Sopenharmony_ci 57362306a36Sopenharmony_cistatic void list_test_list_first_entry(struct kunit *test) 57462306a36Sopenharmony_ci{ 57562306a36Sopenharmony_ci struct list_test_struct test_struct1, test_struct2; 57662306a36Sopenharmony_ci LIST_HEAD(list); 57762306a36Sopenharmony_ci 57862306a36Sopenharmony_ci list_add_tail(&test_struct1.list, &list); 57962306a36Sopenharmony_ci list_add_tail(&test_struct2.list, &list); 58062306a36Sopenharmony_ci 58162306a36Sopenharmony_ci 58262306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, &test_struct1, list_first_entry(&list, 58362306a36Sopenharmony_ci struct list_test_struct, list)); 58462306a36Sopenharmony_ci} 58562306a36Sopenharmony_ci 58662306a36Sopenharmony_cistatic void list_test_list_last_entry(struct kunit *test) 58762306a36Sopenharmony_ci{ 58862306a36Sopenharmony_ci struct list_test_struct test_struct1, test_struct2; 58962306a36Sopenharmony_ci LIST_HEAD(list); 59062306a36Sopenharmony_ci 59162306a36Sopenharmony_ci list_add_tail(&test_struct1.list, &list); 59262306a36Sopenharmony_ci list_add_tail(&test_struct2.list, &list); 59362306a36Sopenharmony_ci 59462306a36Sopenharmony_ci 59562306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, &test_struct2, list_last_entry(&list, 59662306a36Sopenharmony_ci struct list_test_struct, list)); 59762306a36Sopenharmony_ci} 59862306a36Sopenharmony_ci 59962306a36Sopenharmony_cistatic void list_test_list_first_entry_or_null(struct kunit *test) 60062306a36Sopenharmony_ci{ 60162306a36Sopenharmony_ci struct list_test_struct test_struct1, test_struct2; 60262306a36Sopenharmony_ci LIST_HEAD(list); 60362306a36Sopenharmony_ci 60462306a36Sopenharmony_ci KUNIT_EXPECT_FALSE(test, list_first_entry_or_null(&list, 60562306a36Sopenharmony_ci struct list_test_struct, list)); 60662306a36Sopenharmony_ci 60762306a36Sopenharmony_ci list_add_tail(&test_struct1.list, &list); 60862306a36Sopenharmony_ci list_add_tail(&test_struct2.list, &list); 60962306a36Sopenharmony_ci 61062306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, &test_struct1, 61162306a36Sopenharmony_ci list_first_entry_or_null(&list, 61262306a36Sopenharmony_ci struct list_test_struct, list)); 61362306a36Sopenharmony_ci} 61462306a36Sopenharmony_ci 61562306a36Sopenharmony_cistatic void list_test_list_next_entry(struct kunit *test) 61662306a36Sopenharmony_ci{ 61762306a36Sopenharmony_ci struct list_test_struct test_struct1, test_struct2; 61862306a36Sopenharmony_ci LIST_HEAD(list); 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_ci list_add_tail(&test_struct1.list, &list); 62162306a36Sopenharmony_ci list_add_tail(&test_struct2.list, &list); 62262306a36Sopenharmony_ci 62362306a36Sopenharmony_ci 62462306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, &test_struct2, list_next_entry(&test_struct1, 62562306a36Sopenharmony_ci list)); 62662306a36Sopenharmony_ci} 62762306a36Sopenharmony_ci 62862306a36Sopenharmony_cistatic void list_test_list_prev_entry(struct kunit *test) 62962306a36Sopenharmony_ci{ 63062306a36Sopenharmony_ci struct list_test_struct test_struct1, test_struct2; 63162306a36Sopenharmony_ci LIST_HEAD(list); 63262306a36Sopenharmony_ci 63362306a36Sopenharmony_ci list_add_tail(&test_struct1.list, &list); 63462306a36Sopenharmony_ci list_add_tail(&test_struct2.list, &list); 63562306a36Sopenharmony_ci 63662306a36Sopenharmony_ci 63762306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, &test_struct1, list_prev_entry(&test_struct2, 63862306a36Sopenharmony_ci list)); 63962306a36Sopenharmony_ci} 64062306a36Sopenharmony_ci 64162306a36Sopenharmony_cistatic void list_test_list_for_each(struct kunit *test) 64262306a36Sopenharmony_ci{ 64362306a36Sopenharmony_ci struct list_head entries[3], *cur; 64462306a36Sopenharmony_ci LIST_HEAD(list); 64562306a36Sopenharmony_ci int i = 0; 64662306a36Sopenharmony_ci 64762306a36Sopenharmony_ci list_add_tail(&entries[0], &list); 64862306a36Sopenharmony_ci list_add_tail(&entries[1], &list); 64962306a36Sopenharmony_ci list_add_tail(&entries[2], &list); 65062306a36Sopenharmony_ci 65162306a36Sopenharmony_ci list_for_each(cur, &list) { 65262306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 65362306a36Sopenharmony_ci i++; 65462306a36Sopenharmony_ci } 65562306a36Sopenharmony_ci 65662306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, i, 3); 65762306a36Sopenharmony_ci} 65862306a36Sopenharmony_ci 65962306a36Sopenharmony_cistatic void list_test_list_for_each_prev(struct kunit *test) 66062306a36Sopenharmony_ci{ 66162306a36Sopenharmony_ci struct list_head entries[3], *cur; 66262306a36Sopenharmony_ci LIST_HEAD(list); 66362306a36Sopenharmony_ci int i = 2; 66462306a36Sopenharmony_ci 66562306a36Sopenharmony_ci list_add_tail(&entries[0], &list); 66662306a36Sopenharmony_ci list_add_tail(&entries[1], &list); 66762306a36Sopenharmony_ci list_add_tail(&entries[2], &list); 66862306a36Sopenharmony_ci 66962306a36Sopenharmony_ci list_for_each_prev(cur, &list) { 67062306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 67162306a36Sopenharmony_ci i--; 67262306a36Sopenharmony_ci } 67362306a36Sopenharmony_ci 67462306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, i, -1); 67562306a36Sopenharmony_ci} 67662306a36Sopenharmony_ci 67762306a36Sopenharmony_cistatic void list_test_list_for_each_safe(struct kunit *test) 67862306a36Sopenharmony_ci{ 67962306a36Sopenharmony_ci struct list_head entries[3], *cur, *n; 68062306a36Sopenharmony_ci LIST_HEAD(list); 68162306a36Sopenharmony_ci int i = 0; 68262306a36Sopenharmony_ci 68362306a36Sopenharmony_ci 68462306a36Sopenharmony_ci list_add_tail(&entries[0], &list); 68562306a36Sopenharmony_ci list_add_tail(&entries[1], &list); 68662306a36Sopenharmony_ci list_add_tail(&entries[2], &list); 68762306a36Sopenharmony_ci 68862306a36Sopenharmony_ci list_for_each_safe(cur, n, &list) { 68962306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 69062306a36Sopenharmony_ci list_del(&entries[i]); 69162306a36Sopenharmony_ci i++; 69262306a36Sopenharmony_ci } 69362306a36Sopenharmony_ci 69462306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, i, 3); 69562306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, list_empty(&list)); 69662306a36Sopenharmony_ci} 69762306a36Sopenharmony_ci 69862306a36Sopenharmony_cistatic void list_test_list_for_each_prev_safe(struct kunit *test) 69962306a36Sopenharmony_ci{ 70062306a36Sopenharmony_ci struct list_head entries[3], *cur, *n; 70162306a36Sopenharmony_ci LIST_HEAD(list); 70262306a36Sopenharmony_ci int i = 2; 70362306a36Sopenharmony_ci 70462306a36Sopenharmony_ci list_add_tail(&entries[0], &list); 70562306a36Sopenharmony_ci list_add_tail(&entries[1], &list); 70662306a36Sopenharmony_ci list_add_tail(&entries[2], &list); 70762306a36Sopenharmony_ci 70862306a36Sopenharmony_ci list_for_each_prev_safe(cur, n, &list) { 70962306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 71062306a36Sopenharmony_ci list_del(&entries[i]); 71162306a36Sopenharmony_ci i--; 71262306a36Sopenharmony_ci } 71362306a36Sopenharmony_ci 71462306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, i, -1); 71562306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, list_empty(&list)); 71662306a36Sopenharmony_ci} 71762306a36Sopenharmony_ci 71862306a36Sopenharmony_cistatic void list_test_list_for_each_entry(struct kunit *test) 71962306a36Sopenharmony_ci{ 72062306a36Sopenharmony_ci struct list_test_struct entries[5], *cur; 72162306a36Sopenharmony_ci LIST_HEAD(list); 72262306a36Sopenharmony_ci int i = 0; 72362306a36Sopenharmony_ci 72462306a36Sopenharmony_ci for (i = 0; i < 5; ++i) { 72562306a36Sopenharmony_ci entries[i].data = i; 72662306a36Sopenharmony_ci list_add_tail(&entries[i].list, &list); 72762306a36Sopenharmony_ci } 72862306a36Sopenharmony_ci 72962306a36Sopenharmony_ci i = 0; 73062306a36Sopenharmony_ci 73162306a36Sopenharmony_ci list_for_each_entry(cur, &list, list) { 73262306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, cur->data, i); 73362306a36Sopenharmony_ci i++; 73462306a36Sopenharmony_ci } 73562306a36Sopenharmony_ci 73662306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, i, 5); 73762306a36Sopenharmony_ci} 73862306a36Sopenharmony_ci 73962306a36Sopenharmony_cistatic void list_test_list_for_each_entry_reverse(struct kunit *test) 74062306a36Sopenharmony_ci{ 74162306a36Sopenharmony_ci struct list_test_struct entries[5], *cur; 74262306a36Sopenharmony_ci LIST_HEAD(list); 74362306a36Sopenharmony_ci int i = 0; 74462306a36Sopenharmony_ci 74562306a36Sopenharmony_ci for (i = 0; i < 5; ++i) { 74662306a36Sopenharmony_ci entries[i].data = i; 74762306a36Sopenharmony_ci list_add_tail(&entries[i].list, &list); 74862306a36Sopenharmony_ci } 74962306a36Sopenharmony_ci 75062306a36Sopenharmony_ci i = 4; 75162306a36Sopenharmony_ci 75262306a36Sopenharmony_ci list_for_each_entry_reverse(cur, &list, list) { 75362306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, cur->data, i); 75462306a36Sopenharmony_ci i--; 75562306a36Sopenharmony_ci } 75662306a36Sopenharmony_ci 75762306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, i, -1); 75862306a36Sopenharmony_ci} 75962306a36Sopenharmony_ci 76062306a36Sopenharmony_cistatic struct kunit_case list_test_cases[] = { 76162306a36Sopenharmony_ci KUNIT_CASE(list_test_list_init), 76262306a36Sopenharmony_ci KUNIT_CASE(list_test_list_add), 76362306a36Sopenharmony_ci KUNIT_CASE(list_test_list_add_tail), 76462306a36Sopenharmony_ci KUNIT_CASE(list_test_list_del), 76562306a36Sopenharmony_ci KUNIT_CASE(list_test_list_replace), 76662306a36Sopenharmony_ci KUNIT_CASE(list_test_list_replace_init), 76762306a36Sopenharmony_ci KUNIT_CASE(list_test_list_swap), 76862306a36Sopenharmony_ci KUNIT_CASE(list_test_list_del_init), 76962306a36Sopenharmony_ci KUNIT_CASE(list_test_list_del_init_careful), 77062306a36Sopenharmony_ci KUNIT_CASE(list_test_list_move), 77162306a36Sopenharmony_ci KUNIT_CASE(list_test_list_move_tail), 77262306a36Sopenharmony_ci KUNIT_CASE(list_test_list_bulk_move_tail), 77362306a36Sopenharmony_ci KUNIT_CASE(list_test_list_is_head), 77462306a36Sopenharmony_ci KUNIT_CASE(list_test_list_is_first), 77562306a36Sopenharmony_ci KUNIT_CASE(list_test_list_is_last), 77662306a36Sopenharmony_ci KUNIT_CASE(list_test_list_empty), 77762306a36Sopenharmony_ci KUNIT_CASE(list_test_list_empty_careful), 77862306a36Sopenharmony_ci KUNIT_CASE(list_test_list_rotate_left), 77962306a36Sopenharmony_ci KUNIT_CASE(list_test_list_rotate_to_front), 78062306a36Sopenharmony_ci KUNIT_CASE(list_test_list_is_singular), 78162306a36Sopenharmony_ci KUNIT_CASE(list_test_list_cut_position), 78262306a36Sopenharmony_ci KUNIT_CASE(list_test_list_cut_before), 78362306a36Sopenharmony_ci KUNIT_CASE(list_test_list_splice), 78462306a36Sopenharmony_ci KUNIT_CASE(list_test_list_splice_tail), 78562306a36Sopenharmony_ci KUNIT_CASE(list_test_list_splice_init), 78662306a36Sopenharmony_ci KUNIT_CASE(list_test_list_splice_tail_init), 78762306a36Sopenharmony_ci KUNIT_CASE(list_test_list_entry), 78862306a36Sopenharmony_ci KUNIT_CASE(list_test_list_entry_is_head), 78962306a36Sopenharmony_ci KUNIT_CASE(list_test_list_first_entry), 79062306a36Sopenharmony_ci KUNIT_CASE(list_test_list_last_entry), 79162306a36Sopenharmony_ci KUNIT_CASE(list_test_list_first_entry_or_null), 79262306a36Sopenharmony_ci KUNIT_CASE(list_test_list_next_entry), 79362306a36Sopenharmony_ci KUNIT_CASE(list_test_list_prev_entry), 79462306a36Sopenharmony_ci KUNIT_CASE(list_test_list_for_each), 79562306a36Sopenharmony_ci KUNIT_CASE(list_test_list_for_each_prev), 79662306a36Sopenharmony_ci KUNIT_CASE(list_test_list_for_each_safe), 79762306a36Sopenharmony_ci KUNIT_CASE(list_test_list_for_each_prev_safe), 79862306a36Sopenharmony_ci KUNIT_CASE(list_test_list_for_each_entry), 79962306a36Sopenharmony_ci KUNIT_CASE(list_test_list_for_each_entry_reverse), 80062306a36Sopenharmony_ci {}, 80162306a36Sopenharmony_ci}; 80262306a36Sopenharmony_ci 80362306a36Sopenharmony_cistatic struct kunit_suite list_test_module = { 80462306a36Sopenharmony_ci .name = "list-kunit-test", 80562306a36Sopenharmony_ci .test_cases = list_test_cases, 80662306a36Sopenharmony_ci}; 80762306a36Sopenharmony_ci 80862306a36Sopenharmony_cistruct hlist_test_struct { 80962306a36Sopenharmony_ci int data; 81062306a36Sopenharmony_ci struct hlist_node list; 81162306a36Sopenharmony_ci}; 81262306a36Sopenharmony_ci 81362306a36Sopenharmony_cistatic void hlist_test_init(struct kunit *test) 81462306a36Sopenharmony_ci{ 81562306a36Sopenharmony_ci /* Test the different ways of initialising a list. */ 81662306a36Sopenharmony_ci struct hlist_head list1 = HLIST_HEAD_INIT; 81762306a36Sopenharmony_ci struct hlist_head list2; 81862306a36Sopenharmony_ci HLIST_HEAD(list3); 81962306a36Sopenharmony_ci struct hlist_head *list4; 82062306a36Sopenharmony_ci struct hlist_head *list5; 82162306a36Sopenharmony_ci 82262306a36Sopenharmony_ci INIT_HLIST_HEAD(&list2); 82362306a36Sopenharmony_ci 82462306a36Sopenharmony_ci list4 = kzalloc(sizeof(*list4), GFP_KERNEL | __GFP_NOFAIL); 82562306a36Sopenharmony_ci INIT_HLIST_HEAD(list4); 82662306a36Sopenharmony_ci 82762306a36Sopenharmony_ci list5 = kmalloc(sizeof(*list5), GFP_KERNEL | __GFP_NOFAIL); 82862306a36Sopenharmony_ci memset(list5, 0xFF, sizeof(*list5)); 82962306a36Sopenharmony_ci INIT_HLIST_HEAD(list5); 83062306a36Sopenharmony_ci 83162306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, hlist_empty(&list1)); 83262306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, hlist_empty(&list2)); 83362306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, hlist_empty(&list3)); 83462306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, hlist_empty(list4)); 83562306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, hlist_empty(list5)); 83662306a36Sopenharmony_ci 83762306a36Sopenharmony_ci kfree(list4); 83862306a36Sopenharmony_ci kfree(list5); 83962306a36Sopenharmony_ci} 84062306a36Sopenharmony_ci 84162306a36Sopenharmony_cistatic void hlist_test_unhashed(struct kunit *test) 84262306a36Sopenharmony_ci{ 84362306a36Sopenharmony_ci struct hlist_node a; 84462306a36Sopenharmony_ci HLIST_HEAD(list); 84562306a36Sopenharmony_ci 84662306a36Sopenharmony_ci INIT_HLIST_NODE(&a); 84762306a36Sopenharmony_ci 84862306a36Sopenharmony_ci /* is unhashed by default */ 84962306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, hlist_unhashed(&a)); 85062306a36Sopenharmony_ci 85162306a36Sopenharmony_ci hlist_add_head(&a, &list); 85262306a36Sopenharmony_ci 85362306a36Sopenharmony_ci /* is hashed once added to list */ 85462306a36Sopenharmony_ci KUNIT_EXPECT_FALSE(test, hlist_unhashed(&a)); 85562306a36Sopenharmony_ci 85662306a36Sopenharmony_ci hlist_del_init(&a); 85762306a36Sopenharmony_ci 85862306a36Sopenharmony_ci /* is again unhashed after del_init */ 85962306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, hlist_unhashed(&a)); 86062306a36Sopenharmony_ci} 86162306a36Sopenharmony_ci 86262306a36Sopenharmony_ci/* Doesn't test concurrency guarantees */ 86362306a36Sopenharmony_cistatic void hlist_test_unhashed_lockless(struct kunit *test) 86462306a36Sopenharmony_ci{ 86562306a36Sopenharmony_ci struct hlist_node a; 86662306a36Sopenharmony_ci HLIST_HEAD(list); 86762306a36Sopenharmony_ci 86862306a36Sopenharmony_ci INIT_HLIST_NODE(&a); 86962306a36Sopenharmony_ci 87062306a36Sopenharmony_ci /* is unhashed by default */ 87162306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, hlist_unhashed_lockless(&a)); 87262306a36Sopenharmony_ci 87362306a36Sopenharmony_ci hlist_add_head(&a, &list); 87462306a36Sopenharmony_ci 87562306a36Sopenharmony_ci /* is hashed once added to list */ 87662306a36Sopenharmony_ci KUNIT_EXPECT_FALSE(test, hlist_unhashed_lockless(&a)); 87762306a36Sopenharmony_ci 87862306a36Sopenharmony_ci hlist_del_init(&a); 87962306a36Sopenharmony_ci 88062306a36Sopenharmony_ci /* is again unhashed after del_init */ 88162306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, hlist_unhashed_lockless(&a)); 88262306a36Sopenharmony_ci} 88362306a36Sopenharmony_ci 88462306a36Sopenharmony_cistatic void hlist_test_del(struct kunit *test) 88562306a36Sopenharmony_ci{ 88662306a36Sopenharmony_ci struct hlist_node a, b; 88762306a36Sopenharmony_ci HLIST_HEAD(list); 88862306a36Sopenharmony_ci 88962306a36Sopenharmony_ci hlist_add_head(&a, &list); 89062306a36Sopenharmony_ci hlist_add_behind(&b, &a); 89162306a36Sopenharmony_ci 89262306a36Sopenharmony_ci /* before: [list] -> a -> b */ 89362306a36Sopenharmony_ci hlist_del(&a); 89462306a36Sopenharmony_ci 89562306a36Sopenharmony_ci /* now: [list] -> b */ 89662306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, list.first, &b); 89762306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, b.pprev, &list.first); 89862306a36Sopenharmony_ci} 89962306a36Sopenharmony_ci 90062306a36Sopenharmony_cistatic void hlist_test_del_init(struct kunit *test) 90162306a36Sopenharmony_ci{ 90262306a36Sopenharmony_ci struct hlist_node a, b; 90362306a36Sopenharmony_ci HLIST_HEAD(list); 90462306a36Sopenharmony_ci 90562306a36Sopenharmony_ci hlist_add_head(&a, &list); 90662306a36Sopenharmony_ci hlist_add_behind(&b, &a); 90762306a36Sopenharmony_ci 90862306a36Sopenharmony_ci /* before: [list] -> a -> b */ 90962306a36Sopenharmony_ci hlist_del_init(&a); 91062306a36Sopenharmony_ci 91162306a36Sopenharmony_ci /* now: [list] -> b */ 91262306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, list.first, &b); 91362306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, b.pprev, &list.first); 91462306a36Sopenharmony_ci 91562306a36Sopenharmony_ci /* a is now initialised */ 91662306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, a.next, NULL); 91762306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, a.pprev, NULL); 91862306a36Sopenharmony_ci} 91962306a36Sopenharmony_ci 92062306a36Sopenharmony_ci/* Tests all three hlist_add_* functions */ 92162306a36Sopenharmony_cistatic void hlist_test_add(struct kunit *test) 92262306a36Sopenharmony_ci{ 92362306a36Sopenharmony_ci struct hlist_node a, b, c, d; 92462306a36Sopenharmony_ci HLIST_HEAD(list); 92562306a36Sopenharmony_ci 92662306a36Sopenharmony_ci hlist_add_head(&a, &list); 92762306a36Sopenharmony_ci hlist_add_head(&b, &list); 92862306a36Sopenharmony_ci hlist_add_before(&c, &a); 92962306a36Sopenharmony_ci hlist_add_behind(&d, &a); 93062306a36Sopenharmony_ci 93162306a36Sopenharmony_ci /* should be [list] -> b -> c -> a -> d */ 93262306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, list.first, &b); 93362306a36Sopenharmony_ci 93462306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, c.pprev, &(b.next)); 93562306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, b.next, &c); 93662306a36Sopenharmony_ci 93762306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, a.pprev, &(c.next)); 93862306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, c.next, &a); 93962306a36Sopenharmony_ci 94062306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, d.pprev, &(a.next)); 94162306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, a.next, &d); 94262306a36Sopenharmony_ci} 94362306a36Sopenharmony_ci 94462306a36Sopenharmony_ci/* Tests both hlist_fake() and hlist_add_fake() */ 94562306a36Sopenharmony_cistatic void hlist_test_fake(struct kunit *test) 94662306a36Sopenharmony_ci{ 94762306a36Sopenharmony_ci struct hlist_node a; 94862306a36Sopenharmony_ci 94962306a36Sopenharmony_ci INIT_HLIST_NODE(&a); 95062306a36Sopenharmony_ci 95162306a36Sopenharmony_ci /* not fake after init */ 95262306a36Sopenharmony_ci KUNIT_EXPECT_FALSE(test, hlist_fake(&a)); 95362306a36Sopenharmony_ci 95462306a36Sopenharmony_ci hlist_add_fake(&a); 95562306a36Sopenharmony_ci 95662306a36Sopenharmony_ci /* is now fake */ 95762306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, hlist_fake(&a)); 95862306a36Sopenharmony_ci} 95962306a36Sopenharmony_ci 96062306a36Sopenharmony_cistatic void hlist_test_is_singular_node(struct kunit *test) 96162306a36Sopenharmony_ci{ 96262306a36Sopenharmony_ci struct hlist_node a, b; 96362306a36Sopenharmony_ci HLIST_HEAD(list); 96462306a36Sopenharmony_ci 96562306a36Sopenharmony_ci INIT_HLIST_NODE(&a); 96662306a36Sopenharmony_ci KUNIT_EXPECT_FALSE(test, hlist_is_singular_node(&a, &list)); 96762306a36Sopenharmony_ci 96862306a36Sopenharmony_ci hlist_add_head(&a, &list); 96962306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, hlist_is_singular_node(&a, &list)); 97062306a36Sopenharmony_ci 97162306a36Sopenharmony_ci hlist_add_head(&b, &list); 97262306a36Sopenharmony_ci KUNIT_EXPECT_FALSE(test, hlist_is_singular_node(&a, &list)); 97362306a36Sopenharmony_ci KUNIT_EXPECT_FALSE(test, hlist_is_singular_node(&b, &list)); 97462306a36Sopenharmony_ci} 97562306a36Sopenharmony_ci 97662306a36Sopenharmony_cistatic void hlist_test_empty(struct kunit *test) 97762306a36Sopenharmony_ci{ 97862306a36Sopenharmony_ci struct hlist_node a; 97962306a36Sopenharmony_ci HLIST_HEAD(list); 98062306a36Sopenharmony_ci 98162306a36Sopenharmony_ci /* list starts off empty */ 98262306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, hlist_empty(&list)); 98362306a36Sopenharmony_ci 98462306a36Sopenharmony_ci hlist_add_head(&a, &list); 98562306a36Sopenharmony_ci 98662306a36Sopenharmony_ci /* list is no longer empty */ 98762306a36Sopenharmony_ci KUNIT_EXPECT_FALSE(test, hlist_empty(&list)); 98862306a36Sopenharmony_ci} 98962306a36Sopenharmony_ci 99062306a36Sopenharmony_cistatic void hlist_test_move_list(struct kunit *test) 99162306a36Sopenharmony_ci{ 99262306a36Sopenharmony_ci struct hlist_node a; 99362306a36Sopenharmony_ci HLIST_HEAD(list1); 99462306a36Sopenharmony_ci HLIST_HEAD(list2); 99562306a36Sopenharmony_ci 99662306a36Sopenharmony_ci hlist_add_head(&a, &list1); 99762306a36Sopenharmony_ci 99862306a36Sopenharmony_ci KUNIT_EXPECT_FALSE(test, hlist_empty(&list1)); 99962306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, hlist_empty(&list2)); 100062306a36Sopenharmony_ci hlist_move_list(&list1, &list2); 100162306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, hlist_empty(&list1)); 100262306a36Sopenharmony_ci KUNIT_EXPECT_FALSE(test, hlist_empty(&list2)); 100362306a36Sopenharmony_ci 100462306a36Sopenharmony_ci} 100562306a36Sopenharmony_ci 100662306a36Sopenharmony_cistatic void hlist_test_entry(struct kunit *test) 100762306a36Sopenharmony_ci{ 100862306a36Sopenharmony_ci struct hlist_test_struct test_struct; 100962306a36Sopenharmony_ci 101062306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, &test_struct, 101162306a36Sopenharmony_ci hlist_entry(&(test_struct.list), 101262306a36Sopenharmony_ci struct hlist_test_struct, list)); 101362306a36Sopenharmony_ci} 101462306a36Sopenharmony_ci 101562306a36Sopenharmony_cistatic void hlist_test_entry_safe(struct kunit *test) 101662306a36Sopenharmony_ci{ 101762306a36Sopenharmony_ci struct hlist_test_struct test_struct; 101862306a36Sopenharmony_ci 101962306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, &test_struct, 102062306a36Sopenharmony_ci hlist_entry_safe(&(test_struct.list), 102162306a36Sopenharmony_ci struct hlist_test_struct, list)); 102262306a36Sopenharmony_ci 102362306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, NULL, 102462306a36Sopenharmony_ci hlist_entry_safe((struct hlist_node *)NULL, 102562306a36Sopenharmony_ci struct hlist_test_struct, list)); 102662306a36Sopenharmony_ci} 102762306a36Sopenharmony_ci 102862306a36Sopenharmony_cistatic void hlist_test_for_each(struct kunit *test) 102962306a36Sopenharmony_ci{ 103062306a36Sopenharmony_ci struct hlist_node entries[3], *cur; 103162306a36Sopenharmony_ci HLIST_HEAD(list); 103262306a36Sopenharmony_ci int i = 0; 103362306a36Sopenharmony_ci 103462306a36Sopenharmony_ci hlist_add_head(&entries[0], &list); 103562306a36Sopenharmony_ci hlist_add_behind(&entries[1], &entries[0]); 103662306a36Sopenharmony_ci hlist_add_behind(&entries[2], &entries[1]); 103762306a36Sopenharmony_ci 103862306a36Sopenharmony_ci hlist_for_each(cur, &list) { 103962306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 104062306a36Sopenharmony_ci i++; 104162306a36Sopenharmony_ci } 104262306a36Sopenharmony_ci 104362306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, i, 3); 104462306a36Sopenharmony_ci} 104562306a36Sopenharmony_ci 104662306a36Sopenharmony_ci 104762306a36Sopenharmony_cistatic void hlist_test_for_each_safe(struct kunit *test) 104862306a36Sopenharmony_ci{ 104962306a36Sopenharmony_ci struct hlist_node entries[3], *cur, *n; 105062306a36Sopenharmony_ci HLIST_HEAD(list); 105162306a36Sopenharmony_ci int i = 0; 105262306a36Sopenharmony_ci 105362306a36Sopenharmony_ci hlist_add_head(&entries[0], &list); 105462306a36Sopenharmony_ci hlist_add_behind(&entries[1], &entries[0]); 105562306a36Sopenharmony_ci hlist_add_behind(&entries[2], &entries[1]); 105662306a36Sopenharmony_ci 105762306a36Sopenharmony_ci hlist_for_each_safe(cur, n, &list) { 105862306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 105962306a36Sopenharmony_ci hlist_del(&entries[i]); 106062306a36Sopenharmony_ci i++; 106162306a36Sopenharmony_ci } 106262306a36Sopenharmony_ci 106362306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, i, 3); 106462306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, hlist_empty(&list)); 106562306a36Sopenharmony_ci} 106662306a36Sopenharmony_ci 106762306a36Sopenharmony_cistatic void hlist_test_for_each_entry(struct kunit *test) 106862306a36Sopenharmony_ci{ 106962306a36Sopenharmony_ci struct hlist_test_struct entries[5], *cur; 107062306a36Sopenharmony_ci HLIST_HEAD(list); 107162306a36Sopenharmony_ci int i = 0; 107262306a36Sopenharmony_ci 107362306a36Sopenharmony_ci entries[0].data = 0; 107462306a36Sopenharmony_ci hlist_add_head(&entries[0].list, &list); 107562306a36Sopenharmony_ci for (i = 1; i < 5; ++i) { 107662306a36Sopenharmony_ci entries[i].data = i; 107762306a36Sopenharmony_ci hlist_add_behind(&entries[i].list, &entries[i-1].list); 107862306a36Sopenharmony_ci } 107962306a36Sopenharmony_ci 108062306a36Sopenharmony_ci i = 0; 108162306a36Sopenharmony_ci 108262306a36Sopenharmony_ci hlist_for_each_entry(cur, &list, list) { 108362306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, cur->data, i); 108462306a36Sopenharmony_ci i++; 108562306a36Sopenharmony_ci } 108662306a36Sopenharmony_ci 108762306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, i, 5); 108862306a36Sopenharmony_ci} 108962306a36Sopenharmony_ci 109062306a36Sopenharmony_cistatic void hlist_test_for_each_entry_continue(struct kunit *test) 109162306a36Sopenharmony_ci{ 109262306a36Sopenharmony_ci struct hlist_test_struct entries[5], *cur; 109362306a36Sopenharmony_ci HLIST_HEAD(list); 109462306a36Sopenharmony_ci int i = 0; 109562306a36Sopenharmony_ci 109662306a36Sopenharmony_ci entries[0].data = 0; 109762306a36Sopenharmony_ci hlist_add_head(&entries[0].list, &list); 109862306a36Sopenharmony_ci for (i = 1; i < 5; ++i) { 109962306a36Sopenharmony_ci entries[i].data = i; 110062306a36Sopenharmony_ci hlist_add_behind(&entries[i].list, &entries[i-1].list); 110162306a36Sopenharmony_ci } 110262306a36Sopenharmony_ci 110362306a36Sopenharmony_ci /* We skip the first (zero-th) entry. */ 110462306a36Sopenharmony_ci i = 1; 110562306a36Sopenharmony_ci 110662306a36Sopenharmony_ci cur = &entries[0]; 110762306a36Sopenharmony_ci hlist_for_each_entry_continue(cur, list) { 110862306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, cur->data, i); 110962306a36Sopenharmony_ci /* Stamp over the entry. */ 111062306a36Sopenharmony_ci cur->data = 42; 111162306a36Sopenharmony_ci i++; 111262306a36Sopenharmony_ci } 111362306a36Sopenharmony_ci 111462306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, i, 5); 111562306a36Sopenharmony_ci /* The first entry was not visited. */ 111662306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, entries[0].data, 0); 111762306a36Sopenharmony_ci /* The second (and presumably others), were. */ 111862306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, entries[1].data, 42); 111962306a36Sopenharmony_ci} 112062306a36Sopenharmony_ci 112162306a36Sopenharmony_cistatic void hlist_test_for_each_entry_from(struct kunit *test) 112262306a36Sopenharmony_ci{ 112362306a36Sopenharmony_ci struct hlist_test_struct entries[5], *cur; 112462306a36Sopenharmony_ci HLIST_HEAD(list); 112562306a36Sopenharmony_ci int i = 0; 112662306a36Sopenharmony_ci 112762306a36Sopenharmony_ci entries[0].data = 0; 112862306a36Sopenharmony_ci hlist_add_head(&entries[0].list, &list); 112962306a36Sopenharmony_ci for (i = 1; i < 5; ++i) { 113062306a36Sopenharmony_ci entries[i].data = i; 113162306a36Sopenharmony_ci hlist_add_behind(&entries[i].list, &entries[i-1].list); 113262306a36Sopenharmony_ci } 113362306a36Sopenharmony_ci 113462306a36Sopenharmony_ci i = 0; 113562306a36Sopenharmony_ci 113662306a36Sopenharmony_ci cur = &entries[0]; 113762306a36Sopenharmony_ci hlist_for_each_entry_from(cur, list) { 113862306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, cur->data, i); 113962306a36Sopenharmony_ci /* Stamp over the entry. */ 114062306a36Sopenharmony_ci cur->data = 42; 114162306a36Sopenharmony_ci i++; 114262306a36Sopenharmony_ci } 114362306a36Sopenharmony_ci 114462306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, i, 5); 114562306a36Sopenharmony_ci /* The first entry was visited. */ 114662306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, entries[0].data, 42); 114762306a36Sopenharmony_ci} 114862306a36Sopenharmony_ci 114962306a36Sopenharmony_cistatic void hlist_test_for_each_entry_safe(struct kunit *test) 115062306a36Sopenharmony_ci{ 115162306a36Sopenharmony_ci struct hlist_test_struct entries[5], *cur; 115262306a36Sopenharmony_ci struct hlist_node *tmp_node; 115362306a36Sopenharmony_ci HLIST_HEAD(list); 115462306a36Sopenharmony_ci int i = 0; 115562306a36Sopenharmony_ci 115662306a36Sopenharmony_ci entries[0].data = 0; 115762306a36Sopenharmony_ci hlist_add_head(&entries[0].list, &list); 115862306a36Sopenharmony_ci for (i = 1; i < 5; ++i) { 115962306a36Sopenharmony_ci entries[i].data = i; 116062306a36Sopenharmony_ci hlist_add_behind(&entries[i].list, &entries[i-1].list); 116162306a36Sopenharmony_ci } 116262306a36Sopenharmony_ci 116362306a36Sopenharmony_ci i = 0; 116462306a36Sopenharmony_ci 116562306a36Sopenharmony_ci hlist_for_each_entry_safe(cur, tmp_node, &list, list) { 116662306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, cur->data, i); 116762306a36Sopenharmony_ci hlist_del(&cur->list); 116862306a36Sopenharmony_ci i++; 116962306a36Sopenharmony_ci } 117062306a36Sopenharmony_ci 117162306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, i, 5); 117262306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, hlist_empty(&list)); 117362306a36Sopenharmony_ci} 117462306a36Sopenharmony_ci 117562306a36Sopenharmony_ci 117662306a36Sopenharmony_cistatic struct kunit_case hlist_test_cases[] = { 117762306a36Sopenharmony_ci KUNIT_CASE(hlist_test_init), 117862306a36Sopenharmony_ci KUNIT_CASE(hlist_test_unhashed), 117962306a36Sopenharmony_ci KUNIT_CASE(hlist_test_unhashed_lockless), 118062306a36Sopenharmony_ci KUNIT_CASE(hlist_test_del), 118162306a36Sopenharmony_ci KUNIT_CASE(hlist_test_del_init), 118262306a36Sopenharmony_ci KUNIT_CASE(hlist_test_add), 118362306a36Sopenharmony_ci KUNIT_CASE(hlist_test_fake), 118462306a36Sopenharmony_ci KUNIT_CASE(hlist_test_is_singular_node), 118562306a36Sopenharmony_ci KUNIT_CASE(hlist_test_empty), 118662306a36Sopenharmony_ci KUNIT_CASE(hlist_test_move_list), 118762306a36Sopenharmony_ci KUNIT_CASE(hlist_test_entry), 118862306a36Sopenharmony_ci KUNIT_CASE(hlist_test_entry_safe), 118962306a36Sopenharmony_ci KUNIT_CASE(hlist_test_for_each), 119062306a36Sopenharmony_ci KUNIT_CASE(hlist_test_for_each_safe), 119162306a36Sopenharmony_ci KUNIT_CASE(hlist_test_for_each_entry), 119262306a36Sopenharmony_ci KUNIT_CASE(hlist_test_for_each_entry_continue), 119362306a36Sopenharmony_ci KUNIT_CASE(hlist_test_for_each_entry_from), 119462306a36Sopenharmony_ci KUNIT_CASE(hlist_test_for_each_entry_safe), 119562306a36Sopenharmony_ci {}, 119662306a36Sopenharmony_ci}; 119762306a36Sopenharmony_ci 119862306a36Sopenharmony_cistatic struct kunit_suite hlist_test_module = { 119962306a36Sopenharmony_ci .name = "hlist", 120062306a36Sopenharmony_ci .test_cases = hlist_test_cases, 120162306a36Sopenharmony_ci}; 120262306a36Sopenharmony_ci 120362306a36Sopenharmony_ci 120462306a36Sopenharmony_cistruct klist_test_struct { 120562306a36Sopenharmony_ci int data; 120662306a36Sopenharmony_ci struct klist klist; 120762306a36Sopenharmony_ci struct klist_node klist_node; 120862306a36Sopenharmony_ci}; 120962306a36Sopenharmony_ci 121062306a36Sopenharmony_cistatic int node_count; 121162306a36Sopenharmony_cistatic struct klist_node *last_node; 121262306a36Sopenharmony_ci 121362306a36Sopenharmony_cistatic void check_node(struct klist_node *node_ptr) 121462306a36Sopenharmony_ci{ 121562306a36Sopenharmony_ci node_count++; 121662306a36Sopenharmony_ci last_node = node_ptr; 121762306a36Sopenharmony_ci} 121862306a36Sopenharmony_ci 121962306a36Sopenharmony_cistatic void check_delete_node(struct klist_node *node_ptr) 122062306a36Sopenharmony_ci{ 122162306a36Sopenharmony_ci node_count--; 122262306a36Sopenharmony_ci last_node = node_ptr; 122362306a36Sopenharmony_ci} 122462306a36Sopenharmony_ci 122562306a36Sopenharmony_cistatic void klist_test_add_tail(struct kunit *test) 122662306a36Sopenharmony_ci{ 122762306a36Sopenharmony_ci struct klist_node a, b; 122862306a36Sopenharmony_ci struct klist mylist; 122962306a36Sopenharmony_ci struct klist_iter i; 123062306a36Sopenharmony_ci 123162306a36Sopenharmony_ci node_count = 0; 123262306a36Sopenharmony_ci klist_init(&mylist, &check_node, NULL); 123362306a36Sopenharmony_ci 123462306a36Sopenharmony_ci klist_add_tail(&a, &mylist); 123562306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, node_count, 1); 123662306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, last_node, &a); 123762306a36Sopenharmony_ci 123862306a36Sopenharmony_ci klist_add_tail(&b, &mylist); 123962306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, node_count, 2); 124062306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, last_node, &b); 124162306a36Sopenharmony_ci 124262306a36Sopenharmony_ci /* should be [list] -> a -> b */ 124362306a36Sopenharmony_ci klist_iter_init(&mylist, &i); 124462306a36Sopenharmony_ci 124562306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, klist_next(&i), &a); 124662306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, klist_next(&i), &b); 124762306a36Sopenharmony_ci KUNIT_EXPECT_NULL(test, klist_next(&i)); 124862306a36Sopenharmony_ci 124962306a36Sopenharmony_ci klist_iter_exit(&i); 125062306a36Sopenharmony_ci 125162306a36Sopenharmony_ci} 125262306a36Sopenharmony_ci 125362306a36Sopenharmony_cistatic void klist_test_add_head(struct kunit *test) 125462306a36Sopenharmony_ci{ 125562306a36Sopenharmony_ci struct klist_node a, b; 125662306a36Sopenharmony_ci struct klist mylist; 125762306a36Sopenharmony_ci struct klist_iter i; 125862306a36Sopenharmony_ci 125962306a36Sopenharmony_ci node_count = 0; 126062306a36Sopenharmony_ci klist_init(&mylist, &check_node, NULL); 126162306a36Sopenharmony_ci 126262306a36Sopenharmony_ci klist_add_head(&a, &mylist); 126362306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, node_count, 1); 126462306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, last_node, &a); 126562306a36Sopenharmony_ci 126662306a36Sopenharmony_ci klist_add_head(&b, &mylist); 126762306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, node_count, 2); 126862306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, last_node, &b); 126962306a36Sopenharmony_ci 127062306a36Sopenharmony_ci /* should be [list] -> b -> a */ 127162306a36Sopenharmony_ci klist_iter_init(&mylist, &i); 127262306a36Sopenharmony_ci 127362306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, klist_next(&i), &b); 127462306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, klist_next(&i), &a); 127562306a36Sopenharmony_ci KUNIT_EXPECT_NULL(test, klist_next(&i)); 127662306a36Sopenharmony_ci 127762306a36Sopenharmony_ci klist_iter_exit(&i); 127862306a36Sopenharmony_ci 127962306a36Sopenharmony_ci} 128062306a36Sopenharmony_ci 128162306a36Sopenharmony_cistatic void klist_test_add_behind(struct kunit *test) 128262306a36Sopenharmony_ci{ 128362306a36Sopenharmony_ci struct klist_node a, b, c, d; 128462306a36Sopenharmony_ci struct klist mylist; 128562306a36Sopenharmony_ci struct klist_iter i; 128662306a36Sopenharmony_ci 128762306a36Sopenharmony_ci node_count = 0; 128862306a36Sopenharmony_ci klist_init(&mylist, &check_node, NULL); 128962306a36Sopenharmony_ci 129062306a36Sopenharmony_ci klist_add_head(&a, &mylist); 129162306a36Sopenharmony_ci klist_add_head(&b, &mylist); 129262306a36Sopenharmony_ci 129362306a36Sopenharmony_ci klist_add_behind(&c, &a); 129462306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, node_count, 3); 129562306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, last_node, &c); 129662306a36Sopenharmony_ci 129762306a36Sopenharmony_ci klist_add_behind(&d, &b); 129862306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, node_count, 4); 129962306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, last_node, &d); 130062306a36Sopenharmony_ci 130162306a36Sopenharmony_ci klist_iter_init(&mylist, &i); 130262306a36Sopenharmony_ci 130362306a36Sopenharmony_ci /* should be [list] -> b -> d -> a -> c*/ 130462306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, klist_next(&i), &b); 130562306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, klist_next(&i), &d); 130662306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, klist_next(&i), &a); 130762306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, klist_next(&i), &c); 130862306a36Sopenharmony_ci KUNIT_EXPECT_NULL(test, klist_next(&i)); 130962306a36Sopenharmony_ci 131062306a36Sopenharmony_ci klist_iter_exit(&i); 131162306a36Sopenharmony_ci 131262306a36Sopenharmony_ci} 131362306a36Sopenharmony_ci 131462306a36Sopenharmony_cistatic void klist_test_add_before(struct kunit *test) 131562306a36Sopenharmony_ci{ 131662306a36Sopenharmony_ci struct klist_node a, b, c, d; 131762306a36Sopenharmony_ci struct klist mylist; 131862306a36Sopenharmony_ci struct klist_iter i; 131962306a36Sopenharmony_ci 132062306a36Sopenharmony_ci node_count = 0; 132162306a36Sopenharmony_ci klist_init(&mylist, &check_node, NULL); 132262306a36Sopenharmony_ci 132362306a36Sopenharmony_ci klist_add_head(&a, &mylist); 132462306a36Sopenharmony_ci klist_add_head(&b, &mylist); 132562306a36Sopenharmony_ci klist_add_before(&c, &a); 132662306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, node_count, 3); 132762306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, last_node, &c); 132862306a36Sopenharmony_ci 132962306a36Sopenharmony_ci klist_add_before(&d, &b); 133062306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, node_count, 4); 133162306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, last_node, &d); 133262306a36Sopenharmony_ci 133362306a36Sopenharmony_ci klist_iter_init(&mylist, &i); 133462306a36Sopenharmony_ci 133562306a36Sopenharmony_ci /* should be [list] -> b -> d -> a -> c*/ 133662306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, klist_next(&i), &d); 133762306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, klist_next(&i), &b); 133862306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, klist_next(&i), &c); 133962306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, klist_next(&i), &a); 134062306a36Sopenharmony_ci KUNIT_EXPECT_NULL(test, klist_next(&i)); 134162306a36Sopenharmony_ci 134262306a36Sopenharmony_ci klist_iter_exit(&i); 134362306a36Sopenharmony_ci 134462306a36Sopenharmony_ci} 134562306a36Sopenharmony_ci 134662306a36Sopenharmony_ci/* 134762306a36Sopenharmony_ci * Verify that klist_del() delays the deletion of a node until there 134862306a36Sopenharmony_ci * are no other references to it 134962306a36Sopenharmony_ci */ 135062306a36Sopenharmony_cistatic void klist_test_del_refcount_greater_than_zero(struct kunit *test) 135162306a36Sopenharmony_ci{ 135262306a36Sopenharmony_ci struct klist_node a, b, c, d; 135362306a36Sopenharmony_ci struct klist mylist; 135462306a36Sopenharmony_ci struct klist_iter i; 135562306a36Sopenharmony_ci 135662306a36Sopenharmony_ci node_count = 0; 135762306a36Sopenharmony_ci klist_init(&mylist, &check_node, &check_delete_node); 135862306a36Sopenharmony_ci 135962306a36Sopenharmony_ci /* Add nodes a,b,c,d to the list*/ 136062306a36Sopenharmony_ci klist_add_tail(&a, &mylist); 136162306a36Sopenharmony_ci klist_add_tail(&b, &mylist); 136262306a36Sopenharmony_ci klist_add_tail(&c, &mylist); 136362306a36Sopenharmony_ci klist_add_tail(&d, &mylist); 136462306a36Sopenharmony_ci 136562306a36Sopenharmony_ci klist_iter_init(&mylist, &i); 136662306a36Sopenharmony_ci 136762306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, klist_next(&i), &a); 136862306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, klist_next(&i), &b); 136962306a36Sopenharmony_ci /* Advance the iterator to point to node c*/ 137062306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, klist_next(&i), &c); 137162306a36Sopenharmony_ci 137262306a36Sopenharmony_ci /* Try to delete node c while there is a reference to it*/ 137362306a36Sopenharmony_ci klist_del(&c); 137462306a36Sopenharmony_ci 137562306a36Sopenharmony_ci /* 137662306a36Sopenharmony_ci * Verify that node c is still attached to the list even after being 137762306a36Sopenharmony_ci * deleted. Since the iterator still points to c, the reference count is not 137862306a36Sopenharmony_ci * decreased to 0 137962306a36Sopenharmony_ci */ 138062306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, klist_node_attached(&c)); 138162306a36Sopenharmony_ci 138262306a36Sopenharmony_ci /* Check that node c has not been removed yet*/ 138362306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, node_count, 4); 138462306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, last_node, &d); 138562306a36Sopenharmony_ci 138662306a36Sopenharmony_ci klist_iter_exit(&i); 138762306a36Sopenharmony_ci 138862306a36Sopenharmony_ci /* 138962306a36Sopenharmony_ci * Since the iterator is no longer pointing to node c, node c is removed 139062306a36Sopenharmony_ci * from the list 139162306a36Sopenharmony_ci */ 139262306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, node_count, 3); 139362306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, last_node, &c); 139462306a36Sopenharmony_ci 139562306a36Sopenharmony_ci} 139662306a36Sopenharmony_ci 139762306a36Sopenharmony_ci/* 139862306a36Sopenharmony_ci * Verify that klist_del() deletes a node immediately when there are no 139962306a36Sopenharmony_ci * other references to it. 140062306a36Sopenharmony_ci */ 140162306a36Sopenharmony_cistatic void klist_test_del_refcount_zero(struct kunit *test) 140262306a36Sopenharmony_ci{ 140362306a36Sopenharmony_ci struct klist_node a, b, c, d; 140462306a36Sopenharmony_ci struct klist mylist; 140562306a36Sopenharmony_ci struct klist_iter i; 140662306a36Sopenharmony_ci 140762306a36Sopenharmony_ci node_count = 0; 140862306a36Sopenharmony_ci klist_init(&mylist, &check_node, &check_delete_node); 140962306a36Sopenharmony_ci 141062306a36Sopenharmony_ci /* Add nodes a,b,c,d to the list*/ 141162306a36Sopenharmony_ci klist_add_tail(&a, &mylist); 141262306a36Sopenharmony_ci klist_add_tail(&b, &mylist); 141362306a36Sopenharmony_ci klist_add_tail(&c, &mylist); 141462306a36Sopenharmony_ci klist_add_tail(&d, &mylist); 141562306a36Sopenharmony_ci /* Delete node c*/ 141662306a36Sopenharmony_ci klist_del(&c); 141762306a36Sopenharmony_ci 141862306a36Sopenharmony_ci /* Check that node c is deleted from the list*/ 141962306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, node_count, 3); 142062306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, last_node, &c); 142162306a36Sopenharmony_ci 142262306a36Sopenharmony_ci /* Should be [list] -> a -> b -> d*/ 142362306a36Sopenharmony_ci klist_iter_init(&mylist, &i); 142462306a36Sopenharmony_ci 142562306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, klist_next(&i), &a); 142662306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, klist_next(&i), &b); 142762306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, klist_next(&i), &d); 142862306a36Sopenharmony_ci KUNIT_EXPECT_NULL(test, klist_next(&i)); 142962306a36Sopenharmony_ci 143062306a36Sopenharmony_ci klist_iter_exit(&i); 143162306a36Sopenharmony_ci 143262306a36Sopenharmony_ci} 143362306a36Sopenharmony_ci 143462306a36Sopenharmony_cistatic void klist_test_remove(struct kunit *test) 143562306a36Sopenharmony_ci{ 143662306a36Sopenharmony_ci /* This test doesn't check correctness under concurrent access */ 143762306a36Sopenharmony_ci struct klist_node a, b, c, d; 143862306a36Sopenharmony_ci struct klist mylist; 143962306a36Sopenharmony_ci struct klist_iter i; 144062306a36Sopenharmony_ci 144162306a36Sopenharmony_ci node_count = 0; 144262306a36Sopenharmony_ci klist_init(&mylist, &check_node, &check_delete_node); 144362306a36Sopenharmony_ci 144462306a36Sopenharmony_ci /* Add nodes a,b,c,d to the list*/ 144562306a36Sopenharmony_ci klist_add_tail(&a, &mylist); 144662306a36Sopenharmony_ci klist_add_tail(&b, &mylist); 144762306a36Sopenharmony_ci klist_add_tail(&c, &mylist); 144862306a36Sopenharmony_ci klist_add_tail(&d, &mylist); 144962306a36Sopenharmony_ci /* Delete node c*/ 145062306a36Sopenharmony_ci klist_remove(&c); 145162306a36Sopenharmony_ci 145262306a36Sopenharmony_ci /* Check the nodes in the list*/ 145362306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, node_count, 3); 145462306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, last_node, &c); 145562306a36Sopenharmony_ci 145662306a36Sopenharmony_ci /* should be [list] -> a -> b -> d*/ 145762306a36Sopenharmony_ci klist_iter_init(&mylist, &i); 145862306a36Sopenharmony_ci 145962306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, klist_next(&i), &a); 146062306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, klist_next(&i), &b); 146162306a36Sopenharmony_ci KUNIT_EXPECT_PTR_EQ(test, klist_next(&i), &d); 146262306a36Sopenharmony_ci KUNIT_EXPECT_NULL(test, klist_next(&i)); 146362306a36Sopenharmony_ci 146462306a36Sopenharmony_ci klist_iter_exit(&i); 146562306a36Sopenharmony_ci 146662306a36Sopenharmony_ci} 146762306a36Sopenharmony_ci 146862306a36Sopenharmony_cistatic void klist_test_node_attached(struct kunit *test) 146962306a36Sopenharmony_ci{ 147062306a36Sopenharmony_ci struct klist_node a = {}; 147162306a36Sopenharmony_ci struct klist mylist; 147262306a36Sopenharmony_ci 147362306a36Sopenharmony_ci klist_init(&mylist, NULL, NULL); 147462306a36Sopenharmony_ci 147562306a36Sopenharmony_ci KUNIT_EXPECT_FALSE(test, klist_node_attached(&a)); 147662306a36Sopenharmony_ci klist_add_head(&a, &mylist); 147762306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, klist_node_attached(&a)); 147862306a36Sopenharmony_ci klist_del(&a); 147962306a36Sopenharmony_ci KUNIT_EXPECT_FALSE(test, klist_node_attached(&a)); 148062306a36Sopenharmony_ci 148162306a36Sopenharmony_ci} 148262306a36Sopenharmony_ci 148362306a36Sopenharmony_cistatic struct kunit_case klist_test_cases[] = { 148462306a36Sopenharmony_ci KUNIT_CASE(klist_test_add_tail), 148562306a36Sopenharmony_ci KUNIT_CASE(klist_test_add_head), 148662306a36Sopenharmony_ci KUNIT_CASE(klist_test_add_behind), 148762306a36Sopenharmony_ci KUNIT_CASE(klist_test_add_before), 148862306a36Sopenharmony_ci KUNIT_CASE(klist_test_del_refcount_greater_than_zero), 148962306a36Sopenharmony_ci KUNIT_CASE(klist_test_del_refcount_zero), 149062306a36Sopenharmony_ci KUNIT_CASE(klist_test_remove), 149162306a36Sopenharmony_ci KUNIT_CASE(klist_test_node_attached), 149262306a36Sopenharmony_ci {}, 149362306a36Sopenharmony_ci}; 149462306a36Sopenharmony_ci 149562306a36Sopenharmony_cistatic struct kunit_suite klist_test_module = { 149662306a36Sopenharmony_ci .name = "klist", 149762306a36Sopenharmony_ci .test_cases = klist_test_cases, 149862306a36Sopenharmony_ci}; 149962306a36Sopenharmony_ci 150062306a36Sopenharmony_cikunit_test_suites(&list_test_module, &hlist_test_module, &klist_test_module); 150162306a36Sopenharmony_ci 150262306a36Sopenharmony_ciMODULE_LICENSE("GPL v2"); 1503