Skip to content

Commit 72f36e1

Browse files
authored
Merge pull request #32 from vshcryabets/feature/cpp-deserialization
Add StyxSerializer C++ tests
2 parents 4817abf + db8c87f commit 72f36e1

15 files changed

Lines changed: 250 additions & 25 deletions

File tree

.vscode/settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@
8484
"regex": "cpp",
8585
"stack": "cpp",
8686
"__node_handle": "cpp",
87-
"__bit_reference": "cpp"
87+
"__bit_reference": "cpp",
88+
"__config": "cpp"
8889
},
8990
"cmake.sourceDirectory": "${workspaceFolder}/linux/"
9091
}

java/v2styx-lib/src/main/java/com/v2soft/styxlib/l5/serialization/IDataSerializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
public interface IDataSerializer {
99
int BASE_BINARY_SIZE = 7;
10-
10+
int getMessageSize(StyxMessage message);
1111
void serialize(StyxMessage message, IBufferWriter output) throws StyxException;
1212
void serializeStat(StyxStat stat, IBufferWriter output) throws StyxException;
1313
int getStatSerializedSize(StyxStat stat);

java/v2styx-lib/src/main/java/com/v2soft/styxlib/l5/serialization/impl/StyxSerializerImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@
2020
import java.util.List;
2121

2222
public class StyxSerializerImpl implements IDataSerializer {
23-
protected int getMessageSize(StyxMessage message) {
23+
@Override
24+
public int getMessageSize(StyxMessage message) {
2425
var size = IDataSerializer.BASE_BINARY_SIZE;
2526
if (message instanceof StyxTMessageFID) {
2627
size += 4;
@@ -209,7 +210,6 @@ public void serializeStat(StyxStat stat, IBufferWriter output)
209210
output.writeUInt16(stat.type());
210211
output.writeUInt32(stat.dev());
211212
serializeQid(stat.QID(), output);
212-
// stat.QID().writeBinaryTo(output);
213213
output.writeUInt32(stat.mode());
214214
output.writeUInt32(DateToInt(stat.accessTime()));
215215
output.writeUInt32(DateToInt(stat.modificationTime()));

java/v2styx-lib/src/test/java/com/v2soft/styxlib/l5/serialization/impl/StyxSerializerImplTest.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,4 +163,54 @@ void testQidSerialization() throws StyxException {
163163
buffer.get(data);
164164
assertArrayEquals(expected, data);
165165
}
166+
167+
@Test
168+
void testSerializeStat() throws StyxException {
169+
StyxStat stat = new StyxStat(
170+
(short) 1,
171+
2,
172+
new StyxQID(QidType.QTFILE, 0x80, 0x90),
173+
0x01,
174+
new Date(1717171717L * 1000), // fixed date for reproducibility
175+
new Date(1717171717L * 1000),
176+
0x123,
177+
"file",
178+
"user",
179+
"group",
180+
"editor"
181+
);
182+
BufferWriterImpl output = new BufferWriterImpl(8192);
183+
serializer.serializeStat(stat, output);
184+
185+
// Validate buffer size and some expected values
186+
var buffer = output.getBuffer();
187+
assertEquals(serializer.getStatSerializedSize(stat), output.getPosition());
188+
189+
byte[] expected = {
190+
66, 0x00, // size - 2
191+
1, 0x00, // type
192+
0x02, 0x00, 0x00, 0x00, // dev
193+
(byte) QidType.QTFILE,
194+
(byte)0x80, 0x00, 0x00, 0x00, //9: qid.version[4]
195+
(byte)0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //13: qid.path[8] 0x12309E51049E5104L
196+
0x01, 0x00, 0x00, 0x00, // mode
197+
0x05, (byte)0xF6, 89, 102, // atime
198+
0x05, (byte)0xF6, 89, 102, // mtime
199+
0x23, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // length
200+
0x04, 0x00, // name length
201+
'f', 'i', 'l', 'e', // name
202+
0x04, 0x00, // uid length
203+
'u', 's', 'e', 'r', // uid
204+
0x05, 0x00, // gid length
205+
'g', 'r', 'o', 'u', 'p', // gid
206+
0x06, 0x00, // muid length
207+
'e', 'd', 'i', 't', 'o', 'r' // muid
208+
};
209+
210+
buffer.flip();
211+
byte[] data = new byte[buffer.limit()];
212+
// buffer.position(0);
213+
buffer.get(data);
214+
assertArrayEquals(expected, data);
215+
}
166216
}

native/V2StyxLib/modules/l5/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ if(BUILD_MODULE_L5)
55
src/BufferWriterImpl.cpp
66
src/BufferReaderImpl.cpp
77
src/StyxMessage.cpp
8+
src/StyxSerializerImpl.cpp
9+
src/StyxQID.cpp
10+
src/StyxStat.cpp
811
)
912
target_include_directories(module_l5 PUBLIC
1013
$<INSTALL_INTERFACE:include>
@@ -14,6 +17,7 @@ if(BUILD_MODULE_L5)
1417
add_executable(module_l5_tests
1518
test/test_BufferWriterImpl.cpp
1619
test/test_BufferReaderImpl.cpp
20+
test/test_StyxSerializerImpl.cpp
1721
)
1822
target_include_directories(module_l5_tests PRIVATE ./include/)
1923
target_link_libraries(module_l5_tests PRIVATE Catch2::Catch2WithMain module_l5)

native/V2StyxLib/modules/l5/include/serialization/BufferReaderImpl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#pragma once
22
#include "serialization/IBufferReader.h"
33

4-
class BufferReaderImpl : public IBufferReader {
4+
class BufferReaderImpl : public styxlib::serialization::IBufferReader {
55
private:
66
const StyxBuffer buffer;
77
Styx::Size position;

native/V2StyxLib/modules/l5/include/serialization/IBufferReader.h

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@
22
#include <cstdint>
33
#include "data.h"
44

5-
class IBufferReader {
6-
public:
7-
virtual ~IBufferReader() = default;
8-
virtual uint8_t readUInt8() = 0;
9-
virtual uint16_t readUInt16() = 0;
10-
virtual uint32_t readUInt32() = 0;
11-
virtual uint64_t readUInt64() = 0;
12-
virtual StyxString readUTFString() = 0;
13-
virtual Styx::Size read(uint8_t* data, Styx::Size count) = 0;
14-
};
5+
namespace styxlib::serialization {
6+
7+
class IBufferReader {
8+
public:
9+
virtual ~IBufferReader() = default;
10+
virtual uint8_t readUInt8() = 0;
11+
virtual uint16_t readUInt16() = 0;
12+
virtual uint32_t readUInt32() = 0;
13+
virtual uint64_t readUInt64() = 0;
14+
virtual StyxString readUTFString() = 0;
15+
virtual Styx::Size read(uint8_t* data, Styx::Size count) = 0;
16+
};
17+
}
Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
#pragma once
2-
#include "l5/messages/StyxMessage.h"
3-
#include "l5/structs/StyxStat.h"
4-
#include "l5/serialization/IBufferWritter.h"
2+
#include "messages/StyxMessage.h"
3+
#include "structs/StyxStat.h"
4+
#include "serialization/IBufferWriter.h"
55

66
class IDataSerializer {
77
public:
8-
virtual void serialize(const StyxMessage &message, IBufferWriter *output) = 0;
9-
virtual void serializeStat(const StyxStat &stat, IBufferWriter *output) = 0;
8+
virtual void serialize(const styxlib::messages::StyxMessage &message,
9+
IBufferWriter &output) = 0;
10+
virtual void serializeStat(const StyxStat &stat, IBufferWriter &output) = 0;
1011
virtual int getStatSerializedSize(const StyxStat &stat) = 0;
1112
virtual int getQidSize() = 0;
12-
virtual void serializeQid(const StyxQID &qid, IBufferWriter *output) = 0;
13+
virtual void serializeQid(const StyxQID &qid, IBufferWriter &output) = 0;
1314
};
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#pragma once
2+
3+
#include "serialization/IDataSerializer.h"
4+
5+
class StyxSerializerImpl : public IDataSerializer {
6+
public:
7+
StyxSerializerImpl() = default;
8+
~StyxSerializerImpl() = default;
9+
void serialize(const styxlib::messages::StyxMessage &message,
10+
IBufferWriter &output) override;
11+
void serializeStat(const StyxStat &stat, IBufferWriter &output) override;
12+
int getStatSerializedSize(const StyxStat &stat) override;
13+
int getQidSize() override;
14+
void serializeQid(const StyxQID &qid, IBufferWriter &output) override;
15+
};

native/V2StyxLib/modules/l5/include/structs/StyxQID.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@
33
#include <cstdint>
44

55
struct StyxQID {
6-
public:
76
uint8_t type;
87
uint32_t version;
98
uint64_t path;
10-
};
9+
10+
constexpr StyxQID(uint8_t t, uint32_t v, uint64_t p)
11+
: type(t), version(v), path(p) {}
12+
13+
const static StyxQID EMPTY;
14+
};

0 commit comments

Comments
 (0)