/* * Copyright 2015-present Facebook, Inc. * * Licensed 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.facebook.buck.artifact_cache; import com.facebook.buck.artifact_cache.thrift.ArtifactMetadata; import com.facebook.buck.artifact_cache.thrift.BuckCacheFetchRequest; import com.facebook.buck.artifact_cache.thrift.BuckCacheRequest; import com.facebook.buck.artifact_cache.thrift.BuckCacheRequestType; import com.facebook.buck.artifact_cache.thrift.BuckCacheStoreRequest; import com.facebook.buck.artifact_cache.thrift.PayloadInfo; import com.facebook.buck.artifact_cache.thrift.RuleKey; import com.facebook.buck.slb.ThriftProtocol; import com.google.common.io.BaseEncoding; import com.google.common.io.ByteSource; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; /** * * Creates example fetch and store requests, encodes them using the hybrid thrift/binary protocol, * and finally prints out the hybrid payload using base 64 encoding. * * <p>Used as input to tests in the cache server. */ public class HybridPayloadGenerator { private static final ThriftProtocol PROTOCOL = ThriftArtifactCache.PROTOCOL; private static final String PAYLOAD_ONE = "payloadOne"; private static final byte[] PAYLOAD_ONE_BYTES; // See static {} for initialization private static final String STORE_RULE_KEY_ONE = "ruleKeyOne"; private static final String STORE_RULE_KEY_TWO = "ruleKeyTwo"; private static final String METDATA_KEY_ONE = "metaDataKeyOne"; private static final String METDATA_KEY_TWO = "metaDataKeyTwo"; private static final String METDATA_VALUE_ONE = "metaDataValueOne"; private static final String METDATA_VALUE_TWO = "metaDataValueTwo"; static { ByteArrayOutputStream bos = new ByteArrayOutputStream(); try (DataOutputStream dataOs = new DataOutputStream(bos)) { dataOs.writeUTF(PAYLOAD_ONE); } catch (IOException e) { e.printStackTrace(); } PAYLOAD_ONE_BYTES = bos.toByteArray(); } public static void main(String[] args) throws IOException { HybridPayloadGenerator encoder = new HybridPayloadGenerator(); encoder.encodeHybridFetchRequestNoPayload(); encoder.encodeHybridStoreRequestOnePayload(); } public void encodeHybridFetchRequestNoPayload() throws IOException { ThriftArtifactCacheProtocol.Request request = ThriftArtifactCacheProtocol.createRequest(PROTOCOL, createFetchRequest()); try (ByteArrayOutputStream stream = new ByteArrayOutputStream()) { request.writeAndClose(stream); stream.flush(); byte[] buffer = stream.toByteArray(); System.out.println("Fetch request:"); System.out.println(BaseEncoding.base64().encode(buffer)); } } public void encodeHybridStoreRequestOnePayload() throws IOException { ThriftArtifactCacheProtocol.Request request = ThriftArtifactCacheProtocol.createRequest( PROTOCOL, createStoreRequest(), ByteSource.wrap(Arrays.copyOf(PAYLOAD_ONE_BYTES, PAYLOAD_ONE_BYTES.length))); try (ByteArrayOutputStream stream = new ByteArrayOutputStream()) { request.writeAndClose(stream); stream.flush(); byte[] buffer = stream.toByteArray(); System.out.println("Store request:"); System.out.println(BaseEncoding.base64().encode(buffer)); } } private BuckCacheRequest createFetchRequest() { BuckCacheFetchRequest fetchRequest = new BuckCacheFetchRequest(); RuleKey ruleKey = new RuleKey(); ruleKey.setHashString(STORE_RULE_KEY_ONE); fetchRequest.setRuleKey(ruleKey); BuckCacheRequest cacheRequest = new BuckCacheRequest(); cacheRequest.setType(BuckCacheRequestType.FETCH); cacheRequest.setFetchRequest(fetchRequest); cacheRequest.setType(BuckCacheRequestType.FETCH); return cacheRequest; } private BuckCacheRequest createStoreRequest() { BuckCacheRequest cacheRequest = new BuckCacheRequest(); cacheRequest.setType(BuckCacheRequestType.STORE); BuckCacheStoreRequest storeRequest = new BuckCacheStoreRequest(); ArtifactMetadata metadata = new ArtifactMetadata(); RuleKey ruleKeyOne = new RuleKey(); ruleKeyOne.setHashString(STORE_RULE_KEY_ONE); RuleKey ruleKeyTwo = new RuleKey(); ruleKeyTwo.setHashString(STORE_RULE_KEY_TWO); List<RuleKey> ruleKeys = new ArrayList<>(); ruleKeys.add(ruleKeyOne); ruleKeys.add(ruleKeyTwo); metadata.setRuleKeys(ruleKeys); Map<String, String> metadataMap = new HashMap<>(); metadataMap.put(METDATA_KEY_ONE, METDATA_VALUE_ONE); metadataMap.put(METDATA_KEY_TWO, METDATA_VALUE_TWO); metadata.setRuleKeys(ruleKeys); metadata.setMetadata(metadataMap); List<PayloadInfo> payloadInfos = new ArrayList<>(); PayloadInfo payloadInfo = new PayloadInfo(); payloadInfo.setSizeBytes(PAYLOAD_ONE_BYTES.length); payloadInfos.add(payloadInfo); storeRequest.setMetadata(metadata); cacheRequest.setStoreRequest(storeRequest); cacheRequest.setPayloads(payloadInfos); return cacheRequest; } }