gRPC - Google Remote Procedure Call
What is gRPC?
gRPC is a high-performance, open-source remote procedure call (RPC) framework developed by Google. It enables communication between services using HTTP/2 and Protocol Buffers (protobufs) for efficient, strongly-typed messaging.
Why is gRPC useful?
Efficient communication – Uses Protocol Buffers for compact and fast serialization.
Strongly typed – Interfaces are defined using .proto files, enabling code generation.
Bi-directional streaming – Supports client, server, and bi-directional streaming natively.
Language interoperability – Works across many programming languages.
How it works?
Define service – A .proto file defines the service and message types.
Generate code – Tools generate client and server code in multiple languages.
Client makes request – The client calls a method as if it were local.
Server handles request – The server receives the call and processes it.
Response sent – The result is sent back to the client over HTTP/2.
Where is gRPC used?
Microservices – Enables efficient communication between services.
Mobile applications – Due to compact message size and HTTP/2.
Cloud services – Used in systems like Google Cloud and Kubernetes.
Real-time communication – Great for use cases needing bi-directional streaming.
Which OSI layer does this protocol belong to?
gRPC defines application-level service interfaces and message formats.
It operates over transport protocols like HTTP/2, focusing on high-level logic.
It provides structured, reliable RPC services directly to applications.
Topics in this section,
In this section, you are going to learn
Terminology
Version Info
gRPC |
RFC |
Year |
Core Idea / Contribution |
---|---|---|---|
Version |
|||
Version 1.0 |
|||
gRPC Public Release (GitHub) |
2016 |
Initial stable release of gRPC, introducing efficient, cross-language RPC communication using Protocol Buffers over HTTP/2 |
|
Semantic Versioning |
|||
GitHub Versioning Guide |
Ongoing |
gRPC follows semantic versioning (vX.Y.Z), ensuring backward compatibility and structured evolution of features |
|
Service Versioning Strategy |
|||
Microsoft Learn |
2024 |
Guidelines for evolving gRPC services without breaking clients, supporting non-breaking changes like adding fields or methods |
setup
setup
Client Request Headers Packet
S.No |
Protocol Packets |
Description |
Size(bytes) |
---|---|---|---|
1 |
Client Request Headers Packet |
Sent by the client to initiate a gRPC call |
Variable (depends |
over HTTP/2. |
on headers) |
||
:method |
HTTP method (always POST) |
Variable |
|
:scheme |
Protocol scheme (http or https) |
Variable |
|
:path |
RPC method path (e.g., /service/method) |
Variable |
|
:authority |
Server authority (host:port) |
Variable |
|
content-type |
Must be application/grpc |
Variable |
|
te |
Must be trailers |
Variable |
|
grpc-timeout |
Optional timeout value |
Variable |
|
grpc-encoding |
Optional compression method |
Variable |
|
grpc-accept-encoding |
Supported compression methods |
Variable |
|
Custom Metadata |
Application-specific headers |
Variable |
|
gRPC Data Frame (Request Message) Packet
S.No |
Protocol Packets |
Description |
Size(bytes) |
---|---|---|---|
2 |
gRPC Data Frame (Request Message) |
Carries the serialized Protobuf message |
5 + message length |
from client to server. |
|||
Compressed Flag |
0 = uncompressed, 1 = compressed |
1 |
|
Message Length |
Length of the message (big-endian) |
4 |
|
Message |
Serialized Protobuf message |
Variable |
|
Server Response Headers Packet
S.No |
Protocol Packets |
Description |
Size(bytes) |
---|---|---|---|
3 |
Server Response Headers Packet |
Sent by the server to acknowledge the |
Variable |
request and start the response. |
|||
:status |
HTTP status (usually 200) |
Variable |
|
content-type |
Must be application/grpc |
Variable |
|
grpc-encoding |
Compression used (if any) |
Variable |
|
grpc-accept-encoding |
Supported compression methods |
Variable |
|
Custom Metadata |
Application-specific headers |
Variable |
|
gRPC Data Frame (Response Message) Packet
S.No |
Protocol Packets |
Description |
Size(bytes) |
---|---|---|---|
4 |
gRPC Data Frame (Response Message) |
Carries the serialized Protobuf message |
5 + message length |
from server to client. |
|||
Compressed Flag |
0 = uncompressed, 1 = compressed |
1 |
|
Message Length |
Length of the message (big-endian) |
4 |
|
Message |
Serialized Protobuf message |
Variable |
|
Server Trailers Packet
S.No |
Protocol Packets |
Description |
Size(bytes) |
---|---|---|---|
5 |
Server Trailers Packet |
Sent by the server at the end of the stream |
Variable |
to indicate status. |
|||
grpc-status |
Status code (e.g., 0 = OK) |
Variable |
|
grpc-message |
Optional human-readable message |
Variable |
|
Custom Trailers |
Application-specific metadata |
Variable |
|
s.no |
Use Case |
Description |
---|---|---|
1 |
Microservices Communication |
Enables efficient, low-latency communication between services in distributed systems. |
2 |
Cloud-Native Applications |
Widely used in Kubernetes and service meshes (e.g., Istio) for internal service communication. |
3 |
Mobile Backend Services |
Ideal for mobile apps due to its compact binary format and HTTP/2 support. |
4 |
IoT Systems |
Facilitates fast and lightweight communication between edge devices and cloud services. |
5 |
Real-Time Data Streaming |
Supports bidirectional streaming for telemetry, logs, and analytics pipelines. |
6 |
Machine Learning Pipelines |
Used to connect ML model servers with data preprocessing and inference services. |
7 |
Cross-Language APIs |
Allows services written in different languages to communicate seamlessly. |
8 |
Internal APIs in Enterprises |
Preferred for internal APIs due to performance, type safety, and versioning. |
9 |
Blockchain and Fintech |
Used in systems requiring high throughput and secure communication. |
10 |
Gaming Backends |
Supports real-time multiplayer game state synchronization and matchmaking. |
S.no |
Feature |
Description |
---|---|---|
1 |
Protocol Buffers (Protobuf) |
Uses Protobuf for compact, fast, and strongly typed message serialization. |
2 |
HTTP/2 Transport |
Leverages HTTP/2 for multiplexing, flow control, and low-latency communication. |
3 |
Cross-Language Support |
Supports many languages including Go, Java, Python, C++, and more. |
4 |
Streaming Support |
Enables client, server, and bidirectional streaming for real-time data exchange. |
5 |
Contract-First API Design |
APIs are defined in .proto files, ensuring consistency and auto-generated code. |
6 |
Built-in Authentication |
Supports TLS, token-based auth, and integration with systems like OAuth2. |
7 |
Load Balancing & Retry |
Supports advanced features like client-side load balancing and retries. |
8 |
Pluggable Architecture |
Allows integration of custom interceptors, authentication, and logging. |
9 |
Efficient Binary Format |
Smaller and faster than JSON or XML, ideal for performance-critical systems. |
10 |
Error Handling & Status Codes |
Provides structured error responses with gRPC status codes and messages. |
protocol buffers(Protobuf) - Testcases
# |
Test Case |
Description |
Expected Result |
---|---|---|---|
1 |
Define Simple Message |
Create a basic .proto message with primitive fields |
Message compiles successfully |
2 |
Serialize Message |
Convert message to binary format |
Output is compact and valid |
3 |
Deserialize Message |
Parse binary data into message object |
Fields populated correctly |
4 |
Use Nested Messages |
Define nested message structures |
Nested fields serialized/deserialized correctly |
5 |
Use Repeated Fields |
Define repeated fields (arrays/lists) |
Multiple values handled correctly |
6 |
Use Enum Fields |
Define and use enums |
Enum values serialized and parsed correctly |
7 |
Use Oneof Fields |
Use oneof for mutually exclusive fields |
Only one field set at a time |
8 |
Use Optional Fields |
Define optional fields |
Fields can be omitted without error |
9 |
Use Default Values |
Rely on default values for unset fields |
Defaults applied correctly |
10 |
Forward Compatibility |
Add new fields to existing message |
Older clients ignore unknown fields |
11 |
Backward Compatibility |
Remove or rename fields |
Older messages still parse correctly |
12 |
Field Number Uniqueness |
Ensure unique field numbers |
Compiler throws error on duplicates |
13 |
Reserved Fields |
Reserve field numbers and names |
Compiler prevents reuse |
14 |
Use Map Fields |
Define map (key-value) fields |
Keys and values serialized correctly |
15 |
Use Custom Options |
Add custom options to fields/messages |
Options parsed and respected |
16 |
Define RPC Service |
Define service and RPC methods in .proto |
Service compiles and stubs generated |
17 |
Generate Code in Go |
Generate Go code from .proto |
Code compiles and runs |
18 |
Generate Code in Python |
Generate Python code from .proto |
Code compiles and runs |
19 |
Use Protobuf in Unary RPC |
Send/receive Protobuf message in unary RPC |
Message transmitted correctly |
20 |
Use Protobuf in Streaming RPC |
Use Protobuf in client/server streaming |
Messages streamed correctly |
21 |
Validate Required Fields |
Use optional keyword in proto3 |
Field presence tracked |
22 |
Use Extensions (proto2) |
Define and use extensions |
Extensions parsed correctly |
23 |
Import Custom Types |
Import and use messages from other .proto files |
Imports resolved and compiled |
24 |
Handle Unknown Fields |
Receive message with unknown fields |
Unknown fields ignored |
25 |
Use Any Type |
Use google.protobuf.Any |
Type unpacked correctly |
26 |
Use Timestamp and Duration |
Use standard time types |
Time values serialized correctly |
27 |
Use Struct and Value |
Use dynamic JSON-like types |
Data parsed correctly |
28 |
Use Field Deprecation |
Mark a field as deprecated |
Compiler warns, field still usable |
29 |
JSON Mapping |
Convert Protobuf message to JSON |
JSON output matches schema |
30 |
Parse JSON to Protobuf |
Convert JSON to Protobuf |
Message populated correctly |
31 |
Use Reflection |
Inspect message structure at runtime |
Fields and types accessible |
32 |
Use REST Gateway |
Use gRPC-Gateway to expose Protobuf over HTTP |
JSON mapped to Protobuf correctly |
33 |
Use with gRPC-Web |
Use Protobuf in browser via gRPC-Web |
Messages encoded/decoded correctly |
34 |
Use Compression |
Compress Protobuf messages |
Size reduced, message valid |
35 |
Use with Interceptors |
Inspect/modify Protobuf messages in interceptor |
Interceptor sees correct message |
36 |
Use with Middleware |
Pass Protobuf messages through middleware |
Middleware processes correctly |
37 |
Use with Load Balancer |
Send Protobuf messages through load-balanced gRPC |
Messages routed and handled correctly |
38 |
Use with Retry Logic |
Retry failed Protobuf-based RPC |
Message re-sent and handled |
39 |
Use with Deadlines |
Set deadline for RPC |
Timeout enforced |
40 |
Use with Metadata |
Attach metadata to Protobuf RPC |
Metadata accessible on server |
41 |
Use with Error Handling |
Return structured error using Protobuf |
Error parsed and displayed |
42 |
Use with Status Codes |
Return gRPC status with Protobuf message |
Status and message handled correctly |
43 |
Use Custom Error Types |
Define custom error message types |
Custom errors parsed correctly |
44 |
Versioning .proto Files |
Maintain multiple versions |
Clients interoperate correctly |
45 |
Use in CI/CD Pipeline |
Compile and test .proto files in CI/CD |
Build passes with valid schema |
46 |
Lint .proto Files |
Lint for style and best practices |
Lint passes or shows actionable warnings |
47 |
Use Code Generation Plugins |
Use plugins like protoc-gen-validate |
Generated code includes validation logic |
48 |
Generate Multi-Language Bindings |
Generate bindings for multiple languages |
Code compiles and interoperates |
49 |
Use with IDE Integration |
Use IDE support for .proto files |
Syntax highlighting and autocomplete work |
50 |
Use with Schema Registry |
Store and retrieve .proto definitions |
Schema versioning and access managed |
HTTP/2 Transport - Testcases
# |
Test Case |
Description |
Expected Result |
---|---|---|---|
1 |
Establish HTTP/2 Connection |
Initiate gRPC call over HTTP/2 |
Connection established successfully |
2 |
Multiplex Multiple Streams |
Send multiple RPCs over a single connection |
Streams handled concurrently |
3 |
Stream Prioritization |
Assign priorities to streams |
Higher priority streams processed first |
4 |
Flow Control Window Adjustment |
Adjust flow control window size |
Data flow adapts accordingly |
5 |
Header Compression |
Use HPACK to compress headers |
Reduced header size |
6 |
Binary Framing |
Use HTTP/2 binary framing for messages |
Frames parsed correctly |
7 |
Stream Reset Handling |
Reset a stream mid-communication |
Stream closed gracefully |
8 |
Connection Keepalive |
Send keepalive pings |
Connection remains active |
9 |
Connection Timeout |
Simulate idle timeout |
Connection closed after timeout |
10 |
Connection Reuse |
Reuse existing HTTP/2 connection for new RPCs |
No new TCP connection created |
11 |
Server Push Rejection |
Ensure server push is disabled |
No unsolicited responses |
12 |
Large Payload Handling |
Send large message over HTTP/2 |
Message split into frames and reassembled |
13 |
Bidirectional Streaming |
Use full-duplex communication |
Both client and server send/receive simultaneously |
14 |
Client Streaming |
Send multiple messages from client |
Server receives all messages |
15 |
Server Streaming |
Server sends multiple messages |
Client receives all messages |
16 |
Stream Cancellation |
Cancel stream from client side |
Server receives cancellation |
17 |
Stream Error Propagation |
Trigger error mid-stream |
Error propagated to client |
18 |
Max Concurrent Streams |
Exceed max concurrent stream limit |
Excess streams rejected |
19 |
Stream ID Management |
Ensure stream IDs increment correctly |
No ID reuse or collision |
20 |
Header Order Preservation |
Maintain header order |
Headers received in correct order |
21 |
Trailers Support |
Send trailers after message body |
Trailers parsed correctly |
22 |
Ping Frame Handling |
Send and receive ping frames |
RTT measured accurately |
23 |
SETTINGS Frame Exchange |
Exchange settings between client and server |
Settings acknowledged |
24 |
GOAWAY Frame Handling |
Server sends GOAWAY |
Client stops initiating new streams |
25 |
Window Update Frame Handling |
Send WINDOW_UPDATE frames |
Flow control window increased |
26 |
Frame Size Limit Enforcement |
Send frame exceeding max size |
Frame rejected or split |
27 |
Header Size Limit Enforcement |
Send large headers |
Headers rejected if too large |
28 |
Connection Preface Validation |
Validate HTTP/2 connection preface |
Invalid preface rejected |
29 |
Stream Timeout |
Simulate stream-level timeout |
Stream closed with error |
30 |
Connection Error Handling |
Trigger protocol error |
Connection closed with error |
31 |
TLS with HTTP/2 |
Use HTTP/2 over TLS |
Secure connection established |
32 |
ALPN Negotiation |
Use ALPN to negotiate HTTP/2 |
HTTP/2 selected |
33 |
Proxy Compatibility |
Use HTTP/2 through proxy |
Proxy forwards frames correctly |
34 |
Load Balancer Compatibility |
Use HTTP/2 with load balancer |
Streams routed correctly |
35 |
NAT Traversal |
Maintain HTTP/2 connection through NAT |
Connection remains stable |
36 |
IPv6 Support |
Use HTTP/2 over IPv6 |
Connection established |
37 |
IPv4 Support |
Use HTTP/2 over IPv4 |
Connection established |
38 |
Header Compression Efficiency |
Measure header compression ratio |
Compression reduces size significantly |
39 |
Stream Interleaving |
Interleave frames from multiple streams |
Frames decoded correctly |
40 |
Stream Flow Control Enforcement |
Exceed flow control window |
Data blocked until window update |
41 |
Connection-Level Flow Control |
Exceed connection-level window |
All streams blocked |
42 |
Graceful Shutdown |
Server initiates graceful shutdown |
Client completes in-flight streams |
43 |
Stream-Level Retry |
Retry failed stream |
Stream re-established |
44 |
Connection-Level Retry |
Retry after connection failure |
New connection established |
45 |
Frame Reordering Handling |
Simulate out-of-order frames |
Frames reassembled correctly |
46 |
Frame Loss Recovery |
Simulate frame loss |
Stream fails or retries |
47 |
Stream Fragmentation |
Fragment large message into multiple frames |
Message reassembled correctly |
48 |
Stream Compression |
Compress message payload |
Payload decompressed correctly |
49 |
Server Push Disabled |
Ensure server push is not used |
No unsolicited data sent |
50 |
HTTP/2 Compliance |
Validate full compliance with HTTP/2 spec |
All protocol rules followed |
Cross language support - Testcases
# |
Test Case |
Description |
Expected Result |
---|---|---|---|
1 |
Generate Code in Go |
Generate client/server code from .proto in Go |
Code compiles and runs |
2 |
Generate Code in Java |
Generate client/server code in Java |
Code compiles and runs |
3 |
Generate Code in Python |
Generate client/server code in Python |
Code executes correctly |
4 |
Generate Code in C++ |
Generate client/server code in C++ |
Code compiles and runs |
5 |
Generate Code in C# |
Generate client/server code in C# |
Code compiles and runs |
6 |
Generate Code in Ruby |
Generate client/server code in Ruby |
Code executes correctly |
7 |
Generate Code in Node.js |
Generate client/server code in Node.js |
Code executes correctly |
8 |
Generate Code in PHP |
Generate client/server code in PHP |
Code executes correctly |
9 |
Generate Code in Kotlin |
Generate client/server code in Kotlin |
Code compiles and runs |
10 |
Generate Code in Swift |
Generate client code in Swift |
Code compiles and runs |
11 |
Interop: Go Server, Java Client |
Start server in Go, connect with Java client |
Communication successful |
12 |
Interop: Java Server, Python Client |
Start server in Java, connect with Python client |
Communication successful |
13 |
Interop: C++ Server, C# Client |
Start server in C++, connect with C# client |
Communication successful |
14 |
Interop: Node.js Server, Go Client |
Start server in Node.js, connect with Go client |
Communication successful |
15 |
Interop: Python Server, Ruby Client |
Start server in Python, connect with Ruby client |
Communication successful |
16 |
Unary RPC Across Languages |
Test unary RPC between different language pairs |
Request/response successful |
17 |
Server Streaming Across Languages |
Test server streaming RPC across languages |
Stream received correctly |
18 |
Client Streaming Across Languages |
Test client streaming RPC across languages |
Stream sent correctly |
19 |
Bidirectional Streaming Across Languages |
Test full-duplex streaming across languages |
Messages exchanged correctly |
20 |
Use Common Protobuf Schema |
Share .proto file across languages |
All languages generate consistent code |
21 |
Use Custom Options in Protobuf |
Use custom options and verify support across languages |
Options respected or ignored gracefully |
22 |
Use Enums Across Languages |
Define enums in .proto and use in all languages |
Enum values mapped correctly |
23 |
Use Maps Across Languages |
Define map fields and test serialization |
Maps handled correctly |
24 |
Use Oneof Across Languages |
Use oneof fields and test behavior |
Only one field set at a time |
25 |
Use Repeated Fields Across Languages |
Use repeated fields (arrays/lists) |
Lists handled correctly |
26 |
Use Nested Messages Across Languages |
Use nested message structures |
Nested fields parsed correctly |
27 |
Use Optional Fields Across Languages |
Use optional fields |
Optionality respected |
28 |
Use Default Values Across Languages |
Rely on default values |
Defaults applied consistently |
29 |
Use Metadata Across Languages |
Send/receive metadata |
Metadata accessible |
30 |
Use Deadlines Across Languages |
Set deadlines and timeouts |
Timeouts enforced |
31 |
Use TLS Across Languages |
Secure communication with TLS |
Connection encrypted |
32 |
Use Compression Across Languages |
Enable message compression |
Messages compressed and decompressed |
33 |
Use Interceptors Across Languages |
Add interceptors/middleware |
Interceptors invoked correctly |
34 |
Use Error Handling Across Languages |
Return and parse structured errors |
Errors handled consistently |
35 |
Use Status Codes Across Languages |
Return gRPC status codes |
Status interpreted correctly |
36 |
Use Streaming Flow Control |
Test flow control in streaming RPCs |
Flow respected across languages |
37 |
Use Authentication Across Languages |
Use token-based or mTLS authentication |
Authenticated successfully |
38 |
Use Load Balancing Across Languages |
Connect to load-balanced server |
Requests distributed correctly |
39 |
Use Retry Policies Across Languages |
Configure and test retry logic |
Retries performed as expected |
40 |
Use Reflection API |
Use gRPC reflection to discover services |
Services listed correctly |
41 |
Use Health Check API |
Use standard health check service |
Health status returned |
42 |
Use Logging Across Languages |
Log gRPC calls |
Logs generated correctly |
43 |
Use Monitoring/Tracing Tools |
Integrate with tools like OpenTelemetry |
Traces collected across languages |
44 |
Use Code Linting for .proto Files |
Lint .proto files for style |
Lint passes or shows warnings |
45 |
Use CI/CD for Multi-Language Builds |
Compile and test all language clients in CI |
Build passes for all targets |
46 |
Use Versioned APIs |
Maintain multiple versions of .proto files |
Clients interoperate correctly |
47 |
Use Language-Specific Features |
Use idiomatic constructs in each language |
Code remains idiomatic and functional |
48 |
Handle Unknown Fields |
Send unknown fields between languages |
Fields ignored gracefully |
49 |
Use Language-Specific gRPC Libraries |
Use official or community-supported libraries |
Libraries function correctly |
50 |
Validate Interop with gRPC Interop Suite |
Run gRPC interoperability test suite |
All tests pass |
streaming support - Testcases
# |
Test Case |
Description |
Expected Result |
---|---|---|---|
1 |
Client Streaming RPC |
Client sends multiple messages to server |
Server receives all messages |
2 |
Server Streaming RPC |
Server sends multiple messages to client |
Client receives all messages |
3 |
Bidirectional Streaming RPC |
Both client and server stream messages |
Messages exchanged in real-time |
4 |
Stream Initialization |
Establish streaming connection |
Stream opens successfully |
5 |
Stream Termination |
Close stream gracefully |
Stream closes without error |
6 |
Stream Cancellation by Client |
Client cancels stream mid-way |
Server receives cancellation |
7 |
Stream Cancellation by Server |
Server cancels stream mid-way |
Client receives cancellation |
8 |
Stream Timeout |
Simulate timeout during streaming |
Stream closed with deadline exceeded |
9 |
Stream Error Propagation |
Trigger error during stream |
Error propagated to other side |
10 |
Stream Retry Logic |
Retry failed stream |
Stream re-established |
11 |
Stream Flow Control |
Respect flow control limits |
No overflow or data loss |
12 |
Stream with Large Payloads |
Send large messages in stream |
Messages split and reassembled |
13 |
Stream with Small Payloads |
Send many small messages |
All messages received |
14 |
Stream with Compression |
Enable compression for stream |
Messages compressed and decompressed |
15 |
Stream with Metadata |
Attach metadata to stream |
Metadata accessible |
16 |
Stream with Authentication |
Authenticate before streaming |
Authenticated successfully |
17 |
Stream with TLS |
Use TLS-secured stream |
Encrypted communication |
18 |
Stream with Interceptors |
Use interceptors to inspect stream |
Interceptors invoked correctly |
19 |
Stream with Logging |
Log all stream messages |
Logs show correct sequence |
20 |
Stream with Monitoring |
Monitor stream with tracing tools |
Metrics collected |
21 |
Stream with Deadline |
Set deadline for stream |
Stream ends on timeout |
22 |
Stream with Backpressure |
Simulate slow consumer |
Flow control respected |
23 |
Stream with Burst Load |
Send burst of messages |
No message loss |
24 |
Stream with Network Delay |
Simulate network latency |
Stream continues with delay |
25 |
Stream with Packet Loss |
Simulate packet loss |
Stream retries or fails gracefully |
26 |
Stream with Reconnection |
Reconnect after network drop |
Stream resumes or restarts |
27 |
Stream with Bidirectional Sync |
Sync data in both directions |
Data exchanged correctly |
28 |
Stream with Stateful Server |
Maintain state across stream messages |
State preserved |
29 |
Stream with Stateless Server |
Handle each message independently |
No state retained |
30 |
Stream with Message Ordering |
Ensure message order is preserved |
Messages received in order |
31 |
Stream with Out-of-Order Messages |
Simulate out-of-order delivery |
Messages reordered or flagged |
32 |
Stream with Duplicate Messages |
Send duplicate messages |
Duplicates handled gracefully |
33 |
Stream with Message Acknowledgment |
Acknowledge each message |
ACKs received |
34 |
Stream with Custom Headers |
Send custom headers |
Headers received correctly |
35 |
Stream with Trailers |
Send trailers after stream |
Trailers parsed correctly |
36 |
Stream with Binary Data |
Send binary payloads |
Data received intact |
37 |
Stream with JSON Payload |
Send JSON-encoded data |
Parsed correctly |
38 |
Stream with Protobuf Payload |
Use Protobuf messages |
Messages serialized/deserialized |
39 |
Stream with Error Recovery |
Recover from mid-stream error |
Stream resumes or fails gracefully |
40 |
Stream with Multi-Client Load |
Multiple clients stream simultaneously |
Server handles all streams |
41 |
Stream with Multi-Server Load |
Client streams to multiple servers |
Load balanced correctly |
42 |
Stream with Versioned APIs |
Use different versions of streaming APIs |
Compatible communication |
43 |
Stream with Rate Limiting |
Enforce rate limits on stream |
Excess messages throttled |
44 |
Stream with Quotas |
Enforce quotas on stream usage |
Limits respected |
45 |
Stream with Health Check |
Monitor stream health |
Health status reported |
46 |
Stream with Reflection |
Discover streaming methods dynamically |
Methods listed correctly |
47 |
Stream with CI/CD Integration |
Test streaming in CI pipeline |
Tests pass |
48 |
Stream with Language Interoperability |
Stream between different language clients/servers |
Messages exchanged correctly |
49 |
Stream with Mobile Client |
Stream from mobile app |
Stream stable and responsive |
50 |
Stream with Embedded Device |
Stream from IoT/embedded system |
Stream functional with constraints |
Contract first API Design - Testcases
# |
Test Case |
Description |
Expected Result |
---|---|---|---|
1 |
Define Basic .proto File |
Create a .proto file with a simple service and message |
File compiles successfully |
2 |
Use Service Definition |
Define service with RPC methods |
Service recognized by code generator |
3 |
Use Message Definition |
Define request and response messages |
Messages compiled correctly |
4 |
Use Enum in .proto |
Define enum type in .proto |
Enum values parsed correctly |
5 |
Use Nested Messages |
Define nested message structures |
Nested fields accessible |
6 |
Use Repeated Fields |
Define repeated fields (lists) |
Lists handled correctly |
7 |
Use Optional Fields |
Use optional keyword in proto3 |
Optionality respected |
8 |
Use Oneof Fields |
Define mutually exclusive fields |
Only one field set at a time |
9 |
Use Map Fields |
Define map (key-value) fields |
Maps serialized correctly |
10 |
Use Reserved Fields |
Reserve field numbers/names |
Compiler prevents reuse |
11 |
Use Default Values |
Rely on default values |
Defaults applied correctly |
12 |
Use Custom Options |
Add custom options to messages or fields |
Options parsed or ignored gracefully |
13 |
Use Comments for Documentation |
Add comments in .proto file |
Comments appear in generated docs |
14 |
Use Import Statements |
Import types from other .proto files |
Imports resolved correctly |
15 |
Use Package Declaration |
Define package name |
Namespace applied in generated code |
16 |
Use Syntax Declaration |
Specify proto3 syntax |
Compiler uses correct version |
17 |
Generate Code in Go |
Generate Go code from .proto |
Code compiles and runs |
18 |
Generate Code in Python |
Generate Python code from .proto |
Code executes correctly |
19 |
Generate Code in Java |
Generate Java code from .proto |
Code compiles and runs |
20 |
Generate Code in C++ |
Generate C++ code from .proto |
Code compiles and runs |
21 |
Generate Code in C# |
Generate C# code from .proto |
Code compiles and runs |
22 |
Generate Code in Node.js |
Generate Node.js code from .proto |
Code executes correctly |
23 |
Validate Field Number Uniqueness |
Use unique field numbers |
Compiler accepts schema |
24 |
Detect Duplicate Field Numbers |
Use duplicate field numbers |
Compiler throws error |
25 |
Detect Missing Field Types |
Omit field type in message |
Compiler throws error |
26 |
Detect Invalid Syntax |
Use invalid syntax in .proto |
Compiler throws error |
27 |
Use Protobuf Linter |
Lint .proto file for style and best practices |
Lint passes or shows warnings |
28 |
Use Protobuf Validator Plugin |
Use protoc-gen-validate for field validation |
Validation rules enforced |
29 |
Use Versioned .proto Files |
Maintain multiple versions of API |
Clients interoperate correctly |
30 |
Use Semantic Naming |
Follow naming conventions in .proto |
Code is readable and consistent |
31 |
Use gRPC Gateway Annotations |
Add HTTP annotations for REST support |
REST endpoints generated |
32 |
Use Field Deprecation |
Mark field as deprecated |
Warning shown in generated code |
33 |
Use Field Aliases |
Rename field in code while keeping Protobuf name |
Serialization remains consistent |
34 |
Use JSON Mapping |
Convert Protobuf to JSON |
JSON matches schema |
35 |
Use Reflection API |
Enable gRPC reflection |
Services discoverable dynamically |
36 |
Use Health Check API |
Define health check service in .proto |
Health status accessible |
37 |
Use Streaming RPCs |
Define client/server/bidirectional streaming methods |
Streams function correctly |
38 |
Use Unary RPCs |
Define simple request-response methods |
RPCs function correctly |
39 |
Use Metadata in .proto |
Define metadata expectations in comments or options |
Metadata handled correctly |
40 |
Use Error Handling Schema |
Define structured error messages |
Errors parsed correctly |
41 |
Use Status Codes in .proto |
Document expected status codes |
Clients handle codes correctly |
42 |
Use CI/CD to Validate .proto |
Compile .proto in CI pipeline |
Build passes |
43 |
Use .proto in API Documentation |
Generate API docs from .proto |
Docs reflect schema accurately |
44 |
Use .proto in SDK Generation |
Generate SDKs from .proto |
SDKs consistent across languages |
45 |
Use .proto in Mock Server Generation |
Generate mock server from .proto |
Mocks simulate real behavior |
46 |
Use .proto in Test Automation |
Use .proto to drive test cases |
Tests validate contract |
47 |
Use .proto in Schema Registry |
Store .proto in central registry |
Versioning and access managed |
48 |
Use .proto in Code Review |
Review .proto for API changes |
Changes approved or flagged |
49 |
Use .proto for Backward Compatibility |
Add new fields without breaking clients |
Older clients continue to work |
50 |
Use .proto for Forward Compatibility |
Ignore unknown fields in newer messages |
New clients interoperate with old servers |
Built in authentication - Testcases
# |
Test Case |
Description |
Expected Result |
---|---|---|---|
1 |
Enable TLS on Server |
Configure server with TLS certificate |
Secure connection established |
2 |
Enable TLS on Client |
Configure client to use TLS |
Secure connection established |
3 |
Use Self-Signed Certificate |
Use self-signed cert for TLS |
Connection established with trust override |
4 |
Use Expired Certificate |
Use expired TLS certificate |
Connection rejected |
5 |
Use Revoked Certificate |
Use revoked TLS certificate |
Connection rejected |
6 |
Use Mutual TLS |
Require client certificate |
Mutual authentication successful |
7 |
Use Invalid Client Certificate |
Present invalid client certificate |
Connection rejected |
8 |
Use Token-Based Auth |
Send bearer token in metadata |
Token validated and access granted |
9 |
Use Expired Token |
Send expired token |
Access denied |
10 |
Use Invalid Token |
Send malformed or invalid token |
Access denied |
11 |
Use OAuth2 Access Token |
Authenticate using OAuth2 token |
Token validated by server |
12 |
Use OAuth2 Refresh Token |
Refresh access token |
New token issued |
13 |
Use JWT Token |
Authenticate using JWT |
Token verified and claims extracted |
14 |
Use Token with Scopes |
Send token with specific scopes |
Access granted based on scope |
15 |
Use Token with Audience Claim |
Validate audience in JWT |
Access granted if audience matches |
16 |
Use Token with Exp Claim |
Validate expiration in JWT |
Access denied if expired |
17 |
Use Token with Issuer Claim |
Validate issuer in JWT |
Access denied if issuer mismatch |
18 |
Use Token with Signature Validation |
Validate token signature |
Access granted if valid |
19 |
Use OAuth2 with Authorization Code Flow |
Complete full OAuth2 flow |
Token issued and used |
20 |
Use OAuth2 with Client Credentials Flow |
Authenticate using client credentials |
Token issued and used |
21 |
Use OAuth2 with PKCE |
Use PKCE extension in OAuth2 flow |
Token issued securely |
22 |
Use OAuth2 with OpenID Connect |
Retrieve ID token |
Identity verified |
23 |
Use Auth Interceptor on Client |
Add interceptor to attach token |
Token sent with each request |
24 |
Use Auth Interceptor on Server |
Add interceptor to validate token |
Requests authenticated |
25 |
Use Auth Middleware |
Use middleware for authentication |
Middleware enforces auth |
26 |
Use Auth with Streaming RPC |
Authenticate before streaming |
Stream allowed if authenticated |
27 |
Use Auth with Unary RPC |
Authenticate unary RPC |
Access granted if valid |
28 |
Use Auth with Metadata |
Send token in metadata |
Metadata parsed and validated |
29 |
Use Auth with TLS and Token |
Combine TLS and token-based auth |
Dual-layer security enforced |
30 |
Use Auth with Role-Based Access Control |
Enforce RBAC using token claims |
Access granted based on role |
31 |
Use Auth with Attribute-Based Access |
Enforce ABAC using token attributes |
Access granted based on attributes |
32 |
Use Auth with Custom Claims |
Use custom claims in JWT |
Claims parsed and used |
33 |
Use Auth with Anonymous Access |
Allow unauthenticated access to some methods |
Access granted without token |
34 |
Use Auth with Method-Level Restrictions |
Restrict access to specific RPC methods |
Unauthorized methods blocked |
35 |
Use Auth with Service-Level Restrictions |
Restrict access to entire service |
Unauthorized services blocked |
36 |
Use Auth with Expired TLS Session |
Simulate expired TLS session |
Re-authentication required |
37 |
Use Auth with Token Revocation |
Revoke token and attempt access |
Access denied |
38 |
Use Auth with Token Introspection |
Validate token via introspection endpoint |
Token status confirmed |
39 |
Use Auth with External Identity Provider |
Authenticate via external IdP |
Identity verified |
40 |
Use Auth with Federated Identity |
Use federated login (e.g., Google, Azure AD) |
Access granted |
41 |
Use Auth with Multi-Factor Authentication |
Require second factor |
Access granted after MFA |
42 |
Use Auth with Rate Limiting |
Limit auth attempts |
Excess attempts blocked |
43 |
Use Auth with Logging |
Log authentication attempts |
Logs show success/failure |
44 |
Use Auth with Monitoring |
Monitor auth metrics |
Metrics collected |
45 |
Use Auth with CI/CD |
Test authentication in CI pipeline |
Tests pass |
46 |
Use Auth with Token Caching |
Cache token on client |
Token reused efficiently |
47 |
Use Auth with Token Rotation |
Rotate token periodically |
New token used seamlessly |
48 |
Use Auth with Token Expiry Notification |
Notify user before token expires |
Alert shown |
49 |
Use Auth with Secure Storage |
Store token securely on client |
Token not exposed |
50 |
Use Auth with Revocation List |
Check token against revocation list |
Revoked tokens denied |
Load balancing Retry - Testcases
# |
Test Case |
Description |
Expected Result |
---|---|---|---|
1 |
Configure Round-Robin Load Balancer |
Use round-robin strategy for client-side load balancing |
Requests distributed evenly |
2 |
Configure Pick-First Load Balancer |
Use pick-first strategy |
All requests go to first available server |
3 |
Use Custom Load Balancer |
Implement and use custom load balancing logic |
Custom logic applied |
4 |
Use DNS-Based Load Balancing |
Resolve multiple IPs via DNS |
Requests distributed among resolved addresses |
5 |
Use xDS Load Balancer |
Use xDS-based dynamic configuration |
Load balancing controlled by external system |
6 |
Load Balance Across 2 Servers |
Distribute requests between 2 servers |
Both servers receive traffic |
7 |
Load Balance Across 3+ Servers |
Distribute requests among 3 or more servers |
Traffic evenly distributed |
8 |
Load Balance with Server Health Check |
Skip unhealthy servers |
Only healthy servers used |
9 |
Load Balance with Server Weighting |
Assign weights to servers |
Traffic follows weight distribution |
10 |
Load Balance with Server Failover |
Failover to backup server on failure |
Requests rerouted automatically |
11 |
Load Balance with Server Restart |
Restart one server during load |
Requests rerouted temporarily |
12 |
Load Balance with Server Timeout |
Simulate server timeout |
Retry or reroute triggered |
13 |
Load Balance with Server Crash |
Simulate server crash |
Requests rerouted |
14 |
Load Balance with Network Partition |
Simulate network partition |
Client switches to reachable server |
15 |
Load Balance with TLS |
Use TLS-secured connections |
Secure load balancing |
16 |
Load Balance with Streaming RPC |
Stream data across balanced servers |
Stream handled correctly |
17 |
Load Balance with Unary RPC |
Send unary requests |
Requests distributed |
18 |
Load Balance with Metadata |
Send metadata with requests |
Metadata preserved |
19 |
Load Balance with Retry Enabled |
Enable retry policy |
Failed requests retried |
20 |
Retry on Unavailable Error |
Retry when server returns UNAVAILABLE |
Request retried automatically |
21 |
Retry on Deadline Exceeded |
Retry when deadline exceeded |
Retry triggered |
22 |
Retry on Internal Error |
Retry on INTERNAL error |
Retry triggered |
23 |
Retry on Resource Exhausted |
Retry on RESOURCE_EXHAUSTED |
Retry triggered or delayed |
24 |
Retry with Max Attempts |
Set max retry attempts |
Retries stop after limit |
25 |
Retry with Backoff |
Use exponential backoff between retries |
Delay increases with each retry |
26 |
Retry with Jitter |
Add jitter to retry delay |
Retry intervals randomized |
27 |
Retry with Per-Method Policy |
Apply retry policy to specific RPCs |
Only selected methods retried |
28 |
Retry with Global Policy |
Apply retry policy to all RPCs |
All eligible methods retried |
29 |
Retry with Streaming RPC |
Retry streaming RPC |
Stream re-established |
30 |
Retry with Unary RPC |
Retry unary RPC |
Request retried |
31 |
Retry with Token-Based Auth |
Retry with token in metadata |
Token preserved across retries |
32 |
Retry with TLS |
Retry over secure connection |
TLS session reused or re-established |
33 |
Retry with Load Balancer Change |
Retry after switching load balancer |
Retry succeeds with new server |
34 |
Retry with Server Restart |
Retry after server restart |
Request retried successfully |
35 |
Retry with Server Crash |
Retry after crash |
Request rerouted |
36 |
Retry with Network Drop |
Retry after network failure |
Request retried after reconnect |
37 |
Retry with Deadline |
Retry within deadline |
Retry stops if deadline exceeded |
38 |
Retry with Cancelled Context |
Retry with cancelled context |
Retry not attempted |
39 |
Retry with Custom Error Codes |
Retry on custom-defined error codes |
Retry triggered as configured |
40 |
Retry with Rate Limiting |
Retry under rate-limited conditions |
Retry delayed or blocked |
41 |
Retry with Logging |
Log retry attempts |
Logs show retry sequence |
42 |
Retry with Monitoring |
Monitor retry metrics |
Retry count and latency tracked |
43 |
Retry with Circuit Breaker |
Use circuit breaker to block retries temporarily |
Retry paused during open state |
44 |
Retry with Retry Budget |
Limit retries using retry budget |
Retry stops when budget exhausted |
45 |
Retry with Client Interceptor |
Use interceptor to manage retries |
Interceptor logic applied |
46 |
Retry with Server Interceptor |
Server logs retry attempts |
Retry attempts visible on server |
47 |
Retry with CI/CD Pipeline |
Test retry logic in CI |
Tests pass |
48 |
Retry with Multi-Region Servers |
Retry across regions |
Request rerouted to available region |
49 |
Retry with Load Balancer Failover |
Retry after load balancer failure |
Request rerouted |
50 |
Retry with Retry Token Bucket |
Use token bucket to limit retries |
Retry throttled based on token availability |
Pluggable Architecture - Testcases
# |
Test Case |
Description |
Expected Result |
---|---|---|---|
1 |
Add Unary Client Interceptor |
Attach interceptor to client unary calls |
Interceptor invoked before/after call |
2 |
Add Unary Server Interceptor |
Attach interceptor to server unary calls |
Interceptor invoked before/after handler |
3 |
Add Streaming Client Interceptor |
Attach interceptor to client streaming calls |
Interceptor invoked on stream events |
4 |
Add Streaming Server Interceptor |
Attach interceptor to server streaming calls |
Interceptor invoked on stream events |
5 |
Chain Multiple Interceptors |
Use multiple interceptors in sequence |
All interceptors executed in order |
6 |
Use Interceptor for Logging |
Log request and response metadata |
Logs contain expected data |
7 |
Use Interceptor for Authentication |
Validate token in interceptor |
Access granted or denied |
8 |
Use Interceptor for Metrics |
Collect metrics like latency, error rate |
Metrics recorded correctly |
9 |
Use Interceptor for Tracing |
Add tracing spans to RPC calls |
Traces visible in monitoring tool |
10 |
Use Interceptor for Retry Logic |
Implement retry in client interceptor |
Failed calls retried |
11 |
Use Interceptor for Rate Limiting |
Enforce rate limits per user |
Excess requests blocked |
12 |
Use Interceptor for Request Validation |
Validate request payload before processing |
Invalid requests rejected |
13 |
Use Interceptor for Response Transformation |
Modify response before sending to client |
Response altered as expected |
14 |
Use Interceptor for Header Injection |
Add custom headers to outgoing requests |
Headers visible on server |
15 |
Use Interceptor for Header Extraction |
Read headers from incoming requests |
Headers logged or used |
16 |
Use Interceptor for Context Injection |
Add values to context |
Context accessible in handler |
17 |
Use Interceptor for Panic Recovery |
Catch and log panics in server handler |
Server does not crash |
18 |
Use Interceptor for Audit Logging |
Log sensitive operations |
Audit trail created |
19 |
Use Interceptor for IP Whitelisting |
Allow only specific IPs |
Unauthorized IPs blocked |
20 |
Use Interceptor for Geo-Blocking |
Block requests from certain regions |
Requests denied based on location |
21 |
Use Interceptor for A/B Testing |
Route traffic based on experiment group |
Traffic split correctly |
22 |
Use Interceptor for Feature Flags |
Enable/disable features dynamically |
Behavior changes based on flags |
23 |
Use Interceptor for Caching |
Cache responses for idempotent requests |
Cached response returned |
24 |
Use Interceptor for Request Enrichment |
Add additional data to request |
Enriched request processed |
25 |
Use Interceptor for Request Deduplication |
Detect and drop duplicate requests |
Only one request processed |
26 |
Use Interceptor for Request Throttling |
Throttle high-frequency requests |
Rate limited responses |
27 |
Use Interceptor for Custom Error Handling |
Customize error responses |
Errors formatted consistently |
28 |
Use Interceptor for Locale Detection |
Detect user locale from headers |
Locale used in response |
29 |
Use Interceptor for Session Management |
Track session state |
Session data persisted |
30 |
Use Interceptor for Access Logging |
Log access details (method, IP, duration) |
Logs contain access info |
31 |
Use Interceptor for Request ID Injection |
Generate and attach request ID |
ID visible in logs and responses |
32 |
Use Interceptor for Debug Mode |
Enable debug logging for specific users |
Debug logs generated |
33 |
Use Interceptor for Multi-Tenancy |
Extract tenant ID from metadata |
Tenant context applied |
34 |
Use Interceptor for Quota Enforcement |
Enforce usage quotas |
Quota exceeded error returned |
35 |
Use Interceptor for Custom Authentication |
Plug in custom auth logic |
Authenticated based on custom rules |
36 |
Use Interceptor for Token Refresh |
Refresh expired tokens |
New token issued |
37 |
Use Interceptor for Request Replay |
Replay captured requests for testing |
Requests replayed successfully |
38 |
Use Interceptor for Canary Releases |
Route traffic to canary version |
Canary receives expected traffic |
39 |
Use Interceptor for Circuit Breaking |
Block calls to failing services |
Circuit opened and traffic blocked |
40 |
Use Interceptor for Service Discovery |
Dynamically resolve service endpoints |
Requests routed correctly |
41 |
Use Interceptor for Request Timeout |
Enforce custom timeout policy |
Requests cancelled after timeout |
42 |
Use Interceptor for Request Size Limit |
Reject large requests |
Error returned for oversized payloads |
43 |
Use Interceptor for Response Compression |
Compress responses based on client headers |
Compressed response sent |
44 |
Use Interceptor for Request Decompression |
Decompress incoming requests |
Request processed correctly |
45 |
Use Interceptor for Protocol Translation |
Translate between Protobuf and JSON |
Request/response converted |
46 |
Use Interceptor for Legacy Support |
Adapt legacy clients to new API |
Compatibility maintained |
47 |
Use Interceptor for Schema Validation |
Validate Protobuf schema at runtime |
Invalid messages rejected |
48 |
Use Interceptor for Request Routing |
Route requests to different handlers |
Routing logic applied |
49 |
Use Interceptor for Custom Metrics |
Record custom business metrics |
Metrics visible in dashboard |
50 |
Use Interceptor for Testing Hooks |
Inject test behavior during development |
Test hooks executed |
Efficient binary format - Testcases
# |
Test Case |
Description |
Expected Result |
---|---|---|---|
1 |
Serialize Simple Message |
Serialize a basic Protobuf message |
Output is compact binary |
2 |
Deserialize Simple Message |
Deserialize binary data into message |
Fields populated correctly |
3 |
Compare Size with JSON |
Compare Protobuf and JSON message sizes |
Protobuf is smaller |
4 |
Compare Size with XML |
Compare Protobuf and XML message sizes |
Protobuf is significantly smaller |
5 |
Measure Serialization Speed |
Benchmark Protobuf serialization |
Faster than JSON/XML |
6 |
Measure Deserialization Speed |
Benchmark Protobuf deserialization |
Faster than JSON/XML |
7 |
Use Nested Messages |
Serialize nested Protobuf messages |
Compact and efficient |
8 |
Use Repeated Fields |
Serialize repeated fields |
Efficient encoding |
9 |
Use Oneof Fields |
Serialize mutually exclusive fields |
Only one field encoded |
10 |
Use Map Fields |
Serialize map fields |
Efficient key-value encoding |
11 |
Use Enum Fields |
Serialize enums |
Encoded as integers |
12 |
Use Optional Fields |
Omit optional fields |
Not included in binary |
13 |
Use Default Values |
Skip default values in serialization |
Not encoded, saving space |
14 |
Use Packed Repeated Fields |
Use packed encoding for repeated primitives |
More compact binary |
15 |
Use Field Number Optimization |
Use small field numbers |
Smaller encoded size |
16 |
Use Field Type Optimization |
Use efficient field types (e.g., int32 vs string) |
Smaller binary output |
17 |
Use Varint Encoding |
Encode integers using varint |
Small numbers use fewer bytes |
18 |
Use ZigZag Encoding |
Encode signed integers efficiently |
Smaller size for negative numbers |
19 |
Use Fixed32/Fixed64 Types |
Use fixed-size types |
Predictable size |
20 |
Use Float/Double Types |
Serialize floating-point numbers |
Compact binary representation |
21 |
Use Bytes Field |
Serialize raw binary data |
Efficiently encoded |
22 |
Use Timestamp Field |
Serialize google.protobuf.Timestamp |
Compact time encoding |
23 |
Use Duration Field |
Serialize google.protobuf.Duration |
Efficient duration encoding |
24 |
Use Struct Field |
Serialize dynamic JSON-like structure |
Efficient binary format |
25 |
Use Any Field |
Serialize dynamic message types |
Type and value encoded compactly |
26 |
Use Compression with Protobuf |
Compress Protobuf messages |
Further size reduction |
27 |
Use Streaming with Protobuf |
Stream Protobuf messages |
Efficient real-time transmission |
28 |
Use Protobuf in Low-Bandwidth Network |
Transmit over constrained network |
Minimal bandwidth usage |
29 |
Use Protobuf in IoT Device |
Use on resource-constrained device |
Low memory and CPU usage |
30 |
Use Protobuf in Mobile App |
Use in mobile client |
Fast and efficient messaging |
31 |
Use Protobuf in Embedded System |
Use in embedded firmware |
Compact binary fits memory constraints |
32 |
Use Protobuf in Real-Time System |
Use in latency-sensitive application |
Low serialization overhead |
33 |
Use Protobuf in High-Volume System |
Handle large message throughput |
Efficient processing |
34 |
Use Protobuf with File Transfer |
Encode file metadata |
Compact and fast |
35 |
Use Protobuf with Image Metadata |
Encode image tags and properties |
Efficient binary format |
36 |
Use Protobuf with Sensor Data |
Encode time-series sensor readings |
Compact and fast |
37 |
Use Protobuf with Financial Data |
Encode transactions and prices |
High precision, low size |
38 |
Use Protobuf with Logs |
Encode structured logs |
Efficient storage |
39 |
Use Protobuf with Telemetry |
Encode metrics and telemetry data |
Low overhead |
40 |
Use Protobuf with Chat Messages |
Encode chat messages |
Fast and small payloads |
41 |
Use Protobuf with Notifications |
Encode push notifications |
Efficient delivery |
42 |
Use Protobuf with Video Metadata |
Encode video stream metadata |
Compact and fast |
43 |
Use Protobuf with Audio Metadata |
Encode audio stream metadata |
Efficient encoding |
44 |
Use Protobuf with Game State |
Encode multiplayer game state |
Real-time performance |
45 |
Use Protobuf with Blockchain Data |
Encode blocks and transactions |
Compact and verifiable |
46 |
Use Protobuf with Machine Learning Models |
Encode model metadata and configs |
Efficient model serving |
47 |
Use Protobuf with Health Records |
Encode patient data securely and compactly |
HIPAA-compliant and efficient |
48 |
Use Protobuf with Configuration Files |
Encode app configs |
Small and portable |
49 |
Use Protobuf with API Gateway |
Transmit messages through gateway |
Low latency and size |
50 |
Use Protobuf with CDN |
Distribute Protobuf messages via CDN |
Fast and efficient delivery |
Error handling status codes - Testcases
# |
Test Case |
Description |
Expected Result |
---|---|---|---|
1 |
Return OK Status |
Return successful response |
Status code OK (0) |
2 |
Return CANCELLED Status |
Simulate client-side cancellation |
Status code CANCELLED (1) |
3 |
Return UNKNOWN Status |
Return unknown error |
Status code UNKNOWN (2) |
4 |
Return INVALID_ARGUMENT Status |
Send invalid input |
Status code INVALID_ARGUMENT (3) |
5 |
Return DEADLINE_EXCEEDED Status |
Simulate timeout |
Status code DEADLINE_EXCEEDED (4) |
6 |
Return NOT_FOUND Status |
Request non-existent resource |
Status code NOT_FOUND (5) |
7 |
Return ALREADY_EXISTS Status |
Attempt to create duplicate resource |
Status code ALREADY_EXISTS (6) |
8 |
Return PERMISSION_DENIED Status |
Access resource without permission |
Status code PERMISSION_DENIED (7) |
9 |
Return RESOURCE_EXHAUSTED Status |
Exceed quota or limit |
Status code RESOURCE_EXHAUSTED (8) |
10 |
Return FAILED_PRECONDITION Status |
Violate precondition |
Status code FAILED_PRECONDITION (9) |
11 |
Return ABORTED Status |
Simulate aborted operation |
Status code ABORTED (10) |
12 |
Return OUT_OF_RANGE Status |
Send out-of-range value |
Status code OUT_OF_RANGE (11) |
13 |
Return UNIMPLEMENTED Status |
Call unimplemented method |
Status code UNIMPLEMENTED (12) |
14 |
Return INTERNAL Status |
Trigger internal server error |
Status code INTERNAL (13) |
15 |
Return UNAVAILABLE Status |
Simulate server unavailability |
Status code UNAVAILABLE (14) |
16 |
Return DATA_LOSS Status |
Simulate data corruption |
Status code DATA_LOSS (15) |
17 |
Return UNAUTHENTICATED Status |
Access without valid credentials |
Status code UNAUTHENTICATED (16) |
18 |
Include Error Message |
Return error with descriptive message |
Message shown in client |
19 |
Include Error Details |
Attach structured error details |
Details parsed by client |
20 |
Include Error Metadata |
Attach metadata to error |
Metadata accessible |
21 |
Handle Error in Unary RPC |
Return error in unary RPC |
Client receives status and message |
22 |
Handle Error in Streaming RPC |
Return error mid-stream |
Stream terminated with error |
23 |
Retry on UNAVAILABLE |
Retry when server is unavailable |
Retry logic triggered |
24 |
Do Not Retry on INVALID_ARGUMENT |
Avoid retry on client-side error |
Retry skipped |
25 |
Log Error on Server |
Log error details |
Logs contain status and message |
26 |
Log Error on Client |
Log received error |
Client logs contain status |
27 |
Map Internal Exception to gRPC Status |
Convert internal error to gRPC status |
Correct status returned |
28 |
Use Custom Error Codes |
Define application-specific error codes |
Codes included in metadata |
29 |
Use Custom Error Messages |
Return localized or user-friendly messages |
Message shown to user |
30 |
Use Error Interceptor |
Intercept and modify error responses |
Custom error formatting applied |
31 |
Use Error Wrapping |
Wrap internal errors with context |
Full error trace preserved |
32 |
Use Error Translation Layer |
Translate internal errors to gRPC status |
Consistent error mapping |
33 |
Use Error Metrics |
Track error rates |
Metrics collected |
34 |
Use Error Alerts |
Trigger alert on critical errors |
Alert sent |
35 |
Use Error Retry Budget |
Limit retries on repeated errors |
Retry throttled |
36 |
Use Error Rate Limiting |
Block requests after error threshold |
Rate limit enforced |
37 |
Use Error Circuit Breaker |
Open circuit on repeated failures |
Requests blocked temporarily |
38 |
Use Error in Health Check |
Return error in health check RPC |
Health status marked as unhealthy |
39 |
Use Error in Reflection API |
Simulate error in reflection |
Error returned with status |
40 |
Use Error in Auth Interceptor |
Deny access in interceptor |
UNAUTHENTICATED returned |
41 |
Use Error in Validation Interceptor |
Reject invalid request |
INVALID_ARGUMENT returned |
42 |
Use Error in Rate Limiting Interceptor |
Block excessive requests |
RESOURCE_EXHAUSTED returned |
43 |
Use Error in Streaming Flow Control |
Exceed flow control window |
INTERNAL or UNAVAILABLE returned |
44 |
Use Error in Deadline Enforcement |
Exceed deadline |
DEADLINE_EXCEEDED returned |
45 |
Use Error in Token Expiry |
Use expired token |
UNAUTHENTICATED returned |
46 |
Use Error in Permission Check |
Access forbidden resource |
PERMISSION_DENIED returned |
47 |
Use Error in Quota Enforcement |
Exceed usage quota |
RESOURCE_EXHAUSTED returned |
48 |
Use Error in Feature Flag Check |
Access disabled feature |
FAILED_PRECONDITION returned |
49 |
Use Error in Multi-Tenant Context |
Access resource from wrong tenant |
PERMISSION_DENIED returned |
50 |
Use Error in Legacy API Call |
Call deprecated or removed method |
UNIMPLEMENTED returned |
Reference links