1 /*
2  * Copyright 2018 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.services;
18 
19 import com.google.common.base.MoreObjects;
20 import com.google.common.util.concurrent.ListenableFuture;
21 import com.google.common.util.concurrent.SettableFuture;
22 import io.grpc.ConnectivityState;
23 import io.grpc.InternalChannelz;
24 import io.grpc.InternalChannelz.ChannelStats;
25 import io.grpc.InternalChannelz.Security;
26 import io.grpc.InternalChannelz.ServerStats;
27 import io.grpc.InternalChannelz.SocketOptions;
28 import io.grpc.InternalChannelz.SocketStats;
29 import io.grpc.InternalChannelz.TransportStats;
30 import io.grpc.InternalInstrumented;
31 import io.grpc.InternalLogId;
32 import io.grpc.InternalWithLogId;
33 import java.net.InetSocketAddress;
34 import java.net.SocketAddress;
35 import java.util.Collections;
36 
37 /**
38  * Test class definitions that will be used in the proto utils test as well as
39  * channelz service test.
40  */
41 final class ChannelzTestHelper {
42 
43   static final class TestSocket implements InternalInstrumented<SocketStats> {
44     private final InternalLogId id = InternalLogId.allocate("socket");
45     TransportStats transportStats = new TransportStats(
46         /*streamsStarted=*/ 1,
47         /*lastLocalStreamCreatedTimeNanos=*/ 2,
48         /*lastRemoteStreamCreatedTimeNanos=*/ 3,
49         /*streamsSucceeded=*/ 4,
50         /*streamsFailed=*/ 5,
51         /*messagesSent=*/ 6,
52         /*messagesReceived=*/ 7,
53         /*keepAlivesSent=*/ 8,
54         /*lastMessageSentTimeNanos=*/ 9,
55         /*lastMessageReceivedTimeNanos=*/ 10,
56         /*localFlowControlWindow=*/ 11,
57         /*remoteFlowControlWindow=*/ 12);
58     SocketAddress local = new InetSocketAddress("10.0.0.1", 1000);
59     SocketAddress remote = new InetSocketAddress("10.0.0.2", 1000);
60     InternalChannelz.SocketOptions socketOptions
61         = new InternalChannelz.SocketOptions.Builder().build();
62     Security security = null;
63 
64     @Override
getStats()65     public ListenableFuture<SocketStats> getStats() {
66       SettableFuture<SocketStats> ret = SettableFuture.create();
67       ret.set(
68           new SocketStats(
69               transportStats,
70               local,
71               remote,
72               socketOptions,
73               security));
74       return ret;
75     }
76 
77     @Override
getLogId()78     public InternalLogId getLogId() {
79       return id;
80     }
81 
82     @Override
toString()83     public String toString() {
84       return MoreObjects.toStringHelper(this)
85           .add("logId", getLogId())
86           .toString();
87     }
88   }
89 
90   static final class TestListenSocket implements InternalInstrumented<SocketStats> {
91     private final InternalLogId id = InternalLogId.allocate("listensocket");
92     SocketAddress listenAddress = new InetSocketAddress("10.0.0.1", 1234);
93 
94     @Override
getStats()95     public ListenableFuture<SocketStats> getStats() {
96       SettableFuture<SocketStats> ret = SettableFuture.create();
97       ret.set(
98           new SocketStats(
99               /*data=*/ null,
100               listenAddress,
101               /*remote=*/ null,
102               new SocketOptions.Builder().addOption("listen_option", "listen_option_value").build(),
103               /*security=*/ null));
104       return ret;
105     }
106 
107     @Override
getLogId()108     public InternalLogId getLogId() {
109       return id;
110     }
111 
112     @Override
toString()113     public String toString() {
114       return MoreObjects.toStringHelper(this)
115           .add("logId", getLogId())
116           .toString();
117     }
118   }
119 
120   static final class TestServer implements InternalInstrumented<ServerStats> {
121     private final InternalLogId id = InternalLogId.allocate("server");
122     ServerStats serverStats = new ServerStats(
123         /*callsStarted=*/ 1,
124         /*callsSucceeded=*/ 2,
125         /*callsFailed=*/ 3,
126         /*lastCallStartedNanos=*/ 4,
127         Collections.<InternalInstrumented<SocketStats>>emptyList());
128 
129     @Override
getStats()130     public ListenableFuture<ServerStats> getStats() {
131       SettableFuture<ServerStats> ret = SettableFuture.create();
132       ret.set(serverStats);
133       return ret;
134     }
135 
136     @Override
getLogId()137     public InternalLogId getLogId() {
138       return id;
139     }
140 
141     @Override
toString()142     public String toString() {
143       return MoreObjects.toStringHelper(this)
144           .add("logId", getLogId())
145           .toString();
146     }
147   }
148 
149   static final class TestChannel implements InternalInstrumented<ChannelStats> {
150     private final InternalLogId id = InternalLogId.allocate("channel-or-subchannel");
151 
152     ChannelStats stats = new ChannelStats.Builder()
153         .setTarget("sometarget")
154         .setState(ConnectivityState.READY)
155         .setCallsStarted(1)
156         .setCallsSucceeded(2)
157         .setCallsFailed(3)
158         .setLastCallStartedNanos(4)
159         .setSubchannels(Collections.<InternalWithLogId>emptyList())
160         .setSockets(Collections.<InternalWithLogId>emptyList())
161         .build();
162 
163     @Override
getStats()164     public ListenableFuture<ChannelStats> getStats() {
165       SettableFuture<ChannelStats> ret = SettableFuture.create();
166       ret.set(stats);
167       return ret;
168     }
169 
170     @Override
getLogId()171     public InternalLogId getLogId() {
172       return id;
173     }
174 
175     @Override
toString()176     public String toString() {
177       return MoreObjects.toStringHelper(this)
178           .add("logId", getLogId())
179           .toString();
180     }
181   }
182 }
183