com.aliyun.oss.integrationtests.TestUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.aliyun.oss.integrationtests.TestUtils.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package com.aliyun.oss.integrationtests;

import static com.aliyun.oss.integrationtests.TestConfig.OSS_TEST_ENDPOINT;
import static com.aliyun.oss.internal.OSSConstants.DEFAULT_CHARSET_NAME;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.net.URI;
import java.net.URLDecoder;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import junit.framework.Assert;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import com.aliyun.oss.ClientConfiguration;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.comm.Protocol;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.common.utils.HttpHeaders;
import com.aliyun.oss.common.utils.HttpUtil;
import com.aliyun.oss.model.InitiateMultipartUploadRequest;
import com.aliyun.oss.model.InitiateMultipartUploadResult;
import com.aliyun.oss.model.PartETag;

@SuppressWarnings("deprecation")
public class TestUtils {

    private static final byte[] ALPHABETS = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
            'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
            'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3',
            '4', '5', '6', '7', '8', '9' };

    private static final int MAX_RANDOM_LENGTH = 1 * 1024 * 1024 * 1024; // 1GB

    private static Random rand = new Random();

    private static HttpClient httpClient = null;
    static {
        httpClient = new DefaultHttpClient();
        Scheme sch = new Scheme(Protocol.HTTPS.toString(), 443, getSSLSocketFactory());
        httpClient.getConnectionManager().getSchemeRegistry().register(sch);
    }

    private static SSLSocketFactory getSSLSocketFactory() {
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }

            public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
            }

            public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
            }
        } };

        try {
            SSLContext sslcontext = SSLContext.getInstance("SSL");
            sslcontext.init(null, trustAllCerts, null);
            SSLSocketFactory ssf = new SSLSocketFactory(sslcontext, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
            return ssf;

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private static byte pickupAlphabet() {
        int idx = new Random().nextInt(ALPHABETS.length);
        return ALPHABETS[idx];
    }

    public static String genRandomString(final int length) {
        byte[] data = new byte[length];
        for (int i = 0; i < data.length; i++) {
            data[i] = pickupAlphabet();
        }
        return new String(data);
    }

    public static String buildObjectKey(String keyPrefix, int seqNum) {
        return keyPrefix + seqNum;
    }

    public static void waitAll(Thread[] targets) {
        for (int i = 0; i < targets.length; i++) {
            targets[i].start();
        }

        for (int i = 0; i < targets.length; i++) {
            try {
                targets[i].join();
            } catch (InterruptedException e) {
            }
        }
    }

    public static String genFixedLengthFile(long fixedLength) throws IOException {
        ensureDirExist(TestBase.UPLOAD_DIR);
        String filePath = TestBase.UPLOAD_DIR + System.currentTimeMillis();
        RandomAccessFile raf = new RandomAccessFile(filePath, "rw");
        FileChannel fc = raf.getChannel();

        MappedByteBuffer mbb = fc.map(MapMode.READ_WRITE, 0, fixedLength);
        try {
            for (int i = 0; i < fixedLength; i++) {
                mbb.put(pickupAlphabet());
            }
            return filePath;
        } finally {
            if (fc != null) {
                fc.close();
            }

            if (raf != null) {
                raf.close();
            }
        }
    }

    public static String buildFilePath() {
        ensureDirExist(TestBase.DOWNLOAD_DIR);
        return TestBase.DOWNLOAD_DIR + System.currentTimeMillis();
    }

    public static String genRandomLengthFile() throws IOException {
        ensureDirExist(TestBase.UPLOAD_DIR);
        String filePath = TestBase.UPLOAD_DIR + System.currentTimeMillis();
        RandomAccessFile raf = new RandomAccessFile(filePath, "rw");
        FileChannel fc = raf.getChannel();

        long fileLength = rand.nextInt(MAX_RANDOM_LENGTH);
        MappedByteBuffer mbb = fc.map(MapMode.READ_WRITE, 0, fileLength);
        try {
            for (int i = 0; i < fileLength; i++) {
                mbb.put(pickupAlphabet());
            }
            return filePath;
        } finally {
            if (fc != null) {
                fc.close();
            }

            if (raf != null) {
                raf.close();
            }
        }
    }

    public static boolean batchPutObject(OSSClient client, String bucketName, List<String> objects) {
        byte[] buf = new byte[1024];
        for (int i = 0; i < buf.length; i++)
            buf[i] = 'a';

        for (String o : objects) {
            try {
                client.putObject(bucketName, o, new ByteArrayInputStream(buf), null);
            } catch (Exception e) {
                // Ignore the exception and return directly.
                return false;
            }
        }
        return true;
    }

    public static InputStream genFixedLengthInputStream(long fixedLength) {
        byte[] buf = new byte[(int) fixedLength];
        for (int i = 0; i < buf.length; i++)
            buf[i] = 'a';
        return new ByteArrayInputStream(buf);
    }

    public static void ensureDirExist(String dir) {
        File f = new File(dir);
        if (!f.exists())
            f.mkdirs();
    }

    public static void removeFiles(List<File> files) {
        for (File f : files) {
            if (f != null && f.exists())
                f.delete();
        }
    }

    public static void removeFile(String filePath) {
        File toRemove = new File(filePath);
        if (toRemove != null && toRemove.exists())
            toRemove.delete();
    }

    public static String claimUploadId(OSSClient client, String bucketName, String key) {
        InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, key);
        InitiateMultipartUploadResult result = client.initiateMultipartUpload(request);
        Assert.assertEquals(bucketName, result.getBucketName());
        Assert.assertEquals(key, result.getKey());
        return result.getUploadId();
    }

    public static String calcMultipartsETag(List<PartETag> eTags) {
        StringBuffer concatedEtags = new StringBuffer();
        for (PartETag e : eTags) {
            concatedEtags.append(e.getETag());
        }

        String md5Digest = BinaryUtil.encodeMD5(concatedEtags.toString().getBytes());
        int partNumber = eTags.size();
        String finalETag = String.format("%s-%d", md5Digest, partNumber);
        return finalETag;
    }

    public static String composeLocation(String endpoint, String bucketName, String key) {
        try {
            URI baseUri = URI.create(endpoint);
            URI resultUri = new URI(baseUri.getScheme(), null, bucketName + "." + baseUri.getHost(),
                    baseUri.getPort(), String.format("/%s", HttpUtil.urlEncode(key, DEFAULT_CHARSET_NAME)), null,
                    null);
            return URLDecoder.decode(resultUri.toString(), DEFAULT_CHARSET_NAME);
        } catch (Exception e) {
            throw new IllegalArgumentException(e.getMessage(), e);
        }
    }

    public static String composeLocation(OSSClient client, String endpoint, String bucketName, String key) {
        try {
            URI baseUri = URI.create(endpoint);
            URI resultUri = null;
            if (client.getClientConfiguration().isSLDEnabled()) {
                resultUri = new URI(baseUri.getScheme(), null, baseUri.getHost(), baseUri.getPort(),
                        String.format("/%s/%s", bucketName, HttpUtil.urlEncode(key, DEFAULT_CHARSET_NAME)), null,
                        null);
            } else {
                resultUri = new URI(baseUri.getScheme(), null, bucketName + "." + baseUri.getHost(),
                        baseUri.getPort(), String.format("/%s", HttpUtil.urlEncode(key, DEFAULT_CHARSET_NAME)),
                        null, null);
            }

            return URLDecoder.decode(resultUri.toString(), DEFAULT_CHARSET_NAME);
        } catch (Exception e) {
            throw new IllegalArgumentException(e.getMessage(), e);
        }
    }

    public static void waitForCacheExpiration(int durationSeconds) {
        try {
            Thread.sleep(durationSeconds * 1000);
        } catch (InterruptedException e) {
        }
    }

    static class StsToken {
        private String accessKeyId;
        private String secretAccessKey;
        private String securityToken;

        public StsToken(String accessKeyId, String secretAccessKey, String securityToken) {
            this.accessKeyId = accessKeyId;
            this.secretAccessKey = secretAccessKey;
            this.securityToken = securityToken;
        }

        public String getAccessKeyId() {
            return accessKeyId;
        }

        public void setAccessKeyId(String accessKeyId) {
            this.accessKeyId = accessKeyId;
        }

        public String getSecretAccessKey() {
            return secretAccessKey;
        }

        public void setSecretAccessKey(String secretAccessKey) {
            this.secretAccessKey = secretAccessKey;
        }

        public String getSecurityToken() {
            return securityToken;
        }

        public void setSecurityToken(String securityToken) {
            this.securityToken = securityToken;
        }
    }

    public static OSSClient createSessionClient(List<String> actions, List<String> resources) {
        String tokenPolicy = jsonizeTokenPolicy(actions, resources, true);
        StsToken token = getStsToken("", "", 3600, tokenPolicy);
        return new OSSClient(OSS_TEST_ENDPOINT, token.accessKeyId, token.secretAccessKey, token.securityToken,
                new ClientConfiguration().setSupportCname(false));
    }

    public static String jsonizeTokenPolicy(List<String> actions, List<String> resources, boolean allow) {
        JSONObject stmtJsonObject = new JSONObject();
        stmtJsonObject.put("Action", actions);
        stmtJsonObject.put("Resource", resources);
        stmtJsonObject.put("Effect", allow ? "Allow" : "Deny");

        JSONArray stmtJsonArray = new JSONArray();
        stmtJsonArray.add(0, stmtJsonObject);

        JSONObject policyJsonObject = new JSONObject();
        policyJsonObject.put("Version", "1");
        policyJsonObject.put("Statement", stmtJsonArray);

        return policyJsonObject.toString();
    }

    public static StsToken getStsToken(String grantor, String grantee, long durationSeconds, String policy) {
        try {
            URI apiUri = new URI(Protocol.HTTPS.toString(), null, "", 80, "", null, null);

            HttpPost httpPost = new HttpPost(apiUri);
            List<NameValuePair> nvps = new ArrayList<NameValuePair>();
            nvps.add(new BasicNameValuePair("STSVERSION", "1"));
            nvps.add(new BasicNameValuePair("CALLERUID", grantor));
            nvps.add(new BasicNameValuePair("GRANTEE", grantee));
            nvps.add(new BasicNameValuePair("DURATIONSECONDS", String.valueOf(durationSeconds)));
            nvps.add(new BasicNameValuePair("POLICY", policy));
            nvps.add(new BasicNameValuePair("APIUSERNAME", ""));
            nvps.add(new BasicNameValuePair("APIPASSWORD", ""));
            nvps.add(new BasicNameValuePair("MFAPresent", "false"));
            nvps.add(new BasicNameValuePair("OwnerId", grantor));
            nvps.add(new BasicNameValuePair("CallerType", "customer"));
            nvps.add(new BasicNameValuePair("ProxyTrustTransportInfo", "false"));
            nvps.add(new BasicNameValuePair("CallerIp", "127.0.0.1"));
            nvps.add(new BasicNameValuePair("ProxyCallerIp", "127.0.0.1"));
            nvps.add(new BasicNameValuePair("ProxyCallerSecurityTransport", "false"));
            nvps.add(new BasicNameValuePair("callerSecurityTransport", "true"));
            httpPost.setEntity(new UrlEncodedFormEntity(nvps));
            httpPost.addHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded");

            HttpResponse httpResponse = httpClient.execute(httpPost);
            InputStream responseBody = httpResponse.getEntity().getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(responseBody));
            String line = null;
            StringBuilder tokenString = new StringBuilder();
            while ((line = reader.readLine()) != null) {
                tokenString.append(line);
                System.out.println(line);
            }

            JSONObject tokenJsonObject = JSONObject.fromObject(tokenString.toString());
            JSONObject credsJsonObjson = tokenJsonObject.getJSONObject("Credentials");
            String accessKeyId = credsJsonObjson.getString("AccessKeyId");
            String secretAccessKey = credsJsonObjson.getString("AccessKeySecret");
            String securityToken = credsJsonObjson.getString("SecurityToken");

            return new StsToken(accessKeyId, secretAccessKey, securityToken);
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
    }
}