1 // Copyright 2023 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifdef UNSAFE_BUFFERS_BUILD
6 // TODO(crbug.com/341324165): Fix and remove.
7 #pragma allow_unsafe_buffers
8 #endif
9
10 #include "base/memory/raw_span.h"
11
12 #include "testing/gmock/include/gmock/gmock.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 // This file contains tests related to raw_span, to show that they
16 // convert to span.
17
TEST(RawSpan,ConvertToSpan)18 TEST(RawSpan, ConvertToSpan) {
19 int arr[3] = {100, 101, 102};
20 base::raw_span<int> span1(arr);
21 base::span<int> span2(span1);
22 base::span<int> span3;
23 span3 = span1;
24
25 EXPECT_THAT(span1, ::testing::ElementsAre(100, 101, 102));
26 EXPECT_THAT(span2, ::testing::ElementsAre(100, 101, 102));
27 EXPECT_THAT(span3, ::testing::ElementsAre(100, 101, 102));
28 }
29
TEST(RawSpan,ConvertFromSpan)30 TEST(RawSpan, ConvertFromSpan) {
31 int arr[3] = {100, 101, 102};
32 base::span<int> span1(arr);
33 base::raw_span<int> span2(span1);
34 base::raw_span<int> span3;
35 span3 = span1;
36
37 EXPECT_THAT(span1, ::testing::ElementsAre(100, 101, 102));
38 EXPECT_THAT(span2, ::testing::ElementsAre(100, 101, 102));
39 EXPECT_THAT(span3, ::testing::ElementsAre(100, 101, 102));
40 }
41
TEST(RawSpan,UnderstandsDanglingAttribute)42 TEST(RawSpan, UnderstandsDanglingAttribute) {
43 // Test passes if it doesn't trip Dangling Ptr Detectors.
44 int* arr = new int[3];
45 base::raw_span<int, DisableDanglingPtrDetection> span(arr, 3u);
46 delete[] span.data();
47 }
48
TEST(RawSpan,ExtractAsDangling)49 TEST(RawSpan, ExtractAsDangling) {
50 // Test passes if it doesn't trip Dangling Ptr Detectors.
51 int* arr = new int[3];
52 base::raw_span<int> span(arr, 3u);
53 delete[] base::ExtractAsDanglingSpan(span).data();
54 }
55
TEST(RawSpan,SameSlotAssignmentWhenDangling)56 TEST(RawSpan, SameSlotAssignmentWhenDangling) {
57 int* arr = new int[3];
58 base::raw_span<int, DisableDanglingPtrDetection> span(arr, 3u);
59 delete[] arr; // Make the pointer dangle.
60
61 // This test is designed to test for crbug.com/347461704, but as #comment13
62 // explains, `raw_span<>` doesn't exhibit the suspected buggy behavior. Keep
63 // the test just in case the implementation changes in the future.
64 span = span.subspan<1>();
65 }
66