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.

  • 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