huangcm
2024-08-23 d76fb8c8c6d079a3cee81da7072347dcb8bbbc70
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
#include <stdint.h>
 
#include <ese/ese_sg.h>
#include <gtest/gtest.h>
 
using ::testing::Test;
 
class ScatterGatherTest : public virtual Test {
 public:
  ScatterGatherTest() {
  }
  virtual ~ScatterGatherTest() { }
  virtual void SetUp() { }
  virtual void TearDown() { }
};
 
TEST_F(ScatterGatherTest, OneToBuf) {
  uint8_t sg_data[] = "HELLO WORLD";
  struct EseSgBuffer sg = {
    .base = &sg_data[0],
    .len = sizeof(sg_data),
  };
  uint8_t dst[sizeof(sg_data) * 2];
  uint32_t copied;
  copied = ese_sg_to_buf(&sg, 1, 0, sizeof(dst), dst);
  EXPECT_EQ(copied, sizeof(sg_data));
  EXPECT_STREQ(reinterpret_cast<char *>(dst),
               reinterpret_cast<char *>(sg_data));
}
 
TEST_F(ScatterGatherTest, OneFromBuf) {
  uint8_t src[] = "HELLO WORLD!";
  uint8_t sg_data[sizeof(src) * 2];
  struct EseSgBuffer sg = {
    .base = &sg_data[0],
    .len = sizeof(sg_data),
  };
  uint32_t copied;
  copied = ese_sg_from_buf(&sg, 1, 0, sizeof(src), src);
  EXPECT_EQ(copied, sizeof(src));
  EXPECT_STREQ(reinterpret_cast<char *>(src),
               reinterpret_cast<char *>(sg_data));
}
 
 
TEST_F(ScatterGatherTest, ThreeToBuf) {
  uint8_t one[] = {'H', 'E', 'L'};
  uint8_t two[] = {'L', 'O', ' '};
  uint8_t three[] = "WORLD";
  struct EseSgBuffer sg[] = {
    {
      .base = one,
      .len = sizeof(one),
    },
    {
      .base = two,
      .len = sizeof(two),
    },
    {
      .base = three,
      .len = sizeof(three),
    },
  };
  uint8_t dst[256];
  uint32_t copied;
  copied = ese_sg_to_buf(sg, 3, 0, sizeof(dst), dst);
  EXPECT_EQ(copied, strlen("HELLO WORLD") + 1);
  EXPECT_STREQ(reinterpret_cast<char *>(dst),
               "HELLO WORLD");
  // Again but offset by the first bufs.
  copied = ese_sg_to_buf(sg, 3, sizeof(one) + sizeof(two) - 2, sizeof(dst),
                         dst);
  EXPECT_EQ(copied, (strlen("HELLO WORLD") + 1) -
                     (sizeof(one) + sizeof(two) - 2));
  EXPECT_STREQ(reinterpret_cast<char *>(dst),
               "O WORLD");
}
 
 
TEST_F(ScatterGatherTest, ThreeFromBuf) {
  uint8_t one[3];
  uint8_t two[3];
  uint8_t three[6];
  struct EseSgBuffer sg[] = {
    {
      .base = one,
      .len = sizeof(one),
    },
    {
      .base = two,
      .len = sizeof(two),
    },
    {
      .base = three,
      .len = sizeof(three),
    },
  };
  uint8_t src[] = "HELLO WORLD";
  uint32_t copied;
  copied = ese_sg_from_buf(sg, 3, 0, sizeof(src), src);
  EXPECT_EQ(copied, sizeof(one)  + sizeof(two) + sizeof(three));
  EXPECT_EQ(one[0], 'H');
  EXPECT_EQ(one[1], 'E');
  EXPECT_EQ(one[2], 'L');
  EXPECT_STREQ(reinterpret_cast<char *>(three), "WORLD");
  // Again but offset.
  copied = ese_sg_from_buf(sg, 3, 6, sizeof(src), src);
  EXPECT_EQ(copied, ese_sg_length(sg, 3) - 6);
  EXPECT_EQ(three[5], ' ');
  three[5] = 0; // NUL terminate for the test below.
  EXPECT_STREQ(reinterpret_cast<char *>(three), "HELLO");
}