1 // Copyright (c) 2013, Google Inc.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
6 // met:
7 //
8 //     * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 //     * Redistributions in binary form must reproduce the above
11 // copyright notice, this list of conditions and the following disclaimer
12 // in the documentation and/or other materials provided with the
13 // distribution.
14 //     * Neither the name of Google Inc. nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 
30 #include <stdlib.h>
31 #include <unistd.h>
32 #include <sys/types.h>
33 #include <stdio.h>
34 #include <errno.h>
35 #include <string.h>
36 
37 #include "breakpad_googletest_includes.h"
38 #include "client/linux/minidump_writer/cpu_set.h"
39 #include "common/linux/tests/auto_testfile.h"
40 
41 using namespace google_breakpad;
42 
43 namespace {
44 
45 typedef testing::Test CpuSetTest;
46 
47 // Helper class to write test text file to a temporary file and return
48 // its file descriptor.
49 class ScopedTestFile : public AutoTestFile {
50 public:
ScopedTestFile(const char * text)51   explicit ScopedTestFile(const char* text)
52     : AutoTestFile("cpu_set", text) {
53   }
54 };
55 
56 }
57 
TEST(CpuSetTest,EmptyCount)58 TEST(CpuSetTest, EmptyCount) {
59   CpuSet set;
60   ASSERT_EQ(0, set.GetCount());
61 }
62 
TEST(CpuSetTest,OneCpu)63 TEST(CpuSetTest, OneCpu) {
64   ScopedTestFile file("10");
65   ASSERT_TRUE(file.IsOk());
66 
67   CpuSet set;
68   ASSERT_TRUE(set.ParseSysFile(file.GetFd()));
69   ASSERT_EQ(1, set.GetCount());
70 }
71 
TEST(CpuSetTest,OneCpuTerminated)72 TEST(CpuSetTest, OneCpuTerminated) {
73   ScopedTestFile file("10\n");
74   ASSERT_TRUE(file.IsOk());
75 
76   CpuSet set;
77   ASSERT_TRUE(set.ParseSysFile(file.GetFd()));
78   ASSERT_EQ(1, set.GetCount());
79 }
80 
TEST(CpuSetTest,TwoCpusWithComma)81 TEST(CpuSetTest, TwoCpusWithComma) {
82   ScopedTestFile file("1,10");
83   ASSERT_TRUE(file.IsOk());
84 
85   CpuSet set;
86   ASSERT_TRUE(set.ParseSysFile(file.GetFd()));
87   ASSERT_EQ(2, set.GetCount());
88 }
89 
TEST(CpuSetTest,TwoCpusWithRange)90 TEST(CpuSetTest, TwoCpusWithRange) {
91   ScopedTestFile file("1-2");
92   ASSERT_TRUE(file.IsOk());
93 
94   CpuSet set;
95   ASSERT_TRUE(set.ParseSysFile(file.GetFd()));
96   ASSERT_EQ(2, set.GetCount());
97 }
98 
TEST(CpuSetTest,TenCpusWithRange)99 TEST(CpuSetTest, TenCpusWithRange) {
100   ScopedTestFile file("9-18");
101   ASSERT_TRUE(file.IsOk());
102 
103   CpuSet set;
104   ASSERT_TRUE(set.ParseSysFile(file.GetFd()));
105   ASSERT_EQ(10, set.GetCount());
106 }
107 
TEST(CpuSetTest,MultiItems)108 TEST(CpuSetTest, MultiItems) {
109   ScopedTestFile file("0, 2-4, 128");
110   ASSERT_TRUE(file.IsOk());
111 
112   CpuSet set;
113   ASSERT_TRUE(set.ParseSysFile(file.GetFd()));
114   ASSERT_EQ(5, set.GetCount());
115 }
116 
TEST(CpuSetTest,IntersectWith)117 TEST(CpuSetTest, IntersectWith) {
118   ScopedTestFile file1("9-19");
119   ASSERT_TRUE(file1.IsOk());
120   CpuSet set1;
121   ASSERT_TRUE(set1.ParseSysFile(file1.GetFd()));
122   ASSERT_EQ(11, set1.GetCount());
123 
124   ScopedTestFile file2("16-24");
125   ASSERT_TRUE(file2.IsOk());
126   CpuSet set2;
127   ASSERT_TRUE(set2.ParseSysFile(file2.GetFd()));
128   ASSERT_EQ(9, set2.GetCount());
129 
130   set1.IntersectWith(set2);
131   ASSERT_EQ(4, set1.GetCount());
132   ASSERT_EQ(9, set2.GetCount());
133 }
134 
TEST(CpuSetTest,SelfIntersection)135 TEST(CpuSetTest, SelfIntersection) {
136   ScopedTestFile file1("9-19");
137   ASSERT_TRUE(file1.IsOk());
138   CpuSet set1;
139   ASSERT_TRUE(set1.ParseSysFile(file1.GetFd()));
140   ASSERT_EQ(11, set1.GetCount());
141 
142   set1.IntersectWith(set1);
143   ASSERT_EQ(11, set1.GetCount());
144 }
145 
TEST(CpuSetTest,EmptyIntersection)146 TEST(CpuSetTest, EmptyIntersection) {
147   ScopedTestFile file1("0-19");
148   ASSERT_TRUE(file1.IsOk());
149   CpuSet set1;
150   ASSERT_TRUE(set1.ParseSysFile(file1.GetFd()));
151   ASSERT_EQ(20, set1.GetCount());
152 
153   ScopedTestFile file2("20-39");
154   ASSERT_TRUE(file2.IsOk());
155   CpuSet set2;
156   ASSERT_TRUE(set2.ParseSysFile(file2.GetFd()));
157   ASSERT_EQ(20, set2.GetCount());
158 
159   set1.IntersectWith(set2);
160   ASSERT_EQ(0, set1.GetCount());
161 
162   ASSERT_EQ(20, set2.GetCount());
163 }
164 
165