From patchwork Sun May 26 08:43:44 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ghanshyam Thakkar X-Patchwork-Id: 13674208 Received: from mail-pf1-f181.google.com (mail-pf1-f181.google.com [209.85.210.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1F58D8F66 for ; Sun, 26 May 2024 08:44:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1716713076; cv=none; b=pLT49LdOoIm/zYZ5QYN/tNFIO+tEfLwztMG6BUYTutTJem1Ji2eLqAv7W3Zw6YWhMENsqnqpNw0E3zEBBR9adYlXZ9nbpp4YPaNw0+QqGOVAEf4e7lTum1H3xe3iV8a3SZAZ5RKLjg+czRQ2wgYMArt60BSAsaz6V6FgUBuDPmA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1716713076; c=relaxed/simple; bh=6HQHjW+N/3w5tEldAEVg/0IebLJd0EFrnxQfepAygqY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uiEaRHJ9z21GzPqaB5ELXRMeZ/2kNYjAWU54kxW5dwvKK69HGQCuTATjPn0RqIEQY5rXiOJ7fg7yEZiKTYUqWJaSB5UYX9zvpWpC2r9DmOJn8U7SqhTtLgxGzLJl58qunvez2QMdA5X9A0wnncae7gI7QhrW/1Jv5avh3UoTt7k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ZZHykX9N; arc=none smtp.client-ip=209.85.210.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ZZHykX9N" Received: by mail-pf1-f181.google.com with SMTP id d2e1a72fcca58-6f8ea2df4b3so1711944b3a.2 for ; Sun, 26 May 2024 01:44:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1716713072; x=1717317872; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=xAd+Gat3kCe+FrRUdxhA0S8JXk+VT8NM7ivA44jzlRA=; b=ZZHykX9NM2jL0krazZcx5kSpv+PSxkVhSFfy0f2vuZHwvs5r4vQdBtL/+jjZEVp/gY sGoGKbf4zFURxdeXI6EFfwvPwoOo5T38E122J6H5P5mJmY4DzY5w8ClEdGnrAX1E0FNN COZQrlyJjbDaBoy6+xK332MxNzFWdaahspKHuzrINgXfKBtMns+pqpz+/KF63F2R6H0W r9tGJJrJjxmaejIkqyjD5iNwioDUO5GtMCL2obP/FPSOPeKLMnKtP3URj2+f7468UCat u8JaFNTGaxILVpRwji4X6KPDk7Mka2mDeVcerapMNTT3QlCouiZ0V60AYC9TzJp+DVsc t7cQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1716713072; x=1717317872; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xAd+Gat3kCe+FrRUdxhA0S8JXk+VT8NM7ivA44jzlRA=; b=J6zvYRyCu494tppg4zK1NruDWwxAhKwPjRFmsC5vAs3UBGqDQvuDIYZ6kFRZmAAxiT HraveMHab52BFRdMs285xBcAQlF/eo9Hkwmn+8rcCAbZ1Ed5jNpiTlUVLhpLgPDZt8wY BjAWUWFf5YmwNHLL0xmWyss+RFw1PePu8Hk0FAkOMdNtUCf1eBBpD/OZr0z9RdwvBRQz h3G0pNm55q4i8+Fm5eD30ff8d6UsLFLLQGzLUat6uz3RqZdOfrk8ZcvIUr7R+hoIE3i5 tjHE7VOEcJK1vH0npsN/qMK69AC4xO3HMUjkgsJUC3WYsi2PMrddllyHm6Uw79+LMWY5 WV/Q== X-Forwarded-Encrypted: i=1; AJvYcCX/v1N+Apy3p/3o6/BBe/yhstup7DKqivu//9wQM0ZqAMCfeBDBuTb1FHTA5D4wjGB9WRERQpDWTyZr/URGuAu8432h X-Gm-Message-State: AOJu0YzKund7JtTj98+8NMwiCVsY6ScCoDn/M18y8c101K2nLoNJ2UHo I/kbeAnfdUGEn8VM+7ayGEp7xIMIGTDsP27j9V7K+T7gSwv8mo+3OSjX4sEp X-Google-Smtp-Source: AGHT+IGPycVhXVEfSk7mJ/htInt+Ju1gtnyFjehxLduzxNo+bDyooJAFCkDXvcin3fgNjn6J+S+H0Q== X-Received: by 2002:a05:6a00:8912:b0:6f9:9606:30da with SMTP id d2e1a72fcca58-6f99624bd73mr5259431b3a.31.1716713072130; Sun, 26 May 2024 01:44:32 -0700 (PDT) Received: from localhost.localdomain ([2402:a00:401:a99b:f188:2dd3:d960:a8ab]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-6f8fcfe64a4sm3274488b3a.158.2024.05.26.01.44.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 26 May 2024 01:44:31 -0700 (PDT) From: Ghanshyam Thakkar To: shyamthakkar001@gmail.com Cc: ach.lumap@gmail.com, chriscool@tuxfamily.org, christian.couder@gmail.com, git@vger.kernel.org, gitster@pobox.com, kaartic.sivaraam@gmail.com, ps@pks.im Subject: [PATCH v4 1/2] strbuf: introduce strbuf_addstrings() to repeatedly add a string Date: Sun, 26 May 2024 14:13:44 +0530 Message-ID: <20240526084345.24138-2-shyamthakkar001@gmail.com> X-Mailer: git-send-email 2.45.1 In-Reply-To: <20240526084345.24138-1-shyamthakkar001@gmail.com> References: <20240523235945.26833-1-shyamthakkar001@gmail.com> <20240526084345.24138-1-shyamthakkar001@gmail.com> Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 In a following commit we are going to port code from "t/helper/test-sha256.c", t/helper/test-hash.c and "t/t0015-hash.sh" to a new "t/unit-tests/t-hash.c" file using the recently added unit test framework. To port code like: perl -e "$| = 1; print q{aaaaaaaaaa} for 1..100000;" we are going to need a new strbuf_addstrings() function that repeatedly adds the same string a number of times to a buffer. Such a strbuf_addstrings() function would already be useful in "json-writer.c" and "builtin/submodule-helper.c" as both of these files already have code that repeatedly adds the same string. So let's introduce such a strbuf_addstrings() function in "strbuf.{c,h}" and use it in both "json-writer.c" and "builtin/submodule-helper.c". We use the "strbuf_addstrings" name as this way strbuf_addstr() and strbuf_addstrings() would be similar for strings as strbuf_addch() and strbuf_addchars() for characters. Helped-by: Junio C Hamano Mentored-by: Christian Couder Mentored-by: Kaartic Sivaraam Co-authored-by: Achu Luma Signed-off-by: Achu Luma Signed-off-by: Ghanshyam Thakkar --- builtin/submodule--helper.c | 4 +--- json-writer.c | 5 +---- strbuf.c | 9 +++++++++ strbuf.h | 5 +++++ 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index e604cb5ddb..5620a5bf67 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -256,11 +256,9 @@ static void module_list_active(struct module_list *list) static char *get_up_path(const char *path) { - int i; struct strbuf sb = STRBUF_INIT; - for (i = count_slashes(path); i; i--) - strbuf_addstr(&sb, "../"); + strbuf_addstrings(&sb, "../", count_slashes(path)); /* * Check if 'path' ends with slash or not diff --git a/json-writer.c b/json-writer.c index 005c820aa4..25b9201f9c 100644 --- a/json-writer.c +++ b/json-writer.c @@ -46,10 +46,7 @@ static void append_quoted_string(struct strbuf *out, const char *in) static void indent_pretty(struct json_writer *jw) { - int k; - - for (k = 0; k < jw->open_stack.len; k++) - strbuf_addstr(&jw->json, " "); + strbuf_addstrings(&jw->json, " ", jw->open_stack.len); } /* diff --git a/strbuf.c b/strbuf.c index 0d929e4e19..e3ca9b1ee9 100644 --- a/strbuf.c +++ b/strbuf.c @@ -313,6 +313,15 @@ void strbuf_add(struct strbuf *sb, const void *data, size_t len) strbuf_setlen(sb, sb->len + len); } +void strbuf_addstrings(struct strbuf *sb, const char *s, size_t n) +{ + size_t len = strlen(s); + + strbuf_grow(sb, st_mult(len, n)); + for (size_t i = 0; i < n; i++) + strbuf_add(sb, s, len); +} + void strbuf_addbuf(struct strbuf *sb, const struct strbuf *sb2) { strbuf_grow(sb, sb2->len); diff --git a/strbuf.h b/strbuf.h index 97fa4a3d01..003f880ff7 100644 --- a/strbuf.h +++ b/strbuf.h @@ -310,6 +310,11 @@ static inline void strbuf_addstr(struct strbuf *sb, const char *s) strbuf_add(sb, s, strlen(s)); } +/** + * Add a NUL-terminated string the specified number of times to the buffer. + */ +void strbuf_addstrings(struct strbuf *sb, const char *s, size_t n); + /** * Copy the contents of another buffer at the end of the current one. */ From patchwork Sun May 26 08:43:45 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ghanshyam Thakkar X-Patchwork-Id: 13674209 Received: from mail-pg1-f169.google.com (mail-pg1-f169.google.com [209.85.215.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0BE3E8F6A for ; Sun, 26 May 2024 08:44:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1716713078; cv=none; b=EAP7B5YK43+qER5RvJW6j+jk+vW7ZJTITjYiRErjnc3NQ2VzoYagXLFlW2QQ9Omo9eP1HQutWMgEVZ3GnuHVYmyMeNNDi87UqIv6OWq0TEll8n7B80OLKXo7JKDT0WtQ3yp8PclSSpdR5+gkYSfNdJKeS0JbNvVMX/TwIXDjxeo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1716713078; c=relaxed/simple; bh=YEVD6yxVBstdYUfm+lIIWXk4QInM+UG9w6aPcgoV4Mw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WYzChOzw+E6GyGFqdfJlGBXfqbRejRN8FbcPnYEGDJqOx1OIi7v/s7HByvAxUGB+1l3fjVe202UTLmxVKBgtv9JdI+RQQDxAxmLfxB7BT8GJBbsFLAWFZUm9zqNJs+9wEURf0BrEWyi/ifgNxuWFlFE9baaWiS8HPtRLjc3GVzg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=OXYmIUZg; arc=none smtp.client-ip=209.85.215.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="OXYmIUZg" Received: by mail-pg1-f169.google.com with SMTP id 41be03b00d2f7-681919f89f2so1802523a12.1 for ; Sun, 26 May 2024 01:44:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1716713076; x=1717317876; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=gXSptaDBKiMUVYMIdMlR97f5h/jLlvXQ7MBK0wAxu7U=; b=OXYmIUZgqNNhkhTGWPgkwED9Iq/f5IIEz0PT8gtweRx8NbtA1Qftuv2wkzA3wqgD+U JUDjZRfOlzlZurO+dIKcq6nzPKNlfTrQx/kkJCCF7mLQpnOj7u1U2m4a1ErZ3zC5WOC3 iqcaBOVCekIfR1RQb6gKnLOv00/rPIx9TsYm6r2GqcAOASwfwrM6hSVBC3HRmQ6NCr3P Dq7XGwf/7ddsbkquxj0IgFk4kUK2HqMB5pD+PheGztdfufKhl7tTqzD5RPzd7kj3s/CF yX96Kx0V73eVENO2WCDD5caPeLRKCTcfqz4t/+KYUOaOLvwGRhefRVPf6e7co3hxPqvA yS2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1716713076; x=1717317876; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=gXSptaDBKiMUVYMIdMlR97f5h/jLlvXQ7MBK0wAxu7U=; b=Gekj98AbQFUPhTXWDwWhl2R0VlxlzJsUl5ryBWOVl4xPto8Y+4ePVtQ6FcfsPSs2ja Ue0m+25/Fod7uBcQjKc0ofzt1ScsIqyXeHvvkOOq2G/XBZS8X1O137QpTDc/oNkzpk24 6R9RKPGwagPJBPDnbNrSg35ROdfNp7BlskPLQriugCox8RU2+SdfE2XNFnfSRu34iZvx uR9fD/zWzoPvxQX7j6uYa77VhWlKoKzX2TKH/yMNcJN3gjU2WUm2FUhP0PLfR6sALSMV ikgfzrgVqqEVZv8HsvzExUhiYqDP4sjjxkRFDoJJS+2dKfEpeolndgiH3eQAHr0L75QW gw5A== X-Forwarded-Encrypted: i=1; AJvYcCXsz57Ho9cxGryzBZLQ7SJXOfc+v7GH6ianAX5497W9MIxx2htIj5VSLXDlai6r7qdfObsfu7WgfTquTQCuf4WmDKId X-Gm-Message-State: AOJu0YwvdRsreU8vbcsmF4Lok5AWwb+Ze49Oy+yTs3lmoqdtut1l19eJ F93UNgiwN9j3DnMS/KiMDYooi8FIEGWn3OuJ0VQR5OyHsfc3byrA X-Google-Smtp-Source: AGHT+IEy5RLT39cuCK1GPz8ER6Ta0gixse4GCpnvD7NU2R+ja1kCJVNOA5GFzCHTph8RrOhxWcrDcQ== X-Received: by 2002:a05:6a20:9c97:b0:1a7:3b4b:4153 with SMTP id adf61e73a8af0-1b212e3aa51mr10555046637.58.1716713076095; Sun, 26 May 2024 01:44:36 -0700 (PDT) Received: from localhost.localdomain ([2402:a00:401:a99b:f188:2dd3:d960:a8ab]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-6f8fcfe64a4sm3274488b3a.158.2024.05.26.01.44.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 26 May 2024 01:44:35 -0700 (PDT) From: Ghanshyam Thakkar To: shyamthakkar001@gmail.com Cc: ach.lumap@gmail.com, chriscool@tuxfamily.org, christian.couder@gmail.com, git@vger.kernel.org, gitster@pobox.com, kaartic.sivaraam@gmail.com, ps@pks.im Subject: [PATCH v4 2/2] t/: migrate helper/test-{sha1, sha256} to unit-tests/t-hash Date: Sun, 26 May 2024 14:13:45 +0530 Message-ID: <20240526084345.24138-3-shyamthakkar001@gmail.com> X-Mailer: git-send-email 2.45.1 In-Reply-To: <20240526084345.24138-1-shyamthakkar001@gmail.com> References: <20240523235945.26833-1-shyamthakkar001@gmail.com> <20240526084345.24138-1-shyamthakkar001@gmail.com> Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 t/helper/test-{sha1, sha256} and t/t0015-hash.sh test the hash implementation of SHA-1 and SHA-256 in Git with basic hash values. Migrate them to the new unit testing framework for better debugging and runtime performance. The 'sha1' and 'sha256' subcommands are still not removed due to pack_trailer():lib-pack.sh's reliance on them. The 'sha1' subcommand is also relied upon by t0013-sha1dc (which requires 'test-tool sha1' dying when it is used on a file created to contain the known sha1 attack). Helped-by: Patrick Steinhardt Mentored-by: Christian Couder Mentored-by: Kaartic Sivaraam Co-authored-by: Achu Luma Signed-off-by: Achu Luma Signed-off-by: Ghanshyam Thakkar --- Makefile | 1 + t/t0015-hash.sh | 56 ---------------------------- t/unit-tests/t-hash.c | 86 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 56 deletions(-) delete mode 100755 t/t0015-hash.sh create mode 100644 t/unit-tests/t-hash.c diff --git a/Makefile b/Makefile index 8f4432ae57..2b19fdf6ae 100644 --- a/Makefile +++ b/Makefile @@ -1335,6 +1335,7 @@ THIRD_PARTY_SOURCES += sha1collisiondetection/% THIRD_PARTY_SOURCES += sha1dc/% UNIT_TEST_PROGRAMS += t-ctype +UNIT_TEST_PROGRAMS += t-hash UNIT_TEST_PROGRAMS += t-mem-pool UNIT_TEST_PROGRAMS += t-prio-queue UNIT_TEST_PROGRAMS += t-strbuf diff --git a/t/t0015-hash.sh b/t/t0015-hash.sh deleted file mode 100755 index 0a087a1983..0000000000 --- a/t/t0015-hash.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/sh - -test_description='test basic hash implementation' - -TEST_PASSES_SANITIZE_LEAK=true -. ./test-lib.sh - -test_expect_success 'test basic SHA-1 hash values' ' - test-tool sha1 actual && - grep da39a3ee5e6b4b0d3255bfef95601890afd80709 actual && - printf "a" | test-tool sha1 >actual && - grep 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 actual && - printf "abc" | test-tool sha1 >actual && - grep a9993e364706816aba3e25717850c26c9cd0d89d actual && - printf "message digest" | test-tool sha1 >actual && - grep c12252ceda8be8994d5fa0290a47231c1d16aae3 actual && - printf "abcdefghijklmnopqrstuvwxyz" | test-tool sha1 >actual && - grep 32d10c7b8cf96570ca04ce37f2a19d84240d3a89 actual && - perl -e "$| = 1; print q{aaaaaaaaaa} for 1..100000;" | - test-tool sha1 >actual && - grep 34aa973cd4c4daa4f61eeb2bdbad27316534016f actual && - printf "blob 0\0" | test-tool sha1 >actual && - grep e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 actual && - printf "blob 3\0abc" | test-tool sha1 >actual && - grep f2ba8f84ab5c1bce84a7b441cb1959cfc7093b7f actual && - printf "tree 0\0" | test-tool sha1 >actual && - grep 4b825dc642cb6eb9a060e54bf8d69288fbee4904 actual -' - -test_expect_success 'test basic SHA-256 hash values' ' - test-tool sha256 actual && - grep e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 actual && - printf "a" | test-tool sha256 >actual && - grep ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb actual && - printf "abc" | test-tool sha256 >actual && - grep ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad actual && - printf "message digest" | test-tool sha256 >actual && - grep f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650 actual && - printf "abcdefghijklmnopqrstuvwxyz" | test-tool sha256 >actual && - grep 71c480df93d6ae2f1efad1447c66c9525e316218cf51fc8d9ed832f2daf18b73 actual && - # Try to exercise the chunking code by turning autoflush on. - perl -e "$| = 1; print q{aaaaaaaaaa} for 1..100000;" | - test-tool sha256 >actual && - grep cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0 actual && - perl -e "$| = 1; print q{abcdefghijklmnopqrstuvwxyz} for 1..100000;" | - test-tool sha256 >actual && - grep e406ba321ca712ad35a698bf0af8d61fc4dc40eca6bdcea4697962724ccbde35 actual && - printf "blob 0\0" | test-tool sha256 >actual && - grep 473a0f4c3be8a93681a267e3b1e9a7dcda1185436fe141f7749120a303721813 actual && - printf "blob 3\0abc" | test-tool sha256 >actual && - grep c1cf6e465077930e88dc5136641d402f72a229ddd996f627d60e9639eaba35a6 actual && - printf "tree 0\0" | test-tool sha256 >actual && - grep 6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321 actual -' - -test_done diff --git a/t/unit-tests/t-hash.c b/t/unit-tests/t-hash.c new file mode 100644 index 0000000000..bf3e0e9e94 --- /dev/null +++ b/t/unit-tests/t-hash.c @@ -0,0 +1,86 @@ +#include "test-lib.h" +#include "hex.h" +#include "strbuf.h" + +static void check_hash_data(const void *data, size_t data_length, + const char *expected_hashes[]) +{ + if (!check(data != NULL)) { + test_msg("BUG: NULL data pointer provided"); + return; + } + + for (int i = 1; i < ARRAY_SIZE(hash_algos); i++) { + git_hash_ctx ctx; + unsigned char hash[GIT_MAX_HEXSZ]; + const struct git_hash_algo *algop = &hash_algos[i]; + + algop->init_fn(&ctx); + algop->update_fn(&ctx, data, data_length); + algop->final_fn(hash, &ctx); + + if (!check_str(hash_to_hex_algop(hash, algop), expected_hashes[i - 1])) + test_msg("result does not match with the expected for %s\n", hash_algos[i].name); + } +} + +/* Works with a NUL terminated string. Doesn't work if it should contain a NUL character. */ +#define TEST_HASH_STR(data, expected_sha1, expected_sha256) \ + { \ + const char *expected_hashes[] = { expected_sha1, expected_sha256 }; \ + TEST(check_hash_data(data, strlen(data), expected_hashes), \ + "SHA1 and SHA256 (%s) works", #data); \ + } + +/* Only works with a literal string, useful when it contains a NUL character. */ +#define TEST_HASH_LITERAL(literal, expected_sha1, expected_sha256) \ + { \ + const char *expected_hashes[] = { expected_sha1, expected_sha256 }; \ + TEST(check_hash_data(literal, (sizeof(literal) - 1), expected_hashes), \ + "SHA1 and SHA256 (%s) works", #literal); \ + } + +int cmd_main(int argc, const char **argv) +{ + struct strbuf aaaaaaaaaa_100000 = STRBUF_INIT; + struct strbuf alphabet_100000 = STRBUF_INIT; + + strbuf_addstrings(&aaaaaaaaaa_100000, "aaaaaaaaaa", 100000); + strbuf_addstrings(&alphabet_100000, "abcdefghijklmnopqrstuvwxyz", 100000); + + TEST_HASH_STR( + "", "da39a3ee5e6b4b0d3255bfef95601890afd80709", + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); + TEST_HASH_STR( + "a", "86f7e437faa5a7fce15d1ddcb9eaeaea377667b8", + "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb"); + TEST_HASH_STR( + "abc", "a9993e364706816aba3e25717850c26c9cd0d89d", + "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"); + TEST_HASH_STR( + "message digest", "c12252ceda8be8994d5fa0290a47231c1d16aae3", + "f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650"); + TEST_HASH_STR( + "abcdefghijklmnopqrstuvwxyz", "32d10c7b8cf96570ca04ce37f2a19d84240d3a89", + "71c480df93d6ae2f1efad1447c66c9525e316218cf51fc8d9ed832f2daf18b73"); + TEST_HASH_STR( + aaaaaaaaaa_100000.buf, "34aa973cd4c4daa4f61eeb2bdbad27316534016f", + "cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0"); + TEST_HASH_STR( + alphabet_100000.buf, "e7da7c55b3484fdf52aebec9cbe7b85a98f02fd4", + "e406ba321ca712ad35a698bf0af8d61fc4dc40eca6bdcea4697962724ccbde35"); + TEST_HASH_LITERAL( + "blob 0\0", "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", + "473a0f4c3be8a93681a267e3b1e9a7dcda1185436fe141f7749120a303721813"); + TEST_HASH_LITERAL( + "blob 3\0abc", "f2ba8f84ab5c1bce84a7b441cb1959cfc7093b7f", + "c1cf6e465077930e88dc5136641d402f72a229ddd996f627d60e9639eaba35a6"); + TEST_HASH_LITERAL( + "tree 0\0", "4b825dc642cb6eb9a060e54bf8d69288fbee4904", + "6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321"); + + strbuf_release(&aaaaaaaaaa_100000); + strbuf_release(&alphabet_100000); + + return test_done(); +}