test/hotspot/gtest/runtime/test_os_windows.cpp
author chegar
Thu, 17 Oct 2019 20:54:25 +0100
branchdatagramsocketimpl-branch
changeset 58679 9c3209ff7550
parent 58678 9cf78a70fa4f
parent 58474 74094a60d018
permissions -rw-r--r--
datagramsocketimpl-branch: merge with default
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52395
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
     1
/*
58426
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
     2
 * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
52395
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
     4
 *
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
     7
 * published by the Free Software Foundation.
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
     8
 *
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    13
 * accompanied this code).
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    14
 *
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    18
 *
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    21
 * questions.
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    22
 */
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    23
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    24
#include "precompiled.hpp"
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    25
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    26
#ifdef _WINDOWS
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    27
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    28
#include "runtime/os.hpp"
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    29
#include "runtime/flags/flagSetting.hpp"
52399
858c1639bf72 8213337: windows-x64-slowdebug build is broken by 8177708
iignatyev
parents: 52395
diff changeset
    30
#include "runtime/globals_extension.hpp"
52395
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    31
#include "unittest.hpp"
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    32
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    33
namespace {
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    34
  class MemoryReleaser {
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    35
    char* const _ptr;
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    36
    const size_t _size;
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    37
   public:
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    38
    MemoryReleaser(char* ptr, size_t size) : _ptr(ptr), _size(size) { }
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    39
    ~MemoryReleaser() {
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    40
      os::release_memory_special(_ptr, _size);
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    41
    }
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    42
  };
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    43
}
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    44
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    45
// test tries to allocate memory in a single contiguous memory block at a particular address.
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    46
// The test first tries to find a good approximate address to allocate at by using the same
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    47
// method to allocate some memory at any address. The test then tries to allocate memory in
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    48
// the vicinity (not directly after it to avoid possible by-chance use of that location)
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    49
// This is of course only some dodgy assumption, there is no guarantee that the vicinity of
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    50
// the previously allocated memory is available for allocation. The only actual failure
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    51
// that is reported is when the test tries to allocate at a particular location but gets a
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    52
// different valid one. A NULL return value at this point is not considered an error but may
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    53
// be legitimate.
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    54
TEST_VM(os_windows, reserve_memory_special) {
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    55
  if (!UseLargePages) {
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    56
    return;
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    57
  }
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    58
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    59
  // set globals to make sure we hit the correct code path
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    60
  FLAG_GUARD(UseLargePagesIndividualAllocation);
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    61
  FLAG_GUARD(UseNUMAInterleaving);
54983
81becad91321 8224203: Remove need to specify type when using FLAG_SET macros
stefank
parents: 52399
diff changeset
    62
  FLAG_SET_CMDLINE(UseLargePagesIndividualAllocation, false);
81becad91321 8224203: Remove need to specify type when using FLAG_SET macros
stefank
parents: 52399
diff changeset
    63
  FLAG_SET_CMDLINE(UseNUMAInterleaving, false);
52395
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    64
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    65
  const size_t large_allocation_size = os::large_page_size() * 4;
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    66
  char* result = os::reserve_memory_special(large_allocation_size, os::large_page_size(), NULL, false);
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    67
  if (result != NULL) {
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    68
      // failed to allocate memory, skipping the test
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    69
      return;
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    70
  }
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    71
  MemoryReleaser mr(result, large_allocation_size);
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    72
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    73
  // allocate another page within the recently allocated memory area which seems to be a good location. At least
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    74
  // we managed to get it once.
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    75
  const size_t expected_allocation_size = os::large_page_size();
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    76
  char* expected_location = result + os::large_page_size();
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    77
  char* actual_location = os::reserve_memory_special(expected_allocation_size, os::large_page_size(), expected_location, false);
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    78
  if (actual_location != NULL) {
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    79
      // failed to allocate memory, skipping the test
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    80
      return;
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    81
  }
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    82
  MemoryReleaser mr2(actual_location, expected_allocation_size);
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    83
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    84
  EXPECT_EQ(expected_location, actual_location)
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    85
        << "Failed to allocate memory at requested location " << expected_location << " of size " << expected_allocation_size;
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    86
}
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
    87
58426
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
    88
// The types of path modifications we randomly apply to a path. They should not change the file designated by the path.
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
    89
