1
2 package mocks
3
4 import (
5 "errors"
6 "fmt"
7 "strconv"
8 "strings"
9
10 "github.com/launchdarkly/go-server-sdk/v6/subsystems/ldstoretypes"
11 )
12
13
14 func MakeMockDataSet(items ...MockDataItem) []ldstoretypes.Collection {
15 itemsColl := ldstoretypes.Collection{
16 Kind: MockData,
17 Items: []ldstoretypes.KeyedItemDescriptor{},
18 }
19 otherItemsColl := ldstoretypes.Collection{
20 Kind: MockOtherData,
21 Items: []ldstoretypes.KeyedItemDescriptor{},
22 }
23 for _, item := range items {
24 d := ldstoretypes.KeyedItemDescriptor{
25 Key: item.Key,
26 Item: item.ToItemDescriptor(),
27 }
28 if item.IsOtherKind {
29 otherItemsColl.Items = append(otherItemsColl.Items, d)
30 } else {
31 itemsColl.Items = append(itemsColl.Items, d)
32 }
33 }
34 return []ldstoretypes.Collection{itemsColl, otherItemsColl}
35 }
36
37
38 func MakeSerializedMockDataSet(items ...MockDataItem) []ldstoretypes.SerializedCollection {
39 itemsColl := ldstoretypes.SerializedCollection{
40 Kind: MockData,
41 Items: []ldstoretypes.KeyedSerializedItemDescriptor{},
42 }
43 otherItemsColl := ldstoretypes.SerializedCollection{
44 Kind: MockOtherData,
45 Items: []ldstoretypes.KeyedSerializedItemDescriptor{},
46 }
47 for _, item := range items {
48 d := ldstoretypes.KeyedSerializedItemDescriptor{
49 Key: item.Key,
50 Item: item.ToSerializedItemDescriptor(),
51 }
52 if item.IsOtherKind {
53 otherItemsColl.Items = append(otherItemsColl.Items, d)
54 } else {
55 itemsColl.Items = append(itemsColl.Items, d)
56 }
57 }
58 return []ldstoretypes.SerializedCollection{itemsColl, otherItemsColl}
59 }
60
61
62 type MockDataItem struct {
63 Key string
64 Version int
65 Deleted bool
66 Name string
67 IsOtherKind bool
68 }
69
70
71 func (m MockDataItem) ToItemDescriptor() ldstoretypes.ItemDescriptor {
72 return ldstoretypes.ItemDescriptor{Version: m.Version, Item: m}
73 }
74
75
76 func (m MockDataItem) ToKeyedItemDescriptor() ldstoretypes.KeyedItemDescriptor {
77 return ldstoretypes.KeyedItemDescriptor{Key: m.Key, Item: m.ToItemDescriptor()}
78 }
79
80
81 func (m MockDataItem) ToSerializedItemDescriptor() ldstoretypes.SerializedItemDescriptor {
82 return ldstoretypes.SerializedItemDescriptor{
83 Version: m.Version,
84 Deleted: m.Deleted,
85 SerializedItem: MockData.Serialize(m.ToItemDescriptor()),
86 }
87 }
88
89
90 var MockData = mockDataKind{isOther: false}
91
92 type mockDataKind struct {
93 isOther bool
94 }
95
96 func (sk mockDataKind) GetName() string {
97 if sk.isOther {
98 return "mock2"
99 }
100 return "mock1"
101 }
102
103 func (sk mockDataKind) String() string {
104 return sk.GetName()
105 }
106
107 func (sk mockDataKind) Serialize(item ldstoretypes.ItemDescriptor) []byte {
108 if item.Item == nil {
109 return []byte(fmt.Sprintf("DELETED:%d", item.Version))
110 }
111 if mdi, ok := item.Item.(MockDataItem); ok {
112 return []byte(fmt.Sprintf("%s,%d,%t,%s,%t", mdi.Key, mdi.Version, mdi.Deleted, mdi.Name, mdi.IsOtherKind))
113 }
114 return nil
115 }
116
117 func (sk mockDataKind) Deserialize(data []byte) (ldstoretypes.ItemDescriptor, error) {
118 if data == nil {
119 return ldstoretypes.ItemDescriptor{}.NotFound(), errors.New("tried to deserialize nil data")
120 }
121 s := string(data)
122 if strings.HasPrefix(s, "DELETED:") {
123 v, _ := strconv.Atoi(strings.TrimPrefix(s, "DELETED:"))
124 return ldstoretypes.ItemDescriptor{Version: v}, nil
125 }
126 fields := strings.Split(s, ",")
127 if len(fields) == 5 {
128 v, _ := strconv.Atoi(fields[1])
129 itemIsOther := fields[4] == "true"
130 if itemIsOther != sk.isOther {
131 return ldstoretypes.ItemDescriptor{}.NotFound(), errors.New("got data item of wrong kind")
132 }
133 isDeleted := fields[2] == "true"
134 if isDeleted {
135 return ldstoretypes.ItemDescriptor{Version: v}, nil
136 }
137 m := MockDataItem{Key: fields[0], Version: v, Name: fields[3], IsOtherKind: itemIsOther}
138 return ldstoretypes.ItemDescriptor{Version: v, Item: m}, nil
139 }
140 return ldstoretypes.ItemDescriptor{}.NotFound(), fmt.Errorf(`not a valid MockDataItem: "%s"`, data)
141 }
142
143
144 var MockOtherData = mockDataKind{isOther: true}
145
View as plain text