diff --git a/subprojects/packagefiles/pcg-c-basic/meson.build b/subprojects/packagefiles/pcg-c-basic/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..efe83ebf8cb6f7cbc98690e22ff87b575867e78a
--- /dev/null
+++ b/subprojects/packagefiles/pcg-c-basic/meson.build
@@ -0,0 +1,13 @@
+project('pcg-c-basic', 'c',
+  version: '0.9',
+  license: 'Apache 2.0',
+)
+
+inc = include_directories('.')
+libpcg_basic = static_library('pcg_basic',
+  'pcg_basic.c',
+  include_directories : inc,
+  install : true)
+
+libpcg_basic_dep = declare_dependency(include_directories : inc,
+  link_with : libpcg_basic)
diff --git a/subprojects/pcg-c-basic.wrap b/subprojects/pcg-c-basic.wrap
new file mode 100644
index 0000000000000000000000000000000000000000..1b24864cc6df36a5e3e62b90f9ab21a579b516d0
--- /dev/null
+++ b/subprojects/pcg-c-basic.wrap
@@ -0,0 +1,6 @@
+[wrap-file]
+directory = pcg-c-basic-0.9
+source_url = https://www.pcg-random.org/downloads/pcg-c-basic-0.9.zip
+source_filename = pcg-c-basic-0.9.zip
+source_hash = 143f9cc0edc7e81064bde5ed6c5f16cbf7ca2f373d35543286f5fe4475a2eff1
+patch_directory = pcg-c-basic
diff --git a/test/cmp_icu/meson.build b/test/cmp_icu/meson.build
index 9c06d726172c0e6e65e9b0b52cc70608a11a86cc..c22293c8a9cf78189d14c5bbefba2850f5f518cd 100644
--- a/test/cmp_icu/meson.build
+++ b/test/cmp_icu/meson.build
@@ -2,9 +2,9 @@ test_case = files('test_cmp_icu.c')
 test_runner = test_runner_generator.process(test_case)
 
 test_cmp_icu = executable('test_cmp_icu',
-   test_case, test_runner,
+                          test_case, test_runner,
    include_directories : incdir,
-   link_with : cmp_lib,
+   link_with : [cmp_lib, test_common_lib],
    dependencies : unity_dep,
    build_by_default : false
 )
diff --git a/test/cmp_icu/test_cmp_icu.c b/test/cmp_icu/test_cmp_icu.c
index ef984e8a3121b84ada7b4c7dacb12e044e631f85..f552f5c8b275b0811a6b0818ef4bf6515a3b662c 100644
--- a/test/cmp_icu/test_cmp_icu.c
+++ b/test/cmp_icu/test_cmp_icu.c
@@ -28,7 +28,9 @@
 #endif
 
 #include "unity.h"
-#include "cmp_icu.h"
+#include "../test_common/test_common.h"
+
+#include <cmp_icu.h>
 #include "../lib/cmp_icu.c" /* this is a hack to test static functions */
 
 
@@ -38,42 +40,23 @@
 
 void setUp(void)
 {
-	unsigned int seed;
+	uint64_t seed;
 	static int n;
 
 #if HAS_TIME_H
-	seed = time(NULL) * getpid();
+	seed = (uint64_t)(time(NULL) ^ getpid()  ^ (intptr_t)&setUp);
 #else
 	seed = 1;
 #endif
 
 	if (!n) {
 		n = 1;
-		srand(seed);
-		printf("seed: %u\n", seed);
+		cmp_rand_seed(seed);
+		printf("seed: %llu\n", seed);
 	}
 }
 
 
-/**
- * @brief generate a random number
- *
- * @param min minimum value (inclusive)
- * @param max maximum value (inclusive)
- *
- * @returns "random" numbers in the range [M, N]
- *
- * @see https://c-faq.com/lib/randrange.html
- */
-
-int random_between(unsigned int min, unsigned int max)
-{
-	TEST_ASSERT(min < max);
-	TEST_ASSERT(max-min <= RAND_MAX);
-	return min + rand() / (RAND_MAX / (max - min + 1) + 1);
-}
-
-
 /**
  * @test cmp_cfg_icu_create
  */
@@ -125,7 +108,7 @@ void test_cmp_cfg_icu_create(void)
 	TEST_ASSERT_EQUAL_INT(DATA_TYPE_UNKNOWN, cfg.data_type);
 	memset(&cfg, 0, sizeof(cfg));
 