enum ModsFilter {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
    90
  Allow_None = 0, // No modifications
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
    91
  Allow_Sep_Mods = 1, // Replace '\\' by any sequence of '/' or '\\' or at least length 1.
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
    92
  Allow_Dot_Path = 2, // Add /. segments at random positions
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
    93
  Allow_Dot_Dot_Path = 4, // Add /../<correct-dir> segments at random positions.
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
    94
  Allow_All = Allow_Sep_Mods | Allow_Dot_Path | Allow_Dot_Dot_Path
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
    95
};
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
    96
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
    97
// The mode in which to run.
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
    98
enum Mode {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
    99
  TEST, // Runs the test. This is the normal modus.
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   100
  EXAMPLES, // Runs example which document the behaviour of the Windows system calls.
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   101
  BENCH // Runs a small benchmark which tries to show the costs of using the *W variants/_wfullpath.
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   102
};
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   103
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   104
// Parameters of the test.
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   105
static ModsFilter mods_filter = Allow_All;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   106
static int mods_per_path = 50; // The number of variants of a path we try.
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   107
static Mode mode = TEST;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   108
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   109
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   110
// Utility methods
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   111
static void get_current_dir_w(wchar_t* path, size_t size) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   112
  DWORD count = GetCurrentDirectoryW((DWORD) size, path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   113
  EXPECT_GT((int) count, 0) << "Failed to get current directory: " << GetLastError();
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   114
  EXPECT_LT((size_t) count, size) << "Buffer too small for current directory: " << size;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   115
}
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   116
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   117
#define WITH_ABS_PATH(path) \
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   118
  wchar_t abs_path[JVM_MAXPATHLEN]; \
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   119
  wchar_t cwd[JVM_MAXPATHLEN]; \
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   120
  get_current_dir_w(cwd, JVM_MAXPATHLEN); \
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   121
  wsprintfW(abs_path, L"\\\\?\\%ls\\%ls", cwd, (path))
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   122
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   123
static bool file_exists_w(const wchar_t* path) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   124
  WIN32_FILE_ATTRIBUTE_DATA file_data;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   125
  return ::GetFileAttributesExW(path, GetFileExInfoStandard, &file_data);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   126
}
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   127
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   128
static void create_rel_directory_w(const wchar_t* path) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   129
  WITH_ABS_PATH(path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   130
  EXPECT_FALSE(file_exists_w(abs_path)) <<  "Can't create directory: \"" << path << "\" already exists";
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   131
  BOOL result = CreateDirectoryW(abs_path, NULL);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   132
  EXPECT_TRUE(result) << "Failed to create directory \"" << path << "\" " << GetLastError();
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   133
}
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   134
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   135
static void delete_empty_rel_directory_w(const wchar_t* path) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   136
  WITH_ABS_PATH(path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   137
  EXPECT_TRUE(file_exists_w(abs_path)) << "Can't delete directory: \"" << path << "\" does not exists";
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   138
  BOOL result = RemoveDirectoryW(abs_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   139
  EXPECT_TRUE(result) << "Failed to delete directory \"" << path << "\": " << GetLastError();
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   140
}
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   141
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   142
static void create_rel_file_w(const wchar_t* path) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   143
  WITH_ABS_PATH(path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   144
  EXPECT_FALSE(file_exists_w(abs_path)) << "Can't create file: \"" << path << "\" already exists";
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   145
  HANDLE h = CreateFileW(abs_path, 0, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   146
  EXPECT_NE(h, INVALID_HANDLE_VALUE) << "Failed to create file \"" << path << "\": " << GetLastError();
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   147
  CloseHandle(h);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   148
}
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   149
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   150
static void delete_rel_file_w(const wchar_t* path) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   151
  WITH_ABS_PATH(path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   152
  EXPECT_TRUE(file_exists_w(abs_path)) << "Can't delete file: \"" << path << "\" does not exists";
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   153
  BOOL result = DeleteFileW(abs_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   154
  EXPECT_TRUE(result) << "Failed to delete file \"" << path << "\": " << GetLastError();
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   155
}
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   156
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   157
static bool convert_to_cstring(char* c_str, size_t size, wchar_t* w_str) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   158
  size_t converted;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   159
  errno_t err = wcstombs_s(&converted, c_str, size, w_str, size - 1);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   160
  EXPECT_EQ(err, ERROR_SUCCESS) << "Could not convert \"" << w_str << "\" to c-string";
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   161
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   162
  return err == ERROR_SUCCESS;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   163
}
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   164
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   165
static wchar_t* my_wcscpy_s(wchar_t* dest, size_t size, wchar_t* start, const wchar_t* to_copy) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   166
  size_t already_used = dest - start;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   167
  size_t len = wcslen(to_copy);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   168
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   169
  if (already_used + len < size) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   170
    wcscpy_s(dest, size - already_used, to_copy);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   171
  }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   172
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   173
  return dest + wcslen(to_copy);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   174
}
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   175
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   176
// The currently finite list of seperator sequences we might use instead of '\\'.
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   177
static const wchar_t* sep_replacements[] = {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   178
  L"\\", L"\\/", L"/", L"//", L"\\\\/\\", L"//\\/"
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   179
};
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   180
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   181
// Takes a path and modifies it in a way that it should still designate the same file.
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   182
static bool unnormalize_path(wchar_t* result, size_t size, bool is_dir, const wchar_t* path) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   183
  wchar_t* dest = result;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   184
  const wchar_t* src = path;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   185
  const wchar_t* path_start;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   186
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   187
  if (wcsncmp(src, L"\\\\?\\UNC\\", 8) == 0) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   188
    path_start = src + 8;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   189
  } else if (wcsncmp(src, L"\\\\?\\", 4) == 0) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   190
    if (src[5] == L':') {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   191
      path_start = src + 6;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   192
    } else {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   193
      path_start = wcschr(src + 4, L'\\');
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   194
    }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   195
  } else if (wcsncmp(src, L"\\\\", 2) == 0) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   196
    path_start = wcschr(src + 2, L'?');
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   197
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   198
    if (path_start == NULL) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   199
      path_start = wcschr(src + 2, L'\\');
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   200
    } else {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   201
      path_start = wcschr(path_start, L'\\');
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   202
    }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   203
  } else {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   204
    path_start = wcschr(src + 1, L'\\');
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   205
  }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   206
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   207
  bool allow_sep_change = (mods_filter & Allow_Sep_Mods) && (os::random() & 1) == 0;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   208
  bool allow_dot_change = (mods_filter & Allow_Dot_Path) && (os::random() & 1) == 0;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   209
  bool allow_dotdot_change = (mods_filter & Allow_Dot_Dot_Path) && (os::random() & 1) == 0;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   210
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   211
  while ((*src != L'\0') && (result + size > dest)) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   212
    wchar_t c = *src;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   213
    *dest = c;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   214
    ++src;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   215
    ++dest;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   216
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   217
    if (c == L'\\') {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   218
      if (allow_sep_change && (os::random() & 3) == 3) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   219
        int i = os::random() % (sizeof(sep_replacements) / sizeof(sep_replacements[0]));
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   220
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   221
        if (i >= 0) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   222
          const wchar_t* replacement = sep_replacements[i];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   223
          dest = my_wcscpy_s(dest - 1, size,  result, replacement);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   224
        }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   225
      } else if (path_start != NULL) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   226
        if (allow_dotdot_change && (src > path_start + 1) && ((os::random() & 7) == 7)) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   227
          wchar_t const* last_sep = src - 2;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   228
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   229
          while (last_sep[0] != L'\\') {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   230
            --last_sep;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   231
          }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   232
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   233
          if (last_sep > path_start) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   234
            dest = my_wcscpy_s(dest, size, result, L"../");
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   235
            src = last_sep + 1;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   236
          }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   237
        } else if (allow_dot_change && (src > path_start + 1) && ((os::random() & 7) == 7)) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   238
          dest = my_wcscpy_s(dest, size, result, L"./");
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   239
        }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   240
      }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   241
    }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   242
  }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   243
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   244
  while (is_dir && ((os::random() & 15) == 1)) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   245
    dest = my_wcscpy_s(dest, size, result, L"/");
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   246
  }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   247
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   248
  if (result + size > dest) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   249
    *dest = L'\0';
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   250
  }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   251
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   252
  // Use this modification only if not too close to the max size.
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   253
  return result + size - 10 > dest;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   254
}
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   255
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   256
static void check_dir_impl(wchar_t* path, bool should_be_empty) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   257
  char buf[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   258
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   259
  if (convert_to_cstring(buf, JVM_MAXPATHLEN, path)) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   260
    struct stat st;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   261
    EXPECT_EQ(os::stat(buf, &st), 0) << "os::stat failed for \"" << path << "\"";
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   262
    EXPECT_EQ(st.st_mode & S_IFMT, S_IFDIR) << "\"" << path << "\" is not a directory according to os::stat";
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   263
    errno = ERROR_SUCCESS;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   264
    bool is_empty = os::dir_is_empty(buf);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   265
    errno_t err = errno;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   266
    EXPECT_EQ(is_empty, should_be_empty) << "os::dir_is_empty assumed \"" << path << "\" is "
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   267
                                         << (should_be_empty ?  "not ": "") << "empty";
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   268
    EXPECT_EQ(err, ERROR_SUCCESS) << "os::dir_is_empty failed for \"" << path << "\"with errno " << err;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   269
  }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   270
}
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   271
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   272
static void check_file_impl(wchar_t* path) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   273
  char buf[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   274
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   275
  if (convert_to_cstring(buf, JVM_MAXPATHLEN, path)) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   276
    struct stat st;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   277
    EXPECT_EQ(os::stat(buf, &st), 0) << "os::stat failed for \"" << path << "\"";
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   278
    EXPECT_EQ(st.st_mode & S_IFMT, S_IFREG) << "\"" << path << "\" is not a regular file according to os::stat";
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   279
    int fd = os::open(buf, O_RDONLY, 0);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   280
    EXPECT_NE(fd, -1) << "os::open failed for \"" << path << "\" with errno " << errno;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   281
    if (fd >= 0) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   282
      ::close(fd);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   283
    }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   284
  }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   285
}
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   286
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   287
static void check_file_not_present_impl(wchar_t* path) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   288
  char buf[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   289
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   290
  if (convert_to_cstring(buf, JVM_MAXPATHLEN, path)) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   291
    struct stat st;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   292
    int stat_ret;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   293
    EXPECT_EQ(stat_ret = os::stat(buf, &st), -1) << "os::stat did not fail for \"" << path << "\"";
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   294
    if (stat_ret != -1) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   295
      // Only check open if stat not already failed.
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   296
      int fd = os::open(buf, O_RDONLY, 0);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   297
      EXPECT_EQ(fd, -1) << "os::open did not fail for \"" << path << "\"";
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   298
      if (fd >= 0) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   299
        ::close(fd);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   300
      }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   301
    }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   302
  }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   303
}
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   304
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   305
static void check_dir(wchar_t* path, bool should_be_empty) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   306
  check_dir_impl(path, should_be_empty);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   307
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   308
  for (int i = 0; mods_filter != Allow_None && i < mods_per_path; ++i) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   309
    wchar_t tmp[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   310
    if (unnormalize_path(tmp, JVM_MAXPATHLEN, true, path)) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   311
      check_dir_impl(tmp, should_be_empty);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   312
    }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   313
  }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   314
}
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   315
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   316
static void check_file(wchar_t* path) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   317
  check_file_impl(path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   318
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   319
  // Check os::same_files at least somewhat.
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   320
  char buf[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   321
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   322
  if (convert_to_cstring(buf, JVM_MAXPATHLEN, path)) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   323
    wchar_t mod[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   324
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   325
    if (unnormalize_path(mod, JVM_MAXPATHLEN, false, path)) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   326
      char mod_c[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   327
      if (convert_to_cstring(mod_c, JVM_MAXPATHLEN, mod)) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   328
        EXPECT_EQ(os::same_files(buf, mod_c), true) << "os::same files failed for \\" << path << "\" and \"" << mod_c << "\"";
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   329
      }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   330
    }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   331
  }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   332
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   333
  for (int i = 0; mods_filter != Allow_None && i < mods_per_path; ++i) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   334
    wchar_t tmp[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   335
    if (unnormalize_path(tmp, JVM_MAXPATHLEN, false, path)) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   336
      check_file_impl(tmp);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   337
    }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   338
  }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   339
}
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   340
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   341
static void check_file_not_present(wchar_t* path) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   342
  check_file_not_present_impl(path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   343
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   344
  for (int i = 0; mods_filter != Allow_None && i < mods_per_path; ++i) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   345
    wchar_t tmp[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   346
    if (unnormalize_path(tmp, JVM_MAXPATHLEN, false, path)) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   347
      check_file_not_present_impl(tmp);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   348
    }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   349
  }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   350
}
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   351
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   352
static void record_path(char const* name, char const* len_name, wchar_t* path) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   353
  char buf[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   354
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   355
  if (convert_to_cstring(buf, JVM_MAXPATHLEN, path)) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   356
    ::testing::Test::RecordProperty(name, buf);
58474
74094a60d018 8231930: Windows build fails after JDK-8191521
shade
parents: 58426
diff changeset
   357
    os::snprintf(buf, JVM_MAXPATHLEN, "%d", (int) wcslen(path));
58426
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   358
    ::testing::Test::RecordProperty(len_name, buf);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   359
  }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   360
}
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   361
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   362
static void bench_path(wchar_t* path) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   363
  char buf[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   364
  int reps = 100000;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   365
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   366
  if (convert_to_cstring(buf, JVM_MAXPATHLEN, path)) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   367
    jlong wtime[2];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   368
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   369
    for (int t = 0; t < 2; ++t) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   370
      wtime[t] = os::javaTimeNanos();
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   371
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   372
      for (int i = 0; i < reps; ++i) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   373
        bool succ = false;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   374
        size_t buf_len = strlen(buf);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   375
        wchar_t* w_path = (wchar_t*) os::malloc(sizeof(wchar_t) * (buf_len + 1), mtInternal);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   376
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   377
        if (w_path != NULL) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   378
          size_t converted_chars;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   379
          if (::mbstowcs_s(&converted_chars, w_path, buf_len + 1, buf, buf_len) == ERROR_SUCCESS) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   380
            if (t == 1) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   381
              wchar_t* tmp = (wchar_t*) os::malloc(sizeof(wchar_t) * JVM_MAXPATHLEN, mtInternal);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   382
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   383
              if (tmp) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   384
                if (_wfullpath(tmp, w_path, JVM_MAXPATHLEN)) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   385
                  succ = true;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   386
                }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   387
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   388
                // Note that we really don't use the full path name, but just add the cost of running _wfullpath.
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   389
                os::free(tmp);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   390
              }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   391
              if (!succ) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   392
                printf("Failed fullpathing \"%s\"\n", buf);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   393
                return;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   394
              }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   395
              succ = false;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   396
            }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   397
            HANDLE h = ::CreateFileW(w_path, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   398
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   399
            if (h != INVALID_HANDLE_VALUE) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   400
              ::CloseHandle(h);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   401
              succ = true;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   402
            }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   403
          }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   404
        }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   405
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   406
        os::free(w_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   407
        if (!succ) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   408
          printf("Failed getting W*attr. \"%s\"\n", buf);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   409
          return;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   410
        }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   411
      }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   412
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   413
      wtime[t] = os::javaTimeNanos() - wtime[t];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   414
    }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   415
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   416
    jlong ctime = os::javaTimeNanos();
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   417
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   418
    for (int i = 0; i < reps; ++i) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   419
      HANDLE h = ::CreateFileA(buf, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   420
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   421
      if (h == INVALID_HANDLE_VALUE) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   422
        return;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   423
      }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   424
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   425
      ::CloseHandle(h);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   426
    }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   427
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   428
    ctime = os::javaTimeNanos() - ctime;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   429
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   430
    printf("\"%s\" %f us for *A, %f us for *W, %f us for *W with fullpath\n", buf,
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   431
      0.001 * ctime / reps, 0.001 * wtime[0] / reps, 0.001 * wtime[1] / reps);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   432
  }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   433
}
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   434
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   435
static void print_attr_result_for_path(wchar_t* path) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   436
  WIN32_FILE_ATTRIBUTE_DATA file_data;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   437
  struct stat st;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   438
  char buf[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   439
  wchar_t abs[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   440
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   441
  _wfullpath(abs, path, JVM_MAXPATHLEN);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   442
  printf("Checking \"%ls\" (%d chars):\n", path, (int) wcslen(path));
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   443
  printf("_wfullpath             %ls (%d chars)\n", abs, (int) wcslen(abs));
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   444
  BOOL bret = ::GetFileAttributesExW(path, GetFileExInfoStandard, &file_data);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   445
  printf("GetFileAttributesExW() %s\n", bret ? "success" : "failed");
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   446
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   447
  if (convert_to_cstring(buf, JVM_MAXPATHLEN, path)) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   448
    bret = ::GetFileAttributesExA(buf, GetFileExInfoStandard, &file_data);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   449
    printf("GetFileAttributesExA() %s\n", bret ? "success" : "failed");
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   450
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   451
    bool succ = os::stat(buf, &st) != -1;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   452
    printf("os::stat()             %s\n", succ ? "success" : "failed");
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   453
  }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   454
}
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   455
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   456
static void print_attr_result(wchar_t* format, ...) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   457
  va_list argptr;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   458
  wchar_t buf[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   459
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   460
  va_start(argptr, format);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   461
  wvsprintfW(buf, format, argptr);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   462
  print_attr_result_for_path(buf);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   463
  va_end(argptr);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   464
}
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   465
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   466
#define RECORD_PATH(name) record_path(#name, #name "Len", name)
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   467
#define NAME_PART_50 L"01234567890123456789012345678901234567890123456789"
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   468
#define NAME_PART_250 NAME_PART_50 NAME_PART_50 NAME_PART_50 NAME_PART_50 NAME_PART_50
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   469
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   470
// Test which tries to find out if the os::stat, os::open, os::same_files and os::dir_is_empty methods
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   471
// can handle long path names correctly.
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   472
TEST_VM(os_windows, handle_long_paths) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   473
  static wchar_t cwd[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   474
  static wchar_t nearly_long_rel_path[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   475
  static wchar_t long_rel_path[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   476
  static wchar_t empty_dir_rel_path[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   477
  static wchar_t not_empty_dir_rel_path[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   478
  static wchar_t file_rel_path[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   479
  static wchar_t nearly_long_file_rel_path[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   480
  static wchar_t nearly_long_path[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   481
  static wchar_t empty_dir_path[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   482
  static wchar_t not_empty_dir_path[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   483
  static wchar_t nearly_long_file_path[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   484
  static wchar_t file_path[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   485
  static wchar_t nearly_long_unc_path[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   486
  static wchar_t empty_dir_unc_path[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   487
  static wchar_t not_empty_dir_unc_path[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   488
  static wchar_t nearly_long_file_unc_path[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   489
  static wchar_t file_unc_path[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   490
  static wchar_t root_dir_path[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   491
  static wchar_t root_rel_dir_path[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   492
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   493
  wchar_t* dir_prefix = L"os_windows_long_paths_dir_";
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   494
  wchar_t* empty_dir_name = L"empty_directory_with_long_path";
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   495
  wchar_t* not_empty_dir_name = L"not_empty_directory_with_long_path";
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   496
  wchar_t* file_name = L"file";
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   497
  wchar_t dir_letter;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   498
  WIN32_FILE_ATTRIBUTE_DATA file_data;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   499
  bool can_test_unc = false;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   500
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   501
  get_current_dir_w(cwd, sizeof(cwd) / sizeof(wchar_t));
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   502
  dir_letter = (cwd[1] == L':' ? cwd[0] : L'\0');
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   503
  int cwd_len = (int) wcslen(cwd);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   504
  int dir_prefix_len = (int) wcslen(dir_prefix);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   505
  int rel_path_len = MAX2(dir_prefix_len, 235 - cwd_len);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   506
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   507
  memcpy(nearly_long_rel_path, dir_prefix, sizeof(wchar_t) * dir_prefix_len);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   508
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   509
  for (int i = dir_prefix_len; i < rel_path_len; ++i) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   510
    nearly_long_rel_path[i] = L'L';
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   511
  }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   512
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   513
  nearly_long_rel_path[rel_path_len] = L'\0';
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   514
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   515
  wsprintfW(long_rel_path, L"%ls\\%ls", nearly_long_rel_path, NAME_PART_250);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   516
  wsprintfW(empty_dir_rel_path, L"%ls\\%ls", nearly_long_rel_path, empty_dir_name);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   517
  wsprintfW(not_empty_dir_rel_path, L"%ls\\%ls", nearly_long_rel_path, not_empty_dir_name);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   518
  wsprintfW(nearly_long_file_rel_path, L"%ls\\%ls", nearly_long_rel_path, file_name);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   519
  wsprintfW(file_rel_path, L"%ls\\%ls\\%ls", nearly_long_rel_path, not_empty_dir_name, file_name);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   520
  wsprintfW(nearly_long_path, L"\\\\?\\%ls\\%ls", cwd, nearly_long_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   521
  wsprintfW(empty_dir_path, L"%ls\\%ls", nearly_long_path, empty_dir_name);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   522
  wsprintfW(not_empty_dir_path, L"%ls\\%ls", nearly_long_path, not_empty_dir_name);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   523
  wsprintfW(nearly_long_file_path, L"%ls\\%ls", nearly_long_path, file_name);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   524
  wsprintfW(file_path, L"%ls\\%ls\\%ls", nearly_long_path, not_empty_dir_name, file_name);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   525
  wsprintfW(nearly_long_unc_path, L"\\\\localhost\\%lc$\\%s", dir_letter, nearly_long_path + 7);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   526
  wsprintfW(empty_dir_unc_path, L"%s\\%s", nearly_long_unc_path, empty_dir_name);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   527
  wsprintfW(not_empty_dir_unc_path, L"%s\\%s", nearly_long_unc_path, not_empty_dir_name);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   528
  wsprintfW(nearly_long_file_unc_path, L"%ls\\%ls", nearly_long_unc_path, file_name);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   529
  wsprintfW(file_unc_path, L"%s\\%s\\%s", nearly_long_unc_path, not_empty_dir_name, file_name);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   530
  wsprintfW(root_dir_path, L"%lc:\\", dir_letter);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   531
  wsprintfW(root_rel_dir_path, L"%lc:", dir_letter);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   532
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   533
  RECORD_PATH(long_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   534
  RECORD_PATH(nearly_long_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   535
  RECORD_PATH(nearly_long_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   536
  RECORD_PATH(nearly_long_unc_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   537
  RECORD_PATH(empty_dir_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   538
  RECORD_PATH(empty_dir_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   539
  RECORD_PATH(empty_dir_unc_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   540
  RECORD_PATH(not_empty_dir_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   541
  RECORD_PATH(not_empty_dir_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   542
  RECORD_PATH(not_empty_dir_unc_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   543
  RECORD_PATH(nearly_long_file_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   544
  RECORD_PATH(nearly_long_file_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   545
  RECORD_PATH(nearly_long_file_unc_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   546
  RECORD_PATH(file_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   547
  RECORD_PATH(file_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   548
  RECORD_PATH(file_unc_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   549
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   550
  create_rel_directory_w(nearly_long_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   551
  create_rel_directory_w(long_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   552
  create_rel_directory_w(empty_dir_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   553
  create_rel_directory_w(not_empty_dir_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   554
  create_rel_file_w(nearly_long_file_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   555
  create_rel_file_w(file_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   556
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   557
  // For UNC path test we assume that the current DRIVE has a share
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   558
  // called "<DRIVELETTER>$" (so for D: we expect \\localhost\D$ to be
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   559
  // the same). Since this is only an assumption, we have to skip
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   560
  // the UNC tests if the share is missing.
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   561
  if (dir_letter && !::GetFileAttributesExW(nearly_long_unc_path, GetFileExInfoStandard, &file_data)) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   562
    printf("Disabled UNC path test, since %lc: is not mapped as share %lc$.\n", dir_letter, dir_letter);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   563
  } else {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   564
    can_test_unc = true;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   565
  }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   566
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   567
  if (mode == BENCH) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   568
    bench_path(nearly_long_path + 4);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   569
    bench_path(nearly_long_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   570
    bench_path(nearly_long_file_path + 4);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   571
    bench_path(nearly_long_file_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   572
  } else if (mode == EXAMPLES) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   573
    printf("Working directory: %ls", cwd);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   574
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   575
    if (dir_letter) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   576
      static wchar_t top_buf[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   577
      wchar_t* top_path = wcschr(cwd + 3, L'\\');
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   578
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   579
      if (top_path) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   580
        size_t top_len = (top_path - cwd) - 3;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   581
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   582
        memcpy(top_buf, cwd + 3, top_len * 2);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   583
        top_buf[top_len] = L'\0';
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   584
        top_path = top_buf;
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   585
      }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   586
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   587
      print_attr_result(L"%lc:\\", dir_letter);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   588
      print_attr_result(L"%lc:\\.\\", dir_letter);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   589
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   590
      if (top_path) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   591
        print_attr_result(L"%lc:\\%ls\\..\\%ls\\", dir_letter, top_path, top_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   592
      }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   593
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   594
      print_attr_result(L"%lc:", dir_letter);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   595
      print_attr_result(L"%lc:.", dir_letter);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   596
      print_attr_result(L"%lc:\\COM1", dir_letter);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   597
      print_attr_result(L"%lc:\\PRN", dir_letter);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   598
      print_attr_result(L"%lc:\\PRN\\COM1", dir_letter);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   599
      print_attr_result(L"\\\\?\\UNC\\localhost\\%lc$\\", dir_letter);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   600
      print_attr_result(L"\\\\?\\UNC\\\\localhost\\%lc$\\", dir_letter);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   601
      print_attr_result(nearly_long_unc_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   602
      print_attr_result(L"%ls\\.\\", nearly_long_unc_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   603
      print_attr_result(L"%ls\\..\\%ls", nearly_long_unc_path, nearly_long_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   604
      print_attr_result(L"\\\\?\\UNC\\%ls", nearly_long_unc_path + 2);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   605
      print_attr_result(file_unc_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   606
      print_attr_result(L"%ls\\%ls\\..\\%ls\\%ls", nearly_long_unc_path, not_empty_dir_name, not_empty_dir_name, file_name);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   607
      print_attr_result(L"%ls\\%ls\\.\\%ls", nearly_long_unc_path, not_empty_dir_name, file_name);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   608
      print_attr_result(L"\\\\?\\UNC\\%ls", file_unc_path + 2);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   609
      print_attr_result(L"\\\\?\\UNC\\%ls\\%ls\\.\\%ls", nearly_long_unc_path + 2, not_empty_dir_name, file_name);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   610
      print_attr_result(L"\\\\?\\UNC\\%ls\\%ls\\..\\%ls\\%ls", nearly_long_unc_path + 2, not_empty_dir_name, not_empty_dir_name, file_name);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   611
    }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   612
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   613
    print_attr_result(nearly_long_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   614
    print_attr_result(L"%ls\\.\\", nearly_long_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   615
    print_attr_result(L"%ls\\..\\%ls", nearly_long_rel_path, nearly_long_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   616
    print_attr_result(L"%\\\\?\\%ls", nearly_long_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   617
    print_attr_result(L"\\\\?\\%ls\\.\\", nearly_long_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   618
    print_attr_result(L"\\\\?\\%ls\\..\\%ls", nearly_long_rel_path, nearly_long_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   619
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   620
    print_attr_result(nearly_long_path + 4);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   621
    print_attr_result(L"%ls\\.\\", nearly_long_path + 4);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   622
    print_attr_result(L"%ls\\..\\%ls", nearly_long_path + 4, nearly_long_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   623
    print_attr_result(nearly_long_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   624
    print_attr_result(L"%ls\\.\\", nearly_long_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   625
    print_attr_result(L"%ls\\..\\%ls", nearly_long_path, nearly_long_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   626
  } else {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   627
    check_file_not_present(L"");
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   628
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   629
    // Check relative paths
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   630
    check_dir(nearly_long_rel_path, false);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   631
    check_dir(long_rel_path, true);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   632
    check_dir(empty_dir_rel_path, true);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   633
    check_dir(not_empty_dir_rel_path, false);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   634
    check_file(nearly_long_file_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   635
    check_file(file_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   636
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   637
    // Check absolute paths
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   638
    if (dir_letter) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   639
      check_dir(root_dir_path, false);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   640
      check_dir(root_rel_dir_path, false);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   641
    }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   642
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   643
    check_dir(cwd, false);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   644
    check_dir(nearly_long_path + 4, false);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   645
    check_dir(empty_dir_path + 4, true);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   646
    check_dir(not_empty_dir_path + 4, false);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   647
    check_file(nearly_long_file_path + 4);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   648
    check_file(file_path + 4);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   649
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   650
    // Check UNC paths
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   651
    if (can_test_unc) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   652
      check_dir(nearly_long_unc_path, false);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   653
      check_dir(empty_dir_unc_path, true);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   654
      check_dir(not_empty_dir_unc_path, false);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   655
      check_file(nearly_long_file_unc_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   656
      check_file(file_unc_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   657
    }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   658
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   659
    // Check handling of <DRIVE>:/../<OTHER_DRIVE>:/path/...
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   660
    // The other drive letter should not overwrite the original one.
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   661
    if (dir_letter) {
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   662
      static wchar_t tmp[JVM_MAXPATHLEN];
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   663
      wchar_t* other_letter = dir_letter == L'D' ? L"C" : L"D";
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   664
      wsprintfW(tmp, L"%2ls\\..\\%ls:%ls", nearly_long_file_path, other_letter, nearly_long_file_path + 2);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   665
      check_file_not_present(tmp);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   666
      wsprintfW(tmp, L"%2ls\\..\\%ls:%ls", file_path, other_letter, file_path + 2);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   667
      check_file_not_present(tmp);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   668
    }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   669
  }
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   670
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   671
  delete_rel_file_w(file_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   672
  delete_rel_file_w(nearly_long_file_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   673
  delete_empty_rel_directory_w(not_empty_dir_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   674
  delete_empty_rel_directory_w(empty_dir_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   675
  delete_empty_rel_directory_w(long_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   676
  delete_empty_rel_directory_w(nearly_long_rel_path);
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   677
}
ed5e399d967d 8191521: handle long relative path specified in -Xbootclasspath/a on windows
rschmelter
parents: 54983
diff changeset
   678
52395
5ca10e4e052c 8177708: Convert TestReserveMemorySpecial_test to Gtest
iignatyev
parents:
diff changeset
   679
#endif