1972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// Copyright (c) 2013, Google Inc.
2972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// All rights reserved.
3972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org//
4972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// Redistribution and use in source and binary forms, with or without
5972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// modification, are permitted provided that the following conditions are
6972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// met:
7972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org//
8972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org//     * Redistributions of source code must retain the above copyright
9972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// notice, this list of conditions and the following disclaimer.
10972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org//     * Redistributions in binary form must reproduce the above
11972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// copyright notice, this list of conditions and the following disclaimer
12972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// in the documentation and/or other materials provided with the
13972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// distribution.
14972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org//     * Neither the name of Google Inc. nor the names of its
15972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// contributors may be used to endorse or promote products derived from
16972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// this software without specific prior written permission.
17972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org//
18972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
30972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org#include <stdlib.h>
31972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org#include <unistd.h>
32972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org#include <sys/types.h>
33972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org#include <stdio.h>
34972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org#include <errno.h>
35972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org#include <string.h>
36972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
37972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org#include "breakpad_googletest_includes.h"
38972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org#include "client/linux/minidump_writer/cpu_set.h"
390cd0f17fd73c3e0619d5506afbee284dc46d3ad7mark@chromium.org#include "common/linux/tests/auto_testfile.h"
40972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
41972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgusing namespace google_breakpad;
42972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
43972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgnamespace {
44972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
45972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgtypedef testing::Test CpuSetTest;
46972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
47972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// Helper class to write test text file to a temporary file and return
48972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// its file descriptor.
49972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgclass ScopedTestFile : public AutoTestFile {
50972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgpublic:
51972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  explicit ScopedTestFile(const char* text)
52972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    : AutoTestFile("cpu_set", text) {
53972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  }
54972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org};
55972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
56972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
57972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
58972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgTEST(CpuSetTest, EmptyCount) {
59972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  CpuSet set;
60972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_EQ(0, set.GetCount());
61972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
62972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
63972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgTEST(CpuSetTest, OneCpu) {
64972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ScopedTestFile file("10");
65972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(file.IsOk());
66972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
67972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  CpuSet set;
68972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(set.ParseSysFile(file.GetFd()));
69972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_EQ(1, set.GetCount());
70972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
71972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
72972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgTEST(CpuSetTest, OneCpuTerminated) {
73972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ScopedTestFile file("10\n");
74972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(file.IsOk());
75972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
76972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  CpuSet set;
77972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(set.ParseSysFile(file.GetFd()));
78972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_EQ(1, set.GetCount());
79972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
80972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
81972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgTEST(CpuSetTest, TwoCpusWithComma) {
82972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ScopedTestFile file("1,10");
83972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(file.IsOk());
84972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
85972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  CpuSet set;
86972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(set.ParseSysFile(file.GetFd()));
87972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_EQ(2, set.GetCount());
88972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
89972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
90972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgTEST(CpuSetTest, TwoCpusWithRange) {
91972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ScopedTestFile file("1-2");
92972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(file.IsOk());
93972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
94972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  CpuSet set;
95972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(set.ParseSysFile(file.GetFd()));
96972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_EQ(2, set.GetCount());
97972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
98972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
99972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgTEST(CpuSetTest, TenCpusWithRange) {
100972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ScopedTestFile file("9-18");
101972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(file.IsOk());
102972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
103972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  CpuSet set;
104972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(set.ParseSysFile(file.GetFd()));
105972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_EQ(10, set.GetCount());
106972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
107972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
108972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgTEST(CpuSetTest, MultiItems) {
109972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ScopedTestFile file("0, 2-4, 128");
110972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(file.IsOk());
111972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
112972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  CpuSet set;
113972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(set.ParseSysFile(file.GetFd()));
114972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_EQ(5, set.GetCount());
115972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
116972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
117972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgTEST(CpuSetTest, IntersectWith) {
118972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ScopedTestFile file1("9-19");
119972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(file1.IsOk());
120972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  CpuSet set1;
121972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(set1.ParseSysFile(file1.GetFd()));
122972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_EQ(11, set1.GetCount());
123972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
124972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ScopedTestFile file2("16-24");
125972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(file2.IsOk());
126972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  CpuSet set2;
127972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(set2.ParseSysFile(file2.GetFd()));
128972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_EQ(9, set2.GetCount());
129972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
130972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  set1.IntersectWith(set2);
131972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_EQ(4, set1.GetCount());
132972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_EQ(9, set2.GetCount());
133972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
134972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
135972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgTEST(CpuSetTest, SelfIntersection) {
136972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ScopedTestFile file1("9-19");
137972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(file1.IsOk());
138972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  CpuSet set1;
139972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(set1.ParseSysFile(file1.GetFd()));
140972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_EQ(11, set1.GetCount());
141972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
142972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  set1.IntersectWith(set1);
143972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_EQ(11, set1.GetCount());
144972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
145972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
146972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgTEST(CpuSetTest, EmptyIntersection) {
147972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ScopedTestFile file1("0-19");
148972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(file1.IsOk());
149972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  CpuSet set1;
150972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(set1.ParseSysFile(file1.GetFd()));
151972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_EQ(20, set1.GetCount());
152972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
153972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ScopedTestFile file2("20-39");
154972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(file2.IsOk());
155972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  CpuSet set2;
156972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(set2.ParseSysFile(file2.GetFd()));
157972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_EQ(20, set2.GetCount());
158972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
159972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  set1.IntersectWith(set2);
160972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_EQ(0, set1.GetCount());
161972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
162972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_EQ(20, set2.GetCount());
163972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
164972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
165