-	cmp_mode = -1;
+	cmp_mode = (enum cmp_mode)-1;
 	cfg = cmp_cfg_icu_create(data_type, cmp_mode, model_value, lossy_par);
 	TEST_ASSERT_EQUAL_INT(DATA_TYPE_UNKNOWN, cfg.data_type);
 	memset(&cfg, 0, sizeof(cfg));
@@ -185,10 +168,10 @@ void test_cmp_cfg_icu_create(void)
 	TEST_ASSERT_EQUAL_INT(3, cfg.round);
 
 	/* random test */
-	data_type = random_between(DATA_TYPE_IMAGETTE, biggest_data_type);
-	cmp_mode = random_between(CMP_MODE_RAW, CMP_MODE_STUFF);
-	model_value = random_between(0, MAX_MODEL_VALUE);
-	lossy_par = random_between(CMP_LOSSLESS, MAX_ICU_ROUND);
+	data_type = cmp_rand_between(DATA_TYPE_IMAGETTE, biggest_data_type);
+	cmp_mode = cmp_rand_between(CMP_MODE_RAW, CMP_MODE_STUFF);
+	model_value = cmp_rand_between(0, MAX_MODEL_VALUE);
+	lossy_par = cmp_rand_between(CMP_LOSSLESS, MAX_ICU_ROUND);
 	cfg = cmp_cfg_icu_create(data_type, cmp_mode, model_value, lossy_par);
 	TEST_ASSERT_EQUAL_INT(data_type, cfg.data_type);
 	TEST_ASSERT_EQUAL_INT(cmp_mode, cfg.cmp_mode);
@@ -1217,7 +1200,7 @@ void test_map_to_pos(void)
 	mapped_value = map_to_pos(value_to_map, max_data_bits);
 	TEST_ASSERT_EQUAL_HEX(UINT32_MAX-1, mapped_value);
 
-	value_to_map = INT32_MIN;
+	value_to_map = (uint32_t)INT32_MIN;
 	mapped_value = map_to_pos(value_to_map, max_data_bits);
 	TEST_ASSERT_EQUAL_HEX(UINT32_MAX, mapped_value);
 
@@ -1776,6 +1759,22 @@ void test_golomb_encoder(void)
 	TEST_ASSERT_EQUAL_INT(32, cw_len);
 	TEST_ASSERT_EQUAL_HEX(0xFFFFFFFE, cw);
 
+	/* error case: value larger than allowed */
+	value = 32; g_par = 1; log2_g_par = ilog_2(g_par); cw = ~0U;
+	cw_len = golomb_encoder(value, g_par, log2_g_par, &cw);
+	TEST_ASSERT_GREATER_THAN_UINT(32, cw_len);
+
+	/* error case: value larger than allowed */
+	value = 33; g_par = 1; log2_g_par = ilog_2(g_par); cw = ~0U;
+	cw_len = golomb_encoder(value, g_par, log2_g_par, &cw);
+	TEST_ASSERT_GREATER_THAN_UINT(32, cw_len);
+
+#if 0
+	/* error case: value larger than allowed overflow in returned len */
+	value = UINT32_MAX; g_par = 1; log2_g_par = ilog_2(g_par); cw = ~0U;
+	cw_len = golomb_encoder(value, g_par, log2_g_par, &cw);
+	TEST_ASSERT_GREATER_THAN_UINT(32, cw_len);
+#endif
 
 	/* test some arbitrary values with g_par = 16 */
 	value = 0; g_par = 16; log2_g_par = ilog_2(g_par); cw = ~0U;
@@ -1876,6 +1875,11 @@ void test_golomb_encoder(void)
 	cw_len = golomb_encoder(value, g_par, log2_g_par, &cw);
 	TEST_ASSERT_EQUAL_INT(32, cw_len);
 	TEST_ASSERT_EQUAL_HEX(0x7FFFFFFF, cw);
+
+	value = 0; g_par = 0xFFFFFFFF; log2_g_par = ilog_2(g_par); cw = ~0U;
+	cw_len = golomb_encoder(value, g_par, log2_g_par, &cw);
+	TEST_ASSERT_EQUAL_INT(32, cw_len);
+	TEST_ASSERT_EQUAL_HEX(0x0, cw);
 }
 
 
@@ -1932,7 +1936,7 @@ void test_encode_value_zero(void)
 	TEST_ASSERT_EQUAL_HEX(0x00000000, bitstream[2]);
 
 	/* test overflow */
-	data = INT32_MIN; model = 0;
+	data = (uint32_t)INT32_MIN; model = 0;
 	/* (INT32_MIN)*-2-1+1=0(overflow) -> cw 0 + 0x0000_0000_0000_0000 */
 	stream_len = encode_value_zero(data, model, stream_len, &setup);
 	TEST_ASSERT_EQUAL_INT(91, stream_len);
@@ -2066,7 +2070,7 @@ void test_encode_value_multi(void)
 	TEST_ASSERT_EQUAL_HEX(0x00000000, bitstream[3]);
 
 	/* highest value with multi outlier encoding */
-	data = INT32_MIN; model = 0;
+	data = (uint32_t)INT32_MIN; model = 0;
 	stream_len = encode_value_multi(data, model, stream_len, &setup);
 	TEST_ASSERT_EQUAL_INT(105, stream_len);
 	TEST_ASSERT_EQUAL_HEX(0x5BFFFBFF, bitstream[0]);
@@ -2534,7 +2538,7 @@ void test_compress_imagette_stuff(void)
 
 void test_compress_imagette_raw(void)
 {
-	uint16_t data[] = {0x0, 0x1, 0x23, 0x42, INT16_MIN, INT16_MAX, UINT16_MAX};
+	uint16_t data[] = {0x0, 0x1, 0x23, 0x42, (uint16_t)INT16_MIN, INT16_MAX, UINT16_MAX};
 	uint16_t output_buf[7] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
 	struct cmp_cfg cfg = {0};
 	int cmp_size;
@@ -2799,7 +2803,7 @@ void test_compress_s_fx_raw(void)
 	data[3].exp_flags = 0x3;
 	data[3].fx = 0x42;
 	data[4].exp_flags = 0x0;
-	data[4].fx = INT32_MIN;
+	data[4].fx = (uint32_t)INT32_MIN;
 	data[5].exp_flags = 0x3;
 	data[5].fx = INT32_MAX;
 	data[6].exp_flags = 0x1;
@@ -2815,8 +2819,10 @@ void test_compress_s_fx_raw(void)
 	TEST_ASSERT_EQUAL_INT(cmp_size_exp, cmp_size);
 
 	for (i = 0; i < ARRAY_SIZE(data); i++) {
+		struct s_fx *p;
+
 		hdr = (struct multi_entry_hdr *)cfg.icu_output_buf;
-		struct s_fx *p = (struct s_fx *)hdr->entry;
+		p = (struct s_fx *)hdr->entry;
 
 		TEST_ASSERT_EQUAL_HEX(data[i].exp_flags, p[i].exp_flags);
 		TEST_ASSERT_EQUAL_HEX(data[i].fx, cpu_to_be32(p[i].fx));
@@ -2992,7 +2998,8 @@ void test_compress_s_fx_model_multi(void)
 
 void test_compress_s_fx_error_cases(void)
 {
-	int error, cmp_bits, compressed_data_size;
+	int error, cmp_bits;
+	uint32_t compressed_data_size;
 	struct cmp_cfg cfg = {0};
 	uint32_t cmp_par_exp_flags = MAX_NON_IMA_GOLOMB_PAR;
 	uint32_t spillover_exp_flags = 6;
@@ -3053,7 +3060,8 @@ void test_compress_s_fx_error_cases(void)
 
 void test_compress_s_fx_efx_error_cases(void)
 {
-	int error, cmp_bits, compressed_data_size;
+	int error, cmp_bits;
+	uint32_t compressed_data_size;
 	struct cmp_cfg cfg = {0};
 	uint32_t cmp_par_exp_flags = 2;
 	uint32_t spillover_exp_flags = 6;
@@ -3129,7 +3137,8 @@ void test_compress_s_fx_efx_error_cases(void)
 
 void test_compress_s_fx_ncob_error_cases(void)
 {
-	int error, cmp_bits, compressed_data_size;
+	int error, cmp_bits;
+	uint32_t compressed_data_size;
 	struct cmp_cfg cfg = {0};
 	uint32_t cmp_par_exp_flags = 3;
 	uint32_t spillover_exp_flags = 6;
@@ -3212,7 +3221,8 @@ void test_compress_s_fx_ncob_error_cases(void)
 
 void test_compress_s_fx_efx_ncob_ecob_error_cases(void)
 {
-	int error, cmp_bits, compressed_data_size;
+	int error, cmp_bits;
+	uint32_t compressed_data_size;
 	struct cmp_cfg cfg = {0};
 	uint32_t cmp_par_exp_flags = 3;
 	uint32_t spillover_exp_flags = 6;
@@ -3329,7 +3339,8 @@ void test_compress_s_fx_efx_ncob_ecob_error_cases(void)
 
 void test_compress_f_fx_error_cases(void)
 {
-	int error, cmp_bits, compressed_data_size;
+	int error, cmp_bits;
+	uint32_t compressed_data_size;
 	struct cmp_cfg cfg = {0};
 	uint32_t cmp_par_fx = MAX_NON_IMA_GOLOMB_PAR;
 	uint32_t spillover_fx = 8;
@@ -3370,7 +3381,8 @@ void test_compress_f_fx_error_cases(void)
 
 void test_compress_f_fx_efx_error_cases(void)
 {
-	int error, cmp_bits, compressed_data_size;
+	int error, cmp_bits;
+	uint32_t compressed_data_size;
 	struct cmp_cfg cfg = {0};
 	uint32_t cmp_par_fx = 1;
 	uint32_t spillover_fx = 8;
@@ -3431,7 +3443,8 @@ void test_compress_f_fx_efx_error_cases(void)
 
 void test_compress_f_fx_ncob_error_cases(void)
 {
-	int error, cmp_bits, compressed_data_size;
+	int error, cmp_bits;
+	uint32_t compressed_data_size;
 	struct cmp_cfg cfg = {0};
 	uint32_t cmp_par_fx = MAX_NON_IMA_GOLOMB_PAR;
 	uint32_t spillover_fx = 8;
@@ -3495,7 +3508,8 @@ void test_compress_f_fx_ncob_error_cases(void)
 
 void test_compress_f_fx_efx_ncob_ecob(void)
 {
-	int error, cmp_bits, compressed_data_size;
+	int error, cmp_bits;
+	uint32_t compressed_data_size;
 	struct cmp_cfg cfg = {0};
 	uint32_t cmp_par_fx = 1;
 	uint32_t spillover_fx = 8;
@@ -3591,7 +3605,8 @@ void test_compress_f_fx_efx_ncob_ecob(void)
 
 void test_compress_l_fx_error_cases(void)
 {
-	int error, cmp_bits, compressed_data_size;
+	int error, cmp_bits;
+	uint32_t compressed_data_size;
 	struct cmp_cfg cfg = {0};
 	uint32_t cmp_par_exp_flags = 3;
 	uint32_t spillover_exp_flags = 10;
@@ -3665,7 +3680,8 @@ void test_compress_l_fx_error_cases(void)
 
 void test_compress_l_fx_efx_error_cases(void)
 {
-	int error, cmp_bits, compressed_data_size;
+	int error, cmp_bits;
+	uint32_t compressed_data_size;
 	struct cmp_cfg cfg = {0};
 	uint32_t cmp_par_exp_flags = MAX_NON_IMA_GOLOMB_PAR;
 	uint32_t spillover_exp_flags = cmp_icu_max_spill(cmp_par_exp_flags);
@@ -3752,7 +3768,8 @@ void test_compress_l_fx_efx_error_cases(void)
 
 void test_compress_l_fx_ncob_error_cases(void)
 {
-	int error, cmp_bits, compressed_data_size;
+	int error, cmp_bits;
+	uint32_t compressed_data_size;
 	struct cmp_cfg cfg = {0};
 	uint32_t cmp_par_exp_flags = MAX_NON_IMA_GOLOMB_PAR;
 	uint32_t spillover_exp_flags = cmp_icu_max_spill(cmp_par_exp_flags);
@@ -3861,7 +3878,8 @@ void test_compress_l_fx_ncob_error_cases(void)
 
 void test_compress_l_fx_efx_ncob_ecob_error_cases(void)
 {
-	int error, cmp_bits, compressed_data_size;
+	int error, cmp_bits;
+	uint32_t compressed_data_size;
 	struct cmp_cfg cfg = {0};
 	uint32_t cmp_par_exp_flags = MAX_NON_IMA_GOLOMB_PAR;
 	uint32_t spillover_exp_flags = cmp_icu_max_spill(cmp_par_exp_flags);
@@ -4003,7 +4021,8 @@ void test_compress_l_fx_efx_ncob_ecob_error_cases(void)
 
 void test_compress_nc_offset_error_cases(void)
 {
-	int error, cmp_bits, compressed_data_size;
+	int error, cmp_bits;
+	uint32_t compressed_data_size;
 	struct cmp_cfg cfg = {0};
 	uint32_t cmp_par_mean = 1;
 	uint32_t spillover_mean = 2;
@@ -4061,7 +4080,8 @@ void test_compress_nc_offset_error_cases(void)
 
 void test_compress_nc_background_error_cases(void)
 {
-	int error, cmp_bits, compressed_data_size;
+	int error, cmp_bits;
+	uint32_t compressed_data_size;
 	struct cmp_cfg cfg = {0};
 	uint32_t cmp_par_mean = 1;
 	uint32_t spillover_mean = 2;
@@ -4133,7 +4153,8 @@ void test_compress_nc_background_error_cases(void)
 
 void test_compress_smearing_error_cases(void)
 {
-	int error, cmp_bits, compressed_data_size;
+	int error, cmp_bits;
+	uint32_t compressed_data_size;
 	struct cmp_cfg cfg = {0};
 	uint32_t cmp_par_mean = 1;
 	uint32_t spillover_mean = 2;
@@ -4358,7 +4379,7 @@ void test_icu_compress_data_error_cases(void)
 
 void test_zero_escape_mech_is_used(void)
 {
-	int cmp_mode;
+	enum cmp_mode cmp_mode;
 
 	for (cmp_mode = 0; cmp_mode <= CMP_MODE_STUFF; cmp_mode++) {
 		int res = zero_escape_mech_is_used(cmp_mode);
diff --git a/test/meson.build b/test/meson.build
index db573585b6d5af10af9eccca4e1f056d75db6054..49bf2a8d23698b0d14fa366ea79270efd1b38484 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -33,6 +33,7 @@ subdir('cmp_tool')
 
 unity_dep = dependency('unity', fallback : ['unity', 'unity_dep'])
 
+subdir('test_common')
 subdir('cmp_icu')
 subdir('cmp_decmp')
 subdir('cmp_data_types')
diff --git a/test/test_common/meson.build b/test/test_common/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..56d233028906f36724e4d138c6ab98ceb218794a
--- /dev/null
+++ b/test/test_common/meson.build
@@ -0,0 +1,8 @@
+pcg_proj = subproject('pcg-c-basic')
+pcb_dep = pcg_proj.get_variable('libpcg_basic_dep')
+
+test_common_lib = static_library(
+   'test_common',
+   'test_common.c',
+   dependencies: pcb_dep,
+)
diff --git a/test/test_common/test_common.c b/test/test_common/test_common.c
new file mode 100644
index 0000000000000000000000000000000000000000..583f52e28e8e57bc6f76a4abd61dd6670841bb63
--- /dev/null
+++ b/test/test_common/test_common.c
@@ -0,0 +1,41 @@
+#include <assert.h>
+
+#include <pcg_basic.h>
+
+
+void cmp_rand_seed(uint64_t seed)
+{
+	pcg32_srandom(seed, 0);
+}
+
+
+uint32_t cmp_rand32(void)
+{
+	return pcg32_random();
+}
+
+
+/**
+ * @brief generate a random number
+ *
+ * @param min minimum value (inclusive)
+ * @param max maximum value (inclusive)
+ *
+ * @returns "random" numbers in the range [M, N]
+ *
+ */
+
+uint32_t cmp_rand_between(uint32_t min, uint32_t max)
+{
+	assert(min < max);
+
+	return min + pcg32_boundedrand(max-min+1);
+}
+
+
+uint32_t cmp_rand_nbits(unsigned int nbits)
+{
+	assert(nbits > 0);
+
+	return cmp_rand32() >> (32 - nbits);
+}
diff --git a/test/test_common/test_common.h b/test/test_common/test_common.h
new file mode 100644
index 0000000000000000000000000000000000000000..750a534c966f65df4155f61b3cfdfbf8baa3660d
--- /dev/null
+++ b/test/test_common/test_common.h
@@ -0,0 +1,14 @@
+#include <stdint.h>
+
+#ifndef TEST_COMMON_H_
+#define TEST_COMMON_H_
+
+void cmp_rand_seed(uint64_t seed);
+
+uint32_t cmp_rand32(void);
+
+uint32_t cmp_rand_between(uint32_t min, uint32_t max);
+
+uint32_t cmp_rand_nbits(unsigned int nbits);
+
+#endif /* TEST_COMMON_H_ */