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