winpthreads: tests: add tests for `pthread_mutexattr_*` functions

Signed-off-by: Kirill Makurin <maiddaisuki@outlook.com>
Signed-off-by: LIU Hao <lh_mouse@126.com>
diff --git a/mingw-w64-libraries/winpthreads/tests/Makefile.am b/mingw-w64-libraries/winpthreads/tests/Makefile.am
index 785da97..8087899 100644
--- a/mingw-w64-libraries/winpthreads/tests/Makefile.am
+++ b/mingw-w64-libraries/winpthreads/tests/Makefile.am
@@ -110,6 +110,10 @@
 	pthread_misc/stress1       \
 	pthread_misc/valid1        \
 	pthread_misc/valid2        \
+	pthread_mutex/attr-prioceiling                 \
+	pthread_mutex/attr-protocol                    \
+	pthread_mutex/attr-pshared                     \
+	pthread_mutex/attr-type                        \
 	pthread_mutex/default-basic                    \
 	pthread_mutex/default-lock-recursive           \
 	pthread_mutex/default-static                   \
diff --git a/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-prioceiling.c b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-prioceiling.c
new file mode 100644
index 0000000..789b87e
--- /dev/null
+++ b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-prioceiling.c
@@ -0,0 +1,63 @@
+/*
+   Copyright (c) 2026 mingw-w64 project
+
+   Permission is hereby granted, free of charge, to any person obtaining a
+   copy of this software and associated documentation files (the "Software"),
+   to deal in the Software without restriction, including without limitation
+   the rights to use, copy, modify, merge, publish, distribute, sublicense,
+   and/or sell copies of the Software, and to permit persons to whom the
+   Software is furnished to do so, subject to the following conditions:
+
+   The above copyright notice and this permission notice shall be included in
+   all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+   DEALINGS IN THE SOFTWARE.
+*/
+
+#include "test.h"
+
+/**
+ * Test Summary:
+ *
+ * Test functions `pthread_mutexattr_setprioceiling` and
+ * `pthread_mutexattr_getprioceiling`.
+ */
+
+static void DoTest (int value, int expectedValue, int expectedReturn1, int expectedReturn2) {
+  pthread_mutexattr_t mutexAttr;
+  pthread_mutex_t mutex;
+
+  assert (pthread_mutexattr_init (&mutexAttr) == 0);
+  assert (pthread_mutexattr_setprioceiling (&mutexAttr, value) == expectedReturn1);
+  assert (pthread_mutexattr_getprioceiling (&mutexAttr, &value) == 0);
+  assert (value == expectedValue);
+  assert (pthread_mutex_init (&mutex, &mutexAttr) == expectedReturn2);
+  if (expectedReturn2 == 0) {
+    assert (pthread_mutex_destroy (&mutex) == 0);
+  }
+  assert (pthread_mutexattr_destroy (&mutexAttr) == 0);
+}
+
+int main (void) {
+  /**
+   * Any valid `THRAED_PRIORITY_*` value can be set for prioceiling attribute.
+   *
+   * Currently, it has no effect; POSIX realtime extensions are not implemented.
+   */
+  for (int value = THREAD_PRIORITY_IDLE; value <= THREAD_PRIORITY_TIME_CRITICAL; ++value) {
+    DoTest (value, value, 0, 0);
+  }
+
+  /**
+   * Try setting an invalid value; default attribute value must be used.
+   */
+  DoTest (0xFF, THREAD_PRIORITY_NORMAL, EINVAL, 0);
+
+  return 0;
+}
diff --git a/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-protocol.c b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-protocol.c
new file mode 100644
index 0000000..d1c0b00
--- /dev/null
+++ b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-protocol.c
@@ -0,0 +1,65 @@
+/*
+   Copyright (c) 2026 mingw-w64 project
+
+   Permission is hereby granted, free of charge, to any person obtaining a
+   copy of this software and associated documentation files (the "Software"),
+   to deal in the Software without restriction, including without limitation
+   the rights to use, copy, modify, merge, publish, distribute, sublicense,
+   and/or sell copies of the Software, and to permit persons to whom the
+   Software is furnished to do so, subject to the following conditions:
+
+   The above copyright notice and this permission notice shall be included in
+   all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+   DEALINGS IN THE SOFTWARE.
+*/
+
+#include "test.h"
+
+/**
+ * Test Summary:
+ *
+ * Test functions `pthread_mutexattr_setprotocol` and
+ * `pthread_mutexattr_getprotocol`.
+ */
+
+static void DoTest (int value, int expectedValue, int expectedReturn1, int expectedReturn2) {
+  pthread_mutexattr_t mutexAttr;
+  pthread_mutex_t mutex;
+
+  assert (pthread_mutexattr_init (&mutexAttr) == 0);
+  assert (pthread_mutexattr_setprotocol (&mutexAttr, value) == expectedReturn1);
+  assert (pthread_mutexattr_getprotocol (&mutexAttr, &value) == 0);
+  assert (value == expectedValue);
+  assert (pthread_mutex_init (&mutex, &mutexAttr) == expectedReturn2);
+  if (expectedReturn2 == 0) {
+    assert (pthread_mutex_destroy (&mutex) == 0);
+  }
+  assert (pthread_mutexattr_destroy (&mutexAttr) == 0);
+}
+
+int main (void) {
+  /**
+   * Currently winpthreads only supports `PTHREAD_PRIO_NONE`.
+   */
+  DoTest (PTHREAD_PRIO_NONE, PTHREAD_PRIO_NONE, 0, 0);
+
+  /**
+   * POSIX realtime extensions are not implemented.
+   */
+  DoTest (PTHREAD_PRIO_INHERIT, PTHREAD_PRIO_NONE, ENOTSUP, 0);
+  DoTest (PTHREAD_PRIO_PROTECT, PTHREAD_PRIO_NONE, ENOTSUP, 0);
+
+  /**
+   * Try setting an invalid value; default attribute value must be used.
+   */
+  DoTest (0xFF, PTHREAD_PRIO_NONE, EINVAL, 0);
+
+  return 0;
+}
diff --git a/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-pshared.c b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-pshared.c
new file mode 100644
index 0000000..f7937f0
--- /dev/null
+++ b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-pshared.c
@@ -0,0 +1,60 @@
+/*
+   Copyright (c) 2026 mingw-w64 project
+
+   Permission is hereby granted, free of charge, to any person obtaining a
+   copy of this software and associated documentation files (the "Software"),
+   to deal in the Software without restriction, including without limitation
+   the rights to use, copy, modify, merge, publish, distribute, sublicense,
+   and/or sell copies of the Software, and to permit persons to whom the
+   Software is furnished to do so, subject to the following conditions:
+
+   The above copyright notice and this permission notice shall be included in
+   all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+   DEALINGS IN THE SOFTWARE.
+*/
+
+#include "test.h"
+
+/**
+ * Test Summary:
+ *
+ * Test functions `pthread_mutexattr_setpshared` and
+ * `pthread_mutexattr_getpshared`.
+ */
+
+static void DoTest (int value, int expectedValue, int expectedReturn1, int expectedReturn2) {
+  pthread_mutexattr_t mutexAttr;
+  pthread_mutex_t mutex;
+
+  assert (pthread_mutexattr_init (&mutexAttr) == 0);
+  assert (pthread_mutexattr_setpshared (&mutexAttr, value) == expectedReturn1);
+  assert (pthread_mutexattr_getpshared (&mutexAttr, &value) == 0);
+  assert (value == expectedValue);
+  assert (pthread_mutex_init (&mutex, &mutexAttr) == expectedReturn2);
+  if (expectedReturn2 == 0) {
+    assert (pthread_mutex_destroy (&mutex) == 0);
+  }
+  assert (pthread_mutexattr_destroy (&mutexAttr) == 0);
+}
+
+int main (void) {
+  /**
+   * Currently winpthreads only supports `PTHREAD_PROCESS_PRIVATE`.
+   */
+  DoTest (PTHREAD_PROCESS_PRIVATE, PTHREAD_PROCESS_PRIVATE, 0, 0);
+  DoTest (PTHREAD_PROCESS_SHARED, PTHREAD_PROCESS_SHARED, 0, ENOSYS);
+
+  /**
+   * Try setting an invalid value; default attribute value must be used.
+   */
+  DoTest (0xFF, PTHREAD_PROCESS_PRIVATE, EINVAL, 0);
+
+  return 0;
+}
diff --git a/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-type.c b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-type.c
new file mode 100644
index 0000000..16fa713
--- /dev/null
+++ b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-type.c
@@ -0,0 +1,65 @@
+/*
+   Copyright (c) 2026 mingw-w64 project
+
+   Permission is hereby granted, free of charge, to any person obtaining a
+   copy of this software and associated documentation files (the "Software"),
+   to deal in the Software without restriction, including without limitation
+   the rights to use, copy, modify, merge, publish, distribute, sublicense,
+   and/or sell copies of the Software, and to permit persons to whom the
+   Software is furnished to do so, subject to the following conditions:
+
+   The above copyright notice and this permission notice shall be included in
+   all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+   DEALINGS IN THE SOFTWARE.
+*/
+
+#include "test.h"
+
+/**
+ * Test Summary:
+ *
+ * Test functions `pthread_mutexattr_settype` and `pthread_mutexattr_gettype`.
+ */
+
+static void DoTest (int value, int expectedValue, int expectedReturn1, int expectedReturn2) {
+  pthread_mutexattr_t mutexAttr;
+  pthread_mutex_t mutex;
+
+  assert (pthread_mutexattr_init (&mutexAttr) == 0);
+  assert (pthread_mutexattr_settype (&mutexAttr, value) == expectedReturn1);
+  assert (pthread_mutexattr_gettype (&mutexAttr, &value) == 0);
+  assert (value == expectedValue);
+  assert (pthread_mutex_init (&mutex, &mutexAttr) == expectedReturn2);
+  if (expectedReturn2 == 0) {
+    assert (pthread_mutex_destroy (&mutex) == 0);
+  }
+  assert (pthread_mutexattr_destroy (&mutexAttr) == 0);
+}
+
+int main (void) {
+  /**
+   * Default mutex type is `PTHREAD_MUTEX_NORMAL`.
+   */
+  DoTest (PTHREAD_MUTEX_DEFAULT, PTHREAD_MUTEX_NORMAL, 0, 0);
+
+  /**
+   * Mutex types defined by POSIX.
+   */
+  DoTest (PTHREAD_MUTEX_NORMAL, PTHREAD_MUTEX_NORMAL, 0, 0);
+  DoTest (PTHREAD_MUTEX_ERRORCHECK, PTHREAD_MUTEX_ERRORCHECK, 0, 0);
+  DoTest (PTHREAD_MUTEX_RECURSIVE, PTHREAD_MUTEX_RECURSIVE, 0, 0);
+
+  /**
+   * Try setting an invalid value; default attribute value must be used.
+   */
+  DoTest (0xFF, PTHREAD_MUTEX_NORMAL, EINVAL, 0);
+
+  return 0;
+}