1 /* 2 * Copyright 2016 The gRPC Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package io.grpc.testing.integration; 18 19 import static com.google.common.collect.Sets.newHashSet; 20 import static java.util.Collections.singletonList; 21 import static org.junit.Assert.assertEquals; 22 import static org.junit.Assert.assertTrue; 23 24 import com.google.common.collect.ImmutableList; 25 import io.grpc.ManagedChannel; 26 import io.grpc.ManagedChannelBuilder; 27 import io.grpc.testing.integration.Metrics.EmptyMessage; 28 import io.grpc.testing.integration.Metrics.GaugeResponse; 29 import io.grpc.testing.integration.StressTestClient.TestCaseWeightPair; 30 import java.net.InetSocketAddress; 31 import java.util.Arrays; 32 import java.util.List; 33 import java.util.Set; 34 import java.util.concurrent.TimeUnit; 35 import java.util.concurrent.locks.LockSupport; 36 import org.junit.Rule; 37 import org.junit.Test; 38 import org.junit.rules.Timeout; 39 import org.junit.runner.RunWith; 40 import org.junit.runners.JUnit4; 41 42 /** Unit tests for {@link StressTestClient}. */ 43 @RunWith(JUnit4.class) 44 public class StressTestClientTest { 45 46 @Rule 47 public final Timeout globalTimeout = Timeout.seconds(5); 48 49 @Test ipv6AddressesShouldBeSupported()50 public void ipv6AddressesShouldBeSupported() { 51 StressTestClient client = new StressTestClient(); 52 client.parseArgs(new String[] {"--server_addresses=[0:0:0:0:0:0:0:1]:8080," 53 + "[1:2:3:4:f:e:a:b]:8083"}); 54 55 assertEquals(2, client.addresses().size()); 56 assertEquals(new InetSocketAddress("0:0:0:0:0:0:0:1", 8080), client.addresses().get(0)); 57 assertEquals(new InetSocketAddress("1:2:3:4:f:e:a:b", 8083), client.addresses().get(1)); 58 } 59 60 @Test defaults()61 public void defaults() { 62 StressTestClient client = new StressTestClient(); 63 assertEquals(singletonList(new InetSocketAddress("localhost", 8080)), client.addresses()); 64 assertTrue(client.testCaseWeightPairs().isEmpty()); 65 assertEquals(-1, client.durationSecs()); 66 assertEquals(1, client.channelsPerServer()); 67 assertEquals(1, client.stubsPerChannel()); 68 assertEquals(8081, client.metricsPort()); 69 } 70 71 @Test allCommandlineSwitchesAreSupported()72 public void allCommandlineSwitchesAreSupported() { 73 StressTestClient client = new StressTestClient(); 74 client.parseArgs(new String[] { 75 "--server_addresses=localhost:8080,localhost:8081,localhost:8082", 76 "--test_cases=empty_unary:20,large_unary:50,server_streaming:30", 77 "--test_duration_secs=20", 78 "--num_channels_per_server=10", 79 "--num_stubs_per_channel=5", 80 "--metrics_port=9090", 81 "--server_host_override=foo.test.google.fr", 82 "--use_tls=true", 83 "--use_test_ca=true" 84 }); 85 86 List<InetSocketAddress> addresses = Arrays.asList(new InetSocketAddress("localhost", 8080), 87 new InetSocketAddress("localhost", 8081), new InetSocketAddress("localhost", 8082)); 88 assertEquals(addresses, client.addresses()); 89 90 List<TestCaseWeightPair> testCases = Arrays.asList( 91 new TestCaseWeightPair(TestCases.EMPTY_UNARY, 20), 92 new TestCaseWeightPair(TestCases.LARGE_UNARY, 50), 93 new TestCaseWeightPair(TestCases.SERVER_STREAMING, 30)); 94 assertEquals(testCases, client.testCaseWeightPairs()); 95 96 assertEquals("foo.test.google.fr", client.serverHostOverride()); 97 assertTrue(client.useTls()); 98 assertTrue(client.useTestCa()); 99 assertEquals(20, client.durationSecs()); 100 assertEquals(10, client.channelsPerServer()); 101 assertEquals(5, client.stubsPerChannel()); 102 assertEquals(9090, client.metricsPort()); 103 } 104 105 @Test serverHostOverrideShouldBeApplied()106 public void serverHostOverrideShouldBeApplied() { 107 StressTestClient client = new StressTestClient(); 108 client.parseArgs(new String[] { 109 "--server_addresses=localhost:8080", 110 "--server_host_override=foo.test.google.fr", 111 }); 112 113 assertEquals("foo.test.google.fr", client.addresses().get(0).getHostName()); 114 } 115 116 @Test gaugesShouldBeExported()117 public void gaugesShouldBeExported() throws Exception { 118 119 TestServiceServer server = new TestServiceServer(); 120 server.parseArgs(new String[]{"--port=" + 0, "--use_tls=false"}); 121 server.start(); 122 123 StressTestClient client = new StressTestClient(); 124 client.parseArgs(new String[] {"--test_cases=empty_unary:1", 125 "--server_addresses=localhost:" + server.getPort(), "--metrics_port=" + 0, 126 "--num_stubs_per_channel=2"}); 127 client.startMetricsService(); 128 client.runStressTest(); 129 130 // Connect to the metrics service 131 ManagedChannel ch = ManagedChannelBuilder.forAddress("localhost", client.getMetricServerPort()) 132 .usePlaintext() 133 .build(); 134 135 MetricsServiceGrpc.MetricsServiceBlockingStub stub = MetricsServiceGrpc.newBlockingStub(ch); 136 137 // Wait until gauges have been exported 138 Set<String> gaugeNames = newHashSet("/stress_test/server_0/channel_0/stub_0/qps", 139 "/stress_test/server_0/channel_0/stub_1/qps"); 140 141 List<GaugeResponse> allGauges = 142 ImmutableList.copyOf(stub.getAllGauges(EmptyMessage.getDefaultInstance())); 143 while (allGauges.size() < gaugeNames.size()) { 144 LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(100)); 145 allGauges = ImmutableList.copyOf(stub.getAllGauges(EmptyMessage.getDefaultInstance())); 146 } 147 148 for (GaugeResponse gauge : allGauges) { 149 String gaugeName = gauge.getName(); 150 151 assertTrue("gaugeName: " + gaugeName, gaugeNames.contains(gaugeName)); 152 assertTrue("qps: " + gauge.getLongValue(), gauge.getLongValue() > 0); 153 gaugeNames.remove(gauge.getName()); 154 155 GaugeResponse gauge1 = 156 stub.getGauge(Metrics.GaugeRequest.newBuilder().setName(gaugeName).build()); 157 assertEquals(gaugeName, gauge1.getName()); 158 assertTrue("qps: " + gauge1.getLongValue(), gauge1.getLongValue() > 0); 159 } 160 161 assertTrue("gauges: " + gaugeNames, gaugeNames.isEmpty()); 162 163 client.shutdown(); 164 server.stop(); 165 } 166 167 } 168