Skip to content

Commit

Permalink
Add memcached container
Browse files Browse the repository at this point in the history
  • Loading branch information
romulojales committed Mar 21, 2023
1 parent 2bcb931 commit 30a1f3e
Show file tree
Hide file tree
Showing 11 changed files with 278 additions and 183 deletions.
1 change: 1 addition & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ jobs:
- kafka
- keycloak
- localstack
- memcached
- meta
- minio
- mongodb
Expand Down
1 change: 1 addition & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ testcontainers-python facilitates the use of Docker containers for functional an
kafka/README
keycloak/README
localstack/README
memcached/README
minio/README
mongodb/README
mssql/README
Expand Down
1 change: 1 addition & 0 deletions memcached/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.. autoclass:: testcontainers.memcached.MemcachedContainer
17 changes: 17 additions & 0 deletions memcached/setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from setuptools import setup, find_namespace_packages

description = "Memcached component of testcontainers-python."

setup(
name="testcontainers-memcached",
version="0.0.1rc1",
packages=find_namespace_packages(),
description=description,
long_description=description,
long_description_content_type="text/x-rst",
url="https://github.com/testcontainers/testcontainers-python",
install_requires=[
"testcontainers-core",
],
python_requires=">=3.7",
)
59 changes: 59 additions & 0 deletions memcached/testcontainers/memcached/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#
# Licensed 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 socket

from testcontainers.core.container import DockerContainer
from testcontainers.core.waiting_utils import wait_container_is_ready


class MemcachedNotReady(Exception):
pass


class MemcachedContainer(DockerContainer):
"""
Test container for Memcached. The example below spins up a Memcached server
Example:
.. doctest::
>>> from testcontainers.memcached import MemcachedContainer
>>> with MemcachedContainer() as memcached_container:
... host, port = memcached_container.get_host_and_port()
"""

def __init__(self, image="memcached:latest", port_to_expose=11211, **kwargs):
super(MemcachedContainer, self).__init__(image, **kwargs)
self.port_to_expose = port_to_expose
self.with_exposed_ports(port_to_expose)

@wait_container_is_ready(MemcachedNotReady)
def _connect(self):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
host = self.get_container_host_ip()
port = int(self.get_exposed_port(self.port_to_expose))
s.connect((host, port))
s.sendall(b"stats\n\r")
data = s.recv(1024)
if len(data) == 0:
raise MemcachedNotReady("Memcached not ready yet")

def start(self):
super().start()
self._connect()
return self

def get_host_and_port(self):
return self.get_container_host_ip(), int(self.get_exposed_port(self.port_to_expose))
25 changes: 25 additions & 0 deletions memcached/tests/test_memcached.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import socket

from memcached.testcontainers.memcached import MemcachedContainer


def test_memcached_host_and_exposed_port():
with MemcachedContainer() as memcached:
host, port = memcached.get_host_and_port()
assert host == 'localhost'
assert port != 11211


def test_memcached_can_connect_and_retrieve_data():
with MemcachedContainer() as memcached:
host, port = memcached.get_host_and_port()
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, port))
s.sendall(b"stats\n\r")
data = s.recv(1024)
assert len(data) > 0, 'We should have received some data from memcached'

pid_stat, uptime_stat, *_ = data.decode().split('\r\n')

assert pid_stat.startswith('STAT pid')
assert uptime_stat.startswith('STAT uptime')
1 change: 1 addition & 0 deletions requirements.in
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
-e file:kafka
-e file:keycloak
-e file:localstack
-e file:memcached
-e file:meta
-e file:minio
-e file:mongodb
Expand Down
Loading

0 comments on commit 30a1f3e

Please # to comment.