Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(220)

Unified Diff: util/mac/mac_util_test.mm

Issue 473023002: Add mac_util, including MacOSXMinorVersion(), MacOSXVersion(), and MacModelAndBoard() (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: Improve documentation Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « util/mac/mac_util.cc ('k') | util/util.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: util/mac/mac_util_test.mm
diff --git a/util/mac/mac_util_test.mm b/util/mac/mac_util_test.mm
new file mode 100644
index 0000000000000000000000000000000000000000..5c1366fb53b2bbb60b47c4ce5e98d22345f5c030
--- /dev/null
+++ b/util/mac/mac_util_test.mm
@@ -0,0 +1,149 @@
+// Copyright 2014 The Crashpad Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "util/mac/mac_util.h"
+
+#import <Foundation/Foundation.h>
+#include <stdlib.h>
+
+#include <string>
+
+#include "base/mac/scoped_nsobject.h"
+#include "base/strings/stringprintf.h"
+#include "gtest/gtest.h"
+
+#ifdef __GLIBCXX__
+// When C++ exceptions are disabled, libstdc++ from GCC 4.2 defines |try| and
+// |catch| so as to allow exception-expecting C++ code to build properly when
+// language support for exceptions is not present. These macros interfere with
+// the use of |@try| and |@catch| in Objective-C files such as this one.
+// Undefine these macros here, after everything has been #included, since there
+// will be no C++ uses and only Objective-C uses from this point on.
+#undef try
+#undef catch
+#endif
+
+namespace {
+
+using namespace crashpad;
+
+// Runs /usr/bin/sw_vers with a single argument, |argument|, and places the
+// command’s standard output into |output| after stripping the trailing newline.
+// Fatal gtest assertions report tool failures, which the caller should check
+// for with testing::Test::HasFatalFailure().
+void SwVers(NSString* argument, std::string* output) {
+ @autoreleasepool {
+ base::scoped_nsobject<NSPipe> pipe([[NSPipe alloc] init]);
+ base::scoped_nsobject<NSTask> task([[NSTask alloc] init]);
+ [task setStandardOutput:pipe];
+ [task setLaunchPath:@"/usr/bin/sw_vers"];
+ [task setArguments:@[ argument ]];
+
+ @try {
+ [task launch];
+ }
+ @catch (NSException* exception) {
+ FAIL() << [[exception name] UTF8String] << ": "
+ << [[exception reason] UTF8String];
+ }
+
+ NSData* data = [[pipe fileHandleForReading] readDataToEndOfFile];
+ [task waitUntilExit];
+
+ ASSERT_EQ(NSTaskTerminationReasonExit, [task terminationReason]);
+ ASSERT_EQ(EXIT_SUCCESS, [task terminationStatus]);
+
+ output->assign(reinterpret_cast<const char*>([data bytes]), [data length]);
+
+ EXPECT_EQ('\n', output->at(output->size() - 1));
+ output->resize(output->size() - 1);
+ }
+}
+
+TEST(MacUtil, MacOSXVersion) {
+ int major;
+ int minor;
+ int bugfix;
+ std::string build;
+ bool server;
+ std::string version_string;
+ ASSERT_TRUE(
+ MacOSXVersion(&major, &minor, &bugfix, &build, &server, &version_string));
+
+ std::string version;
+ if (bugfix) {
+ version = base::StringPrintf("%d.%d.%d", major, minor, bugfix);
+ } else {
+ // 10.x.0 releases report their version string as simply 10.x.
+ version = base::StringPrintf("%d.%d", major, minor);
+ }
+
+ std::string expected_product_version;
+ SwVers(@"-productVersion", &expected_product_version);
+ if (Test::HasFatalFailure()) {
+ return;
+ }
+
+ EXPECT_EQ(expected_product_version, version);
+
+ std::string expected_build_version;
+ SwVers(@"-buildVersion", &expected_build_version);
+ if (Test::HasFatalFailure()) {
+ return;
+ }
+
+ EXPECT_EQ(expected_build_version, build);
+
+ std::string expected_product_name;
+ SwVers(@"-productName", &expected_product_name);
+ if (Test::HasFatalFailure()) {
+ return;
+ }
+
+ // Look for a space after the product name in the complete version string.
+ expected_product_name += ' ';
+ EXPECT_EQ(0u, version_string.find(expected_product_name));
+}
+
+TEST(MacUtil, MacOSXMinorVersion) {
+ // Make sure that MacOSXMinorVersion() and MacOSXVersion() agree. The two have
+ // their own distinct implementations, and the latter was checked against
+ // sw_vers above.
+ int major;
+ int minor;
+ int bugfix;
+ std::string build;
+ bool server;
+ std::string version_string;
+ ASSERT_TRUE(
+ MacOSXVersion(&major, &minor, &bugfix, &build, &server, &version_string));
+
+ EXPECT_EQ(minor, MacOSXMinorVersion());
+}
+
+TEST(MacUtil, MacModelAndBoard) {
+ // There’s not much that can be done to test these, so just make sure they’re
+ // not empty. The model could be compared against the parsed output of
+ // “system_profiler SPHardwareDataType”, but the board doesn’t show up
+ // anywhere other than the I/O Registry, and that’s exactly how
+ // MacModelAndBoard() gets the data, so it wouldn’t be a very useful test.
+ std::string model;
+ std::string board;
+ MacModelAndBoard(&model, &board);
+
+ EXPECT_FALSE(model.empty());
+ EXPECT_FALSE(board.empty());
+}
+
+} // namespace
« no previous file with comments | « util/mac/mac_util.cc ('k') | util/util.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698