test_: unskip test initialize logging (#6229)

* test_: add option to get file from status-backend container

* feat_: automatically create dataDir and logsDir directories

* test_: unskip and update TestInitializeLogging

* fix_: parametrize test

* ci_: use ms precision for func tests docker project_name to

* chore_: rename to extract_data

* fix_: linter

* fix_: set timestamp in python as well
This commit is contained in:
Igor Sirotin 2024-12-19 14:18:40 +00:00 committed by GitHub
parent b803918c2b
commit 0cf556bdb9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 80 additions and 50 deletions

View File

@ -24,7 +24,8 @@ mkdir -p "${merged_coverage_reports_path}"
mkdir -p "${test_results_path}" mkdir -p "${test_results_path}"
all_compose_files="-f ${root_path}/docker-compose.anvil.yml -f ${root_path}/docker-compose.test.status-go.yml" all_compose_files="-f ${root_path}/docker-compose.anvil.yml -f ${root_path}/docker-compose.test.status-go.yml"
project_name="status-go-func-tests-$(date +%s)" timestamp=$(python3 -c "import time; print(int(time.time() * 1000))") # Keep in sync with status_backend.py
project_name="status-go-func-tests-${timestamp}"
export STATUS_BACKEND_URLS=$(eval echo http://${project_name}-status-backend-{1..${STATUS_BACKEND_COUNT}}:3333 | tr ' ' ,) export STATUS_BACKEND_URLS=$(eval echo http://${project_name}-status-backend-{1..${STATUS_BACKEND_COUNT}}:3333 | tr ' ' ,)

View File

@ -5,7 +5,10 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
"os"
"path"
"runtime" "runtime"
"time"
"unsafe" "unsafe"
"go.uber.org/zap" "go.uber.org/zap"
@ -29,6 +32,7 @@ import (
"github.com/status-im/status-go/images" "github.com/status-im/status-go/images"
"github.com/status-im/status-go/logutils" "github.com/status-im/status-go/logutils"
"github.com/status-im/status-go/logutils/requestlog" "github.com/status-im/status-go/logutils/requestlog"
"github.com/status-im/status-go/mobile/callog"
m_requests "github.com/status-im/status-go/mobile/requests" m_requests "github.com/status-im/status-go/mobile/requests"
"github.com/status-im/status-go/multiaccounts" "github.com/status-im/status-go/multiaccounts"
"github.com/status-im/status-go/multiaccounts/accounts" "github.com/status-im/status-go/multiaccounts/accounts"
@ -49,11 +53,6 @@ import (
"github.com/status-im/status-go/services/typeddata" "github.com/status-im/status-go/services/typeddata"
"github.com/status-im/status-go/services/wallet/wallettypes" "github.com/status-im/status-go/services/wallet/wallettypes"
"github.com/status-im/status-go/signal" "github.com/status-im/status-go/signal"
"path"
"time"
"github.com/status-im/status-go/mobile/callog"
) )
func call(fn any, params ...any) any { func call(fn any, params ...any) any {
@ -106,6 +105,11 @@ func initializeApplication(requestJSON string) string {
providers.MixpanelAppID = request.MixpanelAppID providers.MixpanelAppID = request.MixpanelAppID
providers.MixpanelToken = request.MixpanelToken providers.MixpanelToken = request.MixpanelToken
err = os.MkdirAll(request.DataDir, 0700)
if err != nil {
return makeJSONResponse(err)
}
statusBackend.StatusNode().SetMediaServerEnableTLS(request.MediaServerEnableTLS) statusBackend.StatusNode().SetMediaServerEnableTLS(request.MediaServerEnableTLS)
statusBackend.UpdateRootDataDir(request.DataDir) statusBackend.UpdateRootDataDir(request.DataDir)
@ -153,7 +157,12 @@ func initializeLogging(request *requests.InitializeApplication) error {
File: path.Join(request.LogDir, api.DefaultLogFile), File: path.Join(request.LogDir, api.DefaultLogFile),
} }
err := logutils.OverrideRootLoggerWithConfig(logSettings) err := os.MkdirAll(request.LogDir, 0700)
if err != nil {
return err
}
err = logutils.OverrideRootLoggerWithConfig(logSettings)
if err != nil { if err != nil {
return err return err
} }

View File

@ -1,16 +1,19 @@
import io
import json import json
import logging import logging
import tarfile
import tempfile
import time import time
import random import random
import threading import threading
import requests import requests
import docker import docker
import docker.errors
import os import os
from tenacity import retry, stop_after_delay, wait_fixed from tenacity import retry, stop_after_delay, wait_fixed
from clients.signals import SignalClient from clients.signals import SignalClient
from clients.rpc import RpcClient from clients.rpc import RpcClient
from datetime import datetime
from conftest import option from conftest import option
from resources.constants import user_1, DEFAULT_DISPLAY_NAME, USER_DIR from resources.constants import user_1, DEFAULT_DISPLAY_NAME, USER_DIR
@ -19,6 +22,8 @@ NANOSECONDS_PER_SECOND = 1_000_000_000
class StatusBackend(RpcClient, SignalClient): class StatusBackend(RpcClient, SignalClient):
container = None
def __init__(self, await_signals=[]): def __init__(self, await_signals=[]):
if option.status_backend_url: if option.status_backend_url:
@ -48,7 +53,7 @@ class StatusBackend(RpcClient, SignalClient):
def _start_container(self, host_port): def _start_container(self, host_port):
docker_project_name = option.docker_project_name docker_project_name = option.docker_project_name
timestamp = datetime.now().strftime("%Y%m%d%H%M%S") timestamp = int(time.time() * 1000) # Keep in sync with run_functional_tests.sh
image_name = f"{docker_project_name}-status-backend:latest" image_name = f"{docker_project_name}-status-backend:latest"
container_name = f"{docker_project_name}-status-backend-{timestamp}" container_name = f"{docker_project_name}-status-backend-{timestamp}"
@ -153,6 +158,27 @@ class StatusBackend(RpcClient, SignalClient):
data["StatusProxyStageName"] = "test" data["StatusProxyStageName"] = "test"
return data return data
def extract_data(self, path: str):
if not self.container:
return path
try:
stream, _ = self.container.get_archive(path)
except docker.errors.NotFound:
return None
temp_dir = tempfile.mkdtemp()
tar_bytes = io.BytesIO(b"".join(stream))
with tarfile.open(fileobj=tar_bytes) as tar:
tar.extractall(path=temp_dir)
# If the tar contains a single file, return the path to that file
# Otherwise it's a directory, just return temp_dir.
if len(tar.getmembers()) == 1:
return os.path.join(temp_dir, tar.getmembers()[0].name)
return temp_dir
def create_account_and_login( def create_account_and_login(
self, self,
data_dir=USER_DIR, data_dir=USER_DIR,

View File

@ -1,3 +1,4 @@
from resources.constants import USER_DIR
from test_cases import StatusBackend from test_cases import StatusBackend
import pytest import pytest
from clients.signals import SignalType from clients.signals import SignalType
@ -41,49 +42,42 @@ class TestInitialiseApp:
) )
def assert_file_first_line(path, pattern: str, expected: bool):
if not expected:
assert path is None
return
assert os.path.exists(path)
with open(path) as file:
line = file.readline()
line_found = line.find(pattern) >= 0
assert line_found == expected
@pytest.mark.rpc @pytest.mark.rpc
@pytest.mark.skip("waiting for status-backend to be executed on the same host/container") @pytest.mark.init
class TestInitializeLogging: @pytest.mark.parametrize("log_enabled,api_logging_enabled", [(True, True), (False, False)])
def test_check_logs(log_enabled: bool, api_logging_enabled: bool):
data_dir = os.path.join(USER_DIR, "data")
logs_dir = os.path.join(USER_DIR, "logs")
@pytest.mark.init backend = StatusBackend()
def test_init_logging(self, tmp_path): backend.api_valid_request(
self.check_logs(tmp_path, log_enabled=True, api_logging_enabled=True) "InitializeApplication",
{
"dataDir": str(data_dir),
"logDir": str(logs_dir),
"logEnabled": log_enabled,
"apiLoggingEnabled": api_logging_enabled,
},
)
@pytest.mark.init local_geth_log = backend.extract_data(os.path.join(logs_dir, "geth.log"))
def test_no_logging(self, tmp_path): local_api_log = backend.extract_data(os.path.join(logs_dir, "api.log"))
self.check_logs(tmp_path, log_enabled=False, api_logging_enabled=False)
def assert_file_first_line(self, path, pattern: str, expected: bool): assert_file_first_line(path=local_geth_log, pattern="logging initialised", expected=log_enabled)
assert os.path.exists(path) == expected
if not expected:
return
with open(path) as file:
line = file.readline()
line_found = line.find(pattern) >= 0
assert line_found == expected
def check_logs(self, path, log_enabled: bool, api_logging_enabled: bool): assert_file_first_line(
data_dir = path / "data" path=local_api_log,
logs_dir = path / "logs" pattern='"method": "InitializeApplication"',
expected=api_logging_enabled,
data_dir.mkdir() )
logs_dir.mkdir()
backend = StatusBackend()
backend.api_valid_request(
"InitializeApplication",
{
"dataDir": str(data_dir),
"logDir": str(logs_dir),
"logEnabled": log_enabled,
"apiLoggingEnabled": api_logging_enabled,
},
)
self.assert_file_first_line(logs_dir / "geth.log", pattern="logging initialised", expected=log_enabled)
self.assert_file_first_line(
logs_dir / "api.log",
pattern='"method": "InitializeApplication"',
expected=api_logging_enabled,
)