Skip to content

Commit

Permalink
test(cmd-api-server): jestify grpc-proto-gen-ts-client-healthcheck test
Browse files Browse the repository at this point in the history
1. Also fixing a minor bug in config/config-service-example-config-validity.test.ts
where the path of the temporary files generated by the test were being saved
in the wrong directory instead of $PROJECT_ROOT/.tmp/...

Signed-off-by: Peter Somogyvari <[email protected]>
  • Loading branch information
petermetz committed Oct 24, 2024
1 parent aa0108b commit 7c15ce7
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 75 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -437,7 +437,7 @@ jobs:
JEST_TEST_COVERAGE_PATH: ./code-coverage-ts/cactus-cmd-api-server
JEST_TEST_CODE_COVERAGE_ENABLED: true
TAPE_TEST_PATTERN: >-
--files={./packages/cactus-cmd-api-server/src/test/typescript/unit/config/self-signed-certificate-generator/certificates-work-for-mutual-tls.test.ts,./packages/cactus-cmd-api-server/src/test/typescript/unit/config/self-signed-certificate-generator/generates-working-certificates.test.ts,./packages/cactus-cmd-api-server/src/test/typescript/unit/grpc-js-proto-loader-client-healthcheck.test.ts,./packages/cactus-cmd-api-server/src/test/typescript/unit/grpc-proto-gen-ts-client-healthcheck.test.ts,./packages/cactus-cmd-api-server/src/test/typescript/unit/grpc-proto-gen-ts-client-m-tls-enabled.test.ts,./packages/cactus-cmd-api-server/src/test/typescript/unit/plugins/install-basic-plugin-ledger-connector-fabric-0-7-0.test.ts}
--files={./packages/cactus-cmd-api-server/src/test/typescript/unit/config/self-signed-certificate-generator/certificates-work-for-mutual-tls.test.ts,./packages/cactus-cmd-api-server/src/test/typescript/unit/config/self-signed-certificate-generator/generates-working-certificates.test.ts,./packages/cactus-cmd-api-server/src/test/typescript/unit/grpc-js-proto-loader-client-healthcheck.test.ts,./packages/cactus-cmd-api-server/src/test/typescript/unit/grpc-proto-gen-ts-client-m-tls-enabled.test.ts,./packages/cactus-cmd-api-server/src/test/typescript/unit/plugins/install-basic-plugin-ledger-connector-fabric-0-7-0.test.ts}
TAPE_TEST_RUNNER_DISABLED: false
runs-on: ubuntu-22.04
steps:
Expand Down
1 change: 0 additions & 1 deletion .taprc
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ files:
- ./packages/cactus-cmd-api-server/src/test/typescript/unit/plugins/install-basic-plugin-ledger-connector-fabric-0-7-0.test.ts
- ./packages/cactus-cmd-api-server/src/test/typescript/unit/config/self-signed-certificate-generator/generates-working-certificates.test.ts
- ./packages/cactus-cmd-api-server/src/test/typescript/unit/config/self-signed-certificate-generator/certificates-work-for-mutual-tls.test.ts
- ./packages/cactus-cmd-api-server/src/test/typescript/unit/grpc-proto-gen-ts-client-healthcheck.test.ts
- ./packages/cactus-cmd-api-server/src/test/typescript/unit/grpc-js-proto-loader-client-healthcheck.test.ts
- ./packages/cactus-cmd-api-server/src/test/typescript/unit/grpc-proto-gen-ts-client-m-tls-enabled.test.ts
- ./extensions/cactus-plugin-object-store-ipfs/src/test/typescript/integration/plugin-object-store-ipfs.test.ts
Expand Down
1 change: 0 additions & 1 deletion jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ module.exports = {
`./packages/cactus-cmd-api-server/src/test/typescript/unit/plugins/install-basic-plugin-ledger-connector-fabric-0-7-0.test.ts`,
`./packages/cactus-cmd-api-server/src/test/typescript/unit/config/self-signed-certificate-generator/generates-working-certificates.test.ts`,
`./packages/cactus-cmd-api-server/src/test/typescript/unit/config/self-signed-certificate-generator/certificates-work-for-mutual-tls.test.ts`,
`./packages/cactus-cmd-api-server/src/test/typescript/unit/grpc-proto-gen-ts-client-healthcheck.test.ts`,
`./packages/cactus-cmd-api-server/src/test/typescript/unit/grpc-js-proto-loader-client-healthcheck.test.ts`,
`./packages/cactus-cmd-api-server/src/test/typescript/unit/grpc-proto-gen-ts-client-m-tls-enabled.test.ts`,
`./extensions/cactus-plugin-object-store-ipfs/src/test/typescript/integration/plugin-object-store-ipfs.test.ts`,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,7 @@ import {
import { ApiServer } from "../../../../main/typescript/public-api";
import { ConfigService } from "../../../../main/typescript/public-api";

const testcase = "";

describe(testcase, () => {
describe("ConfigService", () => {
const configService = new ConfigService();
let apiServer: ApiServer,
exampleConfig: ICactusApiServerOptions,
Expand All @@ -24,7 +22,7 @@ describe(testcase, () => {
exampleConfig = await configService.newExampleConfig();
const pluginsPath = path.join(
__dirname,
"../../../../../../", // walk back up to the project root
"../../../../../../../", // walk back up to the project root
".tmp/test/test-cmd-api-server/config-service-example-config-validity_test/", // the dir path from the root
uuidv4(), // then a random directory to ensure proper isolation
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,88 +1,97 @@
import test, { Test } from "tape-promise/tape";

import "jest-extended";
import * as grpc from "@grpc/grpc-js";
import { RuntimeError } from "run-time-error-cjs";

import { LogLevelDesc } from "@hyperledger/cactus-common";

import { ApiServer, ConfigService } from "../../../main/typescript/public-api";
import {
ApiServer,
ConfigService,
ICactusApiServerOptions,
} from "../../../main/typescript/public-api";
import { AuthorizationProtocol } from "../../../main/typescript/public-api";
import { default_service } from "../../../main/typescript/public-api";
import { health_check_response_pb } from "../../../main/typescript/public-api";
import { empty } from "../../../main/typescript/public-api";
import { RuntimeError } from "run-time-error-cjs";

const testCase = "API server: runs gRPC TS-proto web services";
const logLevel: LogLevelDesc = "TRACE";
const logLevel: LogLevelDesc = "INFO";

test(testCase, async (t: Test) => {
const configService = new ConfigService();
const apiSrvOpts = await configService.newExampleConfig();
apiSrvOpts.authorizationProtocol = AuthorizationProtocol.NONE;
apiSrvOpts.configFile = "";
apiSrvOpts.logLevel = logLevel;
apiSrvOpts.apiCorsDomainCsv = "*";
apiSrvOpts.apiPort = 0;
apiSrvOpts.grpcPort = 0;
apiSrvOpts.crpcPort = 0;
apiSrvOpts.cockpitPort = 0;
apiSrvOpts.grpcMtlsEnabled = false;
apiSrvOpts.apiTlsEnabled = false;
apiSrvOpts.plugins = [];
const config = await configService.newExampleConfigConvict(apiSrvOpts);
describe("ApiServer", () => {
let apiServer: ApiServer;
let config: ICactusApiServerOptions;
let apiClient: default_service.org.hyperledger.cactus.cmd_api_server.DefaultServiceClient;

const apiServer = new ApiServer({
config: config.getProperties(),
afterAll(async () => {
await apiServer.shutdown();
});
test.onFinish(async () => await apiServer.shutdown());

const startResponse = apiServer.start();
await t.doesNotReject(
startResponse,
"failed to start API server with dynamic plugin imports configured for it...",
);
t.ok(startResponse, "startResponse truthy OK");
beforeAll(async () => {
const configService = new ConfigService();
const apiSrvOpts = await configService.newExampleConfig();
apiSrvOpts.authorizationProtocol = AuthorizationProtocol.NONE;
apiSrvOpts.configFile = "";
apiSrvOpts.logLevel = logLevel;
apiSrvOpts.apiCorsDomainCsv = "*";
apiSrvOpts.apiPort = 0;
apiSrvOpts.grpcPort = 0;
apiSrvOpts.crpcPort = 0;
apiSrvOpts.cockpitPort = 0;
apiSrvOpts.grpcMtlsEnabled = false;
apiSrvOpts.apiTlsEnabled = false;
apiSrvOpts.plugins = [];
const convictCfg = await configService.newExampleConfigConvict(apiSrvOpts);
config = convictCfg.getProperties();

const addressInfoGrpc = (await startResponse).addressInfoGrpc;
const { address, port } = addressInfoGrpc;
const grpcHostAndPort = `${address}:${port}`;
apiServer = new ApiServer({
config,
});

const apiClient =
new default_service.org.hyperledger.cactus.cmd_api_server.DefaultServiceClient(
grpcHostAndPort,
grpc.credentials.createInsecure(),
);
t.ok(apiClient, "apiClient truthy OK");
const apiServerStart = apiServer.start();
await expect(apiServerStart).toResolve();
const addressInfoGrpc = (await apiServerStart).addressInfoGrpc;
const { address, port } = addressInfoGrpc;
const grpcHostAndPort = `${address}:${port}`;

const responsePromise =
new Promise<health_check_response_pb.org.hyperledger.cactus.cmd_api_server.HealthCheckResponsePB>(
(resolve, reject) => {
apiClient.GetHealthCheckV1(
new empty.google.protobuf.Empty(),
(
error: grpc.ServiceError | null,
response?: health_check_response_pb.org.hyperledger.cactus.cmd_api_server.HealthCheckResponsePB,
) => {
if (error) {
reject(error);
} else if (response) {
resolve(response);
} else {
throw new RuntimeError("No error, nor response received.");
}
},
);
},
);
apiClient =
new default_service.org.hyperledger.cactus.cmd_api_server.DefaultServiceClient(
grpcHostAndPort,
grpc.credentials.createInsecure(),
);
expect(apiClient).toBeTruthy();
});

await t.doesNotReject(responsePromise, "No error in healthcheck OK");
const res = await responsePromise;
test("runs gRPC TS-proto web services", async () => {
type HealthCheckResponsePB =
health_check_response_pb.org.hyperledger.cactus.cmd_api_server.HealthCheckResponsePB;

const resHc = res?.toObject();
const grpcReq = new Promise<HealthCheckResponsePB>((resolve, reject) => {
apiClient.GetHealthCheckV1(
new empty.google.protobuf.Empty(),
(error: grpc.ServiceError | null, response?: HealthCheckResponsePB) => {
if (error) {
reject(error);
} else if (response) {
resolve(response);
} else {
reject(new RuntimeError("No error, nor response received."));
}
},
);
});

t.ok(resHc, `healthcheck response truthy OK`);
t.ok(resHc?.createdAt, `resHc.createdAt truthy OK`);
t.ok(resHc?.memoryUsage, `resHc.memoryUsage truthy OK`);
t.ok(resHc?.memoryUsage?.rss, `resHc.memoryUsage.rss truthy OK`);
t.ok(resHc?.success, `resHc.success truthy OK`);
t.end();
await expect(grpcReq).resolves.toMatchObject({
toObject: expect.toBeFunction(),
});

const resPb = await grpcReq;
const res = resPb.toObject();

expect(res).toMatchObject({
createdAt: expect.toBeDateString(),
memoryUsage: expect.objectContaining({
rss: expect.toBeNumber(),
}),
success: true,
});
});
});

0 comments on commit 7c15ce7

Please sign in to comment.