test/hotspot/gtest/runtime/test_arguments.cpp
author coleenp
Tue, 31 Oct 2017 11:55:09 -0400
changeset 47765 b7c7428eaab9
parent 47216 71c04702a3d5
permissions -rw-r--r--
8189610: Reconcile jvm.h and all jvm_md.h between java.base and hotspot Summary: Removed hotspot version of jvm*h and jni*h files. Reviewed-by: ihse, mchung, dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
39621
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
     1
/*
46560
388aa8d67c80 8181449: Fix debug.hpp / globalDefinitions.hpp dependency inversion
kbarrett
parents: 41705
diff changeset
     2
 * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
39621
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
     4
 *
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
     7
 * published by the Free Software Foundation.
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
     8
 *
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    13
 * accompanied this code).
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    14
 *
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    18
 *
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    21
 * questions.
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    22
 */
41705
332239c052cc 8165687: Fix license and copyright headers in jd9 under hotspot/test
stsmirno
parents: 39621
diff changeset
    23
39621
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    24
#include "precompiled.hpp"
47765
b7c7428eaab9 8189610: Reconcile jvm.h and all jvm_md.h between java.base and hotspot
coleenp
parents: 47216
diff changeset
    25
#include "jvm.h"
b7c7428eaab9 8189610: Reconcile jvm.h and all jvm_md.h between java.base and hotspot
coleenp
parents: 47216
diff changeset
    26
#include "unittest.hpp"
39621
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    27
#include "runtime/arguments.hpp"
46625
edefffab74e2 8183552: Move align functions to align.hpp
stefank
parents: 46619
diff changeset
    28
