3.1 KiB
Style Guide
The Bluetooth test interfaces uses protocol buffers v3 as Interfaces Definition Language.
All guidelines from the protocol buffers style guide apply to them.
Additional guidelines
A few additional guidelines apply to the Bluetooth test interfaces to guarantee consistency and improve readability.
Use proto3 syntax
The protobuf compiler currently supports proto2 and proto3 syntax, but proto3 should be used, as it is the latest version.
Use names from the Bluetooth specification nomenclature
This avoids adding confusion to naming, even if the names used in the Bluetooth specification are not consistent across profiles (Gateway, Target, Controller, Server, Client, ...).
service A2DP {
rpc OpenServer(Empty) returns (Empty); // ✗ Avoid
rpc OpenSource(Empty) returns (Empty); // ✓ OK
}
Name services without prefixes or suffixes
This helps to keep short names, if you need name-spacing you should use a package instead.
service A2DP {} // ✓ OK
service Host {} // ✓ OK
service A2DPServer {} // ✗ Avoid
service BluetoothHost {} // ✗ Avoid
Avoid long package names
This makes the usage of the gRPC interface harder in some generated language where long package names are uncommon, for instance in rust and python.
package test.interfaces.bluetooth.bredr.l2cap; // ✗ Avoid
package l2cap; // ✓ OK
Use standards protocol buffers types
Protocol buffers includes a lot of well-known types, so use them instead of redefining your owns.
rpc L2CAP {
Send(MyData) returns (MyEmpty); // ✗ Avoid
Send(google.protobuf.BytesValue) returns (google.protobuf.Empty); // ✓ OK
}
Describe expected errors with oneof
fields
This allows using the protocol buffers type system to describe the possible outcomes of the request. You don't need to describe all errors, you should only specify the ones that are needed by the tests.
We use the gRPC standard error model to send the other non specified errors (like implementation specific errors).
message ConnectResponse {
oneof result {
Connection connection = 1;
DeviceNotFoundError device_not_found = 2;
...
}
}
Avoid gRPC streaming if possible
There is only a few legitimate usages for gRPC streaming (such as audio streaming) and you should avoid it otherwise.
Use typed tokens to represent a resource
This allows the implementation to wrap their internal format for representing the resource inside an opaque message instead of converting them.
// ✗ Avoid
service Host {
rpc Connect(BdAddr) returns (Handle);
}
message Handle {
int16 handle = 1;
}
// ✓ OK
service Host {
rpc Connect(BdAddr) returns (Connection);
}
message Connection {
// Internal (opaque) representation
// of the connection by the server
bytes cookie = 1;
}