brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.8 KiB · 6344423 Raw
189 lines · cpp
1//===-- sanitizer_list_test.cpp -------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file is a part of ThreadSanitizer/AddressSanitizer runtime.10//11//===----------------------------------------------------------------------===//12#include "sanitizer_common/sanitizer_list.h"13#include "gtest/gtest.h"14 15namespace __sanitizer {16 17struct ListItem {18  ListItem *next;19};20 21typedef IntrusiveList<ListItem> List;22 23static List static_list;24 25static void SetList(List *l, ListItem *x = 0,26                    ListItem *y = 0, ListItem *z = 0) {27  l->clear();28  if (x) l->push_back(x);29  if (y) l->push_back(y);30  if (z) l->push_back(z);31}32 33static void CheckList(List *l, ListItem *i1, ListItem *i2 = 0, ListItem *i3 = 0,34                      ListItem *i4 = 0, ListItem *i5 = 0, ListItem *i6 = 0) {35  if (i1) {36    CHECK_EQ(l->front(), i1);37    l->pop_front();38  }39  if (i2) {40    CHECK_EQ(l->front(), i2);41    l->pop_front();42  }43  if (i3) {44    CHECK_EQ(l->front(), i3);45    l->pop_front();46  }47  if (i4) {48    CHECK_EQ(l->front(), i4);49    l->pop_front();50  }51  if (i5) {52    CHECK_EQ(l->front(), i5);53    l->pop_front();54  }55  if (i6) {56    CHECK_EQ(l->front(), i6);57    l->pop_front();58  }59  CHECK(l->empty());60}61 62TEST(SanitizerCommon, IntrusiveList) {63  ListItem items[6];64  CHECK_EQ(static_list.size(), 0);65 66  List l;67  l.clear();68 69  ListItem *x = &items[0];70  ListItem *y = &items[1];71  ListItem *z = &items[2];72  ListItem *a = &items[3];73  ListItem *b = &items[4];74  ListItem *c = &items[5];75 76  CHECK_EQ(l.size(), 0);77  l.push_back(x);78  CHECK_EQ(l.size(), 1);79  CHECK_EQ(l.back(), x);80  CHECK_EQ(l.front(), x);81  l.pop_front();82  CHECK(l.empty());83  l.CheckConsistency();84 85  l.push_front(x);86  CHECK_EQ(l.size(), 1);87  CHECK_EQ(l.back(), x);88  CHECK_EQ(l.front(), x);89  l.pop_front();90  CHECK(l.empty());91  l.CheckConsistency();92 93  l.push_front(x);94  l.push_front(y);95  l.push_front(z);96  CHECK_EQ(l.size(), 3);97  CHECK_EQ(l.front(), z);98  CHECK_EQ(l.back(), x);99  l.CheckConsistency();100 101  l.pop_front();102  CHECK_EQ(l.size(), 2);103  CHECK_EQ(l.front(), y);104  CHECK_EQ(l.back(), x);105  l.pop_front();106  l.pop_front();107  CHECK(l.empty());108  l.CheckConsistency();109 110  l.push_back(x);111  l.push_back(y);112  l.push_back(z);113  CHECK_EQ(l.size(), 3);114  CHECK_EQ(l.front(), x);115  CHECK_EQ(l.back(), z);116  l.CheckConsistency();117 118  l.pop_front();119  CHECK_EQ(l.size(), 2);120  CHECK_EQ(l.front(), y);121  CHECK_EQ(l.back(), z);122  l.pop_front();123  l.pop_front();124  CHECK(l.empty());125  l.CheckConsistency();126 127  l.push_back(x);128  l.push_back(y);129  l.push_back(z);130  l.extract(x, y);131  CHECK_EQ(l.size(), 2);132  CHECK_EQ(l.front(), x);133  CHECK_EQ(l.back(), z);134  l.CheckConsistency();135  l.extract(x, z);136  CHECK_EQ(l.size(), 1);137  CHECK_EQ(l.front(), x);138  CHECK_EQ(l.back(), x);139  l.CheckConsistency();140  l.pop_front();141  CHECK(l.empty());142 143  List l1, l2;144  l1.clear();145  l2.clear();146 147  l1.append_front(&l2);148  CHECK(l1.empty());149  CHECK(l2.empty());150 151  l1.append_back(&l2);152  CHECK(l1.empty());153  CHECK(l2.empty());154 155  SetList(&l1, x);156  CheckList(&l1, x);157 158  SetList(&l1, x, y, z);159  SetList(&l2, a, b, c);160  l1.append_back(&l2);161  CheckList(&l1, x, y, z, a, b, c);162  CHECK(l2.empty());163 164  SetList(&l1, x, y);165  SetList(&l2);166  l1.append_front(&l2);167  CheckList(&l1, x, y);168  CHECK(l2.empty());169}170 171TEST(SanitizerCommon, IntrusiveListAppendEmpty) {172  ListItem i;173  List l;174  l.clear();175  l.push_back(&i);176  List l2;177  l2.clear();178  l.append_back(&l2);179  CHECK_EQ(l.back(), &i);180  CHECK_EQ(l.front(), &i);181  CHECK_EQ(l.size(), 1);182  l.append_front(&l2);183  CHECK_EQ(l.back(), &i);184  CHECK_EQ(l.front(), &i);185  CHECK_EQ(l.size(), 1);186}187 188}  // namespace __sanitizer189