File: multidirectbufferIO.java

package info (click to toggle)
mauve 20140821-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 41,364 kB
  • ctags: 33,415
  • sloc: java: 316,246; sh: 2,834; xml: 208; makefile: 66
file content (136 lines) | stat: -rw-r--r-- 4,155 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/* mulitdirectbufferIO.java -- Scatter/Gather IO using direct buffers
 Copyright (C) 2006 Michael Barker
 Updated for OpenJDK7 Pavel Tisnovsky
 This file is part of Mauve.

 Mauve is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2, or (at your option)
 any later version.

 Mauve is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with Mauve; see the file COPYING.  If not, write to the
 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 02110-1301 USA.

 */

// Tags: JDK14


package gnu.testlet.java.nio.channels.FileChannel;

import gnu.testlet.TestHarness;
import gnu.testlet.Testlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.Arrays;

/**
 * @author mike
 */
public class multidirectbufferIO
    implements Testlet
{

  private void initBuffer(ByteBuffer[] bs, byte[] data)
  {
    for (int i = 0; i < bs.length; i++)
      {
        bs[i] = ByteBuffer.allocateDirect(data.length);
        bs[i].put(data);
        bs[i].flip();
      }
  }

  /*
   * (non-Javadoc)
   * 
   * @see gnu.testlet.Testlet#test(gnu.testlet.TestHarness)
   */
  public void test(TestHarness harness)
  {
    final int BUF_LEN = 17;
    final int MAX_BUFFERS = 16;
    byte[] data = "qwertyuiopasdfghjklzxcvbnm".getBytes();
    ByteBuffer[] out = new ByteBuffer[BUF_LEN];
    ByteBuffer[] in = new ByteBuffer[BUF_LEN];
    initBuffer(out, data);
    initBuffer(in, new byte[data.length]);
    String tmpfile = harness.getTempDirectory() + File.separator
                     + "mauve-multibuffer.tmp";
    try
      {
        File f = new File(tmpfile);
        f.createNewFile();
        FileChannel fcOut = new FileOutputStream(f).getChannel();
        long numWritten = fcOut.write(out);
        fcOut.close();
        /* The SUN JDK limits the number of buffers to 16 */
        /* This has been fixed in OpenJDK 7u8 */
        harness.check(numWritten, conformToJDK17_u8() ? (BUF_LEN * data.length) : (MAX_BUFFERS * data.length));
        for (int i = 0; i < MAX_BUFFERS; i++)
          {
            harness.check(out[i].position() == out[i].limit(), "Position - Limit mismatch");
          }

        FileChannel fcIn = new FileInputStream(f).getChannel();
        long numRead = fcIn.read(in);
        /* The SUN JDK limits the number of buffers to 16 */
        /* This has been fixed in OpenJDK 7u8 */
        harness.check(numRead, conformToJDK17_u8() ? (BUF_LEN * data.length) : (MAX_BUFFERS * data.length));

        for (int i = 0; i < MAX_BUFFERS; i++)
          {
            byte[] dIn = new byte[data.length];
            byte[] dOut  = new byte[data.length];
            in[i].flip();
            out[i].flip();
            in[i].get(dIn);
            out[i].get(dOut);
            harness.check(Arrays.equals(dIn, dOut));
          }
        
        f.delete();
      }
    catch (IOException e)
      {
        harness.fail("Unexpected exception: " + e);
      }
  }

  /**
    * Returns true if tested JRE conformns to JDK 1.7 update 8 or higher.
    * @author: Pavel Tisnovsky
    */
  private static boolean conformToJDK17_u8()
  {
    String[] javaVersion = System.getProperty("java.version").split("\\.");
    String vendorID = System.getProperty("java.vendor");
    // test of OpenJDK
    if ("Sun Microsystems Inc.".equals(vendorID) || "Oracle Corporation".equals(vendorID) )
    {
      int version = Integer.parseInt(javaVersion[1]);
      if (version > 7) {
        return true;
      }
      if (version == 7) {
        String[] splitstr = javaVersion[2].split("_");
        int update = Integer.parseInt(splitstr[1]);
        return update >= 8;
      }
    }
    return false;
  }

}