From patchwork Fri Jan 9 18:31:03 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1389 Return-Path: X-Original-To: u-boot-concept@u-boot.org Delivered-To: u-boot-concept@u-boot.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767983546; bh=fg0LeFShbanvDDfxQQAC5gerTSs70/oNQ39//LZgCKU=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=MCztVqwXl0u6Vuiq7HkKCWPHDu3Q81JiQn5SMFU114MJ11PeDB8Y1jT4tSapYgFF/ HrPz/TYzb5FGmV/YDe9LI2++/uQY57stYhH7Bs/D0ghleEzWOYICwgrzXD332Co5Tm idjqq2bpBe7VnNII4ZCcofGXM/oiZaVC0MRBX95Ta+KpKDsVFFUWPEG+5E9yBz4FAj yBWnSMg+P4XhQxS2PmEjX6ObnApOEdO5iEpnBTLDmjcsN1DLvoXyiqwyUoqcSpeLWW dN8k/KjR8XLQrbmk5q/feSNPaR7sNrYZfCaO5W3me1DBgStoRym9O7rdDAry825Sqa 7JLyx/LIlr9qg== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 1866A69221 for ; Fri, 9 Jan 2026 11:32:26 -0700 (MST) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10024) with ESMTP id NXNGeolxjyXi for ; Fri, 9 Jan 2026 11:32:26 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767983546; bh=fg0LeFShbanvDDfxQQAC5gerTSs70/oNQ39//LZgCKU=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=MCztVqwXl0u6Vuiq7HkKCWPHDu3Q81JiQn5SMFU114MJ11PeDB8Y1jT4tSapYgFF/ HrPz/TYzb5FGmV/YDe9LI2++/uQY57stYhH7Bs/D0ghleEzWOYICwgrzXD332Co5Tm idjqq2bpBe7VnNII4ZCcofGXM/oiZaVC0MRBX95Ta+KpKDsVFFUWPEG+5E9yBz4FAj yBWnSMg+P4XhQxS2PmEjX6ObnApOEdO5iEpnBTLDmjcsN1DLvoXyiqwyUoqcSpeLWW dN8k/KjR8XLQrbmk5q/feSNPaR7sNrYZfCaO5W3me1DBgStoRym9O7rdDAry825Sqa 7JLyx/LIlr9qg== Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 0345969216 for ; Fri, 9 Jan 2026 11:32:26 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767983544; bh=xvm1lMHDqfY7v4ZG03GvHNiYn9C0SgOk+7iblgRsSDM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DQE7OleiQRrY4fQPHm6rg5aVwzbbImFIZ5pYZ6G5pl2Eel+innFaocCLXvRgIn8gL DPubph5vyFt3SXgJj3U3z1unhCO0aM/gb3yRkhhk8Dk6sENn+57pGzZeEtFbNqGMZc xrhgYvLrh+KF44lTQG7VOc7muDlzMRXUpXDpQEURFJCEA0z013ZTdU5OLJ0wtFqPC9 PfKi17hE1zXua69gEo8XGr08bpsLrQkyx38JYwMDTy/uiNki1sGr5McMTSZGVuYj8N qX9gQxHXIVtf7x2XY/2LdYHUTL10hKvUSncLJsKOO4/3GM28+pe6imR3dOwaW+nnMN chaoWJ7G/Jfjg== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 4F2676920A; Fri, 9 Jan 2026 11:32:24 -0700 (MST) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10026) with ESMTP id 2V3L3vCD6IuU; Fri, 9 Jan 2026 11:32:24 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767983540; bh=XcfYPJbTuT//n3l/ljYi9ETpJSCgwJw8LlbjHEq8b0U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TgNrYHVjkbI4NTMycklpbLQysDHFCZud1LrTdSGt3CQagQqQ8TuRUjFufOB1M5L7B vAg/oOD6+Rqio6VPGcUK/+XZ9SshbqUN4l8pCSBfokFZs83z3/EsH9W7G7AnXP6a3I FUCzjdgTVsYIb3/SSafxU46Ljtt1EPyGm1VkTQy9A40jPVQq/CzGKHnZyDhXamC/Fa 8/TRvyUYlwhjL4OLzODNtOBTV3mSpY/tkz/D9W6nJGwj7O/RDiUMZu8D0vopPesuir G/D/YbpJIQ3cWgo74f66EEdGqLeCBaq3Y+PpzBWeubcqUrddIyQJCg+QtlrZRSTJyN eg+7Pk3GPM90g== Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id C6E5169209; Fri, 9 Jan 2026 11:32:19 -0700 (MST) From: Simon Glass To: U-Boot Concept Date: Fri, 9 Jan 2026 11:31:03 -0700 Message-ID: <20260109183116.3262115-12-sjg@u-boot.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260109183116.3262115-1-sjg@u-boot.org> References: <20260109183116.3262115-1-sjg@u-boot.org> MIME-Version: 1.0 Message-ID-Hash: H3FQQ42AH3DGKGGOUZ4QUDE2M6ZP4KZQ X-Message-ID-Hash: H3FQQ42AH3DGKGGOUZ4QUDE2M6ZP4KZQ X-MailFrom: sjg@u-boot.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Heinrich Schuchardt , Simon Glass , "Claude Opus 4 . 5" X-Mailman-Version: 3.3.10 Precedence: list Subject: [Concept] [PATCH 11/18] buildman: Add unit tests for _prepare_working_space() List-Id: Discussion and patches related to U-Boot Concept Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Simon Glass Add TestPrepareWorkingSpace class to test_builder.py with tests covering: - No git setup (setup_git=False) - Worktree available (uses worktree and prunes) - Worktree not available (falls back to clone) - Zero threads (should still prepare 1 thread) - No git_dir set (skips git operations) Co-developed-by: Claude Opus 4.5 Signed-off-by: Simon Glass --- tools/buildman/main.py | 1 + tools/buildman/test_builder.py | 80 ++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/tools/buildman/main.py b/tools/buildman/main.py index 6e780b9e07e..74da226c2cf 100755 --- a/tools/buildman/main.py +++ b/tools/buildman/main.py @@ -55,6 +55,7 @@ def run_tests(skip_net_tests, debug, verbose, args): test_boards.TestBoards, test_bsettings.TestBsettings, test_builder.TestPrintFuncSizeDetail, test_builder.TestPrepareThread, + test_builder.TestPrepareWorkingSpace, 'buildman.toolchain']) return (0 if result.wasSuccessful() else 1) diff --git a/tools/buildman/test_builder.py b/tools/buildman/test_builder.py index 042dacc2f34..d7359477ef2 100644 --- a/tools/buildman/test_builder.py +++ b/tools/buildman/test_builder.py @@ -258,5 +258,85 @@ class TestPrepareThread(unittest.TestCase): self.assertIn("Can't setup git repo", str(ctx.exception)) +class TestPrepareWorkingSpace(unittest.TestCase): + """Tests for Builder._prepare_working_space()""" + + def setUp(self): + """Set up test fixtures""" + self.builder = builder.Builder( + toolchains=None, base_dir='/tmp/test', git_dir='/src/repo', + num_threads=4, num_jobs=1) + terminal.set_print_test_mode() + + def tearDown(self): + """Clean up after tests""" + terminal.set_print_test_mode(False) + + @mock.patch.object(builder.Builder, '_prepare_thread') + @mock.patch.object(builderthread, 'mkdir') + def test_no_setup_git(self, mock_mkdir, mock_prepare_thread): + """Test with setup_git=False""" + self.builder._prepare_working_space(2, False) + + mock_mkdir.assert_called_once() + # Should prepare 2 threads with setup_git=False + self.assertEqual(mock_prepare_thread.call_count, 2) + mock_prepare_thread.assert_any_call(0, False) + mock_prepare_thread.assert_any_call(1, False) + + @mock.patch.object(builder.Builder, '_prepare_thread') + @mock.patch.object(gitutil, 'prune_worktrees') + @mock.patch.object(gitutil, 'check_worktree_is_available', return_value=True) + @mock.patch.object(builderthread, 'mkdir') + def test_worktree_available(self, mock_mkdir, mock_check_worktree, + mock_prune, mock_prepare_thread): + """Test when worktree is available""" + self.builder._prepare_working_space(3, True) + + mock_check_worktree.assert_called_once() + mock_prune.assert_called_once() + # Should prepare 3 threads with setup_git='worktree' + self.assertEqual(mock_prepare_thread.call_count, 3) + mock_prepare_thread.assert_any_call(0, 'worktree') + mock_prepare_thread.assert_any_call(1, 'worktree') + mock_prepare_thread.assert_any_call(2, 'worktree') + + @mock.patch.object(builder.Builder, '_prepare_thread') + @mock.patch.object(gitutil, 'check_worktree_is_available', return_value=False) + @mock.patch.object(builderthread, 'mkdir') + def test_worktree_not_available(self, mock_mkdir, mock_check_worktree, + mock_prepare_thread): + """Test when worktree is not available (falls back to clone)""" + self.builder._prepare_working_space(2, True) + + mock_check_worktree.assert_called_once() + # Should prepare 2 threads with setup_git='clone' + self.assertEqual(mock_prepare_thread.call_count, 2) + mock_prepare_thread.assert_any_call(0, 'clone') + mock_prepare_thread.assert_any_call(1, 'clone') + + @mock.patch.object(builder.Builder, '_prepare_thread') + @mock.patch.object(builderthread, 'mkdir') + def test_zero_threads(self, mock_mkdir, mock_prepare_thread): + """Test with max_threads=0 (should still prepare 1 thread)""" + self.builder._prepare_working_space(0, False) + + # Should prepare at least 1 thread + self.assertEqual(mock_prepare_thread.call_count, 1) + mock_prepare_thread.assert_called_with(0, False) + + @mock.patch.object(builder.Builder, '_prepare_thread') + @mock.patch.object(builderthread, 'mkdir') + def test_no_git_dir(self, mock_mkdir, mock_prepare_thread): + """Test with no git_dir set""" + self.builder.git_dir = None + self.builder._prepare_working_space(2, True) + + # setup_git should remain True but git operations skipped + self.assertEqual(mock_prepare_thread.call_count, 2) + mock_prepare_thread.assert_any_call(0, True) + mock_prepare_thread.assert_any_call(1, True) + + if __name__ == '__main__': unittest.main()