Module Name:    src
Committed By:   christos
Date:           Wed Nov 16 17:46:16 UTC 2011

Modified Files:
        src/external/bsd/atf/dist/atf-c++/detail: text.cpp text.hpp
        src/external/bsd/atf/dist/atf-run: requirements.cpp test-program.cpp

Log Message:
PR/45619: jmmv: Allow atf tests to request a minimum amount of memory


To generate a diff of this commit:
cvs rdiff -u -r1.1.1.1 -r1.2 \
    src/external/bsd/atf/dist/atf-c++/detail/text.cpp \
    src/external/bsd/atf/dist/atf-c++/detail/text.hpp
cvs rdiff -u -r1.1.1.4 -r1.2 \
    src/external/bsd/atf/dist/atf-run/requirements.cpp
cvs rdiff -u -r1.10 -r1.11 src/external/bsd/atf/dist/atf-run/test-program.cpp

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/bsd/atf/dist/atf-c++/detail/text.cpp
diff -u src/external/bsd/atf/dist/atf-c++/detail/text.cpp:1.1.1.1 src/external/bsd/atf/dist/atf-c++/detail/text.cpp:1.2
--- src/external/bsd/atf/dist/atf-c++/detail/text.cpp:1.1.1.1	Wed Oct 20 05:14:21 2010
+++ src/external/bsd/atf/dist/atf-c++/detail/text.cpp	Wed Nov 16 12:46:16 2011
@@ -33,6 +33,7 @@ extern "C" {
 
 #include <cctype>
 #include <cstring>
+#include <cstdlib>
 
 extern "C" {
 #include "../../atf-c/error.h"
@@ -133,3 +134,12 @@ impl::to_bool(const std::string& str)
 
     return b;
 }
+
+int64_t
+impl::to_number(const std::string& str)
+{
+	int64_t num;
+	::dehumanize_number(str.c_str(), &num);
+	return num;
+}
+    
Index: src/external/bsd/atf/dist/atf-c++/detail/text.hpp
diff -u src/external/bsd/atf/dist/atf-c++/detail/text.hpp:1.1.1.1 src/external/bsd/atf/dist/atf-c++/detail/text.hpp:1.2
--- src/external/bsd/atf/dist/atf-c++/detail/text.hpp:1.1.1.1	Wed Oct 20 05:14:21 2010
+++ src/external/bsd/atf/dist/atf-c++/detail/text.hpp	Wed Nov 16 12:46:16 2011
@@ -106,6 +106,13 @@ bool to_bool(const std::string&);
 std::string to_lower(const std::string&);
 
 //!
+//! \brief Converts the given string to a number
+//!
+//! The string should be of the form ^[0-9]+[KMGT]$ or ^[0-9]$
+//!
+int64_t to_number(const std::string&);
+
+//!
 //! \brief Converts the given object to a string.
 //!
 //! Returns a string with the representation of the given object.  There

Index: src/external/bsd/atf/dist/atf-run/requirements.cpp
diff -u src/external/bsd/atf/dist/atf-run/requirements.cpp:1.1.1.4 src/external/bsd/atf/dist/atf-run/requirements.cpp:1.2
--- src/external/bsd/atf/dist/atf-run/requirements.cpp:1.1.1.4	Tue Jun 14 11:23:24 2011
+++ src/external/bsd/atf/dist/atf-run/requirements.cpp	Wed Nov 16 12:46:16 2011
@@ -29,6 +29,14 @@
 
 // TODO: We probably don't want to raise std::runtime_error for the errors
 // detected in this file.
+extern "C" {
+#include <sys/param.h>
+#include <sys/sysctl.h>
+};
+
+#include <cstdlib>
+#include <cstring>
+#include <cerrno>
 #include <stdexcept>
 
 #include "atf-c++/config.hpp"
@@ -185,6 +193,36 @@ check_user(const std::string& user, cons
                                  "require.user");
 }
 
+static
+std::string
+check_memory(const std::string& memory)
+{
+    // Make sure we have enough memory 
+    int64_t memneed = atf::text::to_number(memory);
+    int64_t memavail;
+    size_t len = sizeof(memavail);
+
+    if (::sysctlbyname("hw.usermem64", &memavail, &len, NULL, 0) == -1) {
+	const char *e = ::strerror(errno);
+	std::stringstream ss;
+	ss << "sysctl hw.usermem64 failed (" << e << ")";
+	return ss.str();
+    }
+
+    if (memavail < memneed) {
+	char avail[6], need[6];
+	::humanize_number(avail, sizeof(avail), memavail, "", HN_AUTOSCALE,
+	    HN_B | HN_NOSPACE);
+	::humanize_number(need, sizeof(need), memneed, "", HN_AUTOSCALE,
+	    HN_B | HN_NOSPACE);
+	std::stringstream ss;
+	ss << "available memory (" << avail <<
+	    ") is less than required (" << need << ")";
+	return ss.str();
+    }
+    return "";
+}
+
 } // anonymous namespace
 
 std::string
@@ -211,6 +249,8 @@ impl::check_requirements(const atf::test
             failure_reason = check_progs(value);
         else if (name == "require.user")
             failure_reason = check_user(value, config);
+	else if (name == "require.memory")
+            failure_reason = check_memory(value);
         else {
             // Unknown require.* properties are forbidden by the
             // application/X-atf-tp parser.

Index: src/external/bsd/atf/dist/atf-run/test-program.cpp
diff -u src/external/bsd/atf/dist/atf-run/test-program.cpp:1.10 src/external/bsd/atf/dist/atf-run/test-program.cpp:1.11
--- src/external/bsd/atf/dist/atf-run/test-program.cpp:1.10	Wed Jun 15 04:48:36 2011
+++ src/external/bsd/atf/dist/atf-run/test-program.cpp	Wed Nov 16 12:46:16 2011
@@ -418,6 +418,7 @@ detail::atf_tp_reader::validate_and_inse
 
     const std::string ident_regex = "^[_A-Za-z0-9]+$";
     const std::string integer_regex = "^[0-9]+$";
+    const std::string memory_regex = "^[0-9]+[KMGT]$";
 
     if (name == "descr") {
         // Any non-empty value is valid.
@@ -438,6 +439,12 @@ detail::atf_tp_reader::validate_and_inse
     } else if (name == "require.machine") {
     } else if (name == "require.progs") {
     } else if (name == "require.user") {
+    } else if (name == "require.memory") {
+        if (!atf::text::match(value, integer_regex) &&
+	    !atf::text::match(value, memory_regex))
+            throw parse_error(lineno, "The require.memory property requires"
+			      " an integer value or a string of the form"
+			      " <number>[KMGT]");
     } else if (name == "timeout") {
         if (!atf::text::match(value, integer_regex))
             throw parse_error(lineno, "The timeout property requires an integer"

Reply via email to