# Copyright (C) 2022 The Android Open Source Project
#
# 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.

"""Unittests for the repo_trace.py module."""

import os
import unittest
from unittest import mock

import repo_trace


class TraceTests(unittest.TestCase):
    """Check Trace behavior."""

    def testTrace_MaxSizeEnforced(self):
        content = "git chicken"

        with repo_trace.Trace(content, first_trace=True):
            pass
        first_trace_size = os.path.getsize(repo_trace._TRACE_FILE)

        with repo_trace.Trace(content):
            pass
        self.assertGreater(
            os.path.getsize(repo_trace._TRACE_FILE), first_trace_size
        )

        # Check we clear everything is the last chunk is larger than _MAX_SIZE.
        with mock.patch("repo_trace._MAX_SIZE", 0):
            with repo_trace.Trace(content, first_trace=True):
                pass
            self.assertEqual(
                first_trace_size, os.path.getsize(repo_trace._TRACE_FILE)
            )

            # Check we only clear the chunks we need to.
            repo_trace._MAX_SIZE = (first_trace_size + 1) / (1024 * 1024)
            with repo_trace.Trace(content, first_trace=True):
                pass
            self.assertEqual(
                first_trace_size * 2, os.path.getsize(repo_trace._TRACE_FILE)
            )

            with repo_trace.Trace(content, first_trace=True):
                pass
            self.assertEqual(
                first_trace_size * 2, os.path.getsize(repo_trace._TRACE_FILE)
            )
