From 4cbf0ef630b6393e662c0fbb555e6c6c85d4eb51 Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Wed, 16 Apr 2014 21:38:01 -0700 Subject: [PATCH] Bug 998067: Add utility code for making it easier to create GTests based on NSS, r=keeler --HG-- extra : rebase_source : 8ae08d1ccc9329aa567cfc7ac590ddb026155bae --- security/pkix/test/gtest/moz.build | 1 + security/pkix/test/gtest/nssgtest.cpp | 71 ++++++++++++++++++++++++ security/pkix/test/gtest/nssgtest.h | 79 +++++++++++++++++++++++++++ 3 files changed, 151 insertions(+) create mode 100644 security/pkix/test/gtest/nssgtest.cpp create mode 100644 security/pkix/test/gtest/nssgtest.h diff --git a/security/pkix/test/gtest/moz.build b/security/pkix/test/gtest/moz.build index 8e2f91d4ba0e..610e01f91c4f 100644 --- a/security/pkix/test/gtest/moz.build +++ b/security/pkix/test/gtest/moz.build @@ -7,6 +7,7 @@ LIBRARY_NAME = 'mozillapkix_gtest' SOURCES += [ + 'nssgtest.cpp', 'pkixder_input_tests.cpp', 'pkixder_pki_types_tests.cpp', 'pkixder_universal_types_tests.cpp', diff --git a/security/pkix/test/gtest/nssgtest.cpp b/security/pkix/test/gtest/nssgtest.cpp new file mode 100644 index 000000000000..2b130149f6f9 --- /dev/null +++ b/security/pkix/test/gtest/nssgtest.cpp @@ -0,0 +1,71 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* Copyright 2013 Mozilla Foundation + * + * 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 "nssgtest.h" + +using namespace std; +using namespace testing; + +namespace mozilla { namespace pkix { namespace test { + +ostream& +operator<<(ostream& os, SECStatusWithPRErrorCode const& value) +{ + switch (value.mRv) + { + case SECSuccess: + os << "SECSuccess"; + break; + case SECWouldBlock: + os << "SECWouldBlock"; + break; + case SECFailure: + os << "SECFailure"; + break; + default: + os << "[Invalid SECStatus: " << static_cast(value.mRv) << ']'; + break; + } + + if (value.mRv != SECSuccess) { + os << '('; + const char* name = PR_ErrorToName(value.mErrorCode); + if (name) { + os << name; + } else { + os << value.mErrorCode; + } + os << ')'; + } + + return os; +} + +AssertionResult +Pred_SECFailure(const char* expectedExpr, const char* actualExpr, + PRErrorCode expectedErrorCode, SECStatus actual) +{ + if (SECFailure == actual && expectedErrorCode == PR_GetError()) { + return AssertionSuccess(); + } + + return AssertionFailure() + << "Expected: (" << expectedExpr << ") == (" << actualExpr + << "), actual: " << SECFailure << " != " << actual; +} + +} } } // namespace mozilla::pkix::test diff --git a/security/pkix/test/gtest/nssgtest.h b/security/pkix/test/gtest/nssgtest.h new file mode 100644 index 000000000000..87522c272332 --- /dev/null +++ b/security/pkix/test/gtest/nssgtest.h @@ -0,0 +1,79 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* Copyright 2013 Mozilla Foundation + * + * 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. + */ + +#ifndef mozilla_pkix__nssgtest_h +#define mozilla_pkix__nssgtest_h + +#include "stdint.h" +#include "gtest/gtest.h" +#include "prerror.h" +#include "seccomon.h" + +namespace mozilla { namespace pkix { namespace test { + +class SECStatusWithPRErrorCode +{ +public: + SECStatusWithPRErrorCode(SECStatus rv, PRErrorCode errorCode) + : mRv(rv) + , mErrorCode(errorCode) + { + } + + SECStatusWithPRErrorCode(SECStatus rv) + : mRv(rv) + , mErrorCode(rv == SECSuccess ? 0 : PR_GetError()) + { + } + + bool operator==(const SECStatusWithPRErrorCode& other) const + { + return mRv == other.mRv && mErrorCode == other.mErrorCode; + } + +private: + const SECStatus mRv; + const PRErrorCode mErrorCode; + + friend std::ostream& operator<<(std::ostream& os, + SECStatusWithPRErrorCode const& value); + + void operator=(const SECStatusWithPRErrorCode&) /*delete*/; +}; + +::std::ostream& operator<<(::std::ostream&, + SECStatusWithPRErrorCode const&); + +} } } // namespace mozilla::pkix::test + +#define ASSERT_SECSuccess(rv) \ + ASSERT_EQ(::mozilla::pkix::test::SECStatusWithPRErrorCode(SECSuccess, 0), \ + ::mozilla::pkix::test::SECStatusWithPRErrorCode(rv)) +#define EXPECT_SECSuccess(rv) \ + EXPECT_EQ(::mozilla::pkix::test::SECStatusWithPRErrorCode(SECSuccess, 0), \ + ::mozilla::pkix::test::SECStatusWithPRErrorCode(rv)) + +#define ASSERT_SECFailure(expectedError, rv) \ + ASSERT_EQ(::mozilla::pkix::test::SECStatusWithPRErrorCode(SECFailure, \ + expectedError), \ + ::mozilla::pkix::test::SECStatusWithPRErrorCode(rv)) +#define EXPECT_SECFailure(expectedError, rv) \ + EXPECT_EQ(::mozilla::pkix::test::SECStatusWithPRErrorCode(SECFailure, \ + expectedError), \ + ::mozilla::pkix::test::SECStatusWithPRErrorCode(rv)) + +#endif // mozilla_pkix__nssgtest_h