#include "utilities/align.hpp"
39621
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    29
#include "utilities/globalDefinitions.hpp"
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    30
46616
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    31
class ArgumentsTest : public ::testing::Test {
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    32
public:
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    33
  static intx parse_xss_inner_annotated(const char* str, jint expected_err, const char* file, int line_number);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    34
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    35
  // Expose the private Arguments functions.
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    36
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    37
  static Arguments::ArgsRange check_memory_size(julong size, julong min_size, julong max_size) {
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    38
    return Arguments::check_memory_size(size, min_size, max_size);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    39
  }
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    40
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    41
  static jint parse_xss(const JavaVMOption* option, const char* tail, intx* out_ThreadStackSize) {
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    42
    return Arguments::parse_xss(option, tail, out_ThreadStackSize);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    43
  }
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    44
};
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    45
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    46
TEST_F(ArgumentsTest, atojulong) {
39621
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    47
  char ullong_max[32];
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    48
  int ret = jio_snprintf(ullong_max, sizeof(ullong_max), JULONG_FORMAT, ULLONG_MAX);
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    49
  ASSERT_NE(-1, ret);
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    50
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    51
  julong value;
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    52
  const char* invalid_strings[] = {
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    53
    "", "-1", "-100", " 1", "2 ", "3 2", "1.0",
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    54
    "0x4.5", "0x", "0x0x1" "0.001", "4e10", "e"
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    55
    "K", "M", "G", "1MB", "1KM", "AA", "0B",
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    56
    "18446744073709551615K", "17179869184G",
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    57
    "999999999999999999999999999999"
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    58
  };
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    59
  for (uint i = 0; i < ARRAY_SIZE(invalid_strings); i++) {
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    60
    ASSERT_FALSE(Arguments::atojulong(invalid_strings[i], &value))
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    61
        << "Invalid string '" << invalid_strings[i] << "' parsed without error.";
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    62
  }
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    63
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    64
  struct {
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    65
    const char* str;
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    66
    julong expected_value;
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    67
  } valid_strings[] = {
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    68
      { "0", 0 },
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    69
      { "4711", 4711 },
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    70
      { "1K", 1ULL * K },
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    71
      { "1k", 1ULL * K },
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    72
      { "2M", 2ULL * M },
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    73
      { "2m", 2ULL * M },
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    74
      { "4G", 4ULL * G },
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    75
      { "4g", 4ULL * G },
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    76
      { "0K", 0 },
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    77
      { ullong_max, ULLONG_MAX },
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    78
      { "0xcafebabe", 0xcafebabe },
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    79
      { "0XCAFEBABE", 0xcafebabe },
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    80
      { "0XCAFEbabe", 0xcafebabe },
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    81
      { "0x10K", 0x10 * K }
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    82
  };
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    83
  for (uint i = 0; i < ARRAY_SIZE(valid_strings); i++) {
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    84
    ASSERT_TRUE(Arguments::atojulong(valid_strings[i].str, &value))
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    85
        << "Valid string '" << valid_strings[i].str << "' did not parse.";
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    86
    ASSERT_EQ(valid_strings[i].expected_value, value);
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    87
  }
b475d96f8008 8159695: Arguments::atojulong() fails to detect overflows
mlarsson
parents:
diff changeset
    88
}
46616
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    89
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    90
TEST_F(ArgumentsTest, check_memory_size__min) {
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    91
  EXPECT_EQ(check_memory_size(999,  1000, max_uintx), Arguments::arg_too_small);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    92
  EXPECT_EQ(check_memory_size(1000, 1000, max_uintx), Arguments::arg_in_range);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    93
  EXPECT_EQ(check_memory_size(1001, 1000, max_uintx), Arguments::arg_in_range);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    94
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    95
  EXPECT_EQ(check_memory_size(max_intx - 2, max_intx - 1, max_uintx), Arguments::arg_too_small);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    96
  EXPECT_EQ(check_memory_size(max_intx - 1, max_intx - 1, max_uintx), Arguments::arg_in_range);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    97
  EXPECT_EQ(check_memory_size(max_intx - 0, max_intx - 1, max_uintx), Arguments::arg_in_range);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    98
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
    99
  EXPECT_EQ(check_memory_size(max_intx - 1, max_intx, max_uintx), Arguments::arg_too_small);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   100
  EXPECT_EQ(check_memory_size(max_intx    , max_intx, max_uintx), Arguments::arg_in_range);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   101
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   102
  NOT_LP64(
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   103
    EXPECT_EQ(check_memory_size((julong)max_intx + 1, max_intx, max_uintx), Arguments::arg_in_range);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   104
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   105
    EXPECT_EQ(check_memory_size(        max_intx - 1, (julong)max_intx + 1, max_uintx), Arguments::arg_too_small);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   106
    EXPECT_EQ(check_memory_size(        max_intx    , (julong)max_intx + 1, max_uintx), Arguments::arg_too_small);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   107
    EXPECT_EQ(check_memory_size((julong)max_intx + 1, (julong)max_intx + 1, max_uintx), Arguments::arg_in_range);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   108
    EXPECT_EQ(check_memory_size((julong)max_intx + 2, (julong)max_intx + 1, max_uintx), Arguments::arg_in_range);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   109
  );
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   110
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   111
  EXPECT_EQ(check_memory_size(max_uintx - 2, max_uintx - 1, max_uintx), Arguments::arg_too_small);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   112
  EXPECT_EQ(check_memory_size(max_uintx - 1, max_uintx - 1, max_uintx), Arguments::arg_in_range);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   113
  EXPECT_EQ(check_memory_size(max_uintx    , max_uintx - 1, max_uintx), Arguments::arg_in_range);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   114
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   115
  EXPECT_EQ(check_memory_size(max_uintx - 1, max_uintx, max_uintx), Arguments::arg_too_small);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   116
  EXPECT_EQ(check_memory_size(max_uintx    , max_uintx, max_uintx), Arguments::arg_in_range);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   117
}
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   118
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   119
TEST_F(ArgumentsTest, check_memory_size__max) {
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   120
  EXPECT_EQ(check_memory_size(max_uintx - 1, 1000, max_uintx), Arguments::arg_in_range);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   121
  EXPECT_EQ(check_memory_size(max_uintx    , 1000, max_uintx), Arguments::arg_in_range);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   122
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   123
  EXPECT_EQ(check_memory_size(max_intx - 2     , 1000, max_intx - 1), Arguments::arg_in_range);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   124
  EXPECT_EQ(check_memory_size(max_intx - 1     , 1000, max_intx - 1), Arguments::arg_in_range);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   125
  EXPECT_EQ(check_memory_size(max_intx         , 1000, max_intx - 1), Arguments::arg_too_big);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   126
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   127
  EXPECT_EQ(check_memory_size(max_intx - 1     , 1000, max_intx), Arguments::arg_in_range);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   128
  EXPECT_EQ(check_memory_size(max_intx         , 1000, max_intx), Arguments::arg_in_range);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   129
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   130
  NOT_LP64(
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   131
    EXPECT_EQ(check_memory_size((julong)max_intx + 1     , 1000, max_intx), Arguments::arg_too_big);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   132
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   133
    EXPECT_EQ(check_memory_size(        max_intx         , 1000, (julong)max_intx + 1), Arguments::arg_in_range);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   134
    EXPECT_EQ(check_memory_size((julong)max_intx + 1     , 1000, (julong)max_intx + 1), Arguments::arg_in_range);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   135
    EXPECT_EQ(check_memory_size((julong)max_intx + 2     , 1000, (julong)max_intx + 1), Arguments::arg_too_big);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   136
 );
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   137
}
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   138
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   139
// A random value - used to verify the output when parsing is expected to fail.
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   140
static const intx no_value = 4711;
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   141
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   142
inline intx ArgumentsTest::parse_xss_inner_annotated(const char* str, jint expected_err, const char* file, int line_number) {
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   143
  intx value = no_value;
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   144
  jint err = parse_xss(NULL /* Silence error messages */, str, &value);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   145
  EXPECT_EQ(err, expected_err) << "Failure from: " << file << ":" << line_number;
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   146
  return value;
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   147
}
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   148
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   149
// Wrapper around the help function - gives file and line number when a test failure occurs.
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   150
#define parse_xss_inner(str, expected_err) ArgumentsTest::parse_xss_inner_annotated(str, expected_err, __FILE__, __LINE__)
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   151
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   152
static intx calc_expected(julong small_xss_input) {
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   153
  assert(small_xss_input <= max_julong / 2, "Sanity");
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   154
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   155
  // Match code in arguments.cpp
46619
a3919f5e8d2b 8178499: Remove _ptr_ and _size_ infixes from align functions
stefank
parents: 46616
diff changeset
   156
  julong julong_ret = align_up_(small_xss_input, K) / K;
46616
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   157
  assert(julong_ret <= (julong)max_intx, "Overflow: " JULONG_FORMAT, julong_ret);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   158
  return (intx)julong_ret;
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   159
}
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   160
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   161
static char buff[100];
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   162
static char* to_string(julong value) {
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   163
  jio_snprintf(buff, sizeof(buff), JULONG_FORMAT, value);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   164
  return buff;
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   165
}
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   166
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   167
TEST_VM_F(ArgumentsTest, parse_xss) {
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   168
  // Test the maximum input value - should fail.
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   169
  {
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   170
    EXPECT_EQ(parse_xss_inner(to_string(max_julong), JNI_EINVAL), no_value);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   171
    NOT_LP64(EXPECT_EQ(parse_xss_inner(to_string(max_uintx), JNI_EINVAL), no_value));
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   172
  }
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   173
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   174
  // Test values "far" away from the uintx boundary,
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   175
  // but still beyond the max limit.
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   176
  {
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   177
    LP64_ONLY(EXPECT_EQ(parse_xss_inner(to_string(max_julong / 2), JNI_EINVAL), no_value));
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   178
    EXPECT_EQ(parse_xss_inner(to_string(INT_MAX),     JNI_EINVAL), no_value);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   179
  }
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   180
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   181
  // Test at and around the max limit.
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   182
  {
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   183
    EXPECT_EQ(parse_xss_inner(to_string(1 * M * K - 1), JNI_OK), calc_expected(1 * M * K - 1));
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   184
    EXPECT_EQ(parse_xss_inner(to_string(1 * M * K),     JNI_OK), calc_expected(1 * M * K));
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   185
    EXPECT_EQ(parse_xss_inner(to_string(1 * M * K + 1), JNI_EINVAL), no_value);
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   186
  }
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   187
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   188
  // Test value aligned both to K and vm_page_size.
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   189
  {
46619
a3919f5e8d2b 8178499: Remove _ptr_ and _size_ infixes from align functions
stefank
parents: 46616
diff changeset
   190
    EXPECT_TRUE(is_aligned(32 * M, K));
a3919f5e8d2b 8178499: Remove _ptr_ and _size_ infixes from align functions
stefank
parents: 46616
diff changeset
   191
    EXPECT_TRUE(is_aligned(32 * M, (size_t)os::vm_page_size()));
46616
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   192
    EXPECT_EQ(parse_xss_inner(to_string(32 * M), JNI_OK), (intx)(32 * M / K));
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   193
  }
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   194
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   195
  // Test around the min limit.
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   196
  {
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   197
    EXPECT_EQ(parse_xss_inner(to_string(0),     JNI_OK), calc_expected(0));
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   198
    EXPECT_EQ(parse_xss_inner(to_string(1),     JNI_OK), calc_expected(1));
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   199
    EXPECT_EQ(parse_xss_inner(to_string(K - 1), JNI_OK), calc_expected(K - 1));
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   200
    EXPECT_EQ(parse_xss_inner(to_string(K),     JNI_OK), calc_expected(K));
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   201
    EXPECT_EQ(parse_xss_inner(to_string(K + 1), JNI_OK), calc_expected(K + 1));
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   202
  }
66d452cca30f 8178491: -Xss and -XX:ThreadStackSize argument parsing truncates bits
stefank
parents: 46560
diff changeset
   203
}