Skip to content

Commit

Permalink
test
Browse files Browse the repository at this point in the history
  • Loading branch information
tom-pytel committed Feb 28, 2021
1 parent 3011cf8 commit c540882
Show file tree
Hide file tree
Showing 6 changed files with 341 additions and 0 deletions.
40 changes: 40 additions & 0 deletions tests/plugins/mongodb/client.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*!
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/

import * as http from 'http';
import agent from '../../../src';

process.env.SW_AGENT_LOGGING_LEVEL = 'ERROR';

agent.start({
serviceName: 'client',
maxBufferSize: 1000,
})

const server = http.createServer((req, res) => {
http
.request(`http://${process.env.SERVER || 'localhost:5000'}${req.url}`, (r) => {
let data = '';
r.on('data', (chunk) => (data += chunk));
r.on('end', () => res.end(data));
})
.end();
});

server.listen(5001, () => console.info('Listening on port 5001...'));
90 changes: 90 additions & 0 deletions tests/plugins/mongodb/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

version: "2.1"

services:
collector:
extends:
file: ../common/base-compose.yml
service: collector
networks:
- traveling-light

mongo:
container_name: mongo
environment:
MONGO_INITDB_ROOT_USERNAME: "root"
MONGO_INITDB_ROOT_PASSWORD: "root"
MONGO_INITDB_DATABASE: "admin"
ports:
- 27017:27017
volumes:
- ./init:/docker-entrypoint-initdb.d
healthcheck:
test: ["CMD", "bash", "-c", "cat < /dev/null > /dev/tcp/127.0.0.1/27017"]
interval: 5s
timeout: 60s
retries: 120
image: "mongo:latest"
networks:
- traveling-light

server:
extends:
file: ../common/base-compose.yml
service: agent
ports:
- 5000:5000
environment:
MONGO_HOST: mongo
volumes:
- .:/app/tests/plugins/pg
healthcheck:
test: ["CMD", "bash", "-c", "cat < /dev/null > /dev/tcp/127.0.0.1/5000"]
interval: 5s
timeout: 60s
retries: 120
entrypoint:
["bash", "-c", "npx ts-node /app/tests/plugins/pg/server.ts"]
depends_on:
collector:
condition: service_healthy
mongo:
condition: service_healthy

client:
extends:
file: ../common/base-compose.yml
service: agent
ports:
- 5001:5001
environment:
SERVER: server:5000
healthcheck:
test: ["CMD", "bash", "-c", "cat < /dev/null > /dev/tcp/127.0.0.1/5001"]
interval: 5s
timeout: 60s
retries: 120
entrypoint:
["bash", "-c", "npx ts-node /app/tests/plugins/pg/client.ts"]
depends_on:
server:
condition: service_healthy

networks:
traveling-light:
98 changes: 98 additions & 0 deletions tests/plugins/mongodb/expected.data.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

segmentItems:
- serviceName: server
segmentSize: 1
segments:
- segmentId: not null
spans:
- operationName: /mongo
operationId: 0
parentSpanId: -1
spanId: 0
spanLayer: Http
startTime: gt 0
endTime: gt 0
componentId: 49
spanType: Entry
peer: not null
skipAnalysis: false
tags:
- { key: http.url, value: 'http://server:5000/mongo' }
- { key: http.method, value: GET }
- { key: http.status.code, value: '200' }
refs:
- parentEndpoint: ""
networkAddress: server:5000
refType: CrossProcess
parentSpanId: 1
parentTraceSegmentId: not null
parentServiceInstance: not null
parentService: client
traceId: not null
- operationName: /admin
operationId: 0
parentSpanId: 0
spanId: 1
spanLayer: Database
startTime: gt 0
endTime: gt 0
componentId: 9
spanType: Exit
peer: mongo:27017
skipAnalysis: false
tags:
- { key: db.type, value: MongoDB }
- { key: db.instance, value: admin }
- { key: db.statement, value: docs.findOne() }
- serviceName: client
segmentSize: 1
segments:
- segmentId: not null
spans:
- operationName: /mongo
operationId: 0
parentSpanId: -1
spanId: 0
spanLayer: Http
startTime: gt 0
endTime: gt 0
componentId: 49
spanType: Entry
peer: not null
skipAnalysis: false
tags:
- { key: http.url, value: 'http://localhost:5001/mongo' }
- { key: http.method, value: GET }
- { key: http.status.code, value: '200' }
- operationName: /mongo
operationId: 0
parentSpanId: 0
spanId: 1
spanLayer: Http
startTime: gt 0
endTime: gt 0
componentId: 2
spanType: Exit
peer: server:5000
skipAnalysis: false
tags:
- { key: http.url, value: 'server:5000/mongo' }
- { key: http.method, value: GET }
- { key: http.status.code, value: '200' }
- { key: http.status.msg, value: OK }
1 change: 1 addition & 0 deletions tests/plugins/mongodb/init/init.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
db.createCollection('docs');
55 changes: 55 additions & 0 deletions tests/plugins/mongodb/server.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*!
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/

import * as http from 'http';
import {MongoClient} from 'mongodb';
import agent from '../../../src';

process.env.SW_AGENT_LOGGING_LEVEL = 'ERROR';

agent.start({
serviceName: 'server',
maxBufferSize: 1000,
});

const server = http.createServer(async (req, res) => {
return new Promise((resolve, reject) => {
MongoClient.connect(`mongodb://root:root@${process.env.MONGO_HOST}:27017`, {useUnifiedTopology: true}, function(err: any, client: any) {
if (err) {
res.end(`${err}`);
resolve();
} else {
client.db('admin').collection('docs').findOne().then(
(resDB: any) => {
res.end('Ok');
resolve();
client.close();
},
(err: any) => {
res.end('Error');
resolve();
client.close();
},
);
}
});
});
});

server.listen(5000, () => console.info('Listening on port 5000...'));
57 changes: 57 additions & 0 deletions tests/plugins/mongodb/test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/*!
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/

import * as path from 'path';
import { DockerComposeEnvironment, StartedDockerComposeEnvironment, Wait } from 'testcontainers';
import axios from 'axios';
import waitForExpect from 'wait-for-expect';
import { promises as fs } from 'fs';

const rootDir = path.resolve(__dirname);

describe('plugin tests', () => {
let compose: StartedDockerComposeEnvironment;

beforeAll(async () => {
compose = await new DockerComposeEnvironment(rootDir, 'docker-compose.yml')
.withWaitStrategy('client', Wait.forHealthCheck())
.withWaitStrategy('mongo', Wait.forHealthCheck())
.up();
});

afterAll(async () => {
await compose.down();
});

it(__filename, async () => {
await waitForExpect(async () => expect((await axios.get('http://localhost:5001/mongo')).status).toBe(200));

const expectedData = await fs.readFile(path.join(rootDir, 'expected.data.yaml'), 'utf8');

try {
await waitForExpect(async () =>
expect((await axios.post('http://localhost:12800/dataValidate', expectedData)).status).toBe(200),
);
} catch (e) {
const actualData = (await axios.get('http://localhost:12800/receiveData')).data;
console.info({ actualData });
throw e;
}
});
});

0 comments on commit c540882

Please sign in to comment.