Fix copyright lines
[folly.git] / folly / synchronization / test / AtomicStructTest.cpp
1 /*
2  * Copyright 2013-present Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <folly/synchronization/AtomicStruct.h>
18
19 #include <folly/portability/GTest.h>
20
21 using namespace folly;
22
23 struct TwoBy32 {
24   uint32_t left;
25   uint32_t right;
26 };
27
28 TEST(AtomicStruct, two_by_32) {
29   AtomicStruct<TwoBy32> a(TwoBy32{ 10, 20 });
30   TwoBy32 av = a;
31   EXPECT_EQ(av.left, 10);
32   EXPECT_EQ(av.right, 20);
33   EXPECT_TRUE(a.compare_exchange_strong(av, TwoBy32{ 30, 40 }));
34   EXPECT_FALSE(a.compare_exchange_weak(av, TwoBy32{ 31, 41 }));
35   EXPECT_EQ(av.left, 30);
36   EXPECT_TRUE(a.is_lock_free());
37   auto b = a.exchange(TwoBy32{ 50, 60 });
38   EXPECT_EQ(b.left, 30);
39   EXPECT_EQ(b.right, 40);
40   EXPECT_EQ(a.load().left, 50);
41   a = TwoBy32{ 70, 80 };
42   EXPECT_EQ(a.load().right, 80);
43   a.store(TwoBy32{ 90, 100 });
44   av = a;
45   EXPECT_EQ(av.left, 90);
46   AtomicStruct<TwoBy32> c;
47   c = b;
48   EXPECT_EQ(c.load().right, 40);
49 }
50
51 TEST(AtomicStruct, size_selection) {
52   struct S1 { char x[1]; };
53   struct S2 { char x[2]; };
54   struct S3 { char x[3]; };
55   struct S4 { char x[4]; };
56   struct S5 { char x[5]; };
57   struct S6 { char x[6]; };
58   struct S7 { char x[7]; };
59   struct S8 { char x[8]; };
60
61   EXPECT_EQ(sizeof(AtomicStruct<S1>), 1);
62   EXPECT_EQ(sizeof(AtomicStruct<S2>), 2);
63   EXPECT_EQ(sizeof(AtomicStruct<S3>), 4);
64   EXPECT_EQ(sizeof(AtomicStruct<S4>), 4);
65   EXPECT_EQ(sizeof(AtomicStruct<S5>), 8);
66   EXPECT_EQ(sizeof(AtomicStruct<S6>), 8);
67   EXPECT_EQ(sizeof(AtomicStruct<S7>), 8);
68   EXPECT_EQ(sizeof(AtomicStruct<S8>), 8);
69 }