github.com/keybase/client/go@v0.0.0-20241007131713-f10651d043c8/kbfs/data/path_part_string_test.go (about)

     1  // Copyright 2019 Keybase Inc. All rights reserved.
     2  // Use of this source code is governed by a BSD
     3  // license that can be found in the LICENSE file.
     4  
     5  package data
     6  
     7  import (
     8  	"encoding/json"
     9  	"strings"
    10  	"testing"
    11  
    12  	"github.com/keybase/client/go/libkb"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func TestPathPartStringBasic(t *testing.T) {
    17  	secret := NodeObfuscatorSecret([]byte{1, 2, 3, 4})
    18  	no := NewNodeObfuscator(secret)
    19  
    20  	t.Log("Check String() without extensions")
    21  	pps := NewPathPartString("test", no)
    22  	ob := pps.String()
    23  	words := strings.Split(ob, separator)
    24  	require.Len(t, words, 2)
    25  	require.True(t, libkb.ValidSecWord(words[0]), words[0])
    26  	require.True(t, libkb.ValidSecWord(words[1]), words[1])
    27  
    28  	t.Log("Check String() with short extension")
    29  	pps2 := NewPathPartString("test.txt", no)
    30  	ob2 := pps2.String()
    31  	require.True(t, strings.HasSuffix(ob2, ".txt"))
    32  	words2 := strings.Split(strings.Replace(ob2, ".txt", "", 1), separator)
    33  	require.Len(t, words2, 2)
    34  	require.True(t, libkb.ValidSecWord(words2[0]), words2[0])
    35  	require.True(t, libkb.ValidSecWord(words2[1]), words2[1])
    36  	t.Log("Make sure that the words aren't the same")
    37  	require.False(t, words[0] == words2[0] && words[1] == words2[1])
    38  
    39  	t.Log("Check String() with longer, but still valid, extension")
    40  	pps3 := NewPathPartString("test.tar.gz", no)
    41  	ob3 := pps3.String()
    42  	require.True(t, strings.HasSuffix(ob3, ".tar.gz"))
    43  	words3 := strings.Split(strings.Replace(ob3, ".tar.gz", "", 1), separator)
    44  	require.Len(t, words3, 2)
    45  	require.True(t, libkb.ValidSecWord(words3[0]), words3[0])
    46  	require.True(t, libkb.ValidSecWord(words3[1]), words3[1])
    47  
    48  	t.Log("Check String() with a too-long extension")
    49  	pps4 := NewPathPartString("test.longextension", no)
    50  	ob4 := pps4.String()
    51  	require.False(t, strings.HasSuffix(ob4, ".longextension"))
    52  	words4 := strings.Split(ob4, separator)
    53  	require.Len(t, words4, 2)
    54  	require.True(t, libkb.ValidSecWord(words4[0]), words4[0])
    55  	require.True(t, libkb.ValidSecWord(words4[1]), words4[1])
    56  
    57  	t.Log("Check String() with a conflicted suffix")
    58  	cSuffix := ".conflicted (alice's device copy 2019-06-10).txt"
    59  	pps5 := NewPathPartString("test"+cSuffix, no)
    60  	ob5 := pps5.String()
    61  	require.True(t, strings.HasSuffix(ob5, cSuffix))
    62  	words5 := strings.Split(strings.Replace(ob5, cSuffix, "", 1), separator)
    63  	require.Len(t, words5, 2)
    64  	require.Equal(t, words2[0], words5[0])
    65  	require.Equal(t, words2[1], words5[1])
    66  }
    67  
    68  func TestPathPartStringEquality(t *testing.T) {
    69  	secret := NodeObfuscatorSecret([]byte{1, 2, 3, 4})
    70  	no := NewNodeObfuscator(secret)
    71  
    72  	t.Log("Check equal PathPartStrings")
    73  	pps1 := NewPathPartString("test", no)
    74  	pps2 := NewPathPartString("test", no)
    75  	require.True(t, pps1 == pps2)
    76  
    77  	t.Log("Check as a map key")
    78  	pps3 := NewPathPartString("test2", no)
    79  	val1 := 50
    80  	val3 := 100
    81  	m := map[PathPartString]int{
    82  		pps1: val1,
    83  		pps3: val3,
    84  	}
    85  	require.Equal(t, val1, m[pps1])
    86  	require.Equal(t, val1, m[pps2])
    87  	require.Equal(t, val3, m[pps3])
    88  
    89  	t.Log("Check unequal PathPartStrings with different strings")
    90  	pps1 = NewPathPartString("test", no)
    91  	pps2 = NewPathPartString("test2", no)
    92  	require.False(t, pps1 == pps2)
    93  
    94  	t.Log("Check unequal PathPartStrings with different obfuscators")
    95  	no2 := NewNodeObfuscator(secret)
    96  	pps1 = NewPathPartString("test", no)
    97  	pps2 = NewPathPartString("test", no2)
    98  	require.False(t, pps1 == pps2)
    99  }
   100  
   101  func TestPathPartStringPrefix(t *testing.T) {
   102  	secret := NodeObfuscatorSecret([]byte{1, 2, 3, 4})
   103  	no := NewNodeObfuscator(secret)
   104  
   105  	t.Log("Check that special .kbfs_ files are ignored")
   106  	status := ".kbfs_status"
   107  	pps1 := NewPathPartString(status, no)
   108  	ob1 := pps1.String()
   109  	require.Equal(t, status, ob1)
   110  
   111  	t.Log("Check that .kbfs_fileinfo files are still partially obfuscated")
   112  	fileinfo := ".kbfs_fileinfo_test.txt"
   113  	pps2 := NewPathPartString(fileinfo, no)
   114  	ob2 := pps2.String()
   115  	require.True(t, strings.HasPrefix(ob2, ".kbfs_fileinfo_"))
   116  	require.True(t, strings.HasSuffix(ob2, ".txt"))
   117  	words2 := strings.Split(
   118  		strings.TrimSuffix(strings.TrimPrefix(ob2, ".kbfs_fileinfo_"), ".txt"),
   119  		separator)
   120  	require.Len(t, words2, 2)
   121  	require.True(t, libkb.ValidSecWord(words2[0]), words2[0])
   122  	require.True(t, libkb.ValidSecWord(words2[1]), words2[1])
   123  
   124  	t.Log("Check file info with a conflicted suffix")
   125  	cSuffix := ".conflicted (alice's device copy 2019-06-10).txt"
   126  	pps3 := NewPathPartString(".kbfs_fileinfo_test"+cSuffix, no)
   127  	ob3 := pps3.String()
   128  	require.True(t, strings.HasPrefix(ob3, ".kbfs_fileinfo_"))
   129  	require.True(t, strings.HasSuffix(ob3, cSuffix))
   130  	words3 := strings.Split(
   131  		strings.TrimSuffix(strings.TrimPrefix(ob3, ".kbfs_fileinfo_"), cSuffix),
   132  		separator)
   133  	require.Len(t, words3, 2)
   134  	require.Equal(t, words2[0], words3[0])
   135  	require.Equal(t, words2[1], words3[1])
   136  }
   137  
   138  func TestPathPartStringMarshal(t *testing.T) {
   139  	secret := NodeObfuscatorSecret([]byte{1, 2, 3, 4})
   140  	no := NewNodeObfuscator(secret)
   141  	pps := NewPathPartString("test", no)
   142  	require.Panics(t, func() {
   143  		_, _ = json.Marshal(pps)
   144  	})
   145  
   146  	type m struct {
   147  		PPS   PathPartString
   148  		Other string
   149  	}
   150  	m1 := m{pps, "test"}
   151  	require.Panics(t, func() {
   152  		_, _ = json.Marshal(m1)
   153  	})
   154  }