LCOV - code coverage report
Current view: top level - test - test-unaligned.c (source / functions) Hit Total Coverage
Test: main_coverage.info Lines: 135 135 100.0 %
Date: 2019-08-22 15:41:25 Functions: 4 4 100.0 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: LGPL-2.1+ */
       2             : 
       3             : #include "memory-util.h"
       4             : #include "sparse-endian.h"
       5             : #include "unaligned.h"
       6             : 
       7             : static uint8_t data[] = {
       8             :         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
       9             :         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
      10             : };
      11             : 
      12           1 : static void test_be(void) {
      13             :         uint8_t scratch[16];
      14             : 
      15           1 :         assert_se(unaligned_read_be16(&data[0]) == 0x0001);
      16           1 :         assert_se(unaligned_read_be16(&data[1]) == 0x0102);
      17             : 
      18           1 :         assert_se(unaligned_read_be32(&data[0]) == 0x00010203);
      19           1 :         assert_se(unaligned_read_be32(&data[1]) == 0x01020304);
      20           1 :         assert_se(unaligned_read_be32(&data[2]) == 0x02030405);
      21           1 :         assert_se(unaligned_read_be32(&data[3]) == 0x03040506);
      22             : 
      23           1 :         assert_se(unaligned_read_be64(&data[0]) == 0x0001020304050607);
      24           1 :         assert_se(unaligned_read_be64(&data[1]) == 0x0102030405060708);
      25           1 :         assert_se(unaligned_read_be64(&data[2]) == 0x0203040506070809);
      26           1 :         assert_se(unaligned_read_be64(&data[3]) == 0x030405060708090a);
      27           1 :         assert_se(unaligned_read_be64(&data[4]) == 0x0405060708090a0b);
      28           1 :         assert_se(unaligned_read_be64(&data[5]) == 0x05060708090a0b0c);
      29           1 :         assert_se(unaligned_read_be64(&data[6]) == 0x060708090a0b0c0d);
      30           1 :         assert_se(unaligned_read_be64(&data[7]) == 0x0708090a0b0c0d0e);
      31             : 
      32           1 :         zero(scratch);
      33           1 :         unaligned_write_be16(&scratch[0], 0x0001);
      34           1 :         assert_se(memcmp(&scratch[0], &data[0], sizeof(uint16_t)) == 0);
      35           1 :         zero(scratch);
      36           1 :         unaligned_write_be16(&scratch[1], 0x0102);
      37           1 :         assert_se(memcmp(&scratch[1], &data[1], sizeof(uint16_t)) == 0);
      38             : 
      39           1 :         zero(scratch);
      40           1 :         unaligned_write_be32(&scratch[0], 0x00010203);
      41           1 :         assert_se(memcmp(&scratch[0], &data[0], sizeof(uint32_t)) == 0);
      42           1 :         zero(scratch);
      43           1 :         unaligned_write_be32(&scratch[1], 0x01020304);
      44           1 :         assert_se(memcmp(&scratch[1], &data[1], sizeof(uint32_t)) == 0);
      45           1 :         zero(scratch);
      46           1 :         unaligned_write_be32(&scratch[2], 0x02030405);
      47           1 :         assert_se(memcmp(&scratch[2], &data[2], sizeof(uint32_t)) == 0);
      48           1 :         zero(scratch);
      49           1 :         unaligned_write_be32(&scratch[3], 0x03040506);
      50           1 :         assert_se(memcmp(&scratch[3], &data[3], sizeof(uint32_t)) == 0);
      51             : 
      52           1 :         zero(scratch);
      53           1 :         unaligned_write_be64(&scratch[0], 0x0001020304050607);
      54           1 :         assert_se(memcmp(&scratch[0], &data[0], sizeof(uint64_t)) == 0);
      55           1 :         zero(scratch);
      56           1 :         unaligned_write_be64(&scratch[1], 0x0102030405060708);
      57           1 :         assert_se(memcmp(&scratch[1], &data[1], sizeof(uint64_t)) == 0);
      58           1 :         zero(scratch);
      59           1 :         unaligned_write_be64(&scratch[2], 0x0203040506070809);
      60           1 :         assert_se(memcmp(&scratch[2], &data[2], sizeof(uint64_t)) == 0);
      61           1 :         zero(scratch);
      62           1 :         unaligned_write_be64(&scratch[3], 0x030405060708090a);
      63           1 :         assert_se(memcmp(&scratch[3], &data[3], sizeof(uint64_t)) == 0);
      64           1 :         zero(scratch);
      65           1 :         unaligned_write_be64(&scratch[4], 0x0405060708090a0b);
      66           1 :         assert_se(memcmp(&scratch[4], &data[4], sizeof(uint64_t)) == 0);
      67           1 :         zero(scratch);
      68           1 :         unaligned_write_be64(&scratch[5], 0x05060708090a0b0c);
      69           1 :         assert_se(memcmp(&scratch[5], &data[5], sizeof(uint64_t)) == 0);
      70           1 :         zero(scratch);
      71           1 :         unaligned_write_be64(&scratch[6], 0x060708090a0b0c0d);
      72           1 :         assert_se(memcmp(&scratch[6], &data[6], sizeof(uint64_t)) == 0);
      73           1 :         zero(scratch);
      74           1 :         unaligned_write_be64(&scratch[7], 0x0708090a0b0c0d0e);
      75           1 :         assert_se(memcmp(&scratch[7], &data[7], sizeof(uint64_t)) == 0);
      76           1 : }
      77             : 
      78           1 : static void test_le(void) {
      79             :         uint8_t scratch[16];
      80             : 
      81           1 :         assert_se(unaligned_read_le16(&data[0]) == 0x0100);
      82           1 :         assert_se(unaligned_read_le16(&data[1]) == 0x0201);
      83             : 
      84           1 :         assert_se(unaligned_read_le32(&data[0]) == 0x03020100);
      85           1 :         assert_se(unaligned_read_le32(&data[1]) == 0x04030201);
      86           1 :         assert_se(unaligned_read_le32(&data[2]) == 0x05040302);
      87           1 :         assert_se(unaligned_read_le32(&data[3]) == 0x06050403);
      88             : 
      89           1 :         assert_se(unaligned_read_le64(&data[0]) == 0x0706050403020100);
      90           1 :         assert_se(unaligned_read_le64(&data[1]) == 0x0807060504030201);
      91           1 :         assert_se(unaligned_read_le64(&data[2]) == 0x0908070605040302);
      92           1 :         assert_se(unaligned_read_le64(&data[3]) == 0x0a09080706050403);
      93           1 :         assert_se(unaligned_read_le64(&data[4]) == 0x0b0a090807060504);
      94           1 :         assert_se(unaligned_read_le64(&data[5]) == 0x0c0b0a0908070605);
      95           1 :         assert_se(unaligned_read_le64(&data[6]) == 0x0d0c0b0a09080706);
      96           1 :         assert_se(unaligned_read_le64(&data[7]) == 0x0e0d0c0b0a090807);
      97             : 
      98           1 :         zero(scratch);
      99           1 :         unaligned_write_le16(&scratch[0], 0x0100);
     100           1 :         assert_se(memcmp(&scratch[0], &data[0], sizeof(uint16_t)) == 0);
     101           1 :         zero(scratch);
     102           1 :         unaligned_write_le16(&scratch[1], 0x0201);
     103           1 :         assert_se(memcmp(&scratch[1], &data[1], sizeof(uint16_t)) == 0);
     104             : 
     105           1 :         zero(scratch);
     106           1 :         unaligned_write_le32(&scratch[0], 0x03020100);
     107             : 
     108           1 :         assert_se(memcmp(&scratch[0], &data[0], sizeof(uint32_t)) == 0);
     109           1 :         zero(scratch);
     110           1 :         unaligned_write_le32(&scratch[1], 0x04030201);
     111           1 :         assert_se(memcmp(&scratch[1], &data[1], sizeof(uint32_t)) == 0);
     112           1 :         zero(scratch);
     113           1 :         unaligned_write_le32(&scratch[2], 0x05040302);
     114           1 :         assert_se(memcmp(&scratch[2], &data[2], sizeof(uint32_t)) == 0);
     115           1 :         zero(scratch);
     116           1 :         unaligned_write_le32(&scratch[3], 0x06050403);
     117           1 :         assert_se(memcmp(&scratch[3], &data[3], sizeof(uint32_t)) == 0);
     118             : 
     119           1 :         zero(scratch);
     120           1 :         unaligned_write_le64(&scratch[0], 0x0706050403020100);
     121           1 :         assert_se(memcmp(&scratch[0], &data[0], sizeof(uint64_t)) == 0);
     122           1 :         zero(scratch);
     123           1 :         unaligned_write_le64(&scratch[1], 0x0807060504030201);
     124           1 :         assert_se(memcmp(&scratch[1], &data[1], sizeof(uint64_t)) == 0);
     125           1 :         zero(scratch);
     126           1 :         unaligned_write_le64(&scratch[2], 0x0908070605040302);
     127           1 :         assert_se(memcmp(&scratch[2], &data[2], sizeof(uint64_t)) == 0);
     128           1 :         zero(scratch);
     129           1 :         unaligned_write_le64(&scratch[3], 0x0a09080706050403);
     130           1 :         assert_se(memcmp(&scratch[3], &data[3], sizeof(uint64_t)) == 0);
     131           1 :         zero(scratch);
     132           1 :         unaligned_write_le64(&scratch[4], 0x0B0A090807060504);
     133           1 :         assert_se(memcmp(&scratch[4], &data[4], sizeof(uint64_t)) == 0);
     134           1 :         zero(scratch);
     135           1 :         unaligned_write_le64(&scratch[5], 0x0c0b0a0908070605);
     136           1 :         assert_se(memcmp(&scratch[5], &data[5], sizeof(uint64_t)) == 0);
     137           1 :         zero(scratch);
     138           1 :         unaligned_write_le64(&scratch[6], 0x0d0c0b0a09080706);
     139           1 :         assert_se(memcmp(&scratch[6], &data[6], sizeof(uint64_t)) == 0);
     140           1 :         zero(scratch);
     141           1 :         unaligned_write_le64(&scratch[7], 0x0e0d0c0b0a090807);
     142           1 :         assert_se(memcmp(&scratch[7], &data[7], sizeof(uint64_t)) == 0);
     143           1 : }
     144             : 
     145           1 : static void test_ne(void) {
     146           1 :         uint16_t x = 4711;
     147           1 :         uint32_t y = 123456;
     148           1 :         uint64_t z = 9876543210;
     149             : 
     150             :         /* Note that we don't bother actually testing alignment issues in this function, after all the _ne() functions
     151             :          * are just aliases for the _le() or _be() implementations, which we test extensively above. Hence, in this
     152             :          * function, just ensure that they map to the right version on the local architecture. */
     153             : 
     154           1 :         assert_se(unaligned_read_ne16(&x) == 4711);
     155           1 :         assert_se(unaligned_read_ne32(&y) == 123456);
     156           1 :         assert_se(unaligned_read_ne64(&z) == 9876543210);
     157             : 
     158           1 :         unaligned_write_ne16(&x, 1);
     159           1 :         unaligned_write_ne32(&y, 2);
     160           1 :         unaligned_write_ne64(&z, 3);
     161             : 
     162           1 :         assert_se(x == 1);
     163           1 :         assert_se(y == 2);
     164           1 :         assert_se(z == 3);
     165           1 : }
     166             : 
     167           1 : int main(int argc, const char *argv[]) {
     168           1 :         test_be();
     169           1 :         test_le();
     170           1 :         test_ne();
     171           1 :         return 0;
     172             : }

Generated by: LCOV version 1.14