diff --git a/.circleci/config.yml b/.circleci/config.yml index 0621c49e..5a0017a2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -116,13 +116,24 @@ commands: name: Merge llvm-cov results command: make merge_coverage_results - store-unit-test-results: + store-test-results: steps: - store_test_results: path: workflow/test-results - store_artifacts: path: workflow/test-results + run-tokenserver-integration-tests: + steps: + - run: + when: always + name: Tokenserver integration tests + command: | + # NOTE: Python3.12 requires `--break-system-packages`. + # This command is run on the circleci/rust image, which is running python 3.10 + make run_token_server_integration_tests + environment: + SYNCSTORAGE_RS_IMAGE: app:build run-e2e-mysql-tests: steps: - run: @@ -137,17 +148,6 @@ commands: environment: SYNCSTORAGE_RS_IMAGE: app:build - run-tokenserver-scripts-tests: - steps: - - run: - name: Tokenserver scripts tests - command: | - # NOTE: Python3.12 requires `--break-system-packages`. - # This command is run on the circleci/rust image, which is running python 3.10 - pip3 install -r tools/tokenserver/requirements.txt - python3 tools/tokenserver/run_tests.py - environment: - SYNCSTORAGE_RS_IMAGE: app:build run-e2e-spanner-tests: steps: @@ -240,11 +240,11 @@ jobs: - make-test-dir - run-unit-tests - merge-unit-test-coverage - - store-unit-test-results # if the above tests don't run tokenserver-db tests (i.e. using --workspace) # then run-tokenserver-scripts-tests will fail. These tests expect the db to be # configured already, and it appears unit-tests modify the db to the expected state - - run-tokenserver-scripts-tests + - run-tokenserver-integration-tests + - store-test-results #- save-sccache-cache build-mysql-image: docker: diff --git a/Makefile b/Makefile index f09e6175..037e9ee0 100644 --- a/Makefile +++ b/Makefile @@ -16,11 +16,11 @@ PATH_TO_GRPC_CERT = ../server-syncstorage/local/lib/python2.7/site-packages/grpc WORKFLOW := build-deploy EPOCH_TIME := $(shell date +"%s") TEST_RESULTS_DIR ?= workflow/test-results - TEST_PROFILE := $(if $(CIRCLECI),ci,default) TEST_FILE_PREFIX := $(if $(CIRCLECI),$(CIRCLE_BUILD_NUM)__$(EPOCH_TIME)__$(CIRCLE_PROJECT_REPONAME)__$(WORKFLOW)__) UNIT_JUNIT_XML := $(TEST_RESULTS_DIR)/$(TEST_FILE_PREFIX)unit__results.xml UNIT_COVERAGE_JSON := $(TEST_RESULTS_DIR)/$(TEST_FILE_PREFIX)unit__coverage.json +INTEGRATION_JUNIT_XML := $(TEST_RESULTS_DIR)/$(TEST_FILE_PREFIX)integration__results.xml SYNC_SYNCSTORAGE__DATABASE_URL ?= mysql://sample_user:sample_password@localhost/syncstorage_rs SYNC_TOKENSERVER__DATABASE_URL ?= mysql://sample_user:sample_password@localhost/tokenserver_rs @@ -61,7 +61,6 @@ python: python3 -m venv venv venv/bin/python -m pip install -r requirements.txt - run_mysql: python PATH="./venv/bin:$(PATH)" \ # See https://github.com/PyO3/pyo3/issues/1741 for discussion re: why we need to set the @@ -100,4 +99,9 @@ test_with_coverage: exit $$exit_code merge_coverage_results: - cargo llvm-cov report --summary-only --json --output-path ${UNIT_COVERAGE_JSON} \ No newline at end of file + cargo llvm-cov report --summary-only --json --output-path ${UNIT_COVERAGE_JSON} + +.ONESHELL: +run_token_server_integration_tests: + pip3 install -r tools/tokenserver/requirements.txt + pytest tools/tokenserver --junit-xml=${INTEGRATION_JUNIT_XML} \ No newline at end of file diff --git a/tools/tokenserver/conftest.py b/tools/tokenserver/conftest.py new file mode 100644 index 00000000..1821f4d5 --- /dev/null +++ b/tools/tokenserver/conftest.py @@ -0,0 +1,4 @@ +import sys +import os + +sys.path.insert(0, os.path.abspath(os.path.dirname(__file__))) diff --git a/tools/tokenserver/requirements.txt b/tools/tokenserver/requirements.txt index 72db30fc..d54c7e58 100644 --- a/tools/tokenserver/requirements.txt +++ b/tools/tokenserver/requirements.txt @@ -6,6 +6,7 @@ sqlalchemy==1.4.46 testfixtures tokenlib==2.0.0 PyBrowserID==0.14.0 +pytest==8.3.5 datadog backoff diff --git a/tools/tokenserver/run_tests.py b/tools/tokenserver/run_tests.py deleted file mode 100644 index dcab490d..00000000 --- a/tools/tokenserver/run_tests.py +++ /dev/null @@ -1,25 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this file, -# You can obtain one at http://mozilla.org/MPL/2.0/. - -import sys -import unittest - -from test_database import TestDatabase -from test_process_account_events import TestProcessAccountEvents -from test_purge_old_records import TestPurgeOldRecords -from test_scripts import TestScripts - -if __name__ == "__main__": - loader = unittest.TestLoader() - test_cases = [TestDatabase, TestPurgeOldRecords, TestProcessAccountEvents, - TestScripts] - - res = 0 - for test_case in test_cases: - suite = loader.loadTestsFromTestCase(test_case) - runner = unittest.TextTestRunner() - if not runner.run(suite).wasSuccessful(): - res = 1 - - sys.exit(res) diff --git a/tools/tokenserver/test_database.py b/tools/tokenserver/test_database.py index fac5980a..b5714247 100644 --- a/tools/tokenserver/test_database.py +++ b/tools/tokenserver/test_database.py @@ -467,23 +467,23 @@ class TestDatabase(unittest.TestCase): def test_build_old_range(self): params = dict() sql = self.database._build_old_user_query(None, params) - self.assert_(sql.text.find("uid > :start") < 0) - self.assert_(sql.text.find("uid < :end") < 0) + self.assertTrue(sql.text.find("uid > :start") < 0) + self.assertTrue(sql.text.find("uid < :end") < 0) self.assertIsNone(params.get("start")) self.assertIsNone(params.get("end")) params = dict() rrange = (None, "abcd") sql = self.database._build_old_user_query(rrange, params) - self.assert_(sql.text.find("uid > :start") < 0) - self.assert_(sql.text.find("uid < :end") > 0) + self.assertTrue(sql.text.find("uid > :start") < 0) + self.assertTrue(sql.text.find("uid < :end") > 0) self.assertIsNone(params.get("start")) self.assertEqual(params.get("end"), rrange[1]) params = dict() rrange = ("1234", "abcd") sql = self.database._build_old_user_query(rrange, params) - self.assert_(sql.text.find("uid > :start") > 0) - self.assert_(sql.text.find("uid < :end") > 0) + self.assertTrue(sql.text.find("uid > :start") > 0) + self.assertTrue(sql.text.find("uid < :end") > 0) self.assertEqual(params.get("start"), rrange[0]) self.assertEqual(params.get("end"), rrange[